【问题标题】:Why is the SetupDiCallClassInstaller function restricted to 64 bit programs?为什么 SetupDiCallClassInstaller 函数仅限于 64 位程序?
【发布时间】:2012-01-30 21:27:21
【问题描述】:

尝试从以 32 位模式编译的程序调用 SetupDiCallClassInstaller 在 64 位 Windows 上失败。

显然这是设计使然,但我想知道原因。

【问题讨论】:

  • 嗨,我在 Windows 7 64 位机器中遇到了与“SetupDiCallClassInstaller”相同的问题。你能告诉这个问题的解决方案是什么吗?
  • @2vision2 搞定这个有什么好运气吗?
  • 微软根本没有实现它的 32 位版本,它可以在运行 32 位进程的 Wow64 模拟器中运行。不清楚这是待办事项还是技术限制,我投票支持后者。

标签: winapi 64-bit 32-bit setupapi


【解决方案1】:

根据 MSDN:

Device Installations on 64-Bit Systems:

32 位版本的应用程序必须检查 UpdateDriverForPlugAndPlayDevices 返回的值。如果返回值为 ERROR_IN_WOW64,则 32 位应用程序正在 64 位平台上执行,并且无法更新收件箱驱动程序。相反,它必须调用 CreateProcess(在 Windows SDK 文档中描述)来启动 64 位版本的应用程序。然后 64 位版本可以调用 UpdateDriverForPlugAndPlayDevices,指定一个 FullInfPath 参数来标识所有文件的 64 位版本的位置。

因此,看起来任何旨在报告 ERROR_IN_WOW64 的 API 都专门用于不适用于 WOW64,32 位进程必须调用 64 位进程才能调用 API。

【讨论】:

    【解决方案2】:

    如果您在 64 位操作系统上从 32 位进程进行该调用,则会失败,因为它必须修改注册表的 64 位部分中的一些注册表项。如果您要从 64 位操作系统上的 64 位进程进行调用,那么在 32 位操作系统上使用 32 位进程同样会成功。

    【讨论】:

    • 32 位进程可以在打开/创建密钥时通过 KEY_WOW64_64KEY 标志访问 64 位注册表,因此这不应该成为 API 在 WOW64 中无法工作的限制因素,除非这是微软的疏忽,他们根本没有启用 API 使用该标志。
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2016-02-12
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多