EaBIM

标题: 用程序启动Inventor失败的原因和解决方法 [打印本页]

作者: 萧闫子    时间: 2014-1-14 10:22
标题: 用程序启动Inventor失败的原因和解决方法

有时候用 "CreateObject("Inventor.Application")"来启动Inventor会失败,但是随后再执行这个命令时Inventor又会成功启动,这是怎么回事?下面是我们的技术专家的解释以及解决办法:

Inventor starts up very slowly when none of its DLLs are in the system's file cache. Restarting the computer clears the file cache so that the first instantiation of Inventor takes a very long time to initialize. When Inventor is started via automation, it must call CoRegisterClassObject within two minutes of the process starting, or else COM assumes the process failed to start and raises a CO_E_SERVER_EXEC_FAILURE 0x80080005 exception in the calling program. This has the effect of killing the inventor.exe process providing the caller with a useless pointer/reference and potentially an unhandled exception. Subsequent attempts to start inventor.exe will use the DLLs in the file cache and the process generally starts much more quickly and does not time out


You can pre-load the libraries by running and exiting Inventor prior to running a utility program. This process is generally needed only one time after each computer restart; subsequent use of the utility programs will reuse the cached libraries loaded earlier in the Windows session. If you have multiple releases of Inventor installed, be sure to run and exit the Inventor release that matches the version number of the utility program you would like to run. Running and exiting a specific release of Inventor will set a value in the Windows registry so the utility programs can detect which installation is active.


An alternative solution is to launch Inventor as a local COM server: in this case the timeout can be up to three minutes and it is generally enough to allow the process to run. The following VB.NET sample shows how to accomplish this.


解决办法如下:


Imports Microsoft.Win32


Public Class clsLocalSrv


    Public Shared Function StartAsLocalServer(ByVal ProgId As String, _


                                               ByVal nMilliSeconds As Integer, _


                                               ByRef oApplication As Object) As Boolean



        Dim enUS As New Globalization.CultureInfo("en-US")


        Threading.Thread.CurrentThread.CurrentCulture = enUS



        Dim commandName As String = ""


        Dim arguments As String = ""



        Dim oRegKey As Microsoft.Win32.RegistryKey, oCls As Microsoft.Win32.RegistryKey


        Dim oVal As Object, sName As String, oDir As Object


        Try


            oCls = Registry.ClassesRoot


            oRegKey = oCls.OpenSubKey(ProgId + "//CLSID", False)


            oVal = oRegKey.GetValue("", Nothing)


            oRegKey = oCls.OpenSubKey("CLSID//" & oVal & "//LocalServer32", False)


            oDir = oRegKey.GetValue("", Nothing)



            oRegKey.Close()


            oCls.Close()


            sName = oDir



            Dim nIndex As Long


            nIndex = Microsoft.VisualBasic.InStrRev(sName, "/automation", , CompareMethod.Text)


            commandName = Microsoft.VisualBasic.Left(sName, nIndex - 1)


            arguments = Microsoft.VisualBasic.Right(sName, (sName.Length() - nIndex + 1))


        Catch ex As Exception


            MsgBox(ex.Message)


            Exit Function


        End Try


        ' Start the program


        Dim oProcess As Process = Process.Start(commandName, arguments)


        ' Loop until run out of time or get the process's object.


        Dim Start, Finish As Double


        Start = Microsoft.VisualBasic.DateAndTime.Timer


        Finish = Start + (nMilliSeconds / 1000)



        Do While Microsoft.VisualBasic.DateAndTime.Timer < Finish


            Try


                oApplication = System.Runtime.InteropServices.Marshal.GetActiveObject(ProgId)


                If Not oApplication Is Nothing Then


                    Return True


                End If


            Catch ex As Exception


                ' Keep trying until run out of time


            End Try


            System.Threading.Thread.Sleep(100)


        Loop


        ' Failed to get the running object, stop the process


        oProcess.Kill()

        Return False

    End Function

End Class


在你的程序里调用上面的方法:


If clsLocalSrv.StartAsLocalServer("Inventor.Application", 120000, m_inventorApp) = True Then


   '...

End If


如果你用的不是VB.NET,而是VB,那么替换的办法也许是用定时器(Timer)来替代上面的Thread,并用GetObject来替换上面的System.Runtime.InteropServices.Marshal.GetActiveObject来做类似的工作。

文章来源:http://blog.csdn.net/barbarahan


