4

COM DLLを生成するプロジェクトがたくさんありますが、これらのプロジェクトは次のように出力します。

projectname_i.h
projectname_i.c
projectname_p.c
projectname_i.tlb

次に、別のプロジェクトがこのDLLを使用する場合、次のように使用されます。

#import "projectname.tlb" named_guids no_namespace

インポートの代わりにインクルードを使用するようにこれを変更したいと思います。

からに変更したい理由#import#include、コンパイラスイッチを有効に/MPしてビルド時間を短縮したいからです。

http://msdn.microsoft.com/en-us/library/bb385193.aspx

だから私が知りたいのは:

  • COM DLLにTLBとHがあるのはなぜですか?
  • どちらを使用する必要があり、その理由は何ですか?
  • #includeと#importの使用の違いは何ですか?#includeに切り替えると、予期しない結果が発生しますか?
4

1 に答える 1

10

COM DLLにTLBとHがあるのはなぜですか?

生成さ_i.hれたファイルには、Cまたはc++コンパイラで使用できる形式でIDLファイルに記述した宣言が含まれています。この.tlbファイルはタイプライブラリであり、COMをサポートするすべての言語で使用できる形式のIDL宣言が含まれています。これは、リソースとしてCOMサーバーDLLに埋め込まれます。COMサーバーを使用する人は誰でもそれを必要とします。プロキシ/スタブDLLを作成しない場合は、実行時にアパートメント間でコールをマーシャリングする必要がある場合もあります。

#includeと#importの使用の違いは何ですか?

クライアントがCまたはC++で記述されている限り_i.h、サーバーを使用するために必要な宣言を取得するには、ファイルを含めて#includeで十分です。ただし、#importディレクティブはさらに多くのことを実行し、クライアントコードに#includeされるファイルを.tlh自動生成することに注意してください。.tliこれらのファイルは、COMサーバーのインターフェイスのスマートポインタータイプを宣言します。これにより、サーバーの使用がはるかに簡単になります。これらのファイルをテキストエディタで開いて、ファイルの内容を確認してください。クライアントコードがXxxxPtrタイプを使用するか、エラーリターンコードから自動生成される_com_error例外をキャッチする場合、#importディレクティブを使用したくない場合は、クライアントコードの非常に大幅な書き直しを検討しています。

COMサーバーが安定していて、そのインターフェイス宣言が変更されない場合は、.tlhファイルと.tliファイルをチェックインし、これらのファイルの#importを2つの#includeに置き換えることができます。メンテナにファイルを再生成する方法を示すコメントをコードに残してください。「決して変更しない」というのはとらえどころのない目標です。そしてもちろん、/ MPを有効にしようとする場合、このトリックは適切ではありません。これは、COMサーバーがまだ変更中であることを示しています。

于 2012-12-04T13:05:01.510 に答える