информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Все любят медПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Почему прога не находит ф-цию в DLL???? 03.12.01 04:40  Число просмотров: 1105
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
у меня стоит BCC5.02 поэтому вместо DEF файла я указываю параметры прям в CPP файле:

BOOL __declspec(dllexport) DLLFunction1(...)

и все компилица без проблем.

кстати, если ту же самую ДЛЛку юзать в LOAD-TIME моде -то все пашет!

Что делать - не знаю..... уж скоро на стену полезу... боюсь правда не поможет ((

что делать то?
<programming>
Почему прога не находит ф-цию в DLL???? 03.12.01 03:47  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Ребят -помогите выйти из тупика пожалуйста потому что я который день ничего не понимаю!!!

Проблема:
Есть DLL. В ней ф-ция BOOL __declspec(dllexport) WINAPI DLLFunction1(void*, char *)
Есть модуль, который грузит run-time'ом DLL и ищет адрес ф-ции (GetProcAddress), но ф-ции не находит, хотя регистр соблюдаеца и все компилица без ошибок.

Вопрос: почему он не нахоит эту чертову ф-цию???
Я пробовал вместо моей DLL загружать USER32.DLL и таким же способом вызывать MessageBoxA (со всему параметрами) - он все находит и загружает ее!
Может проблема в DLL?????
Подскажите пожалуйста?
Спасибо
Почему прога не находит ф-цию в DLL???? 03.12.01 04:10  
Автор: Biasha <Бяша> Статус: Member
<"чистая" ссылка>
> Проблема:
> Есть DLL. В ней ф-ция BOOL __declspec(dllexport) WINAPI
> DLLFunction1(void*, char *)
> Есть модуль, который грузит run-time'ом DLL и ищет адрес
> ф-ции (GetProcAddress), но ф-ции не находит, хотя регистр
> соблюдаеца и все компилица без ошибок.
А ты уврен, что имя функции правильно вписываешь?
Ты случайно не "DLLFunction1", без DEF файла пишешь?

> Может проблема в DLL?????
Попробуй посмотреть свою длл программой depends.exe из vc++.
Почему прога не находит ф-цию в DLL???? 03.12.01 04:40  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
у меня стоит BCC5.02 поэтому вместо DEF файла я указываю параметры прям в CPP файле:

BOOL __declspec(dllexport) DLLFunction1(...)

и все компилица без проблем.

кстати, если ту же самую ДЛЛку юзать в LOAD-TIME моде -то все пашет!

Что делать - не знаю..... уж скоро на стену полезу... боюсь правда не поможет ((

что делать то?
Почему прога не находит ф-цию в DLL???? 03.12.01 20:39  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> у меня стоит BCC5.02 поэтому вместо DEF файла я указываю
> параметры прям в CPP файле:
>
> BOOL __declspec(dllexport) DLLFunction1(...)
>
> и все компилица без проблем.
>
> кстати, если ту же самую ДЛЛку юзать в LOAD-TIME моде -то
> все пашет!
>
> Что делать - не знаю..... уж скоро на стену полезу... боюсь
> правда не поможет ((
>
> что делать то?

esli ty ivyzyvaesh' kak : LoadModule(), potom GetProcAddress(), to tebe nado vpisat'BCEv .DEF file, inache smotri kakoe u nego imja, ono dolzhno byt' iskazhennoe.
esli zhe ty ego gruzish' isol'zuja LIB file, to chto to ne to v tvoix options. luchshe vsego sbros' sjuda svoi compiler&linker options DLL i EXE file-ov.
Почему прога не находит ф-цию в DLL???? 03.12.01 07:09  
Автор: NKritsky Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Может быть борланд понапихал своих символов в имя функции (некоторые C компиляторы любят такие вещи)?

Запусти tdump.exe на свою dll и посмотри как там написано имя ф-ии.
Почему прога не находит ф-цию в DLL???? 03.12.01 21:16  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
По порядку:
1) Имя ф-ции в ДЛЛ:
Exports from dll.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Ordinal RVA Name
------- -------- ----
0000 000011c4 DLLFunction1(void*,char*,char*,unsigned int)
0001 00001211 DLLFunction2(void*,char*)
0002 000017f4 __lockDebuggerData()
0003 0000181c __unlockDebuggerData()
0004 0000a25c __DebuggerHookData

Сама функция:

BOOL __declspec(dllexport) DLLFunction1(HWND hwnd, char *Msg, char *Title, UINT Btn){
MessageBox(hwnd, Msg, Title, Btn);
return TRUE;
}

2) Вызов из главного модуля:
void (__stdcall *ProcAddr)(void *,char *, char *, UINT);
if((hinstLib = LoadLibrary("dll.dll"))!=0){
ProcAddr= (void(__stdcall *) (void *,char *, char *, UINT)) GetProcAddress(hinstLib, "DLLFunction1");
if(ProcAddr){
ProcAddr(0,"LEFT. Success.\n","Title: DLLFunction1",MB_OK);
}
else{
//error и так далее

3) DEF файлы я не делаю т.к. Programmer's Guide прямо на это и говорит что можно обойтись лишь __declspec(...)/

Ребят, ну что ж это такое!!! Где тут ошибка? (не говорите что в ДНК :)) )
Спасибо.
Почему прога не находит ф-цию в DLL???? 03.12.01 22:26  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> По порядку:
> 1) Имя ф-ции в ДЛЛ:
> Exports from dll.dll
> 5 exported name(s), 5 export addresse(s). Ordinal base
> is 1.
> Ordinal RVA Name
> ------- -------- ----
> 0000 000011c4
> DLLFunction1(void*,char*,char*,unsigned int)
> 0001 00001211 DLLFunction2(void*,char*)
> 0002 000017f4 __lockDebuggerData()
> 0003 0000181c __unlockDebuggerData()
> 0004 0000a25c __DebuggerHookData
>

Видишь, раз TDUMP показывает параметры ф-й, значит имена искажаются.

> Сама функция:
>
> BOOL __declspec(dllexport) DLLFunction1(HWND hwnd,
> char *Msg, char *Title, UINT Btn){
> MessageBox(hwnd, Msg, Title, Btn);
> return TRUE;
> }
>
> 2) Вызов из главного модуля:
> void (__stdcall *ProcAddr)(void *,char *, char *, UINT);
> if((hinstLib = LoadLibrary("dll.dll"))!=0){
> ProcAddr= (void(__stdcall *) (void *,char *, char *,
> UINT)) GetProcAddress(hinstLib, "DLLFunction1");
> if(ProcAddr){
> ProcAddr(0,"LEFT. Success.\n","Title:
> DLLFunction1",MB_OK);
> }
> else{
> //error и так далее
>
> 3) DEF файлы я не делаю т.к. Programmer's Guide прямо на
> это и говорит что можно обойтись лишь __declspec(...)/

Брехня, выкини/сотри этот Programmer's Guide :)
Тут необходим .DEF файл, либо импортируй ее по ординалу (посмотри его в TDUMP)
напр. импортируем DLLFunction2:
(FARPROC) ProcAddr = GetProcAddress(hinstLib, MAKEINTRESOURCE(1));
Почему прога не находит ф-цию в DLL???? 03.12.01 22:52  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Ну вот смотри сам: (Borland C++ Programmer's Guide)

Exporting and Importing Functions:

To make your DLL functions accessible to other applications (.EXEs or other DLLs) the function names must be exported. To use exported functions, the function names must be imported.

Exporting Functions:

There are two ways to export functions:

1) Create a module-definition file with an EXPORTS section listing all functions that will be used by other applications. The IMPDEF tool can help you do this.
2) Precede every function name to be exported in the DLL with the keyword _export in the function definition.

A function must be exported from a DLL before it can be imported to another DLL or application.

Это говорит о том что ИЛИ ИЛИ....
Я юзаю второй способ - но фиг вам как грица!!!

Ребят, может скинете тада проект для BCC 5.02 с работающим run-time dll примером???
nu i upryamyj zhe ty :-))) Zabud' obo vsem, delaj kak tebe govoryat. 03.12.01 23:28  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
mlya, byvaet zhe tak, uprutsya rogami i ni shagu nazad.
+ 03.12.01 23:19  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
)))) блин я с ддлками никада не работал.. поэтому щас приходица читать то что есть.. но как ты сам видел ни слова про foo нигде нету....

