![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вызов процедуры из DLL [D6, WinXP]
Yozch1 © (2006-02-09 22:51:00)На есть 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 рабочая. Что-=то с типами не то.
Подскажите пожалуйста где глюк.
Digitman (2006-02-10 15:29:00) [1]
> Дело именно в том, что в таблице импорта процедура была
> описана с префиксом
Поколено как она была "описана".
Важна позиционная зависимость кода.
Yozch1 (2006-02-10 15:17:00) [2]Спасибо всем ответившим.
Дело именно в том, что в таблице импорта процедура была описана с префиксом '_'
А сымое маразматическое, чего я так и не понял, что вызывается не @CodeDecode := GetProcAddress(CryptDLL,Pchar('_code')),
а именно
@CodeDecode := GetProcAddress(CryptDLL,'_code')
а с BOOL или Boolean все нормально, если ок возвращает true
Использование cdecl; тоже нужно было обязательно.
Всем еще раз спасибо.
PVOzerski (2006-02-10 14:17:00) [3]1) Boolean - 1 бит, BOOL - несколько (в win32 - 4) => longbool.
2) Надо бы дампануть dll. и выяснить mangled name, которое и указать: например, @CodeDecode := GetProcAddress(CryptDLL,Pchar('_code'));
StriderMan (2006-02-10 14:00:00) [4]Можно при помощи Dependency Walker (кажется он в Visual Studio поставляется) посмотреть реальные имена экспортируемых функций.
evvcom (2006-02-10 09:21:00) [5]
> Может быть, cdecl нужно добавить:
это будет ответом на второй вопрос типа "А почему на строчке if CodeDecode(...) я получаю AV?" А на первый вопрос все-таки ответ "нет такого имени в таблице экспорта"
Poirot (2006-02-10 09:15:00) [6]Если 1 не помогло, то:
Да и вы точно уверены что имя именно такое при экспорте?! что-то я конечно ен помню, но помоему bool в С не было или я не прав (просто могу ошибаться)?!
Если это С++ то у вас експор может быть по очень даже неприличному имени - см таблицу импорта
palva (2006-02-10 00:22:00) [7]Может быть, cdecl нужно добавить:
type TCodeDecode = function(fname, key: pchar):boolean; cdecl;
Кроме того, вы не ошиблись с именем Code в параметре при обращении к GetProcAddress? Сначала ведь было CodeDecode.