我很困惑为什么第二个静态指针pthis不会初始化?我所做的是通过静态函数将窗口过程子类化。第一个静态指针lpProcess在主过程中初始化。但是,第二个甚至不会调用自己的构造函数(我使用调试器来确定这个问题)。不知何故,它只是略过了结构。起初,我怀疑我是否误解了静态变量的某些观点。然而,看到第一个工作,为什么不是第二个?也许,我想这与深度递归或调用静态函数有关?
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static QProcessor* lpProcess = new QProcessor(hwnd); //Initialized without any error
switch(msg)
{
case WM_CREATE:
{
lpProcess->SetFixed(322,200); //Set window size through the container
lpProcess->Update(); //Update members
if(!lpProcess->CreateChild()) //Create all controls
{
Error(); //print error
::DestroyWindow(hwnd); //terminate the window
}
QMonitor::Attach(hwnd); //Attach Monitor Window to current window
}
....
void QMonitor::Attach(HWND hwnd)
{
QMonitor::classdata = (LPVOID)::SetWindowLong(hwnd,GWL_WNDPROC,(LONG)QMainProc); //subclass procedure
}
LRESULT CALLBACK QMainProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static QMonitor* pthis = new QMonitor(hwnd); //Won't initialize??
switch(msg)
{
case WM_MOVE:
{
pthis->OnMove();
}
break;
case WM_SIZE:
{
pthis->OnSize();
}
break;
case WM_COMMAND:
break;
case WM_DESTROY:
delete pthis;
break;
}
return ::CallWindowProc(pthis->GetAttachWndProc(),hwnd,msg,wParam,lParam);
}
答案 0 :(得分:1)
大多数C ++编译器为具有这种静态数据的过程发出一个小代码`preamble'。这个前导码检查一个(隐藏的)布尔标志,如果它清楚,则初始化/构造静态。然后设置布尔标志以指示不应再次初始化静态。
并非所有编译器都以线程安全的方式管理这些标志,因此尝试初始化相同静态的多个线程可能会导致混乱......
如果没有调用你的构造函数,你的代码中的其他内容可能会破坏这个布尔值吗?
很抱歉,我无法直接解决问题,但希望这有助于您了解一些您认为在调试器中执行的汇编代码......