тада вместо того чтоб @#$%еть бездарно лушше б сказал что и как мне пофиксить с линкованием.... если можно то подетальнее плиз... thanx anyway mate ))
Dlia tupogo i uprimogo barana! 03.12.01 22:56  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Delo v tom chto foo v tvoem sluchaee exportiruetsia, no imia izmeniaetsia linkerom !!!!
!!!

P.S. Bliad` pizdec kakoi upertyii!!!
Dlia tupogo i uprimogo barana! 04.12.01 01:25  
Автор: Biasha <Бяша> Статус: Member
<"чистая" ссылка>
> Delo v tom chto foo v tvoem sluchaee exportiruetsia, no
> imia izmeniaetsia linkerom !!!!
> !!!
>
> P.S. Bliad` pizdec kakoi upertyii!!!
Это уж точно :)
Ещё я ему про несоответствие имён и DEF файл писал :)

Ну конечно же - это ж DEF файл писать нужно, а его ж писать облом :)
поставь перед определением функции extern"C" - тогда имя не будет искажено 03.12.01 22:07  
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
ggg - Помогло!!! Спасибо! 04.12.01 00:02  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Итак, посрав на все DEF файлы, поставил extern "C" перед ф-цией в ДЛЛ. После этого tdump показывал DLLFunction уже так: _DLLFucntion1 и без параметров!
Заработало!

