2012-04-26 20 views
2

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ビットにコンパイルするのはおそらく(またはターゲットアプリケーションと同じですが)、私はこのアプリを洞察することに感謝します。

+0

あなたのpinvoke宣言に間違いがあります。おそらく、スタックポインタのアンバランスが発生し、後続のコードがきれいになってしまいます。 Debug + Windows +呼び出しの前後でESPの値が同じであることを登録し、検証します。 MDAがあるので、pInvokeStackImbalanceを無効にしていないことを確認してください –

答えて

2

64ビットプロセスは64ビットコードしか実行できません。 32ビットプロセスは32ビットコードのみを実行できます。現在、32ビットプロセスのオペレーティングシステムカーネルは、カーネルレベルのシステムコールに対して64ビットモードに切り替わります。しかし、それは実際にはオペレーティングシステムのビジネスです。

GetWindowTextを呼び出すと、64ビットプロセスから、user32.dllという64ビットの呼び出しが呼び出されます。 32ビットプロセスからコールすると、hte 32ビットuser32.dllが呼び出されます。ターゲットウィンドウが32または64ビットのプロセスであるかどうかは重要ではありません。重要なのは実行コードのビット数です。

p/invokeシグネチャの約32ビットバージョンについて話すセクションは、私にはあまり意味がありません。私は実際にはコードを見ずにもっと言うことはできません。

32ビット版のアプリケーションをコンパイルする必要があるかどうかは疑問です。疑わしい。あなたは、別のプロセスの自動化を行っています。 32ビットプロセスが64ビットプロセスを自動化することは完全に正常であり、その逆もあります。

混在できないものは、同じプロセスで異なるビット数モジュールです。実行可能な64ビットから32ビットのDLLをロードすることはできません。およびその逆。しかし、あなたはそれをやっていません。つまり、32ビットまたは64ビットのいずれかでアプリケーションをコンパイルできます。

32ビットまたは64ビットのプロセスを使用できると言われていますが、私は32ビットをターゲットにすることをお勧めします。その理由は、アプリケーションのバージョンが1つだけであるため、配置が簡単になるからです。はい、あなたはAnyCPUを使うことができますが、なぜ迷惑ですか。あなたが64ビットプロセスを必要としないなら、最も低い共通分母に固執する方が簡単です。

+0

洞察力に感謝します! 実際には、私はあまりにも多く騒ぎ回ったバージョンでしか見えない他の問題があることを知りました。 まだ、私のプログラムは異なる署名でうまく動作します。私はこれを調べなければならないでしょう。たぶん、ちょっとしたことがうまくいきます。必要なパラメーターが最初のもので4バイトしか使われていないかのように(確かにクラッシュしません) また、 SendMessageの結果を得るために、別のプロセスのプロセスメモリを使用します。それは32と64ビットの間で問題ではありませんか?実際、うまくいきました。 –

+1

インプロセスメモリとSendMessage?メッセージによって異なります。一部のメッセージは、プロセスの境界を越えてメモリをマーシャリングします。場合によります。単一の一般的な答えはありません。 –

+0

もう一度ありがとう!見つける方法?内部で正しく変換されているため、アプリケーションからアクセスすることはできますか?他のアプリケーションでメモリを割り当てたVirtualAllocExのような関数を呼び出すと、32ビットアプリケーションが64ビットアプリケーションでmemを割り当てる場合のように、結果を処理できることは確実ですか? (説明として、それは、いくつかのSendMessageの戻り値を格納するために使用されます)。 –

関連する問題