5

私は 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 でコールバック部分を適切に実装する方法を教えてください。いくつかのサンプルコードをいただければ幸いです。初期化のデバッグは正常に機能しますが、コールバックの作成は失敗します。前もって感謝します。

4

1 に答える 1

4

あなたの割り当てステートメントは逆です。DLL 関数でDLLParametersIDは、コールバックに関する情報を保持しますが、それをグローバル変数で上書きします。

DLLParametersID.CallbackFunction:= @DLLCallback;

それらを交換して割り当て DLLCallbackます。

于 2013-08-22T12:36:22.207 に答える