Marshal.GetActiveObject завершается с ошибкой OPERATION UNAVAILABLE, HRESULT: 0x800401E3, если уровни высот не совпадают.Что я могу сделать? - PullRequest
1 голос
/ 08 мая 2019

Я пишу надстройку VB.NET для Solidworks, в которой мне сначала нужно подключиться к уже запущенному экземпляру Solidworks (аналогично тому, как создаются такие подключения к Excel).Я использую Marshal.GetActiveObject метод:

Sub ConnectToSolidworks()  
    Const PROG_ID As String = "SldWorks.Application"  
    Dim progType = System.Type.GetTypeFromProgID(PROG_ID)  
    If progType Is Nothing Then MSG("Cannot detect a valid Solidworks installation.") : End : Application.Exit()  

    'connect to Solidworks  
    Try  
        swApp = TryCast(System.Runtime.InteropServices.Marshal.GetActiveObject(PROG_ID), SolidWorks.Interop.sldworks.ISldWorks)  
    Catch ex As Exception  
        printException(System.Reflection.MethodBase.GetCurrentMethod().Name, ex)  
    End Try  

    'check if connected  
    If swApp Is Nothing Then  
        MSG("Unable to connect to Solidworks.")  
        End  
        Application.Exit()  
    End If  
End Sub  

К сожалению, есть проблема.Если Solidworks запускается от имени администратора, а мое приложение - нет, или наоборот, Marshal.GetActiveObject завершается с ошибкой HRESULT: исключение 0x800401E3.

Однако мне нужно, чтобы мое приложение работало без административного доступа и независимо от того, когда Solidworks запускался от имени администратора.

Причина, по которой я не использую Interaction.CreateObject, Interaction.GetObject или System.Activator.CreateInstance, потому что эти методы запустят Solidworks самостоятельно, если он еще не запущен, чего я хочу избежать любой ценой.

Имея это в виду, как я могузаставить Marshal.GetActiveObject работать, когда уровни несоответствия не соответствуют, или есть еще какой-то другой способ сделать это?Не удается создать компонент ActiveX ").

...