Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何初始化堆,使其可供常规MFC dll中的静态构造函数使用? 后台:我有一个大型的C++应用程序,带有MFC UI。我正在尝试重构项目并将其迁移到新的.Net UI。现在,作为第一步,我正在尝试将Visual Studio 2015中的MFC exe项目重构为一个常规MFC dll,我可以从exe项目调用它。见下文,我们计划将用户界面从MFC逐渐移动到.Net。飞机在空中时,我们正试图更换发动机 无论如何,我在传统C++应用程序中遇到各种静态和全局问题。当我将新dll加载到exe中时,会出现访问冲突异常。原来堆没有在dll中正确创建,我不明白为什么_C++_Visual C++_Dll_Mfc - Fatal编程技术网

如何初始化堆,使其可供常规MFC dll中的静态构造函数使用? 后台:我有一个大型的C++应用程序,带有MFC UI。我正在尝试重构项目并将其迁移到新的.Net UI。现在,作为第一步,我正在尝试将Visual Studio 2015中的MFC exe项目重构为一个常规MFC dll,我可以从exe项目调用它。见下文,我们计划将用户界面从MFC逐渐移动到.Net。飞机在空中时,我们正试图更换发动机 无论如何,我在传统C++应用程序中遇到各种静态和全局问题。当我将新dll加载到exe中时,会出现访问冲突异常。原来堆没有在dll中正确创建,我不明白为什么

如何初始化堆,使其可供常规MFC dll中的静态构造函数使用? 后台:我有一个大型的C++应用程序,带有MFC UI。我正在尝试重构项目并将其迁移到新的.Net UI。现在,作为第一步,我正在尝试将Visual Studio 2015中的MFC exe项目重构为一个常规MFC dll,我可以从exe项目调用它。见下文,我们计划将用户界面从MFC逐渐移动到.Net。飞机在空中时,我们正试图更换发动机 无论如何,我在传统C++应用程序中遇到各种静态和全局问题。当我将新dll加载到exe中时,会出现访问冲突异常。原来堆没有在dll中正确创建,我不明白为什么,c++,visual-c++,dll,mfc,C++,Visual C++,Dll,Mfc,我将问题缩小到一个带有文件级静态变量的非常简单的结构。该变量在库加载时在正常应用程序逻辑之前调用构造函数 在MfcDll项目中的SomeData.cpp中 struct SomeData { SomeData() { ::OutputDebugString("construct data\n"); char* mem = new char[10]; // nope if (mem) { ::O

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

在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++中的解决方案中做了这个特殊的测试。我有MFCDL,传统的静态链接的C++库和一个股票窗口应用程序,它也在C++中引用MFCDL。因此,在这一点上.Net甚至不在代码中。。。它的所有C++都有MFC和Windows .< /P> < P>在DLL加载期间调用构造函数。到那时,堆可能还没有初始化dll


初始化代码的正确位置应该是InitInstance和existInstance或DllMain,您也可以在这里进行清理。将构造函数和析构函数代码移到那里。

原来旧代码已在本地重写::operator new,它正在执行一些复杂的操作,但现在已被破坏。这特别令人困惑,因为我在线路上有一个断点 char*mem=新字符[10]

直到我在新函数中添加了一个断点,F11才加入到新函数的本地实现中

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

您的整个项目是否使用相同的运行时支持版本和内存模型?什么是静态构造函数?在解决方案项目属性中,所有项目静态库、dll和exe项目都使用多线程调试dll/MDd。dll设置为在共享DLLstatic构造函数中使用MFC。也许我说错了。静态对象的构造函数(在某些情况下需要执行复杂的操作并访问堆)是问题所在。所以有些数据文件是静态的;在应用程序代码之前调用构造函数SomeData::SomeData