如何向COM的接口传递回调函数

yyyfffyyy 2006-12-29 03:38:27
【问题描述】
现在有一个win32 dll,和上层采用回调的方式来通信。因为新的需求,要把这个dll用COM封装,请问该如何写idl文件?例如我的dll输出的方法是:
typedef void (*CALLBACKFUNC) (int x);
void GetCallback(CALLBACKFUNC callbackFunc)
{
//...
}
【我的尝试】
//在idl文件中
[
object,
uuid{xxxxxxx-xx-xx-xx-xx-xx-xx}
]
interface IX
{
typedef void (*CALLBACKFUNC) (int x);
HRESULT GetCallback([in]CALLBACKFUNC callbackFunc);
}
这样是不可以的,MIDL编译它时会出错:error MIDL 2132 : parameter must not be a function:[Parameter 'callbackFunc' of Procedure 'GetCallback' (Interface 'IX')]
【此外】MSDN中列出的IDL Attributes中callback属性与上述问题有什么关系,可以用它解决这个问题吗?
...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Analyst 2006-12-29
  • 打赏
  • 举报
回复
建议用回调接口来实现,而不要用回调函数。用了回调函数再用COM封装意义就不大了。
superarhow 2006-12-29
  • 打赏
  • 举报
回复
简单地,如果确信该接口不会被其它进程使用,可以这样写:
[local]
HRESULT GetCallback([in]CALLBACKFUNC callbackFunc);
[call_as(GetCallback)]
HRESULT RemoteGetCallback([in]BYTE* callbackFunc);

但最好还是定义一个Event的接口类型来做。参考DWebBrowserEvents2的实现方式。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