2012-01-03 11 views
1

Visual C++で特定のコンポーネントのプロキシCOMコンポーネントを開発するプロジェクトを進めています。 "Comp"が元のコンポーネントで、Proxy_Compがプロキシコンポーネントである場合、Proxy_Compは元のコンポーネントと同じインターフェイスを持つことができます。dllファイルを別のIDLファイルにインポートする

これは "Comp.dll"だけをインポートすることで行うべきだと思います。 私の友人の一人が以前これを成功させました。しかし、私はそれをすることはできません。誰も助けてくれませんか?

答えて

2

私はあなたが話していると仮定しますIDLファイルのimportlibディレクティブタイプライブラリが必要です。ファイル名の拡張子は.tlbです。コンパクトな形式で.idl定義を含む.idlファイルでmidl.exeを実行することによって生成されるバイナリファイルです。

DLLはタイプライブラリではありません。 COMオートメーションでは、COMサーバーのタイプライブラリをDLL内のリソースとして埋め込むのが一般的な方法です。サーバーコードとそのインターフェース定義を一緒に保つことはかなり便利です。これはVisual Studioから簡単に確認でき、File + Open + Fileを使用してDLLを選択できます。例としてc:\ windows \ system32 \ shell32.dllを選ぶことができます。

リソースタイプ名は必ず "TYPELIB"です。ノードを開いてリソースIDを表示するには、常に "1"を指定します。ダブルクリックするだけでコンテンツを見ることができます。興味深いのではなく、それは16進ダンプだけなので、コンテンツを見ることができます。あなたは文字列、インターフェイスの名前、コクラスとそのメンバーを認識します。

「1」を右クリックし、コンテキストメニューのエクスポートオプションに注意してください。これにより、ファイルをディスクに書き込むことができます。名前はsomething.tlbとなります。 importlib()ディレクティブが好きな.tlbの正確なコピーが作成されます。

.tlbは元の.idlファイルを再生成するために順番に逆コンパイルすることができます。 Visual Studioプロンプトを起動します。 oleview.exe、ファイルを実行+ Typelibを開き、.tlbを選択します。フォーカスを右ペインに設定し、Ctrl + A、Ctrl + Cキーを押してテキストエディタに貼り付けます。今すぐ元の.idlを取得した後、import指示文を使用するだけです。

元の.idlファイルがCOMオートメーションクリーンで、cpp_quoteを含んでいない場合、これは100%の忠実度しか持ちません。

+0

あなたのアイデアは本当に素晴らしく、うまくいきます。しかし、私の問題は異なり、私はそれをはっきりと説明しなかった。元のコンポーネントのメソッドを呼び出すクライアントがあります。実行時に、プロキシを作成し、元のコンポーネントと同じインターフェイスを提供する必要があります。クライアントは、プロキシが元のコンポーネントと異なると感じるべきではありません。 –

+0

これまでのところ、元のdll/tlbファイルを調べて、実行時にプロキシコンポーネントを生成することができます。私は、プロキシコンポーネント内のインターフェイスの新しいUUIDを作成します。しかし、新しいUUIDで新しいインターフェイスを作成するのではなく、これらのインターフェイスが元のコンポーネントのインターフェイスを指すようにする必要があります。どうすればいいですか教えてください。 –

+0

ライブラリCalcProxyLib { \t importlib( "stdole2。); \t importlib( "C:¥Users¥Uma¥Documents¥Visual Studio 2008¥Projects¥Tutorial¥Calc¥Windows Mobile 5.0 Pocket PC SDK(ARMV4I)¥Debug¥Calc.tlb"); \tインターフェイスIDocHostUIHandlerDispatch ; \tインターフェースIAxWinAmbientDispatchEx; [ UUID(-8131-3d61ddc84446 2c43e5f4-b9e3-421f) helpstring( "ハロークラス") ] コクラスHelloproxy {[デフォルト]インターフェースIHello; }; }。 –

2

タイプライブラリ(DLLに埋め込まれた.tlbデータ)のインターフェイス定義が必要です。 (おそらくVSで)Windows SDKのユーティリティがインストールされている場合は、OLE/COM Object Viewerと "File"、 "View Typelib"を実行してください。それはインタフェース定義をコピーすることができるIDLダンプを与えるはずです。

(もそれはあなたが後にしているものだならば、時間をコンパイルIDLでの.tlbデータをインポートする方法であるが、私は申し訳ありませんわからないことがあります。)

関連する問題