这只是一个半途而废的编程问题。首先,我有一个 PCI-Express 卡和 32/64 位驱动程序。目标操作系统必须是 Windows 64 位系统。我读到,在 Vista64 下,所有驱动程序都必须经过认证 64 位驱动程序。这是 64 位操作系统下的一般限制吗?这是否也适用于“XP 64”或任何 Linux 系统?

因此,为了简单起见,假设我在 Vista64 下为我的 PCIe 卡使用 64 位驱动程序,并且有一堆 64 位 DLL 来使用卡功能。另一方面,有一个大型的传统 32 位 exe 程序需要使用 PCIe 设备。将程序转换为 64 位将是一项巨大的工作。

那么如何才能将 32 位程序和 64 位驱动程序结合在一起呢?我读到混合 32/64 位二进制文​​件和 DLL 根本不可能,但这对我来说很难相信。我确信您可以在 32 位应用程序中打印出 Vista64 下的文档,并且 Windows 会以某种方式将其包装到 64 位打印机驱动程序。

有帮助吗?

解决方案

仅 Vista 下才需要 64 位认证;非 Windows 平台没有认证机构,而且我不相信 XP 或 Windows Server 会检查认证(但不确定,这可能取决于您使用的服务包)。

如果您通过 Windows API 使用驱动程序,那么应该不会有任何问题;Windows 将在内核中进行 32<->64 位转换。如果您尝试在自己的进程中加载​​驱动程序,那可能是不可能的。正如 Dirk 所说,您必须在自己的进程内运行它并通过 COM 服务器进行通信。如果您必须在更高权限的执行级别运行驱动程序并希望从用户模式调用它,我不确定您必须跳过哪些障碍。

希望您的 64 位 DLL 提供 32 位 API,或者 Windows 提供标准驱动程序接口(如果它是常见的 I/O 设备,如显示器或网卡)。

其他提示

你的32位应用程序直接调用驱动程序吗?(我猜是驾驶员模拟器!)

32 位和 64 位 dll 之间通信的唯一方法是编写一个管理通信的 COM 服务器(阅读:将应用程序调用或 64 位驱动程序响应包装在两者之间。

有一件事让我反感:当我第一次编写这个 COM 服务器时(是的,在我知道这个技巧之前,我也不得不忍受许多不眠之夜)我只构建了(自动生成的)代理/存根 dll 的 32 位版本。在我知道解决方案之前,又经历了一轮不眠之夜:为 32 位和 64 位构建代理/存根 dll。32 位端处理 32 位端(在您的情况下是应用程序),64 位端处理 64 位端(驱动程序)。COM 管理不同版本的代理/存根如何相互通信。哦,一定要在您的系统上注册服务器。容易,对吧?

我认为驱动程序的全部意义在于抽象出硬件的实际工作原理并为软件提供一个通用接口。在这种情况下,PCIe 驱动程序需要是 64 位的,以便它可以充当 Windows 和硬件的中间人,但我认为 32 位应用程序可以毫无问题地访问设备。

您读到的不兼容性意味着 32 位和 64 位程序集不能成为同一应用程序的一部分 - 应用程序必须以其中之一为目标,尽管 32 位应用程序将 一般来说 使用 WoW64 在 Windows x64 上运行良好,WoW64 只是充当翻译器。

您目前是否遇到问题,或者您只是假设性地询问?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top