Ala*_*anT 3 c# com vba interop
所有:
我在将一些VBA代码转换为C#时遇到了一些问题.
我们有一个第三方应用程序,它充当本地COM服务器.
在VBA代码中,我们使用GetObject()来获取对现有对象的引用
例如
Set appHandle = GetObject("", ProgId)
Run Code Online (Sandbox Code Playgroud)
这很好用.
我在c#代码中添加了对第三方应用程序的引用,并使用 Marshal.GetActiveObject()来尝试获取对正在运行的实例的引用.
例如
var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId);
Run Code Online (Sandbox Code Playgroud)
但我一直收到MK_E_UNAVAILABLE错误.
在C#代码中创建新对象可以正常工作
例如
var appModel = new AppCoModel()
Run Code Online (Sandbox Code Playgroud)
这将启动第三方应用程序,并允许我与它进行通信.它只是抓取对正在运行的实例失败的引用.
我试过的
不同的安全上下文
VS在管理模式下运行,第三方应用程序不是.我尝试从命令行运行我们的c#app(非管理员).仍然失败.
检查ROT内容
(由Marshal.GetActiveObject()建议在C#中抛出MK_E_UNAVAILABLE异常)
第三方应用程序不会出现在其中.不知道足够的COM以确保它需要.
检查所有注册表条目
看起来不错(据我所见),它们足以创建第三方应用程序和实例以及VBA找到它.有什么特别的,我应该在这里查看?
任何人们可以提出的建议将不胜感激.
所有:
不太清楚关闭一个人自己的问题的礼仪是什么,但是因为我找到了答案,我想以某种方式将其标记为"不需要答案".
GetActiveObject()返回MK_E_UNAVAILABLE的原因是第三方应用程序未注册为自动化服务器.无法获取对正在运行的实例的引用.
这在VBA代码中没有显示,因为:
GetObject("",ProgID)
每次都创建一个新实例(http://msdn.microsoft.com/en-us/library/gg251785.aspx)
如果应用程序未运行,则第三方应用程序中的COM公开功能将启动该应用程序.因此,在VBA中,我们创建的多个对象都指向同一个正在运行的应用程序,而不是附加到正在运行的应用程序.
归档时间: |
|
查看次数: |
4831 次 |
最近记录: |