А>Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.
... А>Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...
Код правильный, но вам нужно проверить экспортируемые имена. Например так:
dumpbin /exports mydll.dll
Здравствуйте, <Аноним>, Вы писали:
А>Есть DLL, известны импортируемы функции, нужно произвести динамическую линковку.Пишу.
А откуда они известны? Из объявлений в .h? Из .def?
Если исходники С++ные, то, может быть, имена декорированы.
А>Вставление подчеркиваний к имени функции суть дела не меняет...Из-за чего происходит — понятно. Не понятно как лечить...
Лечить очень просто. Посмотреть (например, dumpbin /exports your.dll) какие там действительные имена (или вообще числа, если в .def было прописано) и использовать именно их.
В принципе у меня задача подключить именно __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
Здравствуйте, 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.
А как заставить компилятор джавы формировать "правильные" имена — для статической линковки или для экспорта — не знаю, не специалист.
Здравствуйте, loknalori, Вы писали:
L>В принципе у меня задача подключить именно __stdcall dll, ибо если ее собирать без __stdcall то вопросов нет, но это противоречит постановке задачи...
При __stdcall соглашении о вызове имя функции декорируется так — после имени добавляется '@' и число, соответствующее размеру, занимаемому аргументами функции в стеке.
L>0) .def — а это что такое?
Module definition file, вроде так это называется.
Вот, здесь видно, что имена подверглись декорации.
Надо создать .def файл, подключить его к проекту (где-то на вкладке linker) и там написать что-то типа