DyCOMHelperLib--轻松构建轻量对象、轻松注册\反注册ActiveX、动态类工厂等

codingfunny 2010-10-25 04:27:15
纯代码不超过3000行,但是技术点还是蛮多的,用了20几天,终于写完了。现在免费发布出来,供广大VB爱好者使用。
CSDN不能上载,留Email索要示例源码及DLL。
代码参考了Matthew Curland的相关书籍,及Paul Caton的StdCall的相关源码。
DLL是一个标准Dll。通过API调用的方式使用,不用注册。
Dll中内置一了一组对象,这些对象的实现均为轻量对象,起步内存占用为12-16字节,跟VB类起步96字节,资源消耗极低。
COMHelper 主对象
COMLoader 加载ActivexDll,在不注册的情况下CreateInstance,使用完后,释放完毕,Unload即可。此时该
ActivexDll文件时可以被删除等操作的。
COMType 内部辅助类,一个接口的类型
COMTypes 接口的组合
Debug 在编译后,任可输出Debug信息。需要用到一个叫做VBTracer的东东
DerefEBP 用户获取当前函数参数信息,特别对于将ParmaArray类参数向外传递有意义。
DynamicClassFactory 动态
类工厂。动态创建接口,实现接口,并可以调用。详细看例子。
Err 处理轻量对象的错误返回。
GUID 内部辅助类,接口参照.net framework下GUID的成员编写。
StdCaller 对某一标准模块函数传递参数、调用,

这个Helper主要功能是:
1、用它可以以极少的代码,轻易构建轻量对象
a、IUnknown\IDispatch被内置实现,外部只需实现接口的成员函数即可。未来,我将制作一个插件,支持将现有VB类实现转为轻量对象实现,对应的类型库自动生成。
b、轻量对象,如果仅仅实现一个接口即默认接口,占用空间起步12字节,如果是可以实现若干个接口,比如一个对象Room,同时实现IObject、ICloneable,那么起步占用16字节+4+4,即每实现增加一个接口增加4字节。

2、FunctionDelegator,动态Redirect你的函数调用
   
'比如 有一个接口ICaller,有两个成员定义如下
Sub CallSub(ByRef a As Long, ByRef b As Long)
Function CallFunc(ByRef a As Long, ByRef b As Long) As Long
'那么我们可以这么定义一个FunctionDelegator
Dim oCaller As ICaller
Set oCaller = COMHelper.FunctionDelegator.NewDelegator(2)
'//生成一个Delegator,它有2个成员
'同时,我们在一个标准模块里定义了两个要指向执行的函数
Private Sub pTestCallSub(ByRef a As Long, ByRef b As Long)
Private Function pTestCallFunc(ByRef a As Long, ByRef b As Long) As Long
'//那么
Call COMHelper.FunctionDelegator.Redirect(oCaller, AddressOf pTestCallSub)
'//将该Delegator的函数执行指向 pTestCallSub方法
Call oCaller.CallSub(1,2)
'//执行这一句,将自动转向pTestCallSub这个方法。注意 pTestCallSub的定义一定要跟接口ICaller.CallSub的定义是一致的。

3、自行注册和注销ActiveX。
直接贴代码

Private Sub pTestRegisterServer()
Call COMHelper.UnregisterActiveX("C:\WINDOWS\system32\scrrun.dll")
Debug.Print TypeName(CreateObject("Scripting.Dictionary"))
'//将报错,因为已经被注销
Call COMHelper.RegisterActiveX("C:\WINDOWS\system32\scrrun.dll")
Debug.Print TypeName(CreateObject("Scripting.Dictionary"))
'//可以执行,因为已经被重新注册
End Sub

理论上,注册和注销ActiveX,进程会被挂起,如果注册小的DLL,没关系,速度快,如果是大的文件,那么就会有时延。我重新开启了一个线程,用来执行注册和注销,因为即使在注册大文件时,一样很流畅。

4、不用注册,使用ActiveXDll,并创建对象
直接贴代码了

Private Function pTestClassLoader()
Dim o As Object ' Dictionary
Dim oLoader As DyComHelperType.COMLoader
Dim sClsID As String

Set oLoader = COMHelper.NewCOMLoader("C:\WINDOWS\system32\scrrun.dll")

Set o = oLoader.CreateObject("Dictionary")
'//初始化 Dictionary类
Debug.Print TypeName(o)
o.Add "Key1", 1
o.Add "Key2", 2
Debug.Print o.Count
Debug.Print oLoader.CanUnloadNow
'//看看能不能卸载该Dll。返回值为False,因为该Dll有实例未释放
Set o = Nothing
Debug.Print oLoader.CanUnloadNow
'//这次可以释放了

sClsID = oLoader.GetCLSIDFromName("Dictionary")
'//根据名称加载是很慢的,尝试根据ClsID 加载,如果多次重复加载某一对象,这么处理将会有极大效率提升
Set o = oLoader.CreateObjectFromCLSID(sClsID)
'//初始化 Dictionary类
Debug.Print TypeName(o)
o.Add "Key1", 1
o.Add "Key2", 2
Set o = Nothing
Debug.Print oLoader.Unload
Set oLoader = Nothing
'//释放Dll
End Function

先贴这么多了。今天和老婆是相识一周年,出去浪漫了哈。
...全文
171 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
usareur 2012-07-08
  • 打赏
  • 举报
回复
楼主,可以发一个 dll 和演示给我吗?
art64bit@gmail.com
嗷嗷叫的老马 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 codingfunny 的回复:]
?To老马。都是些找人做毕业设计的学生?
[/Quote]
这样的比较多,然后就是工作中遇到问题来求助的,还有别的原因写程序遇到问题的
codingfunny 2010-10-28
  • 打赏
  • 举报
回复
结贴了。关注的人,太少了.有兴趣交流的,请联系我。
MSN:justthisone@hotmail.com
codingfunny 2010-10-27
  • 打赏
  • 举报
回复
?To老马。都是些找人做毕业设计的学生?
嗷嗷叫的老马 2010-10-27
  • 打赏
  • 举报
回复
没错

大多是些学生来找免费劳动力的.
codingfunny 2010-10-26
  • 打赏
  • 举报
回复
VB版,关注COM的人好像不多哦。VB版,现在人气不高啊。
codingfunny 2010-10-26
  • 打赏
  • 举报
回复
哎。怪了。明明我看到lyserver的回复啊。
嗷嗷叫的老马 2010-10-26
  • 打赏
  • 举报
回复
lyserver的回复为什么会被删除?
codingfunny 2010-10-25
  • 打赏
  • 举报
回复
TO lyserver
又见面了呵呵
嗷嗷叫的老马 2010-10-25
  • 打赏
  • 举报
回复
沙发...........支持一下.

863

社区成员

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

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