Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с обращением к dll


leonidus ©   (2007-06-07 14:03:00) 

Господа, подскажите пожалуйста, есть dll и описание доступа к нему на Си, и нужно обратится к ней из Delphi.

В частности описание 2-х первых функций:

ENGINE_API WORD InitEngine(LPCTSTR wszPath);

Производит инициализацию Engin’a.
wszPath – путь к папке.

DENGINE_API void DoneEngine();
Завершение работы с Engin’ом.

Делаю так:

var
InitEngine: function(NameFile: string): word; stdcall;
hinstLib: integer;
begin
hinstLib:= LoadLibrary('d:\Exp\Engine.dll');
if hinstLib <> 0 then
begin
@InitEngine:=GetProcAddress(hinstLib, 'InitEngine');
if nil <> @InitEngine then
 begin
 
 //!!!!!!!!!!!

 end;

 FreeLibrary(hinstLib);
end;
end;

но туже где я поставил восклицательные знаки программа почему-то не доходит, хотя до проверки if nil <> @InitEngine then доходит нормально. В чем же дело? Может я как-то неправильно обращаюсь к dll`ке?


Однокамушкин   (2007-06-08 13:47:00) [1]

Надо ещё посмотреть, что это за макрос ENGINE_API... скорее всего он просто содержит __declspec(dllimport) и тогда на него можно забить, но на всякий случай стоит проверить...


Dimaxx   (2007-06-07 17:03:00) [2]

Тьфу, var InitEngine: function(NameFile: PChar): word; stdcall;


Dimaxx   (2007-06-07 17:02:00) [3]


> Может я как-то неправильно обращаюсь к dll`ке?

Ты еще не успел к ней обратиться.

var
 InitEngine: function(NameFile: string): word; stdcall;
 DoneEngine: procedure; stdcall;
 hinstLib: integer;

begin
 hinstLib:= LoadLibrary('d:\Exp\Engine.dll');
 if hinstLib<>0 then
 begin
   @InitEngine:=GetProcAddress(hinstLib, 'InitEngine');
   @DoneEngine:=GetProcAddress(hinstLib, 'DoneEngine');
   if @InitEngine<>nil then InitEngine(PChar('c:\workdir'));
   if @DoneEngine<>nil then DoneEngine;
   FreeLibrary(hinstLib);
 end;
end;


Примерно так. Возможно соглашение о передаче параметров не stdcall, а, например, cdecl или еще как извращенно. Тогда пробовать или искать доку на либу.


clickmaker   (2007-06-07 15:02:00) [4]


> ENGINE_API WORD InitEngine(LPCTSTR wszPath);

это может быть и const PChar и const PWideChar в зависимости от сишного дефайна UNICODE.
Так что надо уточнять, уникодная ли DLL или нет


MBo   (2007-06-07 14:24:00) [5]

>TDump ?
программа в Delphi/bin

>да уверен, передомной дока лежит.
У сишников искажение имен (name mangling) выполняется автоматически (в зависимости от спецификаторов экспорта), поэтому в доке они всегда пишут неискаженное имя.


leonidus   (2007-06-07 14:18:00) [6]

>А ты уверен, что из DLLпроцедур экспортируется именно под именем 'InitEngine'
да уверен, передомной дока лежит.

А что это за зверь такой TDump ?


MBo   (2007-06-07 14:14:00) [7]

А ты уверен, что из DLLпроцедур экспортируется именно под именем 'InitEngine' ? Посмотри программой TDump, может быть искажение имен типа __InitEngine@8GxPdf

кроме того,  NameFile: string не соответствует LPCTSTR wszPath
PWideChar, видимо, должно быть


Наверх

Титульная страница Поиск, карта сайта Написать письмо