首页 > 解决方案 > 如何从 C# 查询 VB6 IDE 的模式

问题描述

我是开源项目Rubberduck的贡献者,并希望增加对独立 VB6 IDE 的支持(它目前支持 VBA)。

我们需要 IDE 提供的一条信息是它当前所处的模式 - 设计、中断或运行。在 VBA 方面,这由可扩展性 API 公开,但遗憾的是 VB6 并非如此。所以我只能尝试寻找其他方法来查询这些信息。

我原以为可以通过简单地检查主窗口的标题来“作弊”——它将模式附加到标题栏中的项目名称中。不幸的是,这并不实用,因为文本已针对 IDE 的国际版本进行了本地化。

我认为解决方案在于 vba6.dll 的 EbMode 函数(此处的“a”具有误导性,出于兼容性原因而存在)。谷歌搜索“EbMode VB6”在实践中显示了许多这样的例子。

因此我尝试了以下方法:

public class Test
{
    private const string DllName = "vba6.dll";  // Not considering VB5 for now
    [DllImport(DllName)]
    private static extern int EbMode();

    public EnvironmentMode Mode => (EnvironmentMode)EbMode();
}

public enum EnvironmentMode
{
    Run = 0,
    Break = 1,
    Design = 2
}

这会执行并返回一个值,不幸的是它总是返回 0(映射到“运行”),即使在设计或中断模式下也是如此。

我的挑战是我能找到的公共代码都是为非托管代码编写的(主要是 VB6,通常包括内联汇编)。其中一些示例在调用函数之前应用了某种补丁,我认为这可能是我所缺少的。但我不确定如何在托管代码中进行。

标签: c#vb6vbe

解决方案


所以我想通了。关键是这篇文章,没有它,我永远不会发现 EbMode 返回的值与 VBA 可扩展性库中 EnvironmentMode 枚举的值不匹配。

EbMode 的返回值为:0=Design,1=Run,2=Break。


推荐阅读