0

既存のアプリケーションの自動化インターフェースを構築しています。DLLサーバーとEXEサーバーを実装した後(主にCOMの基本に慣れるため)、IDLファイルからタイプライブラリを生成し、たとえば、基本的にVBScriptからアプリケーションを自動化できるようになりました。

Set oApp = CreateObject("MyApp.1") 
oApp.ShowAboutBox()

パラメータをとらない関数へのこの単純な呼び出しは機能します。次のステップは、パラメーターを受け取る関数を呼び出すことです。

IDLファイル内の関数のシグネチャは次のとおりです。

HRESULT CreateSomeChildWindow([out, retval] MyChildWindow** ppChildWindow);

そしてVBScriptではそうなると思います

Dim oWnd As MyChildWindow
oWnd = oApp.CreateSomeChildWindow()

この呼び出しはすでにC++で機能しますMyChildWindowが、現在レジストリにCOMオブジェクトとして登録されていません。登録MyChildWindow する必要がない理由は、パラメータでCreateSomeChildWindow作成されたオブジェクトへのインターフェイスポインタを返すだけだからです。また、登録されていないMyChildWindow理由は、冗長性を避けたいためです。また、直接インスタンス化したくないためです(たとえば、VBScriptで呼び出すことによって)。MyChildWindowCreateObject

質問:

やっぱり登録が必要かどうか調べてみましたMyChildWindowCreateSomeChildWindowVBScriptで呼び出すために私の仮定は正しいですか

  • 私は書く必要がありますDim oWnd As MyChildWindow
  • これが機能するにMyChildWindowは、登録する必要があります

そして、その答えが「はい」MyChildWindowの場合、クラスオブジェクトを実装していないので、クライアントが直接実装できないことを願っていますか?または、クラスオブジェクトを実装する必要がありますか?

4

1 に答える 1

0

out / retvalは(スクリプト側の)オブジェクトではなく、インターフェイスポインタです。また、メソッドCreateSomeChildWindowはIDL、タイプライブラリ、登録済みタイプライブラリにあるため、タイプライブラリ全体がすでに登録されているため、スクリプト/自動化はメソッドなどのインターフェイス定義を認識します。あなたはすでにうまく設定されており、追加の登録は必要ありません。

呼び出し元がインターフェイスポインタを受信すると、ポインタがどのオブジェクトに属しているかは関係ありません。インターフェイスポインタだけで十分であり、スクリプト/自動化環境はそれを処理する方法を知っています。

ただし、呼び出し先側では、インターフェイスポインターを返す必要があり、オブジェクトを処理しています。したがって、このインターフェイスを実装するクラスが必要であり、このオブジェクトのインターフェイスを返します。

于 2012-11-17T18:18:06.383 に答える