3

Delphi XE2 で、異なるアプリケーション間でオブジェクト プロパティを読み取り、変更できるアプリケーションを開発しようとしています。

現在、唯一のターゲット アプリケーションは、Delphi XE で開発されたもので、ソース コードがあり、VB6 で作成されたもので、ソースも情報もありません。

私たちが探している主なオブジェクトはラベルと編集ですが、理想的には、すべてのオブジェクトとそのプロパティをリストし、それらを自由に読み取って変更し、メソッドを呼び出すことができるオブジェクト ビューアーをほとんど設計する必要があります。

私はそうする方法に途方に暮れています.VBアプリケーションのバッファを読み取り、メモリ割り当てを直接操作することに基づいて、いくつかのラベルキャプションを読み取ることができたのが最善でしたが、それでも機能するだけだったため、制限がありました意図したようなWindows 7ではなく、WinXPで。

私が望むものを達成するための最良の方法は何ですか? それが最善であるなら、私は別の言語でコーディングしたいと思っています。

編集:さらに調査を行った後、TestComplete を発見しました。その中には、基本的にオブジェクトとそのプロパティのリスト/変更を行うオブジェクト ビューアーがあります。
これを行うためにサード パーティのソフトウェア パーティを使用しないことが目標であるため、これが実行可能であることは明らかですが、方法についてはわかりません。MSAA/IAutomation はある程度機能しましたが、どちらも実際にすべてのオブジェクトを一覧表示することはできませんでした。

これがどのように機能するかを簡単に示すいくつかの画面を次に示します (サードパーティの VB アプリケーションでは、セキュリティのために部分を編集しています)。

TestComplete オブジェクト ブラウザ TestComplete オブジェクト ブラウザ 2

4

3 に答える 3

6

既存のオブジェクトを一覧表示し、それらのプロパティを読み取り/変更する理想的な方法は何ですか?

理想的な方法のようなものはありません。アプリケーションを知っていて、それへの何らかのインターフェースを持っている (または内部から知っている) か、利用可能なものに準拠する必要があります。ターゲットが一般的な Windows コントロールを備えた Windows アプリケーションである場合、探しているのは Windows API です。

ただし、画面に表示されるすべてのコントロールに Windows API を介してアクセスできるわけではなく、残念ながらラベルはその 1 つです。一般的に言えば、Windows API を介してアクセスできるのは、ハンドルを持つウィンドウ コントロールのみです。

(外部アプリケーションの) すべてのオブジェクトとそのプロパティを一覧表示するオブジェクト ビューアを作成し、これらのプロパティを読み取って変更し、オブジェクトのメソッドを呼び出す方法。

オブジェクトのリスト (Windows API の観点から) は非常に簡単です。検査したいターゲット アプリケーションからウィンドウのハンドルを取得し、その子ウィンドウを列挙する必要があります (または、今回はそれらをコンポーネントと呼ぶ方が適切です)。のようなコードでthis one
しかし、このような列挙から取得できる関連するものは、コンポーネント ハンドルとそのクラス名の 2 つだけです。各コンポーネント インスタンスには、一度に一意である独自のシステム全体の識別子と、クラス名で識別されるクラス タイプがあります。

システム全体のコンポーネント識別子とクラス タイプを取得できるので、コンポーネントの特定のウィンドウ メッセージを送信することで、全体のウィンドウ内のすべてのコンポーネントを制御できますが、...
世界で誰がそのクラスを期待するでしょうか。同じメッセージを同じように処理して反応するコンポーネントの名前は異なる場合があります。

さて、あなたの悪夢はサブクラス化と呼ばれ、開発者は既存のコンポーネントを新しいクラス名の下に新しい機能で拡張できます。1 つの輝かしい例として、基本的な Windows 編集ボックス クラスEDITと、Delphi のサブクラス化された type を使用できますTEditTEdit両方とも同じメッセージ セットで制御でき、どちらも同じように動作しますが、クラス タイプを持つコンポーネントを見つけた場合は同じように制御する必要があることを覚えておく必要があるため、あなたの観点からは別の問題です。EDITクラスコンポーネントのように。

これで、特定のハンドルを持つコンポーネントのタイプがわかったので、あとは、そのコンポーネント タイプで使用できる適切な関数 (メッセージ) のセットを選択するだけです。必要なものはすべて にあり
ますMSDN reference pages。特定のコンポーネントのプロパティを取得または設定するための機能を含む、利用可能なすべての一般的なコントロール機能があり、そこを参照するのが最適です。

外部アプリケーション オブジェクト メソッドの呼び出しについて。幸いなことに、これは不可能であり、マルウェアや不適切に作成されたアプリケーションが、あるプロセスから別のプロセスに制限なしで相互に関数を呼び出していることによって何が引き起こされるか想像したくありません。

于 2012-04-10T23:43:09.710 に答える
5

WinAPI に加えて、Microsoft Active Accessibility を使用して、他のウィンドウから情報を取得できます。ここに小さな例があります: http://blogs.msdn.com/b/oldnewthing/archive/2004/04/23/118893.aspxおよび Delphi コード: http://www.transl-gunsmoker.ru/2009/08/ blog-post.html

于 2012-04-11T09:06:35.603 に答える
1

RTTI と、たとえば Indy TidTCPServer を使用すると、テキストベースの「telnet に似た」オブジェクト ブラウザ/エディタを任意の Delphi アプリに追加するのは非常に簡単です。私はいくつかのアプリでこれを行い、フォームとコンポーネントの構造を整理して、コンテナーが「フォルダー」として表示され、コンポーネントが「ファイル」のように表示されるようにしました。それは便利です..そして楽しいです。アプリが目の前で突然色が変わったり、徐々に高くなったり薄くなったりすると、ユーザーは少し不安になります。その後に寄せられるバグ レポートは面白いものです (いや、その通りです。マーケティング マネージャーに対してさえ、私はそうするべきではありません)。

フォームベースのブラウザを treeView で構築できない理由がわかりません。コンポーネント ノードをクリックすると、プロパティを一覧表示して編集できるフォームが表示されます。IIRC、私はこのような公開されたメソッドしか呼び出すことができませんでした。

OTOH、VB アプリを効果的に取得する方法がわかりません。VB は私が適切な保護なしでアプローチしたいものではなく、防護服は不快です。

于 2012-04-10T20:48:23.533 に答える