2 つのアプリケーション間に自動化シナリオ (主に MSUIA) があります。ターゲットは 32 ビットで、私のアプリ (自動化するもの) は 64 ビットで、64 ビットの win7 上にあります。共有する必要がある情報の一部には、直接 Win SDK 呼び出し (SendMessage、GetFocus など) を介してアクセスする必要があります。
私の理解では、Win64 と 32 サブシステムは完全に分離されているため、そのような種類の対話はすぐに失敗するはずです (たとえば、64 ビット アプリを介して 32 ビット アプリの一部にアクセスしようとするなど)。奇妙なことに、ほとんどのものは正常に動作するようです。そのため、何らかのマーシャリングが内部的に行われているようです。
ただし、p/invoke 関数を定義する方法に問題があるように見えるいくつかのシナリオに遭遇しました。私は、何かがサイズを変更する可能性があるときはいつでも IntPtr を使用して (また、素晴らしいhttp://www.pinvoke.net/default.aspx/サイトを使用して)、それらを「公式の MS の方法」と宣言しました。 64 ビット (コンパイル スイッチを使用) の場合、DLL の 64 ビット バージョンを使用して 64 ビット用にコンパイルする必要があります。
奇妙なことに、これらの呼び出しを使用して 32 ビット アプリにアクセスすると (たとえば、他のプロセスのメモリから実際に読み取る GetWindowText など)、これらの呼び出しは正常に機能しているように見えます。しかし。後続の MSUIA 呼び出しはランダムに失敗するようです。
64 ビットにコンパイルしているにもかかわらず、p/invoke 呼び出しに対して (誤って) 32 ビット署名を宣言すると、すべて正常に動作します。
私には、これは意味がありません。
最もクリーンな解決策は、おそらくアプリを 32 ビット (またはターゲット アプリと同じ) にコンパイルすることですが、それでも..これについての洞察に感謝します。