3

我有这个由几个 DLL、OCX 和 GUI 组成的旧 VB6 项目。

有一个 GUI 组件包含在它的 VBP 文件中:

Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\Windows\SysWOW64\stdole2.tlb#OLE Automation
Object={EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}#1.1#0; ieframe.dll
Object={3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}#4.0#0; mshtml.tlb
Reference=*\G{64E54C86-D847-48F7-9AE5-D6C9B8E6A3A2}#3.0#0#..\..\bin\Crypt.dll#Crypt
Reference=*\G{B3E7F95C-B6D9-458E-B4D4-5272759B139A}#4.0#0#..\..\bin\SpeechMike.dll#SpeechMike_DLL
Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0; MSCOMCTL.OCX
Object={AB4F6C60-4898-11D2-9692-204C4F4F5020}#29.0#0; Ccrpsld.ocx
Object={48E59290-9880-11CF-9754-00AA00C00908}#1.0#0; msinet.ocx
Object={9C526969-AA6E-4D61-BAFA-117FD20C2B38}#3.0#0; SpeechMike.ocx

参考设置很痛苦,因为它们总是从一台机器更改为另一台机器我的意思是,以最后一个为例,GUID '9C526969-AA6E-4D61-BAFA-117FD20C2B38' 将在我的系统上,但在其他人的机器上。

现在,为了使它工作,我删除了对 Crypt.dll 和 SpeechMike.dll 的引用。也对象 SpeechMike.ocx。否则,Visual Studio 会查找不存在的内容。然后在“项目 > 参考”中,我检查了 Crypt 和 SpeechMike,参考返回到具有正确 GUID 和版本的 VBP。最后,在“项目 > 组件”中添加 OCX,一切顺​​利。

我错了吗?我如何与其他人共享项目而无需通过循环来启动项目?

我正在使用 MS Visual Basic 6(VS 6 企业版的一部分)。

4

1 回答 1

9

这听起来像是“未能保持二进制兼容性”。通常您只对自己执行此操作,但如果多人从源项目文件编译您的库,当然会更令人头疼。

当您创建 ActiveX EXE、DLL 和 OCX 时,您需要创建一个“基本”版本,其中分配了类型和类 ID 值 (GUID)。文档甚至建议您这样做,将过程留空:只是注释行或其他内容,以便 IDE 不会删除空声明。

您不必使用“空”的基本参考库,它可以是一个包含完整代码的库。

编译此基线库后,您将退出并保存您的项目。然后将此“空”库重命名为其他名称,并从那里将其与您的项目源文件一起保存。

在此之后,您重新打开项目并进入项目属性并在组件选项卡上将兼容性设置更改为二进制兼容性,并在框中输入已编译基线库的完整路径和名称。保存项目。现在您可以添加代码并编译“真实”库以供其他程序使用。

当您以源代码形式将这些库(DLL、OCX)分发给其他人以便他们可以编译它们时,您必须提供这个重命名的编译基线库以及源代码文件、VBP 文件、资源文件等。

从那里您的 GUID 将保持稳定,直到您对破坏二进制兼容性的内容进行更改(更改方法的参数列表等)。

在线帮助(MSDN 库)中对此有更多详细信息。看:

使用 Visual Basic|组件工具指南|创建 ActiveX 组件|调试、测试和部署组件|ActiveX 组件中的版本兼容性

于 2013-04-11T23:27:09.533 回答