2アプリケーション間の自動化シナリオ(主にMSUIA)があり、ターゲットは32ビット、私のアプリケーション(自動化のもの)は64ビットのwin7で64ビットです。 共有する必要がある情報の一部は、direkt Win SDK呼び出し(SendMessage、GetFocusなど)を介してアクセスする必要があります。オートメーション/ WinAPIは64ビットと32ビットアプリケーション間で呼び出します
私の理解から、Win64と32サブシステムは完全に分離されているので、この種のやりとりはすぐに失敗するはずです(例えば64ビットアプリケーションを通して32ビットアプリケーションの部分にアクセスしようとする)。しかし、不思議なことに、ほとんどのものはうまくいくようです。だから内部的に何らかのマーシャリングがあるようです。
私はp/invoke関数を定義する方法に問題があるように見えますが、ここでいくつかのシナリオを実行しました。私はIntPtrを使ってサイズを変えることができるときはいつでも(「http://www.pinvoke.net/default.aspx/」のサイトを使って)IntPtrを使って「公式MSの方法」を宣言していますので、64ビット(コンパイルスイッチを使って) 64ビット版のdllを使用しています。
奇妙なことは、これらの呼び出しを使用して32bitアプリケーションにアクセスすると(実際に他のプロセスのメモリから読み取るGetWindowTextなど)、これらの呼び出しはうまく動作しているようです。しかし。その後のMSUIA呼び出しはランダムに失敗するようです。
64bitにコンパイルしても、p/invoke呼び出しのために32bitの署名を間違って宣言しても、すべて正常に動作しています。
私にとって、これは意味をなさない。
私のアプリを32ビットにコンパイルするのはおそらく(またはターゲットアプリケーションと同じですが)、私はこのアプリを洞察することに感謝します。
あなたのpinvoke宣言に間違いがあります。おそらく、スタックポインタのアンバランスが発生し、後続のコードがきれいになってしまいます。 Debug + Windows +呼び出しの前後でESPの値が同じであることを登録し、検証します。 MDAがあるので、pInvokeStackImbalanceを無効にしていないことを確認してください –