#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:
- Если библиотека DLL находится в том же каталоге, что и исполняемый файл, он будет найден.
- Имя, экспортируемое библиотекой DLL Delphi, является HW, а не _HW.
- Соглашения о вызовах, вероятно, не совпадают. Я подозреваю, что это регистр в Delphi и cdecl в C . Обратите внимание, что я не уверен на 100%, что C Builder по умолчанию использует cdecl здесь, вы можете проверить.
Более серьезная проблема заключается в том, что вы просто не можете передать TForm через границу DLL, подобную этой. Когда вы вызываете метод для объекта в вашей библиотеке DLL, вы вызываете код в библиотеке DLL, а не код в исполняемом файле хоста. Но вам нужно вызвать код в exe, поскольку это код, который принадлежит объекту.
Вам необходимо переключиться на пакеты времени выполнения или интерфейсы.
Комментарии:
1. Дэвид, спасибо за ответ. Я проверил еще раз: да, ошибка заключалась в том, что я поместил dll в неправильную папку. Теперь все работает. И я кое-что проверил — вы можете передать TForm в dll и все другие компоненты VCL.
2. @user Нет, вы не можете передать
TForm
подобное. Сработает что-то столь же простое, как чтение свойства handle. На самом деле может сработать совсем немного. Но многое не удастся.