Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.01;
Скачать: CL | DM;

Вниз

Проблема с обращением к dll   Найти похожие ветки 

 
leonidus ©   (2007-06-07 14:03) [0]

Господа, подскажите пожалуйста, есть 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`ке?


 
MBo ©   (2007-06-07 14:14) [1]

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

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


 
leonidus ©   (2007-06-07 14:18) [2]

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

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


 
MBo ©   (2007-06-07 14:24) [3]

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

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


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


> ENGINE_API WORD InitEngine(LPCTSTR wszPath);

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


 
Dimaxx ©   (2007-06-07 17:02) [5]


> Может я как-то неправильно обращаюсь к 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 или еще как извращенно. Тогда пробовать или искать доку на либу.


 
Dimaxx ©   (2007-06-07 17:03) [6]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.07.01;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
2-1181112918
Neket
2007-06-06 10:55
2007.07.01
Предотвратить запуск Excel 2 :-((


2-1181218305
>>DEATH<<
2007-06-07 16:11
2007.07.01
вытаскивание переменных из xml


2-1181140831
Bora_ru
2007-06-06 18:40
2007.07.01
Handle окна по неполному названию


2-1181210608
leonidus
2007-06-07 14:03
2007.07.01
Проблема с обращением к dll


15-1180528520
zdm
2007-05-30 16:35
2007.07.01
Клипы