如何从 C# 查询 VB6 IDE 的模式

How to query the mode of the VB6 IDE from C#

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

我们需要从 IDE 获得的一条信息是它当前所处的模式 - 设计、中断或 运行。在 VBA 方面,这通过可扩展性 API 暴露出来,但不幸的是,对于 VB6 而言并非如此。所以我只能尝试寻找其他方法来查询此信息。

我原以为可以 'cheat' 通过简单地检查主 window 的标题 - 它将模式附加到标题栏中的项目名称。不幸的是,这是不切实际的,因为文本会针对 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
}

这会执行 returns 一个值,不幸的是它总是 returns 0(映射到 'Run'),即使在设计或中断模式下也是如此。

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

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

Return EbMode 的值是:0=设计,1=运行,2=中断。