WinAPI : GetProcAdress
Dette er egentlig et blandet VB / C++ spørgsmål, men jeg gættede mig til, at der var størst chance for at få svar i denne kategori...Jeg har brugt wizard'en i VC++ til at skabe en MFC shared DLL. I den har jeg så skrevet flg. funktion:
LRESULT CALLBACK __stdcall LowLevelKeyboardProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // message data
)
{
bool eatKeyStroke = false ;
KBDLLHOOKSTRUCT p ;
if ( nCode = HC_ACTION )
{
if ( wParam == WM_KEYDOWN || wParam == WM_KEYUP ||
wParam == WM_SYSKEYDOWN || wParam == WM_SYSKEYUP )
{
CopyMemory( &p, &lParam, sizeof(p) ) ;
eatKeyStroke = ((( p.vkCode == VK_TAB ) && ( (p.flags & LLKHF_ALTDOWN) != 0 )) ||
(( p.vkCode == VK_ESCAPE ) && ( (p.flags & LLKHF_ALTDOWN )!= 0 ) ) ||
(( p.vkCode == VK_ESCAPE ) && ( (GetKeyState(VK_CONTROL) & 0x8000) != 0 ) ) ) ;
}
}
if (eatKeyStroke)
return -1 ;
else
return CallNextHookEx(0, nCode, wParam, lParam );
}
Min .DEF fil ser således ud:
LIBRARY "khook"
EXPORTS
; Explicit exports can go here
LowLevelKeyboardProc
DLL kan kompileres uden problemer. Nu ønsker jeg at bruge den fra Visual Basic til at håndtere keyboard events, før de bliver behandlet af Windows, ved at bruge API kaldet:
Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, _
ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Her skal lpfn være en pointer til den funktion, som skal håndtere keyboard messages (denne er LowLevelKeyBoardProc, som ligger i DLL'en). Jeg har læst mig frem til, at jeg kan finde denne pointer ved først at bruge LoadLibrary til at få et handle til DLL'en og derefter få pointeren med GetProcAddress, altså sådan her:
hLib = LoadLibrary("hook.dll")
hProc = GetProcAddress(hLib, "LowLevelKeyboardProc")
Her kommer mit problem så: Når GetProcAddress kaldes, genereres en fejl; fejlmeddelelsen ser således ud:
'An unhandled exception of type 'System.NullReferenceException' occurred in minibrowser.exe
Additional information: Object reference not set to an instance of an object'
Hvordan får jeg GetProcAddress til at fungere ? Er det fordi at navnet LowLevelKeyboardProc ikke er exporteret rigtigt fra DLL'en (jeg er ret ny i C++)
Jeg bruger Visual Studio .NET under Windows XP.