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

man*_*lan 5 c# vb6 vbe

我是开源项目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
}
Run Code Online (Sandbox Code Playgroud)

它执行并返回一个值,不幸的是,即使在设计或中断模式下,它始终返回0(映射为“运行”)。

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

man*_*lan 4

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

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