這個是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)
求解各位大牛,或者提供相關書籍,感謝了!
uj5u.com熱心網友回復:
說的好混亂,沒看明白。不過作為介面是不能創建物件的吧。
Private ctest As New Icallback
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
也就是Vb里沒有Icallback這個介面類,只有一個ENTRFUNC,加上withevnens 以后,可以取出回呼的方法,
但是這個物件就是不知道怎么set
uj5u.com熱心網友回復:
越看越混亂了。回呼不是應能你自己去實作 ICallBack 嗎?
uj5u.com熱心網友回復:
vb引入com之后,只看到了ENTRFUNC
而用dephi引入com之后,有
BIZCOMLib_TLB檔案
ENTRFUNC1: TENTRFUNC;
TIcalltest = class(TAutoIntfObject,ICallBack)
public
function OnConnected(var parg: OleVariant): HResult; stdcall;
end;
2個介面都可以看到
vb里面應該怎么做呢
uj5u.com熱心網友回復:
去下載一個tlb 注冊工具,把 .tlb 注冊一下,VB中就能參考了。uj5u.com熱心網友回復:
看樣子不需要Set XX=New XXXX的吧,它有個init程序就應該是初始化吧?!uj5u.com熱心網友回復:
用了tlb,結果也是一樣,給我的感覺就是com如果是withevents的物件,自動化的時候就有問題,可能是com寫得不好,或者是我vb呼叫的不對。
uj5u.com熱心網友回復:
OleCheck(LoadRegTypeLib(LIBID_BIZCOMLib,1,0,0,TypeLib));
test := TIcalltest.Create(TypeLib,ICallBack);
上面是dephi中創建回呼物件的程序init只是系結的程序
uj5u.com熱心網友回復:
COM有問題吧,VB對COM的支持是最好的。uj5u.com熱心網友回復:
還有一個問題就是我創建物件的時候如果是用
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不能創建物件
uj5u.com熱心網友回復:
說明ENTRFUNC沒有實作IDispatch介面,不是完整的COM。uj5u.com熱心網友回復:
應該是這個問題,我再看看com部分的代碼,謝謝你的指導!
uj5u.com熱心網友回復:
最近看了很多關于com和vb方面的資料,基本上了解到,vb上這個回呼的實作應該是用連接點,而不是用回呼的介面來實作的,現在有一個疑問,參考了“COM組件設計與應用(十五)連接點(vc6.0)”,基本了解了連接點的方法,目前有一個疑問就是使用給出的多連接點(Result和timer)的代碼,在VB總創建,只能看到一個連接點(Result)。這個什么原因呢。uj5u.com熱心網友回復:
用什么模式不影響VB呼叫啊。所謂的“只能看到一個連接點”什么意思?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/89616.html
下一篇:關于DLL呼叫問題
