0

私の最後のプロジェクトでは、Delphi アプリケーションで多くのフレームを使用していたので、dll を作成して dll 内に配置することにしました (すべて Delphi で作成されました)。

私は多くのWebサイトを調べて、機能するコードを思いつきましたが、その例では、アプリとdllの両方をランタイムパッケージでビルドしてコンパイルする必要があります。つまり、bplも配布する必要があります。ランタイムパッケージでビルドをチェックしないと、エラーが発生します

これは私が見つけたコードです

実行中

procedure TForm1.Button1Click(Sender: TObject);
type
TGetTheFrame =Function( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall ;
 var
  GetTheFrame : TGetTheFrame;
begin
try
   GetTheFrame(application,TabSheet1).Free ;
except
end;
frm := GetTheFrame(application,TabSheet1) ;
dllHandle := LoadLibrary('project1.dll') ;
   if dllHandle <> 0 then
   begin
     GetTheFrame := GetProcAddress(dllHandle, 'GetTheFrame') ;
  frm := GetTheFrame(application,TabSheet1)   //call the function
    {   ShowMessage('error function not found') ;
     FreeLibrary(dllHandle) ; }
   end
   else
   begin
     ShowMessage('xxxx.dll not found / not loaded') ;
   end

dllで

Function  GetTheFrame( Owner: TComponent; TheParent: TWinControl ): TFrame; stdcall;
Begin
 Result := TFrame2.Create( Owner );

 Result.Parent := TheParent;
End;

それだけですが、ランタイムパッケージなしでこのコードを動作させたいです

4

1 に答える 1

7

残念な。そのコードは、ランタイムパッケージなしでは機能しません。(ランタイムパッケージでは、代わりにを使用する必要がありLoadPackageますLoadLibrary。)

TFrameパッケージがない場合、プログラムの各モジュール(EXEおよび各DLL)には、、、およびを含むすべての標準クラスの定義の独自のコピーがありTWinControlますTObject。EXEのクラスは、DLLにTWinControlは見えません。TWinControl

モジュール間でクラスを共有しているので、それらすべてがそれらのクラスの同じ定義を持っていることを確認する必要があり、ランタイムパッケージはそれを行う方法です。

ランタイムパッケージを実際に使用しない場合は、DLLのインターフェイスを変更して、Delphiオブジェクトタイプを共有しないようにする必要があります。親の代わりにTWinControl、コントロールのHandleプロパティまたはその他のHWnd値を渡して、親ウィンドウとして機能させます。DLLコードは、親のDelphiオブジェクトが存在すると想定できなくなり、EXEは、受信したコントロールがDelphiオブジェクトであると想定できなくなります。Windows APIを使用してウィンドウハンドルを操作し、メッセージを送信するように制限されます。

于 2010-10-21T12:48:22.773 に答える