Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Подключение C++ dll в delphi


Автор: SANCHO123 11.8.2010, 22:05
Здравствуйте!

Есть dll на с++

в ней функция:
Код

extern "C" __declspec(dllexport) int __stdcall start(int mode)
{
....
....
....
return 0;
}


Подключаю в delphi, вызываю функцию:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  h: Thandle;
  Proc: function(mode:integer): integer; stdcall;
begin
   h := LoadLibrary('net_f.dll');
   @Proc := GetProcAddress(h, '_start@0');
   Proc(1);
end;


В результате ошибка "Access violation at address 00000000. Read of address 00000000"
Если сделать функцию без параметров, то ошибка не возникает. 

Что я делаю не правильно?






Автор: xkor 11.8.2010, 22:59
GetProcAddress возвращает не ноль?
функция точно экспортируется как "_start@0"?

Автор: SANCHO123 11.8.2010, 23:18
Вот так работает:
Код

extern "C" __declspec(dllexport) int __stdcall start()
{
....
....
....
return 0;
}


Код

procedure TForm1.Button1Click(Sender: TObject);
var
  h: Thandle;
  Proc: function(): integer; stdcall;
begin
   h := LoadLibrary('net_f.dll');
   @Proc := GetProcAddress(h, '_start@0');
   Proc();
end;


Но мне нужно запускать функцию с параметрами.


Автор: bems 12.8.2010, 08:11
Разберись с именем. Посмотри каким-нить РЕ-редактором/вьювером как на самом деле экспортируется

Автор: Alexeis 12.8.2010, 09:28
Декоратор @0 не является универсальным и зависит от параметров. 
Для extern "C" __declspec(dllexport) int __stdcall start(int mode)

Proc := GetProcAddress(h, '_start@4');

Добавлено через 2 минуты и 19 секунд
Для удобства пользования я бы рекомендовал перебабахать имена экспортных функций в Dll, например при помощи def файла.
типа 
Код

LIBRARY Mylib
EXPORTS
start= _start@4 PRIVATE

Автор: SANCHO123 12.8.2010, 11:04
Proc := GetProcAddress(h, '_start@4');

Так работает, большое спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)