2010-10-21 39 views
0

因爲我用我的Delphi應用程序許多幀我的最後一個項目,所以我決定要創建的dll並把它們的動態鏈接庫(Delphi中所有已創建)德爾福exe文件和dll不與運行時包建立

我有內部通過許多網站,並提出了可用的代碼,但對於這個例子,我必須編譯構建與運行包這兩個應用程序和dll,這意味着我必須分發bpls也。如果不要檢查建立與運行軟件包的錯誤來了

這是我在DLL中找到

在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 

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

Result.Parent := TheParent; 
End; 

這就是所有的代碼,但我想這個代碼沒有運行時包的工作

+0

但我確定代碼是好的,因爲它與runtimw = e軟件包一起工作 – VibeeshanRC 2010-10-21 12:43:32

+1

第一個GetTheFrame調用的目的是什麼?如果它的目的是做任何事情,而不是隨意地摧毀你的記憶,那麼你就錯了。編譯器應該警告你在那裏使用一個未初始化的變量。 – 2010-10-21 12:50:32

+0

在你之前的問題中看到我的答案:http://stackoverflow.com/questions/3985256/how-to-use-delphi-dlls-without-enabling-build-with-runtime-packages我認爲這個問題是重複的。 – 2010-10-21 12:52:36

回答

7

太糟糕了。沒有運行時軟件包,該代碼將無法運行。 (和運行時軟件包,你應該使用LoadPackage,而不是LoadLibrary

沒有包,你的程序(EXE和每個DLL)的每個模塊都有自己的所有標準類的定義副本包括TFrame,TWinControl,甚至TObject。來自EXE的TWinControl類看起來不像DLL的TWinControl

由於您在模塊之間共享類,您需要確保它們都具有與這些類相同的定義,並且運行時包是您如何做到的。

如果你真的不會使用運行時包,那麼你需要改變你的DLL的接口,所以它不共享任何Delphi對象類型。而不是TWinControl父項,傳遞控件的Handle屬性或任何其他HWnd值作爲父窗口。 DLL代碼將無法再假定父對象有一個Delphi對象,並且EXE將無法假定它接收的控件是一個Delphi對象;他們將被限制爲使用Windows API來操作窗口句柄併發送消息。

+0

那麼我現在可以做什麼 – VibeeshanRC 2010-10-21 13:33:10

+0

該句柄可以作爲參數傳遞並作爲DLL內部函數的結果返回。 – skamradt 2010-10-21 16:10:16