Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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
C++ 线程_localunordered _mapplus accessibleObject fromWindow不';不能在WinXP中运行_C++_Visual C++_Com_Windows Xp_Thread Local - Fatal编程技术网

C++ 线程_localunordered _mapplus accessibleObject fromWindow不';不能在WinXP中运行

C++ 线程_localunordered _mapplus accessibleObject fromWindow不';不能在WinXP中运行,c++,visual-c++,com,windows-xp,thread-local,C++,Visual C++,Com,Windows Xp,Thread Local,我正在使用VC++2015编译以下程序 #include <oleacc.h> #include <unordered_map> #pragma comment(lib,"User32.lib") #pragma comment(lib,"Oleacc.lib") thread_local std::unordered_map<int, int> something ; int main( int argc, ch

我正在使用VC++2015编译以下程序

#include <oleacc.h>
#include <unordered_map>

#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Oleacc.lib")

thread_local std::unordered_map<int, int> something ;

int main( int argc, char* argv[] ){
    
    MessageBox(0, "Program started", "Test program", MB_SETFOREGROUND) ;
        
    IAccessible* test ;
    AccessibleObjectFromWindow(GetForegroundWindow(), OBJID_WINDOW, IID_IAccessible, (void**)&test) ;   
}
#包括
#包括
#pragma注释(lib,“User32.lib”)
#pragma注释(lib,“Oleacc.lib”)
线程本地std::无序映射某物;
int main(int argc,char*argv[]){
消息框(0,“程序启动”,“测试程序”,MB_SETFOREGROUND);
IAccessible*测试;
AccessibleObjectFromWindow(GetForegroundWindow(),对象窗口,IID\U IAccessable,(void**)和测试);
}
命令行:
cl test.cpp/EHsc/link/MACHINE:x86/entry:mainCRTStartup/subsystem:windows,5.1

程序显示一个消息框并退出。 它可以在除Windows XP之外的所有Windows版本上正常工作,在Windows XP中,双击程序图标时不会发生任何事情

没有错误消息或程序失败的任何迹象。它什么也不做。它在任务管理器中出现了一小部分秒,然后消失了

要使程序在Win XP中失败,必须具备以下两个要素

  • 全局范围内的
    线程\u本地
    无序\u映射
  • 调用
    AccessibleObjectFromWindow
  • 如果我做了以下任何更改,则该程序在XP中不起作用:

    • 将无序地图更改为标准地图
    • 删除
      线程\u local
      关键字
    • 线程\u local
      变量移动到
      main
    • 删除对
      AccessibleObject FromWindow的调用
    是否有任何命令行参数可以传递给编译器/链接器,以便程序在WinXP中工作


    更新:

    如果我将
    /MD
    添加到命令行(即使用操作系统中安装的运行时),WinXP可以成功运行该程序

    这表明问题在于Windows XP和VS2015嵌入到可执行文件中的MSVC运行时库之间存在某种不兼容(我也尝试过VS2019,但没有什么不同)

    我尝试通过GUI构建一个项目,并选择Windows XP(v140\u XP)作为平台工具集,但问题仍然存在


    我想我唯一的选择是将
    无序的
    映射更改为
    映射
    。或者以某种方式摆脱
    thread\u local

    尝试将
    /Zc:threadSafeInit-
    添加到编译器命令行

    对于VC++2015,从:

    线程安全静态局部变量在内部使用线程局部存储(TLS),以便在静态变量已经初始化时提供有效的执行。此功能的实现依赖于Windows Vista和更高版本操作系统中的Windows操作系统支持功能Windows XP、Windows Server 2003和旧版操作系统没有此支持,因此它们没有效率优势。这些操作系统对可以加载的TLS节的数量也有一个下限。超过TLS区段限制可能导致碰撞。如果这是您的代码中的问题,尤其是必须在旧操作系统上运行的代码中的问题,请使用/Zc:threadSafeInit-禁用线程安全初始化代码。


    尝试将
    /Zc:threadSafeInit-
    添加到编译器命令行

    对于VC++2015,从:

    线程安全静态局部变量在内部使用线程局部存储(TLS),以便在静态变量已经初始化时提供有效的执行。此功能的实现依赖于Windows Vista和更高版本操作系统中的Windows操作系统支持功能Windows XP、Windows Server 2003和旧版操作系统没有此支持,因此它们没有效率优势。这些操作系统对可以加载的TLS节的数量也有一个下限。超过TLS区段限制可能导致碰撞。如果这是您的代码中的问题,尤其是必须在旧操作系统上运行的代码中的问题,请使用/Zc:threadSafeInit-禁用线程安全初始化代码。


    您没有初始化COM。@RichardCriten,初始化COM没有任何区别,因为
    main
    函数从一开始就没有被调用过。这是否回答了您的问题?您没有初始化COM。@RichardCriten,初始化COM没有任何区别,因为
    main
    函数从一开始就没有被调用过。这是否回答了您的问题?