请教各位大牛关于vb com组件回调对象的问题

cheenyu 2015-09-02 10:01:05
这个是com的idl文件,对象是ENTRFUNC
[
uuid(715F4705-D954-4942-AF67-A480D356ACBA),
helpstring("ENTRFUNC Class")
]
coclass ENTRFUNC {
[default] interface IENTRFUNC;
[default, source] interface ICallBack;
};

在VB中加入的参考,正常的调用可以
Private cbtest As New ENTRFUNC
Text1.Text = ""
Dim str As String
cbtest.ENTRFUNC_GetVersion str
Text1.Text = str
定义回调类的时候,也能取到回调方法
Icallback
Public WithEvents cback As ENTRFUNC
Private Sub cback_OnConnected(parg As Variant)
frmAddIn.Text1 = "connected"
End Sub
但是给该类赋值的时候会报错
Private ctest As New Icallback
set ctest.cback= new ENTRFUNC
会报runtime error 430的错误,意思是不支持自动化,或者不期望的接口

另外 在dephi中使用该com一切正常
在dephi里引入com会有两个接口,IENTRFUNC,ICallBack
其中的回调注册函数和idl文件一致
HRESULT ENTRFUNC_Init(
[in] VARIANT use_ssl,
[in] VARIANT start_conn,
[in] ICallBack* pCallBack,
[in] VARIANT* parg);
但是在VB中,就变成了
ENTRFUNC_Init(use_ssl,start_conn,pCallBack ENTRFUNC,parg)

求解各位大牛,或者提供相关书籍,感谢了!

...全文
1854 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheenyu 2015-09-10
  • 打赏
  • 举报
回复
最近看了很多关于com和vb方面的资料,基本上了解到,vb上这个回调的实现应该是用连接点,而不是用回调的接口来实现的,现在有一个疑问,参考了“COM组件设计与应用(十五)连接点(vc6.0)”,基本了解了连接点的方法,目前有一个疑问就是使用给出的多连接点(Result和timer)的代码,在VB总创建,只能看到一个连接点(Result)。这个什么原因呢。
引用 12 楼 Tiger_Zhao 的回复:
说明ENTRFUNC没有实现IDispatch接口,不是完整的COM。
Tiger_Zhao 2015-09-10
  • 打赏
  • 举报
回复
用什么模式不影响VB调用啊。
所谓的“只能看到一个连接点”什么意思?
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
也就是Vb里没有Icallback这个接口类,只有一个ENTRFUNC, 加上withevnens 以后,可以取出回调的方法, 但是这个对象就是不知道怎么set
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
说的好混乱,没看明白。 不过作为接口是不能创建对象的吧。
Private ctest As New Icallback
com引入了VB,Icallback就变成了一个一个withevents的对象ENTRFUNC 我在vb中加入了一个类模块,Icallback,里面定义了一个对象 Public WithEvents cback As ENTRFUNC 定义了其中的cback_OnConnected方法 我想把这个回调对象,注册进去 cbtest.ENTRFUNC_Init i, j, ctest.cback, 0 但是set这个对象的时候报错 set ctest.cback= new ENTRFUNC
Tiger_Zhao 2015-09-02
  • 打赏
  • 举报
回复
说的好混乱,没看明白。
不过作为接口是不能创建对象的吧。
Private ctest As New Icallback
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
引用 12 楼 Tiger_Zhao 的回复:
说明ENTRFUNC没有实现IDispatch接口,不是完整的COM。
应该是这个问题,我再看看com部分的代码,谢谢你的指导!
Tiger_Zhao 2015-09-02
  • 打赏
  • 举报
回复
说明ENTRFUNC没有实现IDispatch接口,不是完整的COM。
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
还有一个问题就是我创建对象的时候 如果是用 Private cbtest As BIZCOMLib.ENTRFUNC set cbtest = New BIZCOMLib.ENTRFUNC 是可以的 加上withevents关键字 Private withevents cbtest As BIZCOMLib.ENTRFUNC set cbtest = New BIZCOMLib.ENTRFUNC 就会报430错误 如果用 Private cbtest As BIZCOMLib.ENTRFUNC set cbtest = createobject (“BIZCOMLib.ENTRFUNC”) 就会报429,activeX不能创建对象
Tiger_Zhao 2015-09-02
  • 打赏
  • 举报
回复
COM有问题吧,VB对COM的支持是最好的。
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
引用 7 楼 Carlven2012 的回复:
看样子不需要Set XX=New XXXX的吧,它有个init过程就应该是初始化吧?!
OleCheck(LoadRegTypeLib(LIBID_BIZCOMLib,1,0,0,TypeLib)); test := TIcalltest.Create(TypeLib,ICallBack); 上面是dephi中创建回调对象的过程init只是绑定的过程
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
引用 6 楼 Tiger_Zhao 的回复:
去下载一个tlb 注册工具,把 .tlb 注册一下,VB中就能引用了。
用了tlb,结果也是一样,给我的感觉就是com如果是withevents的对象,自动化的时候就有问题,可能是com写得不好,或者是我vb调用的不对。
Carlven2012 2015-09-02
  • 打赏
  • 举报
回复
看样子不需要Set XX=New XXXX的吧,它有个init过程就应该是初始化吧?!
Tiger_Zhao 2015-09-02
  • 打赏
  • 举报
回复
去下载一个tlb 注册工具,把 .tlb 注册一下,VB中就能引用了。
cheenyu 2015-09-02
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
越看越混乱了。 回调不是应能你自己去实现 ICallBack 吗?
vb引入com之后,只看到了ENTRFUNC 而用dephi引入com之后,有 BIZCOMLib_TLB文件 ENTRFUNC1: TENTRFUNC; TIcalltest = class(TAutoIntfObject,ICallBack) public function OnConnected(var parg: OleVariant): HResult; stdcall; end; 2个接口都可以看到 vb里面应该怎么做呢
Tiger_Zhao 2015-09-02
  • 打赏
  • 举报
回复
越看越混乱了。
回调不是应能你自己去实现 ICallBack 吗?

863

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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