c++ - 如何初始化堆以便它可以被常规 MFC dll 中的静态构造函数使用?

标签 c++ visual-c++ dll mfc

背景:我有一个带有 MFC UI 的大型遗留 C++ 应用程序。我正在尝试重构项目并将其迁移到新的 .Net UI。现在,作为第一步,我正在尝试将 Visual Studio 2015 中的 MFC exe 项目重构为可以从 exe 项目调用的常规 MFC dll。 (见下文)我们计划逐渐将 UI 从 MFC 移动到 .Net。我们正试图在飞机在空中时更换引擎...

无论如何,我在处理遗留 C++ 应用程序中的各种静态变量和全局变量时遇到了麻烦。当我将新的 dll 加载到 exe 中时,出现访问冲突异常。原来在 dll 中没有正确创建堆,我不明白为什么....

我将问题缩小到一个非常简单的结构,它有一个文件级静态变量。该变量在正常应用程序逻辑之前调用库加载时的构造函数。

在MfcDll项目的SomeData.cpp中

struct SomeData {
    SomeData()
    {
        ::OutputDebugString("construct data\n");
        char* mem = new char[10]; // nope
        if (mem)
        {
            ::OutputDebugString("got mem\n");
        }
        else
        {
            ::OutputDebugString("no heap\n");
        }
    }
};

SomeData fileLevelStatic;

输出是:

construct data
no heap

这是我断点构造函数时的调用堆栈

MfcDll.dll!SomeData::SomeData() Line 57 C++
MfcDll.dll!`dynamic initializer for 'fileLevelStatic''() Line 63    C++
ucrtbased.dll!00007ffdc88f947d()    Unknown
MfcDll.dll!dllmain_crt_process_attach(HINSTANCE__ * const instance, void * const reserved) Line 67  C++
MfcDll.dll!dllmain_crt_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 133   C++
MfcDll.dll!dllmain_dispatch(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 190   C++
MfcDll.dll!_DllMainCRTStartup(HINSTANCE__ * const instance, const unsigned long reason, void * const reserved) Line 249 C++
ntdll.dll!00007ffe005da35f()    Unknown

那么我在这里做错了什么?我需要做什么来确保我有一个可用于静态对象的堆。遗留应用程序广泛使用静态和全局变量。是的,我们想重构这些,但这是一项艰巨的任务,所以我们需要在这样做的同时保持它的工作......

另外,为了验证它不是 .Net 与 MFC 的对比,我在仅使用 C++ 的解决方案中进行了此特定测试。我有 MFCDll、遗留的静态链接 C++ 库和一个也在 C++ 中引用 MFCDll 的库存窗口应用程序项目。因此,此时 .Net 甚至不在代码中……它都是带有 MFC 和 Windows 的 C++。

最佳答案

事实证明,遗留代码已在本地覆盖了::operator new() 并且它正在做一些复杂的事情,现在被破坏了。这特别令人困惑,因为我在行上有一个断点
char* mem = new char[10];

直到我在 new() 函数中放置一个断点,F11 才进入 new 的本地实现。

所以基本上是自制的脚枪... 叹。谢谢您的帮助。

关于c++ - 如何初始化堆以便它可以被常规 MFC dll 中的静态构造函数使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44185791/

相关文章:

c++ - 将 Eigen C++ 库与英特尔 MKL 结合使用

c++ - 动态转换在模板成员函数内部同时使用共享指针和弱指针,无需代码重复

c++ - 将当前日期与 C++ 中的 SQL 数据库条目相匹配

c++ - 您如何在 Visual Studio 中生成具有随机输出名称的 PDB 文件?

c++ - 友元函数中的 STL 问题

c++ - 从 abs(double) 而不是 int 获得双重结果

c++ - 用c++创建一个定时游戏

visual-c++ - 如何禁用 MFC 中的最大化按钮?

c++ - 如何跟踪C++库的加载过程?

c# - DLL 大小重要吗?