![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
juriy9 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 10.6.2005 Репутация: нет Всего: нет |
Вобщем, сделал dll, там (для теста) экспортируется функция
В программе, которая использует dll, код такой:
CMatrix_CMatrix - делается NULL, GetLastError возвращает код ошибки, означающий что вобщем функция не найдена, hMatrixModule - тут проверял - не NULL. В чём может быть дело? Может я не правильно имя функции ("func") указал? Все по MSDN делал. Это сообщение отредактировал(а) juriy9 - 11.6.2005, 16:37 |
||||
|
|||||
UncleBob |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 6.6.2005 Где: vo.spb.ru Репутация: нет Всего: нет |
Посмотри DLL Dependency Walker'ом. Скорее всего имя функции выглядит так: _func
|
|||
|
||||
Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 8 Всего: 18 |
Добавлено @ 21:35 Хотя... наверное, это не то. Это сообщение отредактировал(а) Fixin - 10.6.2005, 21:35 |
|||
|
||||
LuckLess |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 15.9.2004 Репутация: нет Всего: 1 |
Extern "C" здесь как раз поможет.
Или как говорит UncleBob |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 1 Всего: 92 |
VC++ к функциям при экспорте приделавает всякую ерунду. Для загрузки с помощью LoadLibrary и GetProcAdress (как уже сказали) нужно перед типом функции extern "C" написать.
|
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 4 Всего: 47 |
А в проекте dll-ки существует *.def файл? Если нет, то нифига работать не будет. Создай файл и пропиши в нем:
|
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
_Fixin_
Недавно Фантазист про это как раз говорил - это вобще не обязательно, существуют два варианта обьявления экспортируемых функций, применительно к использованию в неявной загрузке. Это как раз один из вариантов. PS bel_nikita как раз говорит про второй вариант, вернее нужную для его работы операцию. надо во первых так: __declspec (dllexport) void func (); Ибо как тут уже сказали, скорее всего в памяти имя будет _func , а адресс и имя самой функции не попадут в таблицу экспортируемых, как раз по которой пробегается GetProcAddress(...); Это сообщение отредактировал(а) En_t_end - 11.6.2005, 05:59 |
|||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
А вот ещё увидел хрень.
Здесь ведь не классовое использование 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); } Это сообщение отредактировал(а) En_t_end - 11.6.2005, 07:49 |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 1 Всего: 92 |
Я делал вызов по GetProcAdress без def-а:
extern "C" __declspec(dllexport) void MyFuc {} Можно продефайнить: #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT void MyFunc {} (это если функций много). |
|||
|
||||
juriy9 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 10.6.2005 Репутация: нет Всего: нет |
Я Walker нашёл, посморел - там имя вообще вот такое: ?func@@YAXXZ. Я попробовал его - всё работает! Потом попробовал
CLASS_DLLEXPORT - __declspec (dllexport) или __declspec (dllimport) в зависимости от того, к чему подключается .h-файл Имя стало нормальное - просто func. Всем огромное спасибо! Это сообщение отредактировал(а) juriy9 - 11.6.2005, 16:41 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |