注册 登录
编程论坛 C++教室

DLL全局变量问题

rohalloway 发布于 2019-05-10 14:35, 3120 次点击
声明为局部变量时程序正常:
程序代码:

extern "C" __declspec(dllexport) bool showDialog(DWORD address, LPDWORD bytes, HWND parent )
{
    DWORD wrote = 0;
    WriteProcessMemory(GetCurrentProcess(), UlongToPtr(address), bytes, 6, &wrote);

    UserOnInject();

    QWinWidget win(nullptr); //声明为局部变量时程序正常
    win.showCentered();

    SroDlg dlg(&win);
    MyGlobalShortCut *shortcut = new MyGlobalShortCut("F5");
    QObject::connect(shortcut, SIGNAL(activated()), &dlg, SLOT(activated()));
    dlg.exec();

    return TRUE;
}



声明为全局变量时程序崩溃:
程序代码:

QWinWidget win(nullptr); //声明为全局变量时程序崩溃

extern "C" __declspec(dllexport) bool showDialog(DWORD address, LPDWORD bytes, HWND parent )
{
    DWORD wrote = 0;
    WriteProcessMemory(GetCurrentProcess(), UlongToPtr(address), bytes, 6, &wrote);

    UserOnInject();

   
    win.showCentered();

    SroDlg dlg(&win);
    MyGlobalShortCut *shortcut = new MyGlobalShortCut("F5");
    QObject::connect(shortcut, SIGNAL(activated()), &dlg, SLOT(activated()));
    dlg.exec();

    return TRUE;
}


请问 QWinWidget win(nullptr) 声明为全局时程序为什么会崩溃?
可编译通过,运行时错误。
这个问题同样适用于 SroDlg dlg(&win),但原始类型不会崩溃。

当showDialog()函数结束后,我仍然需要win和dlg对象,但声明为局部就销毁了

请问我该如何做? 蒙蒙的,请无视Qt的代码,我感觉这属于C++的问题,谢谢您!
2 回复
#2
rjsp2019-05-10 16:00
如果是第二次调用才出错,那么就是 win 需要清洗才可以继续调用showCentered
如果是第一次调用就出错,那么就是 win 创建时必要的环境还没建立,因为它是全局变量,它创建比别人(比如QApplication)早。
#3
rohalloway2019-05-15 19:47
以下是引用rjsp在2019-5-10 16:00:44的发言:

如果是第二次调用才出错,那么就是 win 需要清洗才可以继续调用showCentered
如果是第一次调用就出错,那么就是 win 创建时必要的环境还没建立,因为它是全局变量,它创建比别人(比如QApplication)早。


如您所说,应该是属于第二种情况,非常感谢您,一语击中,谢谢。
1