Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

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

Аватара для El Sanchez

Ветеран


Contributor


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

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


Цитата Johny777:
Скажите пожалуйста чем можно заменить указатель в той или иной функции. »
Пример: функция CreateFile параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)
Чем заменить:
  1. Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;
  2. Переменной типа, на которую указывает указатель - 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;

Последний раз редактировалось El Sanchez, 14-03-2013 в 16:47. Причина: update

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:07, 25-11-2012 | #1327