Итак, посрав на все DEF файлы, поставил extern "C" перед ф-цией в ДЛЛ. После этого tdump показывал DLLFunction уже так: _DLLFucntion1 и без параметров!
Заработало!
Ребят -помогите выйти из тупика пожалуйста потому что я который день ничего не понимаю!!!
Проблема:
Есть 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 моде -то > все пашет! > > Что делать - не знаю..... уж скоро на стену полезу... боюсь > правда не поможет (( > > что делать то?
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 Статус: Незарегистрированный пользователь
> По порядку: > 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 Статус: Незарегистрированный пользователь
> 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
Итак, посрав на все DEF файлы, поставил extern "C" перед ф-цией в ДЛЛ. После этого tdump показывал DLLFunction уже так: _DLLFucntion1 и без параметров!
Заработало!
> Итак, посрав на все DEF файлы, поставил extern "C" перед > ф-цией в ДЛЛ. После этого tdump показывал DLLFunction уже > так: _DLLFucntion1 и без параметров! > Заработало! >
Тут народ в основном MSVC юзает, а там если ф-я _stdcall, даже _extern "C" не поможет. А ты ее как _stdcall экспортировал, или _cdecl?
Ну неужели у Борланда все как у людей: и extern "C" нормально работает, и implib есть... А в MSVC в таких случаях надо с DEF файлами извращаться.
> А объявил я так: > в 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 Статус: Незарегистрированный пользователь