c ++ - brug for hjælp til at oprette windows dll

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er ny til Windows programmering (jeg ved lidt om c og c ++). Jeg forsøger at oprette windows dll som registrerer windows hook for keyboard.I bruger eclipse CDT med MinGW (som jeg ikke vil bruge Visual Studio) til at oprette dll.I var i stand til at oprette dll for nedenstående program (kopieret herfra), men når jeg forsøger at indlæse det fra et andet program, hænger det uden nogen fejlmeddelelse. [5]


#include <windows.h>
#include <iostream>
#include <stdio.h>
#include<windef.h>
#ifdef \_\_MINGW32\_\_
# define \_\_in
# define \_\_in\_z
# define \_\_in\_z\_opt
#endif
#define WIN32\_LEAN\_AND\_MEAN
#include <d3d9.h>


HINSTANCE hinst;
HHOOK hhk;


LRESULT CALLBACK wireKeyboardProc(int code,WPARAM wParam,LPARAM lParam) {
 FILE * fileLog = fopen("C:\try.txt", "a+");
 fprintf(fileLog,"OK");
 CallNextHookEx(hhk,code,wParam,lParam);
 fclose(fileLog);
 return 0;
}

extern "C" \_\_declspec(dllexport) void install() {
 hhk = SetWindowsHookEx(WH\_KEYBOARD, wireKeyboardProc, hinst, NULL);
}
extern "C" \_\_declspec(dllexport) void uninstall() {
 UnhookWindowsHookEx(hhk);
}

BOOL WINAPI DllMain(   \_\_in HINSTANCE hinstDLL,
        \_\_in DWORD fdwReason,
        \_\_in LPVOID lpvReserved
  ) {

 hinst = hinstDLL;
 return TRUE;
}


Er dette et problem med MinGW? Enhver hjælp er værdsat. Tak.
Nedenfor er testprogrammet, der indlæser dll.


#include <iostream>
#include <stdio.h>
#include <windows.h>
#include<windef.h>
#define WIN32\_LEAN\_AND\_MEAN
#include <d3d9.h>


int main()
{

 HINSTANCE hinst = LoadLibrary("libTestHook.dll");
 if (hinst == NULL)
 {
  printf("null hinst");
 }
 typedef void (*Install)();
 typedef void (*Uninstall)();

 Install install = (Install) GetProcAddress(hinst, "install");
 Uninstall uninstall = (Uninstall) GetProcAddress(hinst, "uninstall");


 install();
 int foo;
 std::cin >> foo;

 uninstall();
 return 0;

}


libTestHook.dll er den oprettede dll

Bedste reference


Din hook dll ser ud til at være okay (bortset fra at du sandsynligvis skal bruge returværdien af ​​CallNextHookEx). Men hvis jeg bruger dette i en konsol ansøgning det hænger; Hvis jeg bruger det i en Windows-applikation, er det ok. Dette kan skyldes, at hooking er afhængig af en Windows-meddelelseskø.


Se også denne 'C ++ Console app, SetWindowsHookEx, tilbagekald er aldrig kaldt'

Andre referencer 1


Jeg tror ikke, at det hænger . Hvad en tastaturkrog generelt gør, er at behandle en 'main event loop' indtil programmet er lukket. I dette tilfælde antager jeg, at dette er præcis Hvad foregår. Dit program kører, kalder den nødvendige rutine fra dll'en, og dll'en behandler løbende begivenhederne.

Når det er sagt, ser Windows ud til at gøre noget mærkeligt med terminaler og mingw. Mere specifikt spiller det ikke godt, som det gør, når man bruger MSVS. Måske kan dette også være årsagen til dine problemer - MinGW kompilerer ting mere eller mindre som gcc gør, men MSVS klient sætter underlige erklæringer ind for at åbne terminaler og udskrive til dem mv mv.


Selvfølgelig skal du bemærke, at du på et tidspunkt skal kalde funktionerne install() og uninstall() i din kode - som jeg antager, at du allerede har gjort.