2

通常、COMインターフェイスを作成するには、IDLファイルで宣言する必要があります。私が取り組んでいるプロジェクトでは、C++の*.hファイルで1つのCOMインターフェイスが宣言されています。

struct DECLSPEC_UUID("A67177F7-A4DD-4A80-8EE1-25CF12172068") ISomeService : public IUnknown
{
    virtual ~ISomeService() {}

    virtual HRESULT Initialize(const Settings& settings) = 0;

    // ...
};

さらに、Initializeメソッドは、パラメーターとしてstd::stringフィールドを含む構造体を取ります。対応するCOMクラスはC++で実装されており、別のC++モジュールから使用されます。AppVerifierでコードを実行するまで、これは正常に機能します。アクセス違反の例外が発生します。

だから私の質問は

  1. * .hファイルでCOMインターフェイスを宣言することは正しいですか?
  2. はいの場合、COMインターフェイスメソッドのパラメータとしてC ++タイプを指定するのは正しいですか?または、そのような場合(BSTRなど)は常にCOM準拠のタイプを使用する必要がありますか?
4

1 に答える 1

3
  1. もちろん、IDLを使用せずにCOMインターフェイスを記述できます。ただし、タイプライブラリやマーシャリングコード生成などのIDL機能を使用することはできません。ただし、COMコンポーネントをインプロセスサーバーのみ(DLL)として使用していて、.hファイルをクライアントに配布しても問題がない場合は、このアプローチで問題なく機能します。

  2. DLLの境界を越えてメモリを処理するときにアクセス違反が発生する可能性があるため、インターフェイスでC++タイプを使用することは避けてください。プレーンCタイプまたはCOMタイプを使用することをお勧めします

于 2012-06-04T18:35:49.040 に答える