Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2012, 00:07
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

Есть 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  
Старый 04.10.2012, 10:10
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Для начала почитай вот это
href=http://www.transl-gunsmoker.ru/2009/09/pchars.html
Ответить с цитированием
  #3  
Старый 04.10.2012, 19:44
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

/*повторюсь */
char*==PChar, а не string, отсюда, скорее всего, и ошибка обращения к памяти

Upd:
PChar до Delphi7 (включительно) по умолчанию это указатель на PAnsiChar
в более старших версиях PWideChar
какой PChar в библиотеке - подскажет отладчик или документация (скорее всего PAnsiChar)
по работе с PChar (да и вообще с любыми указателями, динамическими массивами и т.п.): общее правило - там, где память выделена, там она и должна освободиться (в Dll или программе), конечно если использовать стандартный менеджер памяти
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
Этот пользователь сказал Спасибо cotseec за это полезное сообщение:
MrBadge (10.10.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:21.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025