【问题标题】:LoadLibrary fails with 0xC000001D on XP embedded, but runs as expected on XP ProLoadLibrary 在 XP 嵌入式上失败,出现 0xC000001D,但在 XP Pro 上按预期运行
【发布时间】:2016-01-25 19:13:59
【问题描述】:

我有一些相当旧的进程内 ATL COM 服务器,以前使用 VC++ 2005 构建。

现在这些项目已移植到 VC++ 2015。
由于我需要支持旧版 Win XP 系统,平台工具集是“VS 2015 - Windows XP”。另外,根据这个issue,设置了/Zc:threadSafeInit-编译选项。

所有服务器都是用ATL属性写的,每个项目都有这样的:

[module(dll, uuid = "{E49F47F5-C0E2-4C1D-8C66-BF8AE6DDF5A1}",
    name = "MyLib",
    helpstring = "MyLib 1.0 Type Library",
    resource_name = "IDR_MYLIB")]
class CMyLibModule
{
public:
    // Override CAtlDllModuleT members
};

问题。 所有这些项目在 WinXP Pro 上运行良好。但是当我尝试在 XP Embedded 机器上注册它们时,我在 LoadLibrary 调用时收到 0xC000001D 错误代码。

如何修复/诊断此错误?

附:如果这是有道理的,XP 嵌入式系统是建立在 AMD Geode 处理器之上的,而 XP Pro 系统是建立在普通 Intel 处理器之上的。

【问题讨论】:

    标签: visual-c++ windows-xp atl windows-xp-embedded visual-c++-2015


    【解决方案1】:

    我已经弄清楚了,有什么问题。
    问题在于默认情况下 VC++ 编译器使用的 Geode 处理器和指令集的组合 - 适用于 x86 项目的 SSE2。这适用于现代和/或“成熟”处理器,但在 Geode 上失败。

    将此选项更改为 SSE 后,一切正常:

    【讨论】:

    • VS 2015 对于 32 位项目确实默认为 /arch:SSE2。对于 x64 本机代码生成,SSE2 已经是隐式的。 Windows 8.1 和 Windows 10 不会安装在缺少 SSE2 支持的系统上。有关更多背景信息,请参阅DirectXMath: SSE, SSE2, and ARM-NEON。对于古代处理器上的 32 位,您可以使用 /arch:SSE 甚至 /arch:IA32
    • @ChuckWalbourn:谢谢你的链接,我会读的。嗯,我知道,现代处理器支持 SSE2,但在嵌入式世界中有大量的旧硬件和软件,WinXP 和 RS232 仍然广泛存在。不过,这种默认行为对我来说并不明显。
    • Visual C++ 从 VS 2012 开始默认为 /arch:SSE2
    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 2014-04-24
    • 2010-10-11
    • 1970-01-01
    • 2011-03-21
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多