2012-04-18 26 views
2

私はサードパーティ製品のプラグインを作成しようとしています。これは、提供された型ライブラリから指定されたインタフェースを実装するネイティブC++ DLLの形式をとります。私のプラグインが正常に読み込まれ、インターフェイスによって記述されたメソッドが予期されたポイントで呼び出されているので、プラグインからログファイルを書き出してWebサービスに問い合わせることができます。COM Interop - メンバーが見つかりません

しかし、私のプラグインがメインプログラムに問い合わせるために、Initialize()メソッドはIDispatchインターフェイスを渡します。 、

Initialize(LPDISPATCH pDispArchivingControl) { 
    LPOLESTR ptName = L"currentVaultId"; 
    HRESULT hr= pDispArchivingControl->GetIDsOfNames(IID_NULL, &ptName, 1, 
         LOCALE_USER_DEFAULT, &dispID); 
    // add parameters, etc 
    hr = pDispArchivingControl->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
        DISPATCH_METHOD, &dp, pvResult, NULL, NULL); 
    // hr = 0x80020003 Member not found. 
} 

最初のセクションGetIDsOfNames()、私はそれが必要だと思うものを行い、すなわちptNameにプログラムのマニュアルからのメソッドの名前を置くことは私の中に別の値を与える:私はこのようないくつかのコードで、このインターフェイスの使用をしようとしていますdispID - 15,27など。

第2セクションのInvoke()は、常にHRESULT 0x80020003(メンバーが見つかりません)を返します。

ここに記載されている解決策がいくつか見つかりました:HOWTO: Troubleshoot "Member Not Found" 0x80020003 Error解像度1では、4番目のパラメータとしてDISPATCH_METHODとDISPATCH_PROPERTYGETの両方を試しました。私はdispIDで値を取得しているので、2と3を私に当てはめることはできないと仮定していますか?私はこれらを変更する方法もわかりません。

私は今、ちょっとしたアイデアを出しています.Googleはこれ以上私を助けてくれません。だれかが次に何をすべきかを提案できますか?


更新:これは、どのメソッドがoleviewに似ているかです。私は

method seen in oleview

+1

方法とよく似ていません。私たちはdpを見ることができません、実際にはインデックスされたプロパティですか?なぜあなたはタイプライブラリを持っているときにレイトバインディングを使用していますか? Oleview.exeでそれを見てください。 –

+0

@HansPassant私は何をしているのか分からないので、レイトバインディングを使用しています。私はC++とCOMにはかなり新しいです。私はタイプライブラリで#importを使用しようとしましたが、渡されたインターフェースをどのように接続するかはうまくいかなかった - インスタンスを作成してコンパイルするが、実行時に "無効なポインタ"を与えるインターフェイスを割り当てようとした。この状況では#importが優れていますか?または、他の何か? –

+1

あなたが運が良ければ、インポートは 'IArchivingControl'インターフェースと' IArchivingControlPtr' ATLスマートポインタークラスを作成するはずです。スマートポインタがある場合は、IDispatchを割り当てて、null以外のオブジェクトがあるかどうかを確認してから呼び出すことができます。スマートポインタがない場合は、IID_IArchivingControlでIDispatchで 'QueryInterface'を呼び出すと、IArchivingControlインターフェイスが作成されます。あなたが終わったときに両方を '解放する'ことを忘れないでください。 – Rup

答えて

1

コメントでハンスアンパッサンとRupのによって与えられたこの質問に対する正しい答えは、である...ツリービューでそれを見つけるが、[ファイル]> [ビューのタイプライブラリでそれを開くことができたことができませんでしたレイトバインディングを使用しないで、タイプライブラリ#importに。私の.cppファイルに

#import "ArchivingControl.tlb" raw_interfaces_only, raw_native_types, named_guids, auto_search 

そして、この:

ArchivingControl::IArchivingControlPtr JTArchivingControlPtr; 
STDMETHODIMP CMyClass::Initialize(LPDISPATCH pDispArchivingControl) 
{ 
    JTArchivingControlPtr = pDispArchivingControl; 
    return S_OK; 
} 
STDMETHODIMP CMyClass::OtherFunction() 
{ 
    BSTR pVaultId; 
    JTArchivingControlPtr->get_currentVaultId(&pVaultId); 
    return S_OK; 
} 

をそして今、すべてがうまく動作しますが、プラス私は今の方法より少ないコードを持って - 感謝を

私はstdafx.hでこれを入れて!

関連する問題