静态指针不会在子类窗口过程中初始化?

时间:2011-07-11 14:36:35

标签: c++ windows winapi

我很困惑为什么第二个静态指针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);
}

1 个答案:

答案 0 :(得分:1)

大多数C ++编译器为具有这种静态数据的过程发出一个小代码`preamble'。这个前导码检查一个(隐藏的)布尔标志,如果它清楚,则初始化/构造静态。然后设置布尔标志以指示不应再次初始化静态。

并非所有编译器都以线程安全的方式管理这些标志,因此尝试初始化相同静态的多个线程可能会导致混乱......

如果没有调用你的构造函数,你的代码中的其他内容可能会破坏这个布尔值吗?

很抱歉,我无法直接解决问题,但希望这有助于您了解一些您认为在调试器中执行的汇编代码......