gpt4 book ai didi

c# - GetActiveObject() 与 GetObject() - MK_E_UNAVAILABLE 错误

转载 作者:行者123 更新时间:2023-11-30 14:36:48 30 4
gpt4 key购买 nike

全部:

我在将一些 VBA 代码转换为 C# 时遇到了一些问题。

我们有一个充当本地 COM 服务器的第 3 方应用程序。

在 VBA 代码中,我们使用 GetObject() 获取对现有对象的引用

例如

Set appHandle = GetObject("", ProgId)

这很好用。

我在我们的 C# 代码中添加了对第 3 方应用程序的引用,并使用 Marshal.GetActiveObject() 尝试获取对正在运行的实例的引用。

例如

var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId);

但我一直收到 MK_E_UNAVAILABLE 错误。

在 C# 代码中创建一个新对象工作正常

例如

var appModel = new AppCoModel()

这会启动第 3 方应用程序并允许我与其通信。它只是获取对失败的正在运行实例的引用。

我尝试过的

不同的安全上下文
VS 在管理模式下运行,第 3 方应用程序不是。我尝试从命令行(非管理员)运行我们的 c# 应用程序。仍然失败。

检查 ROT 内容
(由 Marshal.GetActiveObject() throws MK_E_UNAVAILABLE exception in C# 建议)
第 3 方应用程序未出现在其中。对 COM 了解不足,无法确定它是否需要。

检查了所有注册表项
看起来不错(据我所知)并且它们足以创建第 3 方应用程序的实例并让 VBA 找到它。有什么我应该在这里检查的具体内容吗?

如有任何建议,我们将不胜感激。

最佳答案

全部:

不太确定结束自己的问题的礼仪是什么,但既然我找到了答案,我想以某种方式将其标记为“不需要答案”

GetActiveObject() 返回 MK_E_UNAVAILABLE 的原因是第 3 方应用程序未注册为自动化服务器。无法获得对正在运行的实例的引用。

这在 VBA 代码中没有显示,因为:

  1. GetObject("",ProgID) 每次创建一个新实例 ( http://msdn.microsoft.com/en-us/library/gg251785.aspx )

  2. 第三方应用程序中的 COM 公开功能会在应用程序未运行时启动该应用程序。因此,在 VBA 中,我们创建了多个对象,它们都指向同一个正在运行的应用程序,而不是附加到正在运行的应用程序。

关于c# - GetActiveObject() 与 GetObject() - MK_E_UNAVAILABLE 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10108098/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com