我想将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;
}
答案 0 :(得分:2)
看起来像是直接的c ++问题。
您的方法需要一个指向函数的指针。
你有一个成员函数 - (与函数不同)。
通常你需要:
1.将要传递的功能更改为静态
2.更改指向成员函数指针的指针类型。
处理成员函数指针的语法不是最好的......
标准技巧是(1)然后显式传递对象this this 作为一个参数,允许你然后调用非静态成员。
答案 1 :(得分:1)
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提到的所有指向成员的东西相同,但它隐藏了使用它的一些更混乱的语法。
答案 2 :(得分:0)
正如morechilli所指出这是一个C ++问题。 这是解决方案,感谢我的同事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;
}