![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 или программе), конечно если использовать стандартный менеджер памяти |
| Этот пользователь сказал Спасибо cotseec за это полезное сообщение: | ||
MrBadge (10.10.2012)
| ||