2012-04-17 15 views
6

私はCOMプログラミングの初心者で、Visual Studio 2010から基本のネイティブCOMサーバー/クライアントペアを作成します。クライアントプロジェクトとサーバープロジェクトの両方が同じソリューションに入ります。私は、クライアントプロジェクトに生成されたクライアントスタブとヘッダーファイルを含めるのが最も適切な方法を知りたいと思います。サーバープロジェクトでMIDLを作成しました。プロジェクトをコンパイルすると、_h.h、_i.c、および_p.cファイルがプロジェクトのソースディレクトリに生成されます。VS2010を使用してクライアントのネイティブCOMクライアントスタブを編集する

  • 私のクライアントプロジェクトで両方の.cファイルをコンパイルする必要はありますか?
  • クライアントプロジェクトでこれらをサーバプロジェクトのソースディレクトリからリンクされたファイルとして追加することで、これらをクライアントプロジェクトでコンパイルする最良の方法はありますか?
  • MIDLを変更すると_h.h、_i.c、および_p.cファイルが古くなっていることをVisual Studioで知る方法はありますか、またはいつでもサーバープロジェクトを再コンパイルする必要があります私はMIDLに触れる?
  • .hファイルの場所はどこですか - サーバープロジェクトのstdafx.hファイルに移動できますか?その場合は、クライアントプロジェクトのヘッダーインクルードディレクトリにサーバープロジェクトのソースディレクトリを追加するのが適切ですか?
  • クライアントプロジェクトのサーバープロジェクトへの「参照」(Visual Studio Referenceの意味)が必要ですか?

さらに、この登録を無料にしたいと思います。この場合、クライアントとサーバーのマニフェストのほかに何か必要なことはありますか?

..

編集

ここでは、MSDNの記事を見て:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366830(v=vs.85).aspxは、それは私だけで、私だけで-PROC REGフリー活性化をサポートしたい場合は、生成されたファイルのことを表示されます_i.cをコンパイルしてクライアントプログラムに_h.hファイルを含める必要があります。

dlldata.cと_p.cは、プロキシDLLを作成するために使用されるように見えます。プロキシDLLは、リモートコンピュータ(リモートコンピュータまたはローカルコンピュータからのアクティブ化のための登録)をサポートしていますなぜそれがCOMサーバーのDLLが登録されていることを考えると必要とされているローカルコンピュータは、PROCのうち?COMサーバDLLは、はい、プロキシDLLが異なるのですか?)あまり

おかげで、

--Matt

答えて

5

生成された_p.cとdlldata.cは、プロキシ/スタブDLLを構築するために別のプロジェクトにコンパイルする必要があります。あなたはアパートやプロセス間でコールをマーシャリングする場合にのみ、必ずしも1つが必要なわけではありません。

生成された_i.cファイルは、GUID値を提供します。それをサーバーとプロキシ/スタブにコンパイルします。クライアントにコンパイルするのは問題ありませんが、__uuidofキーワードを使用するのが最も簡単です。

生成された_i.hファイルには、インターフェイスおよびコクラスの宣言が含まれています。サーバーとクライアントに#includeする必要があります。

Midl.exeは.idlを変更すると、これらのファイルを自動的に再生成する必要があります。クライアント、サーバー、およびプロキシ/スタブが再構築されることが保証されます。

stdafx.hは問題ありません。インクルードディレクトリにはあります。

"参照"にはありません。クライアントとサーバーにはリンクの依存関係はありません。

regフリーのcomのマニフェストを作成し、クライアントに埋め込む必要があります。

+0

ありがとうハンス、私はそれを感謝します。明確にするには - サーバー上の単一プロセスでMTAとSTAをマーシャリングする場合、プロキシ/スタブDLLが必要ですか?もしそうなら、私はここで何をしますか?_p.cとdlldata.cを別のプロジェクトにビルドし、DLLとクライアントとサーバーを別々に配布します。 さらに、__uuidキーワードのページまたはリソースを指摘できますか?私は[__uuidof](http://msdn.microsoft.com/en-us/library/zaah6a61(v = vs80).aspx)が見つかりましたか?もしそうなら、コンパイル時にreg-freeマニフェストからクライアントのどこにこの情報を得ますか? – Matt

+0

はいとはい。 CLSIDとインターフェイスキーを展開して登録します。これは__uuidofで、_i.hファイルのインターフェイス宣言から派生しています。 –

+0

代わりに、代わりにtlbを#importするのはなぜですか? – deltanine

関連する問題