【问题标题】:Automation / WinAPI calls betwenn 64bit and 32bit application [closed]自动化/WinAPI 在 64 位和 32 位应用程序之间调用 [关闭]
【发布时间】:2012-04-26 12:19:06
【问题描述】:

我们在 2 个应用程序之间有一个自动化场景(主要是 MSUIA),目标是 32 位,我的应用程序(自动化应用程序)是 64 位,在 64 位 win7 上。 一些需要共享的信息必须通过直接 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 位(或与目标应用程序相同),但仍然......如果您对此有任何见解,我将不胜感激。

【问题讨论】:

  • 您的 pinvoke 声明很可能有问题,它会使堆栈指针失衡并导致后续代码变得非常混乱。 Debug + Windows + Registers 并验证调用前后 ESP 的值是否相同。有一个 MDA,确保你没有禁用 pInvokeStackImbalance

标签: c# automation pinvoke wow64 win64


【解决方案1】:

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

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

您的问题中关于 32 位版本的 p/invoke 签名的部分对我来说没有多大意义。没有看到任何代码,我真的不能说更多。

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

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

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

【讨论】:

  • 非常感谢您的洞察力!实际上,我发现我还有其他问题,这些问题只有在我修改过多的版本中才会显现出来。不过,我的程序在不同的签名下运行良好。我将不得不对此进行调查。也许事情恰好解决得很好,就像我需要的参数是第一个并且只使用了 4 个字节或类似的东西..(它当然不会崩溃)另外,我想知道..有时我需要在进程中注册- 来自另一个进程的内存,以便获取 SendMessage 的结果。在 32 位和 64 位之间这不是问题吗?实际上,它工作得很好。
  • 进程内内存和SendMessage?取决于消息。一些消息将跨进程边界编组您的内存。这取决于。没有单一的通用答案。
  • 再次感谢!如何发现?我可以从任何应用程序访问任何内容,因为它已在内部正确转换吗?就像我调用像 VirtualAllocEx 这样在另一个应用程序中分配内存的函数,是否可以确定我可以处理结果(例如,如果 32 位应用程序在 64 位应用程序中分配内存)? (作为解释:然后用于存储一些 SendMessage 的返回值。)
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 2017-04-07
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
相关资源
最近更新 更多