作者: 一梦千寻    时间: 2014-2-18 12:15
路过!!!
不发表意见……
作者: 烈火ivk    时间: 2014-2-18 12:19
路过!!!
不发表意见……
作者: AK47    时间: 2014-2-18 12:22
顶!!!!!!!!!!
作者: 大头佬    时间: 2014-2-18 12:29
(*^__^*) 嘻嘻……
作者: 江枫    时间: 2014-2-18 13:31
顶!!!!!!!!!!
作者: leowave    时间: 2014-2-19 15:00
路过!!!
不发表意见……
作者: 烈火ivk    时间: 2014-2-21 14:46
顶!!!!!!!!!!
作者: 飞天舞    时间: 2014-2-22 20:17
顶!!!!!!!!!!
作者: 车奴    时间: 2014-2-25 10:37
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 欧宝    时间: 2014-2-25 10:40
顶!!!!!!!!!!
作者: 中华!    时间: 2014-2-28 11:53
顶!!!!!!!!!!
作者: 乖乖仔    时间: 2014-3-5 15:37
顶起来…………
作者: 矮矮    时间: 2014-3-5 15:40
顶!!!!!!!!!!
作者: 月の月    时间: 2014-3-7 11:58
路过!!!
不发表意见……
作者: 冰雨    时间: 2014-3-7 12:01
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 老朽    时间: 2014-3-11 15:38
路过!!!
不发表意见……
作者: 影馨    时间: 2014-3-11 15:41
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: best    时间: 2014-3-11 15:42
顶......
楼下跟上.....
作者: 冰山    时间: 2014-3-11 15:48
顶......
楼下跟上.....
作者: 波罗友    时间: 2014-3-12 13:41
顶!!!!!!!!!!
作者: 国产008    时间: 2014-3-12 13:47
顶!!!!!!!!!!
作者: 开始了d    时间: 2014-3-18 11:09
顶......
楼下跟上.....
作者: leowave    时间: 2014-3-18 11:12
路过!!!
帮顶……
作者: 风吹枫落    时间: 2014-3-18 11:12
(*^__^*) 嘻嘻……
作者: 嫣雨遥    时间: 2014-3-31 16:42
路过!!!
帮顶……
作者: 等你回来    时间: 2014-3-31 16:47
(*^__^*) 嘻嘻……
作者: 严英华    时间: 2014-3-31 16:49
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 孙雅    时间: 2014-4-10 17:18
路过!!!
不发表意见……
作者: levin    时间: 2014-5-19 14:51
顶起来…………
作者: 长风    时间: 2014-5-21 14:18
顶!!!!!!!!!!
作者: 老鼠仔CH    时间: 2014-5-21 14:30
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: leowave    时间: 2014-5-21 14:31
顶!!!!!!!!!!
作者: 妮可    时间: 2014-5-23 16:34
(*^__^*) 嘻嘻……
作者: dgren    时间: 2014-5-27 11:09
(*^__^*) 嘻嘻……
作者: 雁田佬    时间: 2014-5-27 11:13
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 严英华    时间: 2014-5-27 11:19
顶......
楼下跟上.....
作者: 车晶晶    时间: 2014-6-6 12:11
顶起来…………
作者: 爬爬``PA    时间: 2014-6-6 12:14
(*^__^*) 嘻嘻……
作者: 元劭    时间: 2014-6-6 12:20
(*^__^*) 嘻嘻……
作者: 波罗友    时间: 2014-6-6 12:23
路过!!!
帮顶……
作者: 茶神idg    时间: 2014-6-6 12:31
顶!!!!!!!!!!
作者: 妮可    时间: 2014-6-9 15:57
顶!!!!!!!!!!!!!!!!!!!!!!!!!
作者: We晕晕    时间: 2014-6-9 16:00
顶起来…………
作者: 萧闫子    时间: 2014-7-22 10:09

顶......
楼下跟上.....
作者: 悠悠筱荷    时间: 2014-10-14 12:03
路过
作者: 萧闫子    时间: 2014-10-23 10:17
感谢分享
作者: 萧闫子    时间: 2014-10-27 12:04
路过
作者: 悠悠筱荷    时间: 2014-10-30 10:07
路过
作者: 萧闫子    时间: 2014-12-31 09:02
感谢分享
作者: EaBIM门户编辑    时间: 2015-1-8 09:35
看看
作者: 萧闫子    时间: 2015-2-2 12:48
感谢分享
作者: EaBIM门户编辑    时间: 2015-2-14 10:30
感谢分享
作者: 妮可    时间: 2016-1-6 11:02
顶!!!~~~~
作者: 妮可    时间: 2016-3-31 09:42
o(* ̄︶ ̄*)o 路过。。。~
作者: EaBIM门户编辑    时间: 2016-7-6 09:33

作者: EaBIM门户编辑    时间: 2016-7-12 09:00

作者: 萧闫子    时间: 2016-7-17 12:11
感谢分享
作者: EaBIM门户编辑    时间: 2016-7-19 09:29
很好
作者: EaBIM门户编辑    时间: 2016-7-20 09:14
不错
作者: 益埃毕BIM    时间: 2016-8-30 09:10
好样的
作者: EaBIM门户编辑    时间: 2016-9-28 12:39

作者: EaBIM门户编辑    时间: 2016-11-7 09:28
不错
作者: EaBIM门户编辑    时间: 2016-12-8 09:15
不错
作者: EaBIM门户编辑    时间: 2016-12-21 09:34
很好
作者: EaBIM门户编辑    时间: 2017-1-18 09:35
不错
作者: EaBIM门户编辑    时间: 2017-2-27 10:38
很好
作者: EaBIM门户编辑    时间: 2017-4-26 10:25
很好,
作者: EaBIM门户编辑    时间: 2017-4-28 09:36
来学习学习
作者: EaBIM门户编辑    时间: 2017-5-15 10:15
来看看, 顶
作者: EaBIM门户编辑    时间: 2017-6-15 11:14
支持支持

作者: EaBIM门户编辑    时间: 2017-7-12 10:18
棒棒哒




欢迎光临 EaBIM (https://eabim.net/) Powered by Discuz! X3.2