atl生成的com中到底是不是可以设置回调函数,不是连接点函数,如果可以,应该如何设置,那位高手给出个明确的答复?100分答谢
描述:
atl生成的com中到底是不是可以设置回调函数,不是连接点函数,如果可以,应该如何设置,那位高手给出个明确的答复,最好有一步一步的代码和注释?100分答谢
这个问题查了很久也没有找到找到完美答案,请高手不吝指教
解决方案1:
可以这样,你的接口提供一个方法,接收一个外部设置的回调函数指针。然后就像实现连接点的那些对象一样,你在合适的时机调用这些方法就行了。好像这样的接口方法必须声明为local的。
解决方案2:在跨进程或跨计算机的DCOM中是不可以的,因为函数指针是进程相关的。如果是进程内COM是可以的。
解决方案3:在COM中,函数指针是个内存地址,即是进程相关的,在这个进程根据那个进程中的函数指针发起调用结果将是不可预知的,因此接口方法中是不应该传递函数指针的。
解决方案4: 事件通知方法:
1:回调函数,在少量的事件通知里,c++等环境使用比较方便,在VB,脚本语言等环境使用比较别扭,但也可以使用
2:使用回调接口:参见 "http://www.vckbase.com/document/viewdoc/?id=1525" 性能快,适应与一组相关的事件通知。同样主要使用与c++环境.因为VB,脚本环境里不支持虚接口派生。
3:连接点:参见 "http://www.vckbase.com/document/viewdoc/?id=1538",适应所有的高级语言,因为它通过IDispatch自动化接口进行事件通知,性能慢。
是否支持回调函数本身并不是COM本身需要讨论的问题。答案是肯定的,因为整个Windows操作系统的很多API内部很多就是通过回调函数实现的,比如BOOL EnumWindows( WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
int EnumFontFamilies(
HDC hdc, // handle to DC
LPCTSTR lpszFamily, // font family
FONTENUMPROC lpEnumFontFamProc, // callback function
LPARAM lParam // additional data
);
等。
不过,在有些语言里比如VB等,在设置回调函数指针时就只能强制把函数指针转换为long来进行设置,感觉比较别扭,如果都是在c++环境就无所谓了。
如果你非要设置函数指针,那就没必要做COM了
其他 语言不一定支持函数指针这个东西.
atl生成的com中到底是不是可以设置回调函数?
你看IDL的规定有函数指针这种参数没有? 没有吧
老老实实的用连接点吧,就是做这种事情用的.
COM里实现回调函数如下示例
/**
* 声明回调函数原型
*/
typedef int (* _stdcall FUNC_CALLBACK )(int a,int b) ;
/**
* 接口里声明方法设置回调用函数
*/
interface ComTestI
{
void SetCallBack( FUNC_CALLBACK func);
};
/**
* 实现类实现设置回调函数,并调用回调函数
*/
class ComTestImpl : public ComTestI
{
/**
* 初始化回调函数指针为NULL
*/
ComTestImpl()
{
m_Func=NULL;
};
/**
* 设置回调函数
*/
void SetCallBack( FUNC_CALLBACK func)
{
m_Func =func;
}
/**
* 调用回调函数
*/
void FireCallBackMethod()
{
int a =1,b =2;
if( m_Func)
{
m_Func(a,b);
}
}
/**
* 回调函数指针
*/
FUNC_CALLBACK m_Func;
};
可以啊,你创建对象的时候选上连接点就可以了
解决方案10: 回调函数(call back)肯定是没问题的,和ATL无关,windows操作系统本身就是每秒都在call的你的窗口过程函数。
我怀疑你说的是sink(接收器),这个也是100%支持,ATL就是产生COM代码的模板。
http://www.vckbase.com/document/viewdoc/?id=1525
解决方案12:http://www.vckbase.com/document/viewdoc/?id=1538
解决方案13:用双向接口,可以