如何从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(映射到’Run’),即使在设计或中断模式下也是如此.

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

解决方法:

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

EbMode的返回值为:0 =设计,1 =运行,2 =中断.

上一篇:c# – .NET Interop:在当前目录中使用程序集


下一篇:photoshop鼠绘出拿着红色苹果的帅气美少年