編輯:啞問題,已經修復。 Form1
是nil
,因爲我沒有爲它指定一個新的TForm1
,我忘記了Delphi不會爲你像C++那樣做。從C++調用的Delphi DLL在顯示錶單時崩潰
我有一個Delphi DLL,我想用於我的C++程序的GUI,因此只是爲了初學者,我創建了一個窗體,並且有一個函數將顯示導出的窗體,以便C++可以調用它。但是,程序在調用該函數時會崩潰。這是我的代碼。 (我使用德爾福2010)
德爾福部分:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Tabs, ComCtrls;
type
TForm1 = class(TForm)
TabControl1: TTabControl;
TabSet1: TTabSet;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function ShowForm(i: Integer) : Integer; export; cdecl;
exports
ShowForm name 'ShowForm';
implementation
{$R *.dfm}
function ShowForm(i: Integer) : Integer; export; cdecl;
begin
Form1.Show();
Result := 3; // random value, doesn't mean anything
end;
end.
這裏是C++代碼:
HMODULE h = LoadLibrary("delphidll.dll");
if (!h) {
printf("Failed LoadLibrary (GetLastError: %i)\n", GetLastError());
return 0;
}
FARPROC p = GetProcAddress(h, "ShowForm");
if (p)
printf("Found it @ %p\n", p);
else
printf("Didn't find it\n");
((int(__cdecl *)(int))p)(34);
system("PAUSE");
return 0;
該程序打印 「找到它@」,然後崩潰。如果我在Delphi DLL中註釋掉Form1.Show()
,它不會崩潰,並且函數返回3(由printf測試)。我是否缺少一些初始化或某些東西?謝謝。
@David我不知道該怎麼做。 – Okey 2011-02-06 18:49:02