查看: 13  |  回复: 0
  VB6 Office插件开发,用VB6开发一个插件同时给32位和64位Office使用
楼主
发表于 2025年2月20日 15:53

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发挥点余热。

您需要登录后才可以回帖 登录 | 立即注册
【本版规则】请勿发表违反国家法律的内容,否则会被冻结账号和删贴。
用户名: 立即注册
密码:
2020-2025 MaNongKu.com