Dynamic dll + __stdcall
От: Аноним  
Дата: 21.11.06 16:36
Оценка:
Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.

typedef unsigned long (__stdcall *LPFNDLLFUNC2)();
LPFNDLLFUNC2 Func2;
....
Func2 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "GetNRelisation");//Func2 ==NULL


Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...
Re: Dynamic dll + __stdcall
От: Максим Алексейкин США  
Дата: 21.11.06 17:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.


А>
А>typedef unsigned long (__stdcall *LPFNDLLFUNC2)();
А>LPFNDLLFUNC2 Func2;
А>....
А>Func2 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "GetNRelisation");//Func2 ==NULL
А>


А>Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...


GetLastError пробовал?
Re: Dynamic dll + __stdcall
От: MShura  
Дата: 21.11.06 17:46
Оценка:
А>Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.
...
А>Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...

Код правильный, но вам нужно проверить экспортируемые имена. Например так:
dumpbin /exports mydll.dll
Re: Dynamic dll + __stdcall
От: Кодт Россия  
Дата: 21.11.06 18:20
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.


А откуда они известны? Из объявлений в .h? Из .def?
Если исходники С++ные, то, может быть, имена декорированы.

А>Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...


Лечить очень просто. Посмотреть (например, dumpbin /exports your.dll) какие там действительные имена (или вообще числа, если в .def было прописано) и использовать именно их.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Dynamic dll + __stdcall
От: loknalori Россия  
Дата: 22.11.06 07:45
Оценка:
В принципе у меня задача подключить именно __stdcall dll, ибо если ее собирать без __stdcall то вопросов нет, но это противоречит постановке задачи...

0) .def — а это что такое?
1) Определения мне известны (имена тоже). DLL есть в исходниках. Обьявления есть в H файле. В проект я его не линкую, а просто описываю тип typedef unsigned long (__stdcall *LPFNDLLFUNC2)(); Ибо я ЗНАЮ что тип такой.
2) GetLastError — 127 The specified procedure could not be found. Я это и так знаю
3) dumpbin.exe

Dump of file graph_bite.dll

File Type: DLL

Section contains the following exports for graph_bite.dll

00000000 characteristics
45632745 time date stamp Tue Nov 21 19:20:21 2006
0.00 version
1 ordinal base
3 number of functions
3 number of names

ordinal hint RVA name

1 0 00001050 _GetNRelisation@0
2 1 00001060 _GetRelisation@12
3 2 00001010 _cut_off@28

Summary

2000 .data
2000 .rdata
1000 .reloc
1000 .rsrc
9000 .text
Re[3]: Dynamic dll + __stdcall
От: loknalori Россия  
Дата: 22.11.06 07:59
Оценка:
Гм. Мозг проснулся. ф-ю вызвал. Теперь вопросы.

1)L>0) .def — а это что такое?
2) как быть с другими языками, например с дажвой, какое имя она должна вызывать (про танцы с бубнами вокруг JDK слышал)
Re[4]: Dynamic dll + __stdcall
От: Кодт Россия  
Дата: 22.11.06 09:14
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Гм. Мозг проснулся. ф-ю вызвал. Теперь вопросы.


L>1)L>0) .def — а это что такое?


Это исходник с информацией для линкера. В нём описывается, в частности, перечень экспортируемых функций и их имена.
В MSVC можно обойтись без .def-файла, используя __declspec(dllexport) (у других компиляторов тоже есть аналоги) — информация об экспорте помещается прямо в .obj-файлах; тогда возникают вопросы о декорировании:
extern "C" return_type __stdcall FooBar (params); // экспортное имя FooBar (совместимость с Platform SDK)
extern "C" return_type __cdecl FooBar (params); // экспортное имя _FooBar (как правило)
           return_type some_convention FooBar (params); // экспортное имя FooBar@xxxxxxxx где xxxxxxx несёт информацию о сигнатуре и зависит от компилятора


L>2) как быть с другими языками, например с дажвой, какое имя она должна вызывать (про танцы с бубнами вокруг JDK слышал)


Импортировать и вызывать — очевидно, то имя, которое содержится в DLL.
А как заставить компилятор джавы формировать "правильные" имена — для статической линковки или для экспорта — не знаю, не специалист.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[3]: Dynamic dll + __stdcall
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 28.11.06 09:44
Оценка:
Здравствуйте, loknalori, Вы писали:

L>В принципе у меня задача подключить именно __stdcall dll, ибо если ее собирать без __stdcall то вопросов нет, но это противоречит постановке задачи...


При __stdcall соглашении о вызове имя функции декорируется так — после имени добавляется '@' и число, соответствующее размеру, занимаемому аргументами функции в стеке.

L>0) .def — а это что такое?

Module definition file, вроде так это называется.



L> 1 0 00001050 _GetNRelisation@0

L> 2 1 00001060 _GetRelisation@12
L> 3 2 00001010 _cut_off@28

Вот, здесь видно, что имена подверглись декорации.
Надо создать .def файл, подключить его к проекту (где-то на вкладке linker) и там написать что-то типа

EXPORTS
GetNRelisation=GetNRelisation@0
GetRelisation=GetRelisation@12
cut_off=cut_off@28

Можно и просто:
GetNRelisation
GetRelisation
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.