【问题标题】:How to use enums in basic script from an activex dll/tlb reference late bound如何在来自 activex dll/tlb 参考后期绑定的基本脚本中使用枚举
【发布时间】:2017-12-15 15:25:14
【问题描述】:

TLDR: 我正在使用 VBA 编写和测试一个脚本,但它最终会作为来自主桌面应用程序的单个 .bas 文件执行。

DLL 引用从 VBA 丢失到 bas,这迫使我将应用程序的成员类型定义为“对象”,而不是它们在 .bas 文件中的本机类型。

是否可以通过在 bas 文件中定义引用来避免将早期绑定代码转换为后期绑定代码?


更多信息: 我需要将 vba 脚本转换为软件可以执行的基本脚本。基本脚本中是否有引用 tlb 文件的内容?我使用set app = CreateObject("...") 调用应用程序这些示例显示在他们的示例中键入为“对象”的所有内容都没有从 VBA 提供智能感知(当然)

是否可以引用枚举作为它们的文本值而不将它们转换回它们的整数值?另外,有没有办法正确键入应用程序对象,而不是在基本脚本中使用object

【问题讨论】:

  • 枚举不是文本值,它们是带有名称的Long 整数,名称是标识符,而不是String。你想做什么?你没有得到智能感知,因为你声明了app As Object,这意味着所有成员调用都在运行时得到解决(即它们是后期绑定调用)。如果您正在引用该库,则无需编写后期绑定代码。 Set app = New ThatLibrary.WhateverThatIs,假设Dim app As ThatLibrary.WhateverThatIs,您将获得智能感知。
  • 工具 > 参考... > 浏览到 .tlb 文件,完成。
  • @Mat'sMug 我已经澄清了我的问题。我正在使用 VBA 编写参考并获得智能感知,但需要将 VBA 移动到 BAS 脚本并且 VBA 参考消失了。
  • 所以你问是否有一个工具可以看到你正在使用未引用的库中定义的类型,并自动将你的早期绑定代码转换为后期绑定等效?不幸的是,VBE 中没有这样的东西 - 虽然有一个 feature request in my Rubberduck project 用于这样的功能,但它还没有实现。不过,我很乐意接受实现它的拉取请求。
  • .bas 文件没有引用,它只是一个纯文本文件,几乎没有任何元数据。引用属于 VBProject 对象。如果您希望 .bas 文件在 VBE 之外可执行,则无法避免转换。

标签: vba dll vbscript reference activex


【解决方案1】:

是否可以通过在 bas 文件中定义引用来避免将早期绑定代码转换为后期绑定代码?

不,你不能。 .bas 文件不包含此类元数据。事实上,它拥有的唯一元数据是模块的名称,存储为隐藏的VB_Name 属性,VBE 使用该属性填充模块的Name 属性。

引用属于VBProject 对象;如果您希望 .bas 文件独立存在并可以通过 VBScript 运行时在 VBE 之外执行,那么您必须将您的早期绑定代码转换为后期绑定。

这意味着您确实失去了智能感知,因为在该后期绑定库中定义的所有类型现在必须声明为 Object,并且枚举值需要转换为其底层整数值。

或者,您可以为这些枚举定义同名常量,并保留名称:

Private Const SomeEnumValue As Long = 42

或者,[重新]自己定义枚举:

Private Enum SoneEnum
    SomeEnumValue = 42
    '...
End Enum

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多