タイトル | : Re^2: 実行中のACCESSファイル群のパス取得方法 |
記事No | : 10324 |
投稿日 | : 2010/11/26(Fri) 21:44 |
投稿者 | : 魔界の仮面弁士 |
> AccApp = GetObject(, "Access.Application") '起動済みのインスタンスを取得 (中略) > なお、アプリケーション自体が複数起動されている状態においては、 > GetObject で単純に取得…というわけには行きません(Excel でも Access でも)。 > それぞれのインスタンスを取得したいようなケースにおいては、 > ROT(Running Object Table)から辿っていく必要があります。
ROT からオブジェクトを得るサンプル。
Imports System.Runtime.InteropServices.ComTypes Imports System.Runtime.InteropServices Public Class Form1 Private Declare Function GetRunningObjectTable Lib "ole32" _ (ByVal reserved As Integer, _ <Out()> ByRef pprot As IRunningObjectTable) As Integer
Private Declare Function CreateBindCtx Lib "ole32" _ (ByVal reserved As Integer, _ <Out()> ByRef ppbc As IBindCtx) As Integer
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load Button1.Text = "更新" End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click ListBox1.DataSource = GetROT() End Sub
Private Function GetROT() As List(Of String) Dim names As New List(Of String)() Dim rot As IRunningObjectTable = Nothing Dim hr As Integer = GetRunningObjectTable(0, rot) If hr = 0 AndAlso rot IsNot Nothing Then Dim oBindCtx As IBindCtx = Nothing CreateBindCtx(0, oBindCtx) Dim oMoniker() As IMoniker = {Nothing} Dim oEnumMoniker As IEnumMoniker = Nothing rot.EnumRunning(oEnumMoniker) Do While oEnumMoniker.Next(1, oMoniker, IntPtr.Zero) = 0 Dim dispName As String = "" oMoniker(0).GetDisplayName(oBindCtx, Nothing, dispName) Marshal.ReleaseComObject(oMoniker(0)) oMoniker(0) = Nothing names.Add(dispName) Loop Marshal.ReleaseComObject(oBindCtx) oBindCtx = Nothing Marshal.ReleaseComObject(oEnumMoniker) oEnumMoniker = Nothing Marshal.ReleaseComObject(rot) rot = Nothing End If Return names End Function
Private Function GetObjectFromROT(ByVal dispName As String) As Object GetObjectFromROT = Nothing Dim rot As IRunningObjectTable = Nothing Dim hr As Integer = GetRunningObjectTable(0, rot) If hr = 0 AndAlso rot IsNot Nothing Then Dim oBindCtx As IBindCtx = Nothing CreateBindCtx(0, oBindCtx) Dim oMoniker() As IMoniker = {Nothing} Dim oEnumMoniker As IEnumMoniker = Nothing rot.EnumRunning(oEnumMoniker) Do While oEnumMoniker.Next(1, oMoniker, IntPtr.Zero) = 0 Dim s As String = "" oMoniker(0).GetDisplayName(oBindCtx, Nothing, s) If s = dispName Then rot.GetObject(oMoniker(0), GetObjectFromROT) End If Marshal.ReleaseComObject(oMoniker(0)) oMoniker(0) = Nothing If s = dispName Then Exit Do End If Loop Marshal.ReleaseComObject(oBindCtx) oBindCtx = Nothing Marshal.ReleaseComObject(oEnumMoniker) oEnumMoniker = Nothing Marshal.ReleaseComObject(rot) rot = Nothing End If End Function
Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles ListBox1.DoubleClick Dim dispName As String = CStr(ListBox1.SelectedItem) If MsgBox("取得します。" & vbCrLf & dispName, vbOKCancel) = vbCancel Then Return End If Dim o As Object = GetObjectFromROT(dispName) If o Is Nothing Then MsgBox("見つかりませんでした。") Else MsgBox("取得しました。" & vbCrLf & TypeName(o)) ' ' 'ここに、取得したオブジェクトに対する処理を記述。 ' ' Marshal.ReleaseComObject(o) End If End Sub End Class
|