Como passar um método COM como um argumento de função? E C3867 de erro Microsoft Compiler

StackOverflow https://stackoverflow.com/questions/423730

  •  05-07-2019
  •  | 
  •  

Pergunta

Gostaria de passar um método COM como um argumento de função, mas eu recebo este erro (Microsoft (R) 32-bit C / C ++ Otimizando Compiler versão 15.00.30729.01 para 80x86):

Erro C3867: 'IDispatch :: GetTypeInfoCount': chamada de função faltando lista de argumentos; usar '& IDispatch :: GetTypeInfoCount' para criar um ponteiro para membro

O que eu estou ausente?

Muito obrigado.

#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;
}
Foi útil?

Solução 3

Como morechilli apontou esta é uma questão C ++. Aqui está a solução, graças ao meu colega Daniele:

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

Outras dicas

Parece um problema direto c ++.

Seu método espera um ponteiro para uma função.

Você tem uma função membro - (que é diferente de uma função)

.

Normalmente, você terá que quer:
1. Alterar a função que você quer passar a ser estática.
2. Alterar o tipo de ponteiro esperado para um ponteiro de função de membro.

A sintaxe para lidar com ponteiros de função de membro não é a melhor ...

Um truque padrão seria (1) e, em seguida, passar o objecto esse ponteiro explicitamente como um argumento que lhe permite, em seguida, chamar membros não estáticos.

Boost.Function também é uma escolha razoável aqui (note que eu não testar o que eu escrevi abaixo, por isso pode exigir alguma modificação - particularmente, eu não tenho certeza se você tem que chamar algum tipo de get () método no seu objeto 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;
}

Este é o mesmo que todo esse material ponteiro-para-membro que morechilli mencionado, mas ele esconde um pouco da sintaxe mais confusa de usá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top