подключение и использование библиотеки DLL Delphi в C Builder

#delphi #delphi-2010 #c builder #c builder-2010

#delphi #delphi-2010 #c builder #c builder-2010

Вопрос:

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

Например, моя библиотека DLL Delphi выглядит следующим образом:

 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:

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

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

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

Комментарии:

1. Дэвид, спасибо за ответ. Я проверил еще раз: да, ошибка заключалась в том, что я поместил dll в неправильную папку. Теперь все работает. И я кое-что проверил — вы можете передать TForm в dll и все другие компоненты VCL.

2. @user Нет, вы не можете передать TForm подобное. Сработает что-то столь же простое, как чтение свойства handle. На самом деле может сработать совсем немного. Но многое не удастся.