金蝶软件咨询热线:0371-55980123 金蝶软件技术支持:0371-69063210 服务热线:18530039888

VB6函数ObjPtr在VB.net下继续使用的探讨

调用金蝶KIS专业版的登录界面并获取账套相关信息,自专业版11.0以来机制发生改变,金蝶总部提供的原有VB6代码无效,新提供的VB6代码中使用到了VB不公开函数ObjPtr,该函数的作用是获取对象的内存地址。
用过.net之后,再用VB6做开发,就感觉各种不方便。于是便着手对VB6代码进行升级,用.net来实现,结果就卡在这个ObjPtr函数上了:在.net里没有对应的函数。

上网搜了许久,找到两个解决方案。

一个说,ObjPtr函数包含在msvbvm60.dll里,可以像声明API一样声明它,然后在.net里使用。

Private Declare Function ObjPtr Lib "MSVBVM60" Alias "VarPtr" (ByVal var As Object) As Integer​

实测结果是,报“内存写入出错”!

另一个说,用GCHandle来替代。

Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字节数组的指针​

结果报“包含非基元或非直接复制到本机结构中的数据”之类的错误提示!

怎么整都不行,后来实在没有办法了,只能采用这么个.net+vb6结合的方法:把ObjPtr函数用VB6写成DLL,然后在.net里调用获得结果。

第一步、VB6中创建ActiveX DLL工程,工程名称改为vb6,类名改为spec。

编写代码如下:

Public Function vObjPtr(ByVal o As Object) As Long

   vObjPtr = ObjPtr(o)

End Function

保存,编译生成vb6.dll。

​第二步、在.net里调用。

kd = CreateObject("KFO.Dictionary")

Dim vb As Object = CreateObject("vb6.spec")

dim address as integer=vb.vObjPtr(kd)

​测试成功。

作者:南阳云畅软件有限公司 孙鑫 
地址:南阳市新华西路30号五交化大厦8楼 咨询热线:0377-63496377 商务热线:0377-60887767  服务热线:13525178050 联系QQ:287634334 

河南金菊信息技术有限公司 郑州金蝶软件营销服务中心 
技术支持:0371-69063210 销售咨询:0371-55980123 金蝶艾斌 18530039888