我是开源项目的贡献者 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(映射到“运行”),即使在设计或中断模式下也是如此。
我的挑战是我能找到的公共(public)代码都是为非托管代码编写的(主要是 VB6,并且通常包括内联汇编)。其中一些示例在调用函数之前应用了某种补丁,我认为这可能是我所缺少的。但我不确定如何在托管代码中继续。
最佳答案
所以我想通了。关键是this post ,否则我永远不会发现 EbMode 返回的值与 VBA 扩展库中的 EnvironmentMode 枚举的值不匹配。
EbMode 的返回值为:0=Design,1=Run,2=Break。
关于c# - 如何从C#查询VB6 IDE的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50866331/