2

サードパーティ製品のプラグインを作成しようとしています。これは、提供されたタイプ ライブラリから指定されたインターフェイスを実装するネイティブ C++ DLL の形式をとります。私のプラグインは正常に読み込まれ、インターフェイスによって記述されたメソッドが期待される時点で呼び出されています。プラグインからログ ファイルを書き出し、Web サービスにクエリを実行できます。これまでのところ、問題ありません。

ただし、私のプラグインがメイン プログラムを照会するために、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()、私がそうあるべきだと思うことを行います。つまり、プログラムのドキュメントからメソッドの名前を入れると、-15、27 などのptName異なる値が得られますdispID

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

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

私は今ちょっとアイデアがありません.Googleはそれ以上私を助けてくれません.誰が次に何をすべきか提案できますか?


更新: これは、メソッドの 1 つが oleview でどのように見えるかです。ツリービューで見つけることができませんでしたが、File > View TypeLib で開くことができました...

oleview に見られるメソッド

4

1 に答える 1

1

Hans Passant と Rup がコメントで示したこの質問に対する正しい答えは、レイト バインディングを使用するのではなく#import、タイプ ライブラリを使用することです。

私はこれを入れましたstdafx.h

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

そして、これは私の.cppファイルにあります:

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;
}

そして今、すべてがうまく機能し、コードが大幅に減りました - ありがとう!

于 2012-04-19T14:38:07.183 に答える