VB6创建的COM即可以是线程内的DLL,也可以是线程外独立的EXE,有些32位的旧东西做activex.exe封装后在新硬件新软件x64位上用还是可以的。其实activex DLL和activeX EXE主要功能并不需要改变。activex DLL可以是如下的样子:
一个主工程文件,添加了一个类,为类功能隐藏了一个窗体。
在类里封装一个PowerBasic写的DLL,编译后的 Activex DLL即可由外部调用其内部的Public功能ModbusRoutines。在此基础上,再加上一个窗体和模块(是bas模块,不是cls类模块)
其中form1是个空窗体,visible = false,后面我们讲它的功能。
加的模块中写上一些简单代码,用active exe方式编译就生成了 exe 方式的COM,它是独立运行的程序。
Module1.bas 中的内容
Sub Main()
If Command() <> "!@#$*&^%12348765" Then
End
End If
If App.PrevInstance = True Then
End
Else
If App.StartMode = vbSModeStandalone Then
Load Form1
Else
End
End If
End If
End Sub
功能:
首先读取命令行参数,如果不是特定字符串即终止加载,这样做的目的是防止用户单独运行此activex exe程序,而必须由主程序带上参数调用它。
然后app.PrevInstance是判断是已经加载并运行中,以防程序重复加载。
如果没有加载,按activex模式运行,那么就load form1空窗体。这样程序就不会运行到此直接退出了,否则加载即退出不能正常使用。这地方停顿下来,load 空窗体还是比较方便有效的。
修改一下工程属性为 activex exe, 启动对象为 sub main,编译后即是可执行文件方式的 COM 。做个VB6的标准exe工程,放个窗体,两个button和一个文本框,即可测试调用的功能了。
Dim obj As Object
Private Sub Command1_Click()
Text1.Text = obj.ModbusRoutines(11, "VERSION")
End Sub
Private Sub Command2_Click()
Dim sReturn As String
sReturn = obj.ModbusRoutines(12, "Terminate")
Text1.Text = sReturn
End Sub
Private Sub Form_Load()
Dim dReturn As Double
dReturn = Shell(App.Path & "\MBFMODIEEE.exe !@#$*&^%12348765", vbHide)
Set obj = CreateObject("MBFMODIEEE.MBFIEEECRC")
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set obj = Nothing
End Sub
在通用部分定义 dim obj as object, 在创建窗体时shell执行刚才编译的activex exe并带上参数,然后创建activex exe中类的 obj , 命令按钮1调用COM中的函数并在text文本框中显示返回的字符串,命令按钮2则高用函数12号的Terminate,功能是 unload form1。现在可以把它编译成标准 exe 文件并运行。
它自动加载并启动activex exe,不会重复加载,退出程序前,点击命令钮2将activex load的窗体unload了,当set obj=nothing时,打开任务管理器,会看到APP和COM程序同时退出。下面是activex 的public函数的12号功能,就是一个unload form1.
Case 12
If commandval = "Terminate" Then
Unload Form1
ModbusRoutines = "Ready!"
End If
这是比较简单的封装,实际上按VC的终端程序理解activex exe比较有对应性。它自己是一个类,有初始化与终止处理,就当做是构造与析构吧; 它有属性 let 和 get, 而 sub main 很类似于VC的main; 它也有接口,但很啰嗦,不像VC的virtual函数那么简单明了。但是复杂的东西可以简单化,就比如上面的做法,找核心的写就可以了。如果app和activex在不同的机器上,Set obj = CreateObject("MBFMODIEEE.MBFIEEECRC","机器名") 。Activex EXE分布方便,但效率不如DLL,只是有些旧东西做封装时用Activex EXE做工具比较方便。