VB6只能编译32位DLL
目前已经有部分用户开始使用64位Office了
用VB6给64位Office写插件将是一个痛苦的事所以很多开发者都望而却步,在没有转.net正营的前提下,都会告知用户,产品不兼容64位office此文的内容我研究了很久,用VB6开发64位Office的插件只能是进程外方案,进程内方案是不可能的但是在实现时,又有两种方式:
1、ActiveX EXE
大致实现如下:
a.新建一个ActiveX EXE工程,工程名TestEXE,加入一个类cCreate.cls,写入如下代码:
Public Function CreateInstance(ByVal ProgID As String) As Object
Set CreateInstance = CreateObject(ProgID)
End Function
虽然说Object的效率比较低,但是如果用Variant效率会更低
注册exe和dll后,在VBA中使用时只需要这样使用就好了:
#If Win64 Then
'64位环境用ActiveX EXE中转一下
Dim exeProc As Object, cls As myClass
Set exeProc = CreateObject("TestEXE.cCreate")
Set cls = exeProc.CreateInstance("DllName.myClass")
cls.类的成员 (成员参数)
Set cls = Nothing
Set exeProc = Nothing
#Else
'32位环境直接用
Dim cls As myClass
Set cls = CreateObject("DllName.myClass")
cls.类的成员 (成员参数)
Set cls = Nothing
#End If
上面只是说了一个使用上的概念,真正要拿来开发Office插件,还需要你自己研究一下
2、纯ActiveX DLL方案
这个相比上面的方案,少了一个ActiveX EXE服务器,直接修改注册表,把ActiveX DLL当做进程外服务器使用,修改很简单。
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTWOW6432NodeCLSID{6FAF2F0E-AB26-4182-884E-4544025F8E3E}]
"AppID"="{6FAF2F0E-AB26-4182-884E-4544025F8E3E}"
[HKEY_CLASSES_ROOTWOW6432NodeAppID{6FAF2F0E-AB26-4182-884E-4544025F8E3E}]
"DllSurrogate"=""
[HKEY_CLASSES_ROOTSOFTWAREClassesAppID{6FAF2F0E-AB26-4182-884E-4544025F8E3E}]
"DllSurrogate" = ""
注意上面的6FAF2F0E-AB26-4182-884E-4544025F8E3E是你的类的classid。
使用oleview看时,就是coclass上面的那个uuid。
总结:以上两种方法都还只是概念,由于个人没有时间深入研究,就先发出来,有兴趣的同学自行研究,可以找探讨。
通过以上概念使用VB6去写64位Office插件,其实还需要一点研究:
比如:进程外COM实际上不能被跨进程调用界面,好就好在写插件需要用到的这两个接口IDTExtensibility2和AddinInstance实现基本功能时,其实不需要牵涉界面,界面部分可以另外来写。
以上只是开拓一个新方向,给VB6发挥点余热。