Главная страница
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.041 c
15-1140528229
Axis_of_Evil
2006-02-21 16:23
2006.03.19
WiFi trouble


3-1138032431
pupkin
2006-01-23 19:07
2006.03.19
Создание ADOQuery в run-time


3-1138175325
Sergey_S
2006-01-25 10:48
2006.03.19
Работа с Access через ADO


15-1141062614
Джо
2006-02-27 20:50
2006.03.19
Бюрократия и государственный строй


2-1141544280
NSK3D
2006-03-05 10:38
2006.03.19
Ошибка сохранения