Пацаны! Скажите пожалуйста чем можно заменить указатель в той или иной функции. Те например нужно воспользоваться вин апи функцией, а у неё один из входных параметров указатель
например 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';