显示窗体时,德尔福DLL从C ++叫崩溃

编辑:愚蠢的问题,已经解决Form1nil ,因为我没有给它一个新的TForm1 ,我忘了德尔福并没有为你做的像C ++。

我有,我想用我的C ++程序的GUI一个Delphi DLL,所以只是个开始,我创建了一个表格,并有一个函数,将显示其出口,使得C ++可以调用它的形式。 然而,当它调用该函数的程序崩溃。 下面是我的代码。 (我使用Delphi 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;

该程序打印“找到它@”,然后崩溃。 如果我注释掉Form1.Show()在Delphi的DLL,它不会崩溃,函数返回3(printf的测试)。 我缺少一些初始化的东西? 谢谢。

--------------解决方案-------------

它crases的原因是, var Form1: TForm1;未初始化。

该原因var Form1: TForm1;没有初始化,很可能是因为你把unit Main成DLL项目,但它最初是从一个Delphi VCL项目中,你有来Form1自动创建列表。

自动创建列表意味着德尔福.dpr将初始化形式。

现在,你需要手动创建的形式,所以你需要将这些3个新的程序从DL​​L导出,并有C ++ DLL调用它们:

function CreateForm() : Integer; export; cdecl;
begin
try
Application.CreateForm(TForm1, Form1);
Result := 0;
except
Result := -1;
end;
end;

function DestroyForm() : Integer; export; cdecl;
begin
try
if Assigned(Form1) then
begin
FreeAndNil(Form1);
Application.ProcessMessages();
end;
Result := 0;
except
Result := -1;
end;
end;

function DestroyApplication() : Integer; export; cdecl;
begin
try
FreeAndNil(Application);
Result := 0;
except
Result := -1;
end;
end;

此外,你应该把一个try...except在你的执行块ShowForm功能实现,异常和其他语言相关的运行时功能不应该跨DLL边界。

你应该释放其他可能分配的动态内存条也做类似的事情。

--jeroen

分类:C# 时间:2013-04-10 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.891 (s). 10 q(s)