2

我创建了一个尝试启动应用程序的 Windows 服务(在本例中为 CATIA)。

我使用以下代码:

private Application GetApplicationObject(string ProgId)
        {
            Application AppObject = null;
            //Try to get allready open instance of the Application
            try
            {
                AppObject = (Application)Marshal.GetActiveObject(ProgId);
            }
            catch
            {
                //Create a new instance of the Application instead
                AppObject = (Application)Activator.CreateInstance(Type.GetTypeFromProgID(ProgId));                
            }
            return AppObject;
        } 

当我的服务尝试启动应用程序时,我收到以下错误:

System.Runtime.InteropServices.COMException (0x80080005):检索具有 CLSID {87FD6F40-E252-11D5-8040-0010B5FA1031} 的组件的 COM 类工厂失败,原因是以下错误:80080005. at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) at System.Activator.CreateInstance (类型类型,布尔非公共)在 CATIA.CATIA.GetApplicationObject(String ProgId)

重要提示:当我将此代码作为 Windows 应用程序而不是 Windows 服务运行时,一切正常。我还尝试先启动 CATIA 并让它在后台运行,但我的服务无法捕获它。

我使用本地系统运行服务,并且选中了“与桌面交互”框。

我的 ProgId 是 CATIA.Application,正如我所说,当我将它作为应用程序而不是服务运行时它可以工作。

知道是什么原因造成的吗?

4

1 回答 1

3

我现在找到了解决方案。

我在另一个论坛中找到了它,有人在通过网络运行另一个应用程序时遇到问题。奇怪的是,这个解决方案也对我有用。

  1. 点击运行
  2. 输入 dcomcnfg
  3. 浏览组件服务>计算机>我的电脑>DComConfig>
  4. 然后找到您的应用程序,在我的例子中是“CATIA 应用程序”。
  5. 右键>属性
  6. 转到“身份”选项卡
  7. 将应该运行此应用程序的用户从“启动用户”更改为“交互式用户”。

现在它对我有用。如果我先手动启动它,我仍然无法捕捉到进程 (GetActiveObject)。但至少服务设法启动一个新实例而没有任何错误。

我认为这对于许多在尝试从 Windows 服务启动应用程序时遇到此错误消息的人会有所帮助。

于 2013-08-30T11:22:54.307 回答