c - 为什么在记事本中进行击键时出现异常?

标签 c windows visual-studio winapi keyboard-hook

我在 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 以 Hook 记事本中的击键,只是为了了解 Hook 的机制。

这是加载器的代码:

#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

最佳答案

只是瞎猜,但是传递给 set hook 调用的函数应该如下所示:

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

不是: int Factorial(int n)(另外两个参数在哪里??)

关于c - 为什么在记事本中进行击键时出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592060/

相关文章:

visual-studio - 如何在 Web 测试插件中访问数据驱动值

c# - 检查属性是否可以延迟加载/是否可用而无需捕获异常

c - 当 stdin 结束时 fgets 应该停止

c - 指向字符串的指针数组未按应有的方式存储数据

c - 具有指向指针和 strcpy 的指针的函数

c - 崩溃后恢复与服务器的连接

windows - 在 Windows 上安装 Node 包时出现 ETIMEDOUT 错误

c# - Cortana 应用程序日志

c - 使用 C 中名为 getfullpathname() 的函数解析路径?

c++ - CUDA 使用 CMake 在 x86 中卡住构建