サードパーティの CAD/CAM ソフトウェア (この場合は CATIA) の実行中のすべてのインスタンスを一覧表示し、ユーザーがそのうちの 1 つを選択していくつかの自動化されたタスクを実行できるようにするために、.Net で Windows フォーム アプリケーションを作成しています。自動化されたタスクを実行するには、COM オブジェクトの特定のインスタンスを取得する必要があります。Getobject() では非特定の COM インスタンスが得られます。ウィンドウ ハンドルまたはその他の方法を使用して特定の COM インスタンスを取得する方法はありますか?
更新:レイモンドが言ったように、すべての COM オブジェクトに対する単一のソリューションはありません。ただし、次のコードを使用して CATIA COM オブジェクトを取得できました (ROT を使用して、すべての CATIA COM インスタンス名をリストに入力します)。
<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 アプリケーションを参照します。理由がわからない、誰か?