Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.059 c
15-1140613013
vidiv
2006-02-22 15:56
2006.03.19
посоветуйте дизассемблер


15-1140781534
Сатир
2006-02-24 14:45
2006.03.19
Подавление сообщений Excel


2-1141032793
dem_1112
2006-02-27 12:33
2006.03.19
dbchart очень срочно нужен ответ


15-1140778361
Суслик
2006-02-24 13:52
2006.03.19
Вопрос про перечилимые типы


15-1140614702
ArtemESC
2006-02-22 16:25
2006.03.19
Редактор физических секторов диска...