我创建了一个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。在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型下,布尔型publicOnly,布尔型noCheck,布尔& canBeCached,RuntimeMethodHandle& ctor,布尔& bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow(布尔型publicOnly,布尔fillCache) at System.RuntimeType.CreateInstanceImpl(布尔型publicOnly,布尔型skipVisibilityChecks,布尔fillCache) at System.Activator.CreateInstance(类型类型,布尔nonPublic)在CATIA.CATIA.GetApplicationObject(String ProgId)处
重要:当我以Windows应用程序而不是Windows服务的身份运行此代码时,一切正常。我还试着先启动CATIA并让它在后台运行,但是我的服务无法捕捉到它。
我使用本地系统运行服务,并选中了“与桌面交互”框。
我的ProgId是CATIA.Application,正如我所说的,当我将它作为应用程序而不是服务运行时,它可以工作。
知道是什么导致了这一切吗?
发布于 2013-08-30 03:22:54
我现在找到了解决办法。
我在另一个论坛上找到了它,在那里有人在网上运行另一个应用程序有问题。奇怪的是,这个解决方案也适用于我。
现在它对我有用了。如果我首先手动启动进程(GetActiveObject),我仍然无法捕获它。但是,至少服务能够在没有任何错误的情况下启动一个新实例。
我认为这对许多尝试从Windows服务启动应用程序时遇到此错误消息的人是有帮助的。
https://stackoverflow.com/questions/18484633
复制