Огромное спасибо GGG и всем остальным.
ggg - Помогло!!! Спасибо! 04.12.01 00:16  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> Итак, посрав на все DEF файлы, поставил extern "C" перед
> ф-цией в ДЛЛ. После этого tdump показывал DLLFunction уже
> так: _DLLFucntion1 и без параметров!
> Заработало!
>

Тут народ в основном MSVC юзает, а там если ф-я _stdcall, даже _extern "C" не поможет. А ты ее как _stdcall экспортировал, или _cdecl?

Ну неужели у Борланда все как у людей: и extern "C" нормально работает, и implib есть... А в MSVC в таких случаях надо с DEF файлами извращаться.
ggg - Помогло!!! Спасибо! 04.12.01 00:47  
Автор: BXS Статус: Незарегистрированный пользователь
<"чистая" ссылка>
))) Да 2 года назад поглядел на MFC и их родной визуальный IDE - мне как то он не понравился.. с тех пор строго на BCC!

А объявил я так:
в DLL:
extern "C" BOOL _export DLLFunction1(HWND hwnd, char *Msg, char *Title, UINT Btn);

а вызывал из главного модуля так:

ProcAddr= (void(_export *) (void *,char *, char *, UINT)) GetProcAddress(hinstLib, "_DLLFunction1");

Причем во втором случае не __stdcall а именно _export.
ggg - Помогло!!! Спасибо! 04.12.01 09:19  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
> А объявил я так:
> в DLL:
> extern "C" BOOL _export DLLFunction1(HWND hwnd, char *Msg,
> char *Title, UINT Btn);

Понятно, по умолчанию действует _cdecl
А интересно, со _stdcall тоже получится?

> а вызывал из главного модуля так:
>
> ProcAddr= (void(_export *) (void *,char *, char *, UINT))
> GetProcAddress(hinstLib, "_DLLFunction1");
>
> Причем во втором случае не __stdcall а именно _export.
interestno, a file kakoj? .CPP or .C ? 04.12.01 13:09  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
te be zhe skazali, "Esli hochesh ispolzovat1 LoadLibray(), GetProcAddress("TvoeImia"), dolzhen ob`iavit foo v .DEF file. Potomuchto esli net ee v .DEF Linker izmeniaet imia tvoiei foo, ispolzui "Dependency Walker" i ty uvudish chto linker tebe zgeneril. 03.12.01 22:06  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach