Когда вы говорите «вне потока» и «внутри потока», подразумеваете ли вы «как отдельную функцию» и «как элемент объекта потока»?Потому что, если функция является членом объекта, ее сигнатура отличается, поэтому она не соответствует ожидаемому компилятором.
Способ, который вы можете решить, это передать Self
в CopyFileEx
в качестве параметра lpData
.Это дает ему указатель на то, что он будет возвращаться к обратному вызову.Напишите ваш обратный вызов как отдельную функцию, которая интерпретирует параметр lpData
как ссылку на объект потока и использует его для вызова метода вашего объекта потока с теми же параметрами.
РЕДАКТИРОВАТЬ: Простойпример.Допустим, что обратный вызов имеет только два параметра, называемых «value» и «lpData»:
procedure ProgressRoutine(value: integer; lpData: pointer); stdcall;
var
thread: TMyThreadClass;
begin
thread := lpData;
thread.ProgressRoutine(value);
end;
procedure TMyThreadClass.ProgressRoutine(value: integer);
begin
//do something with the value here
end;
procedure TMyThreadClass.Execute;
begin
CopyFileEx(pchar(ListToCopy.Strings[Loop]),pchar(TN+ExtractFileName(ListToCopy.Strings[Loop])), @ProgressRoutine, Self, nil, 0);
//passing Self to lpData; it will get passed back to the callback
end;