подключение и использование Delphi DLL в C ++ Builder - PullRequest
3 голосов
/ 26 октября 2011

Я хотел попросить о помощи. Я знаю, что есть много мест, где я могу получить эту информацию. Но, в любом случае, у меня проблема с подключением Delphi DLL к моему проекту C ++ Builder.

Например, моя Delphi DLL выглядит так:

library f_dll;

uses
  SysUtils,
  Classes,
  Forms,
  Windows;

procedure HW(AForm : TForm);
        begin
                MessageBox(AForm.Handle, 'DLL message', 'you made it!',MB_OK);
        end;
exports
        HW;

{$R *.res}

begin

end.

И вот как я подключаю DLL и функцию внутри:

//defining a function pointer type
typedef void (*dll_func)(TForm* AForm);

dll_func HLLWRLD = NULL;

HMODULE hDLL = LoadLibrary("f_dll.dll");
if (!hDLL) ShowMessage("Unable to load the library!");

//getting adress of the function
HLLWRD = (dll_func)GetProcAddress(hDLL, "_HW"); 

if (!pShowSum) ShowMessage("Unable to find the function");

HLLWRLD(Form1);

FreeLibrary(hDLL);

У меня нет сообщений об ошибках от компилятора, у меня есть только окно сообщений, в котором говорится, что dll не подключена. Я положил мою DLL в папку проекта, в папке отладки. но просто нет связи.

Пожалуйста, я прошу вас помочь мне. В чем моя ошибка?

РЕДАКТИРОВАТЬ: я опубликовал код C ++ с ошибками, так что вот правильный (это для людей, у которых есть похожие проблемы):

//defining a function pointer type
typedef void (*dll_func)(TForm* AForm);

dll_func HLLWRLD = NULL;

HMODULE hDLL = LoadLibrary("f_dll.dll");
if (!hDLL) ShowMessage("Unable to load the library!");

//getting adress of the function
HLLWRD = (dll_func)GetProcAddress(hDLL, "HW");  //HW instead _HW

if (!HLLWRLD) ShowMessage("Unable to find the function"); //HLLWRLD instead pShowSum

HLLWRLD(Form1);

FreeLibrary(hDLL);

1 Ответ

3 голосов
/ 26 октября 2011
  1. Если библиотека DLL находится в том же каталоге, что и исполняемый файл, она будет найдена.
  2. Имя, экспортируемое DLL-библиотекой Delphi, - HW, а не _HW.
  3. Соглашения о вызовах, вероятно, не совпадают. Я подозреваю, что он зарегистрирован в Delphi и cdecl в C ++. Обратите внимание, что я не уверен на 100%, что C ++ Builder по умолчанию здесь cdecl, вы можете проверить.

Более серьезная проблема заключается в том, что вы просто не можете передать TForm через границу DLL, как это. Когда вы вызываете метод объекта в вашей DLL, вы вызываете код в DLL, а не код в исполняемой программе хоста. Но это код в exe, который вам нужно вызвать, так как это код, который принадлежит объекту.

Вам необходимо переключиться на пакеты или интерфейсы среды выполнения.

...