РЕДАКТИРОВАТЬ: тупой вопрос, уже исправлен.Form1
было nil
, потому что я не назначил ему новый TForm1
, я забыл, что Delphi не делает этого для вас, как C ++.
У меня есть DLL-библиотека Delphi, которую я хочу использовать дляGUI моей программы на C ++, поэтому для начала я создал форму, и у меня есть функция, которая будет показывать форму, которая экспортируется, чтобы C ++ мог ее вызывать.Однако программа вызывает сбой при вызове функции.Вот мой код(Я использую Delphi 2010)
Часть delphi:
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;
Программа выводит "Found it @"а потом вылетает.Если я закомментирую Form1.Show()
в DLL-библиотеке Delphi, она не будет аварийно завершена, и функция вернет 3 (протестировано printf).Я пропускаю некоторую инициализацию или что-то?Спасибо.