Текущий архив: 2006.03.19;
Скачать: CL | DM;
Внизвызов процедуры из DLL Найти похожие ветки
← →
Yozch1 (2006-02-09 22:51) [0]На есть DLL , написана на С
Функция в ней.
bool CodeDecode(char *fname,char *key);
Вызываю так
procedure TForm6.test();
type TCodeDecode = function(fname, key: pchar):boolean;
Var
CryptDLL : THandle;
CodeDecode : TCodeDecode;
begin
CryptDLL := LoadLibrary(Pchar("crypt"));
if CryptDLL=0 then
begin
showmessage("Лажа");
exit;
end;
@CodeDecode := GetProcAddress(CryptDLL,Pchar("Code"));
if @CodeDecode=NIL then
begin
showmessage("Лажа");
// Exit;
end;
chKey:="ryrtyrtyrtyty;
if CodeDecode( pchar(fileforexport), pchar(chKey) ) then showmessage("ОК!");
FreeLibrary(CryptDLL);
end;
В этой строке
@CodeDecode := GetProcAddress(CryptDLL,Pchar("Code"));
@CodeDecode упорно получает Nil
В чем дело. Dll рабочая. Что-=то с типами не то.
Подскажите пожалуйста где глюк.
← →
palva © (2006-02-10 00:22) [1]Может быть, cdecl нужно добавить:
type TCodeDecode = function(fname, key: pchar):boolean; cdecl;
Кроме того, вы не ошиблись с именем Code в параметре при обращении к GetProcAddress? Сначала ведь было CodeDecode.
← →
Poirot © (2006-02-10 09:15) [2]Если 1 не помогло, то:
Да и вы точно уверены что имя именно такое при экспорте?! что-то я конечно ен помню, но помоему bool в С не было или я не прав (просто могу ошибаться)?!
Если это С++ то у вас експор может быть по очень даже неприличному имени - см таблицу импорта
← →
evvcom © (2006-02-10 09:21) [3]
> Может быть, cdecl нужно добавить:
это будет ответом на второй вопрос типа "А почему на строчке if CodeDecode(...) я получаю AV?" А на первый вопрос все-таки ответ "нет такого имени в таблице экспорта"
← →
StriderMan © (2006-02-10 14:00) [4]Можно при помощи Dependency Walker (кажется он в Visual Studio поставляется) посмотреть реальные имена экспортируемых функций.
← →
PVOzerski © (2006-02-10 14:17) [5]1) Boolean - 1 бит, BOOL - несколько (в win32 - 4) => longbool.
2) Надо бы дампануть dll. и выяснить mangled name, которое и указать: например, @CodeDecode := GetProcAddress(CryptDLL,Pchar("_code"));
← →
Yozch1 (2006-02-10 15:17) [6]Спасибо всем ответившим.
Дело именно в том, что в таблице импорта процедура была описана с префиксом "_"
А сымое маразматическое, чего я так и не понял, что вызывается не @CodeDecode := GetProcAddress(CryptDLL,Pchar("_code")),
а именно
@CodeDecode := GetProcAddress(CryptDLL,"_code")
а с BOOL или Boolean все нормально, если ок возвращает true
Использование cdecl; тоже нужно было обязательно.
Всем еще раз спасибо.
← →
Digitman © (2006-02-10 15:29) [7]
> Дело именно в том, что в таблице импорта процедура была
> описана с префиксом
Поколено как она была "описана".
Важна позиционная зависимость кода.
Страницы: 1 вся ветка
Текущий архив: 2006.03.19;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.012 c