![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Опять вопросс о CopyFileEx.
miwa © (2003-07-29 21:55:00)
Вопросс я уже задавал, но ветка куда-то пропала. А проблема в следующем: не могу передать параметром указатель на application defined функцию. Делаю так:
function CopyProgress(bla-bla-bla):integer;
...
CopyFileEx(bla-bla, @CopyProgress(bla-bla-bla), bla-bla-bla);
А компилятор ругается, что не хватает переменной. Или что несовместимы типы integer и pointer (кстати - почему? ведь пойнтер - это адресс в памяти компютера, а он ведь по идее целое?), или еще по всякому в зависимости от того, как я пробую его упросить запустится.
Г-н Зотов посоветовал такой подход:
function CopyProgress(...): DWORD; stdcall;
CopyFileEx(..., @CopyProgress, ...);
(параметры не нужны, передается только адрес самой функции)
Но и в этом случае выдается ошибка: variable requried.
Так как же все-таки копировать файлы с помощью CopyFileEx и при этом получат информацию о состоянии копирования?
Anatoly Podgoretsky (2003-07-31 22:34:00) [1]
Miwa © (31.07.03 22:26)
Тебя просили все указать, а ты так и продолжаешь издеваться, наверно из за этого другую ветку и удалили.
Потом, что за странный синтаксис @CopyProgressRoutine(переменные), ты его сам придумал, смотри, что тебе сказали Зотов и jack128
Miwa (2003-07-31 22:26:00) [2]
var target,bullet:pchar;
copytodir: string;
...
bullet:=pchar(fl[i].path);
target:=pchar(copytodir + ExtractFileName(fl[i].path));
...
Application.ProcessMessages;
if CopyFileEx(bullet, target, @CopyProgressRoutine, nil, nil, COPY_FILE_RESTARTABLE) then lstTarget.Items.Add("Файл успешно скопирован.");
Естессно, uses shellapi прописано ;о)).
В этом случаэ как раз variable required. А еще я пробовал передать так:
CopyFileEx(bullet, target, @CopyProgressRoutine(переменные), nil, nil, COPY_FILE_RESTARTABLE)
и так
CopyFileEx(bullet, target, CopyProgressRoutine(переменные), nil, nil, COPY_FILE_RESTARTABLE)
и еще по-всякому, как только вообще возможно :о)). В каждом случае ошибки, в принципе, вполне понятные. Кроме этого случая.
Игорь Шевченко (2003-07-30 11:00:00) [3]
function CopyFileEx(lpExistingFileName, lpNewFileName: PChar;
lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool;
dwCopyFlags: DWORD): BOOL; stdcall;
Напиши, как ты ее вызываешь с объявлением всех переменных
miwa (2003-07-30 01:18:00) [4]
Блин, это уже не смешно... Верю, что пропускает, но не у меня.
Win98/Delphi6Enterprise. При чем выдает не варнинг или хинт, а именно эррор.
jack128 (2003-07-29 22:24:00) [5]Компилятор такое пропускает...
function CopyProgressRoutine(
TotalFileSize : int64;
TotalBytesTransferred : int64 ; // total number of bytes transferred
StreamSize : int64;
StreamBytesTransferred : int64;
dwStreamNumber : DWORD ; // the current stream
dwCallbackReason : DWORD ; // reason for callback
hSourceFile : THANDLE ; // handle to the source file
hDestinationFile : THANDLE ; // handle to the destination file
lpData : Pointer // passed by CopyFileEx
( Sender: TObject)
Компилятор такое пропускает...
function CopyProgressRoutine(
TotalFileSize : int64;
TotalBytesTransferred : int64 ; // total number of bytes transferred
StreamSize : int64;
StreamBytesTransferred : int64;
dwStreamNumber : DWORD ; // the current stream
dwCallbackReason : DWORD ; // reason for callback
hSourceFile : THANDLE ; // handle to the source file
hDestinationFile : THANDLE ; // handle to the destination file
lpData : Pointer // passed by CopyFileEx
) : DWORD; stdcall;
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CopyFileEx("","",@CopyProgressRoutine,nil,nil,0);
end;