私は Delphi DLL を書いています。Delphi DLL でコールバック関数を実装したいのですが、このコールバック関数は呼び出し元の Delphi プログラムにコールバックする必要があります。コールバック関数の主な目的は、特定の長い操作が DLL で発生することですが、進行状況のレポート (進行状況バーを介して) と操作のキャンセルは、呼び出し元の Delphi プログラムで発生する必要があります。
DLL 内でコールバック関数を正しく実装する方法をサポートしてもらいたいです。EXE から渡されたコールバック関数を割り当てるまで続行できますが、DLL 自体から呼び出しを開始する方法はわかりません。
これは定義部分です (EXE および DLL によって使用されます)。
uses Windows;
Type
PTCallBackStruct = ^TCallBackStruct;
TCallBackStruct = packed record
Handle: THandle;
Caller: Pointer;
FileSize: LongInt;
end;
type
TFunctionPointerType = function(ZCallbackRec: PTCallBackStruct): Longbool;
stdcall;
type
PTDLLParamaters = ^TDLLParamaters;
TDLLParamaters = packed record
Handle: THandle;
Caller: Pointer;
CallbackFunction: TFunctionPointerType;
end;
var
DLLCallback: TFunctionPointerType;
EXE ファイル:
uses ....
type
function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall;
forward;
implementation
function DLL_Callback(ZCallBackRec: PTCallBackStruct): LongBool; stdcall;
begin
// progress reporting this function should be called back from
//the DLL. The Handle and Self parameter should help with identifying
// which object initiated the callback
end;
Delphi exe から次のように DLL に渡される PTDLLParameters を介して:
// init callback
DLLParameters := AllocMem(SizeOf(TDLLParamaters));
with DLLParameters^ do
begin
Handle := Application.Handle;
Caller := Self;
CallbackFunction:= DLL_Callback;
end;
DLL のロード
.....
.....
DLL の呼び出し
CompressionCreateLibrary(DLLParameters);
....
特定の操作
Free DLL
....
.....
FreeMem(DLLParameters);
DLL ファイル:
この関数は、DLL の特定の部分から呼び出され、実際の操作に関して EXE に戻ります。
function CallCallBackFromDLL(Size: integer): Integer;
begin
//
....
set up callbackstruct
....
// calling back
DLLCallback(CallbackStruct);
end;
この部分は大丈夫だと思います:
// main init call assigning the callback function to the DLL
function CompressionCreateLibrary(DLLParametersID: PTDLLParamaters): Integer;
begin
DLLParametersID.CallbackFunction:= @DLLCallback;
end;
DLL でコールバック部分を適切に実装する方法を教えてください。いくつかのサンプルコードをいただければ幸いです。初期化のデバッグは正常に機能しますが、コールバックの作成は失敗します。前もって感謝します。