MSVC:关于看似简单的C代码的编译器错误?

时间:2011-06-07 00:35:37

标签: visual-studio winapi visual-c++

这是一个简单的45 line console application,可以重现我的Win XP 32位系统上的错误。

相关部分:

input_watcher_wndproc属于通过RegisterRawInputDevices设置的窗口,用于监视原始键盘输入事件。

  LRESULT APIENTRY
  input_watcher_wndproc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) {
    switch(umsg) {
    case WM_INPUT:
      analyze_raw_input((HRAWINPUT)lparam);
      DefWindowProc(hwnd, umsg, wparam, lparam);
      return 0;
    }
    return DefWindowProc(hwnd, umsg, wparam, lparam);
  }

  void analyze_raw_input(HRAWINPUT raw_input) {
    RAWINPUTHEADER header;
    UINT size;
    GetRawInputData(raw_input, RID_HEADER, &header, &size, sizeof(RAWINPUTHEADER));
    printf("raw input device handle: %d\n", header.hDevice);
  }

使用MSVC 9或10编译时,程序始终错误地将设备句柄报告为“1”。

但是,如果我应用一些看似无效的更改,比如将switch语句转换为if语句......

    if (umsg == WM_INPUT) {
      analyze_raw_input((HRAWINPUT)lparam);
      DefWindowProc(hwnd, umsg, wparam, lparam);
      return 0;
    }

...或在调用analyze_raw_input ...

之前添加任意指令
  switch(umsg) {
   case WM_INPUT:
     puts("foo");
     analyze_raw_input((HRAWINPUT)lparam);
     DefWindowProc(hwnd, umsg, wparam, lparam);
     return 0;
   }

...代码运行正常并输出正确的设备句柄。

这是修改后的工作source code,只添加了print语句。

任何可能导致此行为的想法?

1 个答案:

答案 0 :(得分:2)

确保在调用GetRawInputData之前将'size'初始化为sizeof(RAWINPUTHEADER),因为这是一个__inout参数。

相关问题