Como passar um método COM como um argumento de função? E C3867 de erro Microsoft Compiler
-
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;
}
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.