почему я получаю исключение при нажатии клавиши в блокноте? - PullRequest
1 голос
/ 21 декабря 2011

У меня есть один файл решения в Visual Studio, и у меня есть в нем два проекта, один для файла .dll и один другой проект для файла .c:

это файл .h:

#include <windows.h>

#ifndef BHANNAN_TEST_CLASS_H_
#define BHANNAN_TEST_CLASS_H_

extern int __declspec (dllexport) Factorial(int n);

#endif 

и в .c файле (из dll):

#include "hanan.h"
#include <stdio.h>

int Factorial(int n) {
  printf("in DLL %d \n" ,n);

  return 0;
}

Теперь у меня есть загрузчик / тестер, который я пытаюсь из него загрузить dll, чтобы перехватывать нажатия клавиш в блокноте, просто чтобы понять механизм перехвата.

это код загрузчика:

#include <windows.h>
#include <stdio.h>

typedef int (*functor) (int);
functor funcptr =NULL;

int main () {

    HWND windowHandle;
    HINSTANCE hMod;
    HOOKPROC lpfn; 
    DWORD threadId;
    HHOOK hook;
    HMODULE myDLL = LoadLibraryW(L"dll123.dll");
    funcptr = (functor) GetProcAddress(myDLL,"Factorial");

    /// printing issues:////////////////
    printf("%d \n\r" , myDLL);
    printf("%d" , funcptr(33));
    //////////////////////////////////////

    lpfn = (HOOKPROC) funcptr;
    hMod = myDLL;
    windowHandle = FindWindow(L"Notepad",NULL);
    threadId = GetWindowThreadProcessId(windowHandle, NULL);

    hook = SetWindowsHookEx(WH_KEYBOARD,lpfn,hMod,threadId);//(WH_CBT, HookCBTProc, hInst, threadId);

    /// printing issues:
    printf("%d %d %d %d\n" , hook, WH_KEYBOARD , lpfn , hMod);
    printf("%d %d \n",threadId , windowHandle );
    getchar();
    return 0;
}

Я получаю всю печать без нулей, что означает, что нет нулей (при условии, что блокнот работает), но когда я нажимаю клавишу в блокноте, я сразу получаю исключение,

с использованием Visual Studio 2010 и Windows 7

добавлены свойства исключения:

 Exception Offset:  0006632c
  Exception Code:   c0000409
  Exception Data:   00000000

1 Ответ

4 голосов
/ 21 декабря 2011

Просто выстрел в темноте, но функция, которую вы передаете вызову set hook, должна выглядеть следующим образом:

LRESULT CALLBACK KeyboardProc(
  __in  int code,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);

Not: int Factorial(int n) (где два других параметра ??)

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