IMyInterface
を実装するCOMクラスCMyCOMServer
があり、いずれも正しいGUIDを使用しています。 CMyCOMServer::QueryInterface
は、IUnknownまたはIMyInterfaceが要求された場合はS_OKを返し(正しいタイプにキャストします)、そうでない場合はE_NOINTERFACEを返します。同じPC上の他のアプリでインターフェイスが見つかってもE_NOINTERFACEを返すCoCreateInstance
、私が呼ん:
HRESULT hr = ::CoCreateInstance(__uuidof(CMyCOMServer), 0, CLSCTX_SERVER,
__uuidof(IMyInterface),(void **)&pInterface);
それはE_NOINTERFACEを返します。だから私は何か間違っていると仮定し、CMyCOMServer::QueryInterface
にブレークポイントを追加しました。私はCoCreateInstance
が呼び出されたときに、QueryInterface
は異なるインタフェースのための複数回トリガーされることがわかった:
- まず、IUnknownのが要求されていない - などIMarshallのような何の問題
- をその後、いくつかのインタフェースが要求されている...これらはサポートされていません。したがって、E_NOINTERFACEが返されます。
- 最後に、IMyInterfaceが要求されます。呼び出しのCoCreateInstanceは私にNULLポインタとE_NOINTERFACEのリターンコードを残している理由COMサーバアプリが明確に帰国したとき
は、だから私の混乱は、ある期待通りのQueryInterfaceは、S_OKを返し、インタフェースポインタとして(IMyInterface *)this
をセットIを検証インターフェイス私は頼む?
EDIT:私のクライアントアプリケーションは起動時にCoInitialize(NULL)を呼び出しますが、これは違いはありません。
明確にする:COMサーバーは1つのアプリケーションで実行され、クライアントは別のアプリケーションで実行されますか?これは、彼らが別のプロセスに入ることを意味し、それはあなたがマーシャリングする必要があることを意味します。 – MSalters
はい、そうです。 PC 1台につき2つの別々のアプリ。私はマーシャルの前にぶち込まなければならなかったことはありません。それが私が混乱している理由です。私はこれまでほとんど聞いたことがなく、かなりの量のCOM開発を行ってきました。 –