C++ 在Visual Studio 2017中创建的简单DLL不会';在XP中不加载

C++ 在Visual Studio 2017中创建的简单DLL不会';在XP中不加载,c++,dll,visual-studio-2017,windows-xp,static-variables,C++,Dll,Visual Studio 2017,Windows Xp,Static Variables,平台工具集-Visual Studio 2017-Windows XP(v141_XP) 运行时库-多线程(无CRT依赖项) DLL在Vista+上加载正常,但在XP SP2(x86)上加载失败,错误代码为error\u NOACCESS(对内存位置的访问无效) dll代码: #include <windows.h> #include <string> BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_fo

平台工具集-Visual Studio 2017-Windows XP(v141_XP)

运行时库-多线程(无CRT依赖项)

DLL在Vista+上加载正常,但在XP SP2(x86)上加载失败,错误代码为error\u NOACCESS(对内存位置的访问无效)

dll代码:

#include <windows.h>
#include <string>

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        {
            static std::string test;
            break;
        }
    }

    return TRUE;
}
#包括
#包括
BOOL APIENTRY DllMain(HMODULE HMODULE,DWORD ul_呼叫原因,LPVOID LPREFERED)
{
开关(ul\u呼叫原因\u)
{
案例DLL\u进程\u附加:
{
静态标准:字符串测试;
打破
}
}
返回TRUE;
}
exe代码:

#include <Windows.h>
#include <tchar.h>

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    HMODULE hModule = LoadLibrary(L"dll.dll");

    if (hModule)
        MessageBoxA(0, "It works", "Info", MB_ICONINFORMATION);
    else
    {
        char buff[10];
        _itoa_s(GetLastError(), buff, 10, 10);

        MessageBoxA(0, buff, "GetLastError()=", MB_ICONEXCLAMATION);
    }

    return 0;
}
#包括
#包括
int APIENTRY_tWinMain(HINSTANCE HINSTANCE、HINSTANCE HPPREINSTANCE、LPTSTR lpCmdLine、int nCmdShow)
{
HMODULE HMODULE=LoadLibrary(L“dll.dll”);
if(hModule)
MessageBoxA(0,“它工作”,“信息”,MB_图标信息);
其他的
{
字符buff[10];
_itoa_s(GetLastError(),buff,10,10);
MessageBoxA(0,浅黄色,“GetLastError()=”,MB_图标连接);
}
返回0;
}
Visual Studio 2015也存在同样的问题。尽管它在Visual Studio 2013中编译时运行良好


Windows XP有此限制。使用
LoadLibrary
加载DLL时,该特定DLL中不能有
静态
数据。这是无法解决的。你需要找到另一种方法

有参考链接吗?VS2013中编译的相同代码仍然适用于XP。请在“loadlibrary windows XP static variable vs 2017”上搜索或类似于“loadlibrary windows XP static variable vs 2017”,感谢您提供了正确的方向。虽然可以通过/Zc:threadSafeInit-compiler开关(可在VS2015/2017中使用)来解决这个问题,但要澄清的是,编译器开关会禁用线程安全初始值设定器(这是可怕的事情,依我看,它们应该是opt-in而不是opt-out,但没关系)。进一步澄清一下,静态数据很好,但不是需要调用其构造函数的对象。