![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() Есть Dll, написанная на С++. Описание функций и процедур там такое:
Код:
DLL_EXP void __stdcall Name2(int param1, int param2); DLL_EXP void __stdcall Name3(char* param1); DLL_EXP char* __stdcall Name5(); Необходимо подключить эту Dll к проекту на Delphi. Делаю так: Код:
unit DllWork; interface uses Windows; var Name2: procedure(param1: Integer; param2: Integer); stdcall; Name3: procedure(param1: string); stdcall; Name5: function(): string; stdcall; DllHandle: THandle; procedure LoadDllandProcs(DllName: string); procedure Name2_D(param1, param2: Integer); procedure Name3_D(param1: string); function Name5_D(): string; implementation procedure LoadDllandProcs(DllName: string); begin @Name2:= nil; @Name3:= nil; @Name5:= nil; DllHandle := LoadLibrary(PChar(DllName)); if DllHandle >= 32 then begin @Name2 := GetProcAddress(DllHandle, 'Name2'); @Name3 := GetProcAddress(DllHandle, 'Name3'); @Name5 := GetProcAddress(DllHandle, 'Name5'); end; end; procedure Name2_D(param1, param2: Integer); begin if @Name2 <> nil then Name2(param1, param2); end; procedure Name3_D(param1: string); begin if @Name3<> nil then Name3(param1); end; function Name5_D(): string; begin if @Name5 <> nil then Result := Name5; end; end. При выполнении появляются ошибки чтения нулевой и других ячеек памяти (по всей видимости, ошибка в DLL). Но хотелось бы узнать, как правильно подгружать и вызывать процедуры и функции из библиотек? Особенно, с функцией, возвращающей char* Последний раз редактировалось Bargest, 05.10.2012 в 00:24. |
#2
|
|||
|
|||
![]() Для начала почитай вот это
href=http://www.transl-gunsmoker.ru/2009/09/pchars.html |
#3
|
||||
|
||||
![]() /*повторюсь */
char*==PChar, а не string, отсюда, скорее всего, и ошибка обращения к памяти Upd: PChar до Delphi7 (включительно) по умолчанию это указатель на PAnsiChar в более старших версиях PWideChar какой PChar в библиотеке - подскажет отладчик или документация (скорее всего PAnsiChar) по работе с PChar (да и вообще с любыми указателями, динамическими массивами и т.п.): общее правило - там, где память выделена, там она и должна освободиться (в Dll или программе), конечно если использовать стандартный менеджер памяти Понять, что хочет заказчик - бесценно, ведь он платит MasterCard ![]() |
Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
MrBadge (10.10.2012)
|