Как передать метод COM в качестве аргумента функции? И ошибка компилятора Microsoft C3867 - PullRequest
0 голосов
/ 08 января 2009

Я хотел бы передать метод COM в качестве аргумента функции, но я получаю эту ошибку (32-разрядная версия оптимизирующего компилятора C / C ++ Microsoft (R) 15.00.30729.01 для 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;
}

Ответы [ 3 ]

2 голосов
/ 08 января 2009

Похоже на прямую проблему с ++.

Ваш метод ожидает указатель на функцию.

У вас есть функция-член - (которая отличается от функции).

Обычно вам нужно:
1. Измените функцию, которую вы хотите передать, чтобы она была статической.
2. Измените ожидаемый тип указателя на указатель на функцию-член.

Синтаксис для работы с указателями на функции-члены не самый лучший ...

Стандартный трюк будет (1), а затем явно передаст объекту этот указатель в качестве аргумента, позволяющего затем вызывать нестатические члены.

1 голос
/ 08 января 2009

Boost.Function также является разумным выбором здесь (обратите внимание, что я не тестировал то, что написал ниже, так что это может потребовать некоторой модификации - в частности, я не уверен, что вам нужно вызывать какую-то () для вашего объекта 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, но оно скрывает некоторый беспорядочный синтаксис его использования.

0 голосов
/ 16 января 2009

Как отметили 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...