| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > GetProcAddress fails, почему? |
| Автор: juriy9 10.6.2005, 14:28 | ||||
Вобщем, сделал dll, там (для теста) экспортируется функция
В программе, которая использует dll, код такой:
CMatrix_CMatrix - делается NULL, GetLastError возвращает код ошибки, означающий что вобщем функция не найдена, hMatrixModule - тут проверял - не NULL. В чём может быть дело? Может я не правильно имя функции ("func") указал? Все по MSDN делал. |
| Автор: UncleBob 10.6.2005, 14:35 |
| Посмотри DLL Dependency Walker'ом. Скорее всего имя функции выглядит так: _func |
| Автор: Fixin 10.6.2005, 21:31 | ||
Добавлено @ 21:35 Хотя... наверное, это не то. |
| Автор: LuckLess 10.6.2005, 21:51 |
| Extern "C" здесь как раз поможет. Или как говорит UncleBob |
| Автор: Любитель 10.6.2005, 23:58 |
| VC++ к функциям при экспорте приделавает всякую ерунду. Для загрузки с помощью LoadLibrary и GetProcAdress (как уже сказали) нужно перед типом функции extern "C" написать. |
| Автор: bel_nikita 11.6.2005, 00:35 | ||
А в проекте dll-ки существует *.def файл? Если нет, то нифига работать не будет. Создай файл и пропиши в нем:
|
| Автор: En_t_end 11.6.2005, 05:58 |
| _Fixin_ Недавно Фантазист про это как раз говорил - это вобще не обязательно, существуют два варианта обьявления экспортируемых функций, применительно к использованию в неявной загрузке. Это как раз один из вариантов. PS bel_nikita как раз говорит про второй вариант, вернее нужную для его работы операцию. надо во первых так: __declspec (dllexport) void func (); Ибо как тут уже сказали, скорее всего в памяти имя будет _func , а адресс и имя самой функции не попадут в таблицу экспортируемых, как раз по которой пробегается GetProcAddress(...); |
| Автор: En_t_end 11.6.2005, 06:09 |
| А вот ещё увидел хрень. Здесь ведь не классовое использование friend функций Поэтому, как и в обьявлении, в описании функции также должно быть название __declspec (dllexport) void func (); А вобще интересно, как компилятор компилит такую чушь ?... хммм получается что то вроде название есть - а процедуры нет. Хотя все правильно - в самой dll ты ведь не применяешь этй функцию(ну там при аттачивания ?) ?. Потому что если бы применял, то обязательно компилер выплюнул бы на это дело unresolved external symbol in !@#$func. Короче имхо. но все же сделай вот так: //Обьявление... можешь делать в макро процессе extern "C", но в твоем //случае оставляй как есть, но не забудь создать def файл, как сказал //bel_nikita __declspec (dllexport) void func (); //А вот и сама функция: __declspec (dllexport) void func (){ MessageBox(NULL, "Hello from vingrad", "vingrad forever", 0); } |
| Автор: Любитель 11.6.2005, 14:20 |
| Я делал вызов по GetProcAdress без def-а: extern "C" __declspec(dllexport) void MyFuc {} Можно продефайнить: #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT void MyFunc {} (это если функций много). |
| Автор: juriy9 11.6.2005, 16:33 | ||
Я Walker нашёл, посморел - там имя вообще вот такое: ?func@@YAXXZ. Я попробовал его - всё работает! Потом попробовал
CLASS_DLLEXPORT - __declspec (dllexport) или __declspec (dllimport) в зависимости от того, к чему подключается .h-файл Имя стало нормальное - просто func. Всем огромное спасибо! |