C++ 线程_localunordered _mapplus accessibleObject fromWindow不';不能在WinXP中运行
我正在使用VC++2015编译以下程序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
#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
- 将无序地图更改为标准地图
- 删除
关键字线程\u local
- 将
变量移动到线程\u local
main
- 删除对
AccessibleObject FromWindow的调用
更新: 如果我将
/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
函数从一开始就没有被调用过。这是否回答了您的问题?