Avatar billede driis Nybegynder
14. december 2002 - 18:33 Der er 6 kommentarer og
3 løsninger

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.
Avatar billede doctorseb Nybegynder
14. december 2002 - 20:40 #1
Har du selv erkllæret LoadLibrary og GetProcAddress, eller får man dem foræret i VB.NET?

Check værdien af hLib efter kaldet til LoadLibrary. Er den = 0 er et eller andet gået galt undervejs og du kan ikke kalde GetProcAddress.

Du kan checke at din DLL's eksport ser fornuftig ud med depends.exe eller dumpbin.exe der begge følger med Visual Studio.

Held og lykke,
/doctorseb!
Avatar billede driis Nybegynder
14. december 2002 - 22:02 #2
Ja, LoadLibrary og GetProcAddress er deklareret. hLib får en værdi tildelt af LoadLibrary, og det er først når jeg bruger GetProcAddress, at det går galt.

Jeg kigger på depends.exe / dumpbin.exe i morgen :-)
Avatar billede driis Nybegynder
17. december 2002 - 12:37 #3
Nu har jeg kigget på DLL'en i depends.exe Jeg får en fejlmeddelelse om, at filen EFSADU.dll ikke kan findes... Hvad er det for en fil, og hvorfor er den ikke på mit system ?

Se evt: http://driis.mobilixnet.dk/dependsfejl.jpg
Avatar billede tam Nybegynder
17. december 2002 - 12:52 #4
Det var underligt, EFSADU.dll burde findes i dit system32 dir hvis du kører WinXP.
Hvorfor din dll bruger denne fil, kan jeg ikke svare på uden at se alle includes du laver i dit program.

EFSADU.dll er til Windows' encrypted filesystem.
Avatar billede driis Nybegynder
17. december 2002 - 13:03 #5
Det eneste include jeg laver er windows.h:

#include <windows.h>
Avatar billede driis Nybegynder
17. december 2002 - 13:04 #6
... og jeg har kontrolleret på min stationære og bærbare, begge "mangler" EFSADU.dll
Avatar billede tam Nybegynder
17. december 2002 - 13:16 #7
Hmmm, underligt. Så kan jeg ikke hjælpe uden selv at sidde med det...

- Anders
Avatar billede driis Nybegynder
17. december 2002 - 13:20 #8
Det er vel ikke sådan, at du kunne sende mig efsadu.dll, så jeg kunne kontrollere, om resten af min kode virker ? Det ville hjælpe meget i fejlfindingen ...
Avatar billede driis Nybegynder
18. december 2002 - 13:22 #9
Nå, jeg har ikke fået det til at virke endnu, og da jeg har en deadline, benytter jeg en anden ( lidt mere u-elegant ) metode til at opnå funktionaliteten. I får hver lidt point for ulejligheden.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester