Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Пацаны! Скажите пожалуйста чем можно заменить указатель в той или иной функции. Те например нужно воспользоваться вин апи функцией, а у неё один из входных параметров указатель
например function CopyFileEx(lpExistingFileName, lpNewFileName: PWideChar; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;
очень привлекательная функция которая может отображать прогресс копирования файла (суть не конкретно в ней, тк есть многo других с указателями)
но каким образом использовать её в инно. Как вообще поступать с Pointer-ом. В Windows.pas (Embarcadero RAD Studio/ Delphi 2010) они на каждом углу. Просветите меня пожалуйста на этот счёт!
читать дальше »
Код: Выделить весь код
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
{ Define possible return codes from the CopyFileEx callback routine }

  PROGRESS_CONTINUE = 0;
  //EXTERNALSYM PROGRESS_CONTINUE
  PROGRESS_CANCEL = 1;
  //EXTERNALSYM PROGRESS_CANCEL
  PROGRESS_STOP = 2;
  //EXTERNALSYM PROGRESS_STOP
  PROGRESS_QUIET = 3;
  //EXTERNALSYM PROGRESS_QUIET
  
{ Define CopyFileEx callback routine state change values }

  CALLBACK_CHUNK_FINISHED = $00000000;
  //EXTERNALSYM CALLBACK_CHUNK_FINISHED
  CALLBACK_STREAM_SWITCH = $00000001;
  //EXTERNALSYM CALLBACK_STREAM_SWITCH


{ Define CopyFileEx option flags }

  COPY_FILE_FAIL_IF_EXISTS = $00000001;
  //EXTERNALSYM COPY_FILE_FAIL_IF_EXISTS
  COPY_FILE_RESTARTABLE = $00000002;
  //EXTERNALSYM COPY_FILE_RESTARTABLE

type
  Pointer = ?;
  TFarProc = Pointer;
  TFNProgressRoutine = TFarProc;
  PBool = BOOL;
  
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;
    
    
function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;

function CopyCallBack(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: _ULARGE_INTEGER;
dwStreamNumber, dwCallbackReason: DWORD; hSourceFile: THandle; hDestinationFile: THandle; ProgressBar : TNewProgressBar): DWORD;
var
  newpos: Integer;
begin
  Result := PROGRESS_CONTINUE;
  if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
  begin
    newpos := Round(Size64(TotalBytesTransferred) / Size64(TotalFileSize) * 100);
    with Progressbar do
      if newpos <> Position then
        Position := newpos;
    Application.ProcessMessages;
  end;
end;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';

Отправлено: 20:33, 24-11-2012 | #1321