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

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

вызов процедуры из 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.


Наверх

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