代码之家  ›  专栏  ›  技术社区  ›  Jim Fell

使用RegisterClassEx时出现问题

  •  2
  • Jim Fell  · 技术社区  · 15 年前

    在我的Win32 C++ DLL中,我发现如果我尝试使用 RegisterClassEx 这样它就可以正常工作了:

    WNDCLASSEX wx = {};
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.lpfnWndProc = (WNDPROC)WndProc;        // function which will handle messages
    wx.hInstance = GetCurrentModule();
    wx.lpszClassName = pClassName;
    atomRet = RegisterClassEx( &wx );
    

    但是,当我尝试使用 窗口类 这样,它就失败了, atomRet 设置为零,异常文本只显示“参数不正确”。

    WNDCLASSEX * _pWndClassEx;
    _pWndClassEx = (WNDCLASSEX *)malloc( sizeof(WNDCLASSEX) );
    _pWndClassEx->cbSize = sizeof(WNDCLASSEX);
    _pWndClassEx->lpfnWndProc = (WNDPROC)WndProc;        // function which will handle messages
    _pWndClassEx->hInstance = GetCurrentModule();
    _pWndClassEx->lpszClassName = pClassName;
    atomRet = RegisterClassEx( _pWndClassEx );
    

    我在msdn文档中注意到 窗口类 定义如下:

    ATOM WINAPI RegisterClassEx(
      __in  const WNDCLASSEX *lpwcx
    );
    

    这是不是意味着 lpwcx 必须指向静态分配的内存?也就是说,它不能指向动态分配的内存(使用 malloc )?谢谢您。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Michael Burr    15 年前

    在第一个例子中,

    WNDCLASSEX wx = {};
    

    声明 wx 初始化所有字段时也是零。

    在第二个示例中,您不显示 _pWndClassEx 正在初始化,但您提到使用 malloc() . 为了等价于第一个示例,您需要清除返回的内存 malloc()号 :

    memset( _pWndClassEx, 0, sizeof(*_pWndClassEx));
    

    否则,未显式分配值的字段将具有不确定的值(尤其是在调试构建中,从中返回的内存 malloc()号 将设置为 0xcd 如果我记得对的话,那么 WNDCLASSEX 结构将具有无效值)。

        2
  •  5
  •   casablanca    15 年前

    当你这样做的时候:

    WNDCLASSEX * _pWndClassEx;
    

    您没有为结构分配任何内存。你需要做如下的事情:

    WNDCLASSEX * _pWndClassEx = new WNDCLASSEX;
    

    然后才能分配给结构中的成员。

    但是,我看不到动态分配 WNDCLASSEX 结构,因为你一打电话就不需要它了 RegisterClassEx