gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:18:57 26 4
gpt4 key购买 nike

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

最佳答案

大多数 C++ 编译器会为具有此类静态数据的过程生成一个小代码“序言”。这个序言检查一个(隐藏的) bool 标志,如果它是明确的,则初始化/构造静态。然后设置 bool 标志以指示不应再次初始化静态。

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

如果你的构造函数没有被调用,也许这个 bool 值被你代码中的其他东西破坏了?

抱歉,我不能直接解决问题,但希望这能帮助您理解您在调试器中看到的一些正在执行的汇编代码...

关于c++ - 静态指针不会在子类窗口过程中初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com