нужна помощь в создании Windows DLL - PullRequest
1 голос
/ 10 апреля 2011

Я новичок в программировании Windows (я немного знаю о c и c ++).Я пытаюсь создать Windows DLL, которая регистрирует Windows крюк для клавиатуры. Я использую Eclipse CDT с MinGW (так как я не хочу использовать Visual Studio) для создания DLL. Я был в состоянии создать DLL для программы ниже ( скопированы изздесь ), но когда я пытаюсь загрузить его из другой программы, он зависает без какого-либо сообщения об ошибке.

#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;
}

Это проблема с MinGW?Любая помощь приветствуется. Спасибо.Ниже тестовая программа, которая загружает 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 - созданная dll

Ответы [ 2 ]

0 голосов
/ 30 октября 2013

Кажется, что ваш dll хука в порядке (за исключением того, что вы, вероятно, должны использовать возвращаемое значение CallNextHookEx). Однако, если я использую это в консольном приложении, оно зависает; если я использую его в приложении Windows, то все в порядке. Это может быть связано с тем, что перехват зависит от очереди сообщений Windows.

Смотрите также это ' Консольное приложение C ++, SetWindowsHookEx, Обратный вызов никогда не вызывается '

0 голосов
/ 10 апреля 2011

Не думаю, что зависает . Хук клавиатуры обычно обрабатывает «главный цикл обработки событий» до закрытия программы. В этом случае я бы предположил, что это точно , что происходит. Ваша программа работает, вызывая требуемую подпрограмму из dll, а затем dll постоянно обрабатывает события.
При этом Windows, кажется, делает что-то странное с терминалами и Mingw. В частности, он не играет хорошо, как это происходит при использовании MSVS. Возможно, это также может быть причиной ваших проблем - MinGW компилирует вещи более или менее подобно gcc, однако cl MSVS помещает странные объявления, чтобы открыть терминалы и распечатать их и т. Д. И т. Д.

Конечно, обратите внимание, что в какой-то момент вам нужно вызвать функции install() и uninstall() в вашем коде - что, я полагаю, вы уже сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...