J'écris une application Windows Form dans .Net pour répertorier toutes les instances en cours d'exécution d'un logiciel de CAO/FAO tiers (dans ce cas CATIA) et laisser l'utilisateur en choisir une d'entre eux pour effectuer quelques tâches automatisées. Pour effectuer des tâches automatisées, j'ai besoin d'obtenir l'instance spécifique des objets COM - par rapport à Getobject() qui me donne une instance COM non spécifique. Est-il possible d'obtenir une instance COM spécifique en utilisant le handle de fenêtre ou d'autres méthodes? Comme l'a dit Raymond, il n'y a pas de solution unique pour tous les objets COM; mais je réussi à obtenir CATIA objets COM en utilisant le code suivant (qui utilise ROT pour remplir une liste avec tous CATIA COM Nom Instances):Obtention d'une instance spécifique d'objet COM dans VB.Net
<DllImport("user32.dll", CharSet:=CharSet.Auto)> Private Shared Sub GetClassName(ByVal hWnd As System.IntPtr, ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer) End Sub
<DllImport("ole32.dll", ExactSpelling:=True, PreserveSig:=False)> Private Shared Function GetRunningObjectTable(ByVal reserved As Int32) As IRunningObjectTable End Function
<DllImport("ole32.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True, PreserveSig:=False)> Private Shared Function CreateItemMoniker(ByVal lpszDelim As String, ByVal lpszItem As String) As IMoniker End Function
<DllImport("ole32.dll", ExactSpelling:=True, PreserveSig:=False)> Private Shared Function CreateBindCtx(ByVal reserved As Integer) As IBindCtx End Function
Try
Dim ROTObject As Object = Nothing
Dim runningObjectTable As IRunningObjectTable
Dim monikerEnumerator As IEnumMoniker = Nothing
Dim monikers(1) As IMoniker
runningObjectTable = GetRunningObjectTable(0)
runningObjectTable.EnumRunning(monikerEnumerator)
monikerEnumerator.Reset()
Dim numFetched As IntPtr = New IntPtr()
While (monikerEnumerator.Next(1, monikers, numFetched) = 0)
Dim ctx As IBindCtx
ctx = CreateBindCtx(0)
Dim runningObjectName As String = ""
monikers(0).GetDisplayName(ctx, Nothing, runningObjectName)
runningObjectName = runningObjectName.ToUpper
If (Not runningObjectName.Equals("")) Then
Dim runningObjectIns As Object = Nothing
runningObjectTable.GetObject(monikers(0), runningObjectIns)
'Check if object is a Catia object
Try
Dim catiaIns As INFITF.Application = Nothing
catiaIns = DirectCast(runningObjectIns, INFITF.Application)
ListCATIA.Items.Add(catiaIns.Windows.Count)
Catch Exc As Exception
MessageBox.Show(Exc.ToString())
End Try
End If
End While
Catch Exc As Exception
Throw Exc
End Try
Cependant, toutes les instances CATIA font référence à la première application CATIA chargée. Aucune idée pourquoi, quelqu'un?
Il n'y a pas de solution générique. Vous devez voir si le serveur en question a une méthode pour énumérer des instances ou obtenir une instance spécifique. –
@RaymondChen - Afin de supprimer cette question de la file d'attente sans réponse, j'ai déplacé votre commentaire dans une réponse wiki communautaire. Si vous souhaitez poster la réponse vous-même, s'il vous plaît laissez un commentaire sur le poste et je vais le supprimer. – JDB