「スレッドの外側」と「スレッドの内側」とは、「スタンドアロン関数として」と「スレッド オブジェクトのメンバーとして」という意味ですか? 関数がオブジェクトのメンバーである場合、その署名は異なるため、コンパイラが期待するものと一致しないためです。
これを解決する方法は、パラメーターとしてに渡すSelf
ことです。これにより、コールバックに返されるポインターが与えられます。パラメータをスレッド オブジェクト参照として解釈し、それを使用して同じパラメータでスレッド オブジェクトのメソッドを呼び出すスタンドアロン関数としてコールバックを記述します。CopyFileEx
lpData
lpData
編集:簡単な例。コールバックには、「value」と「lpData」という 2 つのパラメーターしかないとします。
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;