【发布时间】: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