c# - 如何从 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,通常包括内联汇编)。其中一些示例在调用函数之前应用了某种补丁,我认为这可能是我所缺少的。但我不确定如何在托管代码中进行。
解决方案
所以我想通了。关键是这篇文章,没有它,我永远不会发现 EbMode 返回的值与 VBA 可扩展性库中 EnvironmentMode 枚举的值不匹配。
EbMode 的返回值为:0=Design,1=Run,2=Break。
推荐阅读
- c# - Parallel.ForEach 或 Task.WhenAll 涉及异步操作时?
- python - 使用 PySpark 从名称不包含字符串的文件夹中读取文件
- azure - Azure:跨区域私有链接
- r - 当行不消失时删除 data.frame 中的所有空列和行
- java - 既然 Java 13 已经发布,我该如何在 Mac OSX 上安装 Java 12?
- css - 右侧有间隙的滚动条,可以在该间隙中看到内容
- apache-spark - 有人可以区分 RDD Lineage 和 DAG(直接无环图)吗?
- python - 我想同时运行两个函数
- python - Pandas 每组中的前 n 个值
- python - 将多个excel文件读取到多个变量(来自文件本身的变量名)