簡體   English   中英

無需使用運行時程序包構建的delphi exe和dll

[英]delphi exe and dll without build with runtime packages

對於我的上一個項目,我在delphi應用程序中使用了許多框架,因此我致力於創建dll並將其放入dll中(全部在Delphi中創建)

我已經瀏覽了許多網站並提出了有效的代碼,但對於該示例,我必須使用運行時包進行編譯,同時編譯應用程序和dll,這意味着我還必須分發bpls。 並且如果不檢查帶有運行時軟件包的構建,則會出現錯誤

這是我發現的代碼

在exe中

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;

多數民眾贊成在所有但我希望此代碼可以在沒有運行時包的情況下工作

太糟糕了。 沒有運行時程序包,該代碼將無法工作。 對於運行時程序包,應使用LoadPackage而不是LoadLibrary 。)

如果沒有軟件包,則程序的每個模塊(EXE和每個DLL)都有其自己的所有標准類定義的副本,包括TFrameTWinControl甚至TObject EXE中的TWinControl類與DLL中的TWinControl類似。

由於要在模塊之間共享類,因此需要確保它們都具有相同的類定義,而運行時程序包就是這樣做的方法。

如果您真的不使用運行時程序包,則需要更改DLL的接口,使其不共享任何Delphi對象類型。 代替TWinControl父級,傳遞控件的Handle屬性或任何其他HWnd值作為父級窗口。 DLL代碼將不再能夠假定父代有Delphi對象,而EXE將無法再假定其接收的控件是Delphi對象。 他們將被限制使用Windows API來操縱窗口句柄和發送消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM