Текущий архив: 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.46 MB
Время: 0.004 c