Ветеран
Сообщения: 1264
Благодарности: 1024
|
Профиль
|
Отправить PM
| Цитировать
Цитата Johny777:
Скажите пожалуйста чем можно заменить указатель в той или иной функции. »
|
Пример: функция CreateFile параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)
Чем заменить: - Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;
- Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.
P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).
Johny777, без остановок, пауз, с отменой операции, тупо копирование:
читать дальше »
Код:
[code]
#define A = (Defined UNICODE) ? "W" : "A"
const
PROGRESS_CONTINUE = 0;
PROGRESS_CANCEL = 1;
CALLBACK_CHUNK_FINISHED = $0;
var
ProgressPage: TOutputProgressWizardPage;
CancelButton: TButton;
bCancel: BOOL;
function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine, lpData: Longint; var pbCancel: BOOL; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';
function PathIsDirectory(pszPath: String): BOOL; external 'PathIsDirectory{#A}@shlwapi.dll stdcall';
/////////////////////////////////////////////////////////////
function Size64(LowPart: Longint; HighPart: DWORD): Extended;
begin
Result := (HighPart + integer(LowPart < 0))*4.294967296E9 + LowPart;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CopyProgressRoutine(TotalFileSizeLo, TotalFileSizeHi, TotalBytesTransferredLo, TotalBytesTransferredHi, StreamSizeLo, StreamSizeHi, StreamBytesTransferredLo, StreamBytesTransferredHi: Longint; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Longint): DWORD;
begin
if bCancel then Result := PROGRESS_CANCEL else Result := PROGRESS_CONTINUE;
case dwCallbackReason of
CALLBACK_CHUNK_FINISHED: begin
ProgressPage.SetText(Format('%s: %s', ['Файл', CastIntegerToString(lpData)]), Format('%s: %d %%', ['Прогресс', Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi))]));
ProgressPage.SetProgress(Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi)), 100);
end;
end;
end;
///////////////////////////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
bCancel := True;
end;
/////////////////////////////////
procedure CreateCopyProgressPage;
begin
ProgressPage := CreateOutputProgressPage('Копирование файлов', '');
CancelButton := TButton.Create(ProgressPage);
with CancelButton do
begin
Parent := ProgressPage.Surface;
SetBounds(ProgressPage.ProgressBar.Width - WizardForm.CancelButton.Width, ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height + ScaleY(10), WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := SetupMessage(msgButtonCancel);
OnClick := @CancelButtonOnClick;
end;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////
function FindFiles(const pFrom, pTo: String; const Recurse: Boolean; const szRootDir: String): Integer;
var
FR: TFindRec;
szFileName: String;
begin
if FindFirst(pFrom, FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
begin
if not DirExists(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))])) then ForceDirectories(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))]));
szFileName := MinimizePathName(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), WizardForm.Font, WizardForm.OuterNotebook.ClientWidth - ScaleX(50));
CopyFileEx(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), Format('%s\%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom)), FR.Name]), CallbackAddr('CopyProgressRoutine'), CastStringToInteger(szFileName), bCancel, 0);
Result := DLLGetLastError;
if bCancel then Exit;
end;
until not FindNext(FR);
finally
FindClose(FR);
end;
//
if not Recurse then Exit;
if FindFirst(Format('%s\*', [ExtractFileDir(pFrom)]), FR) then
try
repeat
if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FR.Name <> '.') and (FR.Name <> '..') then
FindFiles(Format('%s\%s\%s', [ExtractFileDir(pFrom), FR.Name, ExtractFileName(pFrom)]), pTo, Recurse, szRootDir);
until not FindNext(FR);
finally
FindClose(FR);
end;
end;
//////////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const Recurse: Boolean): Integer;
// pFrom - source path. wildcard allowed
// pTo - destination path
// Recurse - recursion flag
begin
if PathIsDirectory(pFrom) then
begin
if not DirExists(pFrom) then Exit;
pFrom := Format('%s\*', [pFrom]);
end else if not DirExists(ExtractFileDir(pFrom)) then Exit;
Result := FindFiles(pFrom, pTo, Recurse, ExtractFilePath(pFrom));
end;
/////////////////////////////
procedure InitializeWizard();
begin
CreateCopyProgressPage;
end;
//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = wpWelcome then
begin
ProgressPage.Show;
xcopy('c:\Temp', 'd:\test', True);
//xcopy('c:\temp\te st\*.dll', 'd:\test', True);
//xcopy('c:\Temp\ffc\FileFormatConverters.7z', 'c:\Temp\FileFormatConverters.7z', False);
//xcopy('c:\temp\t est\123', 'c:\temp\t est\1234', True);
ProgressPage.Hide;
Result := True;
end;
Result := True;
end;
|