【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?

こんばんは。

フォームにボタンを設置して、そのボタンをクリックすると
既存のアクセスファイルを開くようにしているのですが
そのアクセスファイルを終了させてもタスクマネージャーのプロセスタブの
MSACCESS.EXE*32
がいつまでも残ってしまいます。

VBのフォームを閉じると、MSACCESS.EXE*32は消えます。

VBのコードは、
Private Sub cmb_Access_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_Access.SelectedIndexChanged
Call AccessOpen()
End Sub
------------------------------
標準モジュール
Sub Access_Open()
Dim AccApp As Access.Application
Dim MyPath As String

MyPath = "C:\test.accdb"

AccApp = CreateObject("Access.Application")
AccApp.OpenCurrentDatabase(MyPath)
AccApp.Visible = True
AccApp.UserControl = True

AccApp = Nothing
End Sub

です。

VBのフォームから
test.accdbを開く→閉じるを繰り返してると、
プロセスが溜まってしまって、アクセスでエラーが起こります。

なので、VBからアクセスを開いて閉じてたら、
プロセスも終了させるようにしたいのですが、
どうすればいいでしょうか?

ご回答よろしくお願いします。

「タスクマネージャーのプロセスから消えなく」の質問画像

A 回答 (1件)

VB 7.0 (=VB.NET 2002)以降のVisual Basicでは,それ以前のVisual Basicに比べ,COMの取り扱いが煩雑になっています。



・Nothingの代入はCOMの解放を意味しません。フィールド変数への代入などを除くと,通常無意味です
・COMのオブジェクトは,全て,確実に System.Runtime.InteropServices.Marshal.ReleaseComObject を呼び出して解放する必要があります

今回の場合,
> AccApp = Nothing
のかわりに,
System.Runtime.InteropServices.Marshal.ReleaseComObject(AccApp)
としてください。
これにより,IUnknown.Releaseが呼び出されて参照カウントが減少し,Accessへの参照がなくなります。
    • good
    • 1
この回答へのお礼

AccApp = Nothingは無意味なのですか。

System.Runtime.InteropServices.Marshal.ReleaseComObject(AccApp)
に変更して確認したら、ちゃんとタスクマネージャーから消えました!
ありがとうございました。大変参考になりました。

お礼日時:2012/11/04 19:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報