使用RegisterClassEx的问题

Jim*_*ell 2 c++ winapi visual-studio-2008

在我的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 );
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用RegisterClassEx这种方式时,它会失败,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 );
Run Code Online (Sandbox Code Playgroud)

我在MSDN文档中RegisterClassEx注意到它的定义如下:

ATOM WINAPI RegisterClassEx(
  __in  const WNDCLASSEX *lpwcx
);
Run Code Online (Sandbox Code Playgroud)

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

cas*_*nca 5

当你这样做时:

WNDCLASSEX * _pWndClassEx;
Run Code Online (Sandbox Code Playgroud)

你没有为结构分配任何内存.你需要做一些事情:

WNDCLASSEX * _pWndClassEx = new WNDCLASSEX;
Run Code Online (Sandbox Code Playgroud)

在分配给结构中的成员之前.

但是,我没有看到动态分配WNDCLASSEX结构的任何理由,因为一旦你打电话,你真的不需要它RegisterClassEx.