Как я могу вызвать функцию из DLL? - PullRequest
0 голосов
/ 10 июня 2010

Как я могу вызвать функцию из DLL?

Я пытался объявить пустой указатель и сохранить в нем результат GetProcAddress ... но не сработал.Я также хотел объявить unsigned long int (я видел это где-то в Интернете), но тогда я не знал, как продолжить.: D

Так, кто-нибудь возражал бы мне помочь?

Ответы [ 3 ]

2 голосов
/ 10 июня 2010

Попробуйте что-то вроде этого.

typedef int (*PFuncMethods)( int args );

hDLL  = LoadLibrary(L"your.dll");
if( !m_hDLL )
  return;

methods = (PFuncMethods)GetProcAddress(hDLL,"methods");
if ( !(methods) ) {
  FreeLibrary(hDLL);
  hDLL = NULL;
  methods = NULL;
  return;
} 

if( methods(1) == 0) ...

имя метода - то, где вы можете застревать.C ++ имеет искажение имени для перегрузки (даже если оно не перегружено), и это зависит от компилятора.Вы можете определить искаженное имя или отключить искажение для функции, используя extern "C".Вы можете использовать инструмент, подобный зависящий от.exe, чтобы увидеть все функции с точным именем, которое вам нужно использовать.

Статически ссылаться на DLL гораздо проще, используя (импорт) файл lib в Windows.1007 *

1 голос
/ 10 июня 2010

Вы должны иметь точную подпись функции и правильно навести указатель.

Например, если это функция, получающая int и возвращающая void:

typedef void (*funcptr)(int);
funcptr func = (funcptr)(void*)GetProcAddress(....)
func(17);

Примечание 1: Если вы перепутаете подпись, могут произойти очень плохие вещи. Примечание 2: вам также необходимо знать используемое соглашение о вызовах (cdecl, stdcall и т. Д.)

Если это ваша DLL, лучше вместо нее создать библиотеку импорта.

1 голос
/ 10 июня 2010

Вы должны создать указатель функции, а не указатель void, и сохранить результат в указателе этой функции из GetProcAddress.

...