Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

вызов процедуры из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.013 c
4-1134633968
DSA
2005-12-15 11:06
2006.03.19
Помогите разобраться с DDE


15-1140674894
7BB
2006-02-23 09:08
2006.03.19
Оберон, Модула


2-1141406651
Alex7
2006-03-03 20:24
2006.03.19
Перехват исключения из "Paradox"


2-1141375218
Creative
2006-03-03 11:40
2006.03.19
Как увидеть из одного юнита класс, описанный во втором


3-1138456107
midavik
2006-01-28 16:48
2006.03.19
не работает Linked Servers из Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский