Я пишу приложение Windows Form в .Net для перечисления всех запущенных экземпляров стороннего программного обеспечения CAD/CAM (в данном случае CATIA) и позволяет пользователю выбрать один из них выполнить несколько автоматизированных задач. Для выполнения автоматических задач мне нужно получить конкретный экземпляр объектов COM - по сравнению с Getobject(), который дает мне неспецифический экземпляр COM. Есть ли способ получить конкретный экземпляр COM, используя дескриптор окна или любые другие методы?Получение конкретного экземпляра COM-объекта в VB.Net
ОБНОВЛЕНИЕ: Поскольку Раймонд сказал, что для всех объектов COM нет единого решения; Однако мне удалось получить объекты CATIA COM, используя следующий код (который использует ROT, чтобы заполнить список со всем CATIA COM именем Instances):
<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
Однако все экземпляры CATIA относящиеся к первому приложению CATIA загруженном. Не знаю, почему, кто-нибудь?
Существует не общее решение. Вам нужно выяснить, имеет ли рассматриваемый сервер метод для перечисления экземпляров или получения определенного экземпляра. –
@RaymondChen - Чтобы удалить этот вопрос из оставшейся без очереди очереди, я переместил ваш комментарий в ответ на wiki сообщества. Если вы хотите опубликовать ответ самостоятельно, оставьте комментарий к сообщению, и я его удалю. – JDB