【问题标题】:How do I reference a class from an EXE project?如何从 EXE 项目中引用一个类?
【发布时间】:2019-07-09 18:49:01
【问题描述】:

我的任务是重振一个 VB6 项目,我已经很久没有使用 VB6 了。

这是我的问题。

项目 A 是一个 ActiveX EXE 项目。在同一个项目组中还有另一个 ActiveX EXE 项目;项目 B。项目 B 包含项目 A 需要使用的clsCommon (clsCommon.cls),如:

Private clsCommonA as ProjectB.clsCommon 

当我尝试将项目 B 的输出 exe(不是 vbp)添加到项目 A 的引用时,我收到错误 Project 'Project B.vbd' can not be referenced because it's project type is EXE.

有人可以提醒我如何在 EXE 中引用类吗? (我在输出为 ActiveX DLL 的项目组中的项目中引用类没有问题)

顺便说一句:我认为这甚至是可能的,只是因为 20 年前的某些开发人员显然已经做到了这一点。

【问题讨论】:

  • 我一直认为从 EXE 到 EXE 需要使用后期绑定(即 CreateObject() 调用)。或许还有另一种方式,我对答案很感兴趣。
  • AFAICR 可以通过早期绑定使用 EXE 到 EXE。我 99% 确定 ActiveX EXE 位于注册表中,并且可以像任何其他 ActiveX(又名 COM)组件一样添加到项目引用中。 ActiveX EXE 也是一个类型库。但是,关于项目组,我不记得如何在项目组中添加对 ActiveX EXE 的引用。我原以为您添加了 VBP 文件。 AFAICR 就是您如何将 ActiveX DLL 项目的引用添加到同一组中的另一个 EXE 项目。 @davecov,如果您尝试添加 VBP,会发生什么?
  • @MarkJ 感谢您的评论,它唤醒了我的记忆。
  • 其他读者请注意 --- 尽管我在下面放置的答案链接到一堆其他问题,并且他们的答案与这个问题有相似之处,但我实际上并不认为问题本身是重复的。我没有找到另一个询问如何执行此操作的 VB6 问题。

标签: vb6


【解决方案1】:

VB6 不允许您从加载到同一 IDE(项目组)的项目 (ProjectA) 中添加对 ActiveX Exe(您的 ProjectB)的引用。尝试时会显示错误。

这是因为 ActiveX Exe 作为单独的进程运行,我相信 VB6 IDE 无法为组中的单独项目执行此操作。因此,虽然看起来您正在添加对 ProjectB exe 的引用,但由于它在组中,VB6 实际上是在添加对 ProjectB vbp 的引用,这是不受支持的。

您需要从您的组中删除 ProjectB。然后您就可以从 ProjectA IDE 中引用 ProjectB 的 Exe。

如果需要在 IDE 中运行 ProjectB(用于调试或开发),则首先启动 VB6 并加载 ProjectB。然后启动第二个 VB6 实例并加载 ProjectA。当您启动 ProjectB 时,您会注意到 ProjectA 中的引用从 ProjectB Exe 更改为 ProjectB vbp(在第二个 IDE 中运行)。根据需要在 ProjectB 中设置断点,然后当您启动 ProjectA 并实例化 ProjectB 并进行方法调用时,您将在该 IDE 中运行 ProjectB 代码。

【讨论】:

  • 很好的解释
  • 不要把你需要的项目放在你需要的项目组里……我永远也想不通。
【解决方案2】:

(注意 - 我已经修改了部分内容)


对于组内的 VB6 项目,您应该能够使用通常的“引用”窗口,EXCEPT TO EXE 项目添加对组内其他项目的相互引用。

我用一对测试 EXE / DLL 项目尝试了这个,当我尝试在一个组中添加 EXE 引用时出现错误:

(test1.vbp的项目类型为EXE,无法引用。)


但是,我可以从 DLL 项目中毫无问题地引用已编译的 EXE。这可能是您前进的最佳方式。

为了注册一个已编译的 EXE,VB6 会在你编译它时为你做这件事,但我最终记得还有一个手动方法——你需要使用 /regserver 开关运行 .EXE 本身。

假设您的 .VBP 已经有正确的条目(基本上,一个指向 EXE 的 GUID 和/或一些 DLL 和 OCX 文件的参考线),一旦您这样做,应该会自动在 EXE 中找到类你编译/运行。

这由其他几个 SO 问题详细描述,所以我不会重复所有这些:

等等


如果您需要从 DLL 组中调试到 EXE,请首先确保所有引用都已连接。然后你应该可以在IDE中运行EXE项目,设置断点,在另一个IDE实例中单独运行DLL组,并在它们之间进行调试。

【讨论】:

  • 我决定走 DLL 路线,但不太成功。首先,我删除了两个项目制作的所有二进制文件。然后我从项目 A 的 vbp 文件中删除了对项目 B 的引用。然后我将项目 B 构建为一个 ActiveX DLL,并在项目 A 中再次引用它。我检查了对 DLL 的引用是否回到了项目 A 的 vbp 文件以及 DLL 的正确路径。它就在那里。然后我尝试构建项目 B 和行 Private clsCommonA as ProjectB.clsCommon 导致 User-defined type not defined.
  • @davecove,我不确定这与这个答案有什么关系,这个答案并不提倡构建任何东西,但可能是 EXE。在可能的情况下,几乎总是最好分组跑步。如果未在 DLL 上设置二进制兼容性,您可能会出现错误 - 在组中运行可以避免这种情况。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 2012-09-08
  • 2011-10-24
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多