c# - 64 位和 32 位应用程序之间的自动化/WinAPI 调用

标签 c# automation pinvoke wow64 win64

我们在 2 个应用程序之间有一个自动化场景(主要是 MSUIA),目标是 32 位,我的应用程序(自动化应用程序)是 64 位,在 64 位 win7 上。 一些需要共享的信息必须通过 direkt Win SDK 调用(如 SendMessage、GetFocus 等)来访问。

根据我现在的理解,Win64 和 32 子系统是完全独立的,因此任何此类交互都应该立即失败(例如尝试通过 64 位应用程序访问 32 位应用程序的部分内容)。但奇怪的是,大多数东西似乎都能正常工作。所以内部似乎有某种编码/任何东西。

不过,我现在遇到了一些情况,我定义 p/invoke 函数的方式似乎存在问题。我已经将它们声明为“官方 MS 方式”,只要某些内容可能会改变大小(也使用伟大的 http://www.pinvoke.net/default.aspx/ 站点),就使用 IntPtr,因此,由于我强制我的 .net 应用程序为 64 位(使用编译开关),因此应该编译它们对于 64 位,使用 64 位版本的 dll。

现在奇怪的是,当使用这些调用访问 32 位应用程序时(例如 GetWindowText 实际上从其他进程的内存中读取),这些调用似乎工作正常。但。随后的 MSUIA 调用似乎随机失败。

如果我(错误地)为 p/invoke 调用声明了 32 位签名,即使编译为 64 位,一切也运行正常。

对我来说,这毫无意义。

最干净的解决方案可能是将我的应用程序也编译为 32 位(或与目标应用程序相同),但...如果您对此有任何见解,我将不胜感激。

最佳答案

64位进程只能执行64位代码。 32 位进程只能执行32 位代码。现在,对于 32 位进程,操作系统内核将切换到 64 位模式以进行任何内核级系统调用。但这确实是操作系统的事。

当您从 64 位进程调用 GetWindowText 时,您正在调用 64 位 user32.dll。当您从 32 位进程调用时,您正在调用 32 位 user32.dll。目标窗口是 32 位还是 64 位进程并不重要,重要的是执行代码的位数。

你的问题中讨论 32 位版本的 p/invoke 签名的部分对我来说没有多大意义。如果没有看到任何代码,我真的无法说更多。

您想知道是否需要编译 32 位应用程序。我对此表示怀疑。您正在对不同的流程进行自动化。 32 位进程自动化 64 位进程是完全正常的,反之亦然。

不能在同一进程中混合使用不同位数的模块。您无法从 64 位可执行文件加载 32 位 DLL。反之亦然。但您没有这样做,这意味着您可以编译 32 位或 64 位应用程序。

现在,虽然您可以使用 32 位或 64 位进程,但我建议您以 32 位为目标。原因是它使您的部署更简单,因为您只有一个应用程序版本。是的,您可以使用 AnyCPU,但何苦呢?如果您不需要 64 位进程,那么坚持最低公分母会更简单。

关于c# - 64 位和 32 位应用程序之间的自动化/WinAPI 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10333248/

相关文章:

python - 如何在 iOS Appium 上按 "OK"弹出位置

java - 自动构建脚本以更新 postgres 中的数据库

c# - 编码 C 结构,其中包含结构数组

c# - 从 JQuery 将 JSON 发布到 ASP.NET MVC 4 操作

c# - Facebook 面试问题 : Formatting a collection of times for a movie show time output (using Linq is preferred)

c# - 静态方法应该修改对象还是返回一个新对象

c# linq crm select where contains 收藏

compilation - 为 AutoCAD Lisp 文件构建自动化

security - pinvoking时.NET 4方法安全异常

c# - 如何以编程方式使用 PIN 码登录 Windows