0

関数の引数として COM メソッドを渡したいのですが、次のエラーが発生します (Microsoft (R) 32 ビット C/C++ 最適化コンパイラ バージョン 15.00.30729.01 for 80x86):

エラー C3867: 'IDispatch::GetTypeInfoCount': 関数呼び出しに引数リストがありません。「&IDispatch::GetTypeInfoCount」を使用して、メンバーへのポインターを作成します

私は何が欠けていますか?

どうもありがとうございました。

#include <atlbase.h>

void update( HRESULT(*com_uint_getter)(UINT*), UINT& u )
{
   UINT tmp;
   if ( S_OK == com_uint_getter( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( ptr->GetTypeInfoCount, u );
   return 0;
}
4

3 に答える 3

2

まっすぐなC ++の問題のように見えます。

あなたのメソッドは関数へのポインタを期待しています。

メンバー関数があります - (これは関数とは異なります)。

通常、次のいずれかを行う必要があります。
1. 渡す関数を静的に変更します。
2. 期待されるポインターの型をメンバー関数ポインターに変更します。

メンバー関数ポインターを処理するための構文は最適ではありません...

標準的なトリックは (1) であり、オブジェクトに this ポインターを引数として明示的に渡し、非静的メンバーを呼び出すことができるようにします。

于 2009-01-08T10:04:02.887 に答える
1

Boost.Functionもここでの合理的な選択です(以下に書いたものをテストしなかったので、いくつかの変更が必要になる可能性があります-特に、ある種のget()メソッドを呼び出す必要があるかどうかはわかりませんCComPtrオブジェクト上):

#include <atlbase.h>
#include <boost/function.hpp>
#include <boost/bind.hpp>

void update( boost::function<HRESULT (UINT*)> com_uint_getter, UINT& u )
{
   UINT tmp;
   if ( S_OK == com_uint_getter( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( boost::bind(&IDispatch::GetTypeInfoCount, ptr), u );
   return 0;
}

これは、morechilliが言及したメンバーへのポインタのすべてと同じですが、それを使用する際の厄介な構文の一部を隠しています。

于 2009-01-08T19:43:10.737 に答える
0

morechilli指摘したように、これは C++ の問題です。同僚のダニエレのおかげで、これが解決策です。

#include <atlbase.h>

template < typename interface_t >
void update( interface_t* p, HRESULT (__stdcall interface_t::*com_uint_getter)(UINT*), UINT& u )
{
   UINT tmp;
   if ( S_OK == (p->*com_uint_getter)( &tmp ) ) {
      u = tmp;
   }
}

// only for compile purpose, it will not work at runtime
int main(int, char*[])
{
   // I choose IDispatch::GetTypeInfoCount just for the sake of exemplification
   CComPtr< IDispatch > ptr;
   UINT u;
   update( ptr.p, &IDispatch::GetTypeInfoCount, u );
   return 0;
}
于 2009-01-16T12:35:06.967 に答える