Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetProcAddress fails, почему?


Автор: juriy9 10.6.2005, 14:28
Вобщем, сделал dll, там (для теста) экспортируется функция
Код

. . . . . .
__declspec (dllexport) void func ();  // Чёрт меня побери, конечно там сначала __declspec, а потом void
. . . . . . 
void func () {
}
. . . . . .

В программе, которая использует dll, код такой:
Код

#include <windows.h>
#include <matrix.h>  // заголовочный файл для моёй dll

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int) {

  HMODULE hMatrixModule = LoadLibrary ("matrix.dll");

  FARPROC CMatrix_CMatrix = GetProcAddress (hMatrixModule, "func");
  return 0;
}

CMatrix_CMatrix - делается NULL, GetLastError возвращает код ошибки, означающий что вобщем функция не найдена, hMatrixModule - тут проверял - не NULL.
В чём может быть дело? Может я не правильно имя функции ("func") указал? Все по MSDN делал.

Автор: UncleBob 10.6.2005, 14:35
Посмотри DLL Dependency Walker'ом. Скорее всего имя функции выглядит так: _func

Автор: Fixin 10.6.2005, 21:31
Код
extern "C"
Попробуй юзать.
Добавлено @ 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 файл? Если нет, то нифига работать не будет. Создай файл и пропиши в нем:
Цитата
LIBRARY      "MyLibrary"
DESCRIPTION  'MyLibrary Windows Dynamic Link Library'
EXPORTS
func  @1
Myfunc  @2
NextMyfunc @4

Автор: 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 функций smile
Поэтому, как и в обьявлении, в описании функции также должно быть название __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. Я попробовал его - всё работает! Потом попробовал
Код

extern "C" CLASS_DLLEXPORT void func ();

CLASS_DLLEXPORT - __declspec (dllexport) или __declspec (dllimport) в зависимости от того, к чему подключается .h-файл
Имя стало нормальное - просто func.
Всем огромное спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)