私は一種の複雑なシナリオを持っています
開発中の Access-Application は、別の Access-Application 内の VBA Function を呼び出します。この関数は、「呼び出し元」の Access-Application を呼び出すことによってインストール ルーチンをトリガーします。どちらのアプリケーションも、accda (Access-AddIn 用) またはコンパイル済みの accde ファイルのいずれかです。
Admin.accda -> PlugIn.accda (InstallPlugIn) -> Admin.accda (RegisterPlugIn)
Admin.accda の対応する行は次のようになります。
Application.Run("\\Path\To\PlugIn\PlugIn.InstallPlugin", "Parameters")
1つのことを除いて、すべてが期待どおりに機能します。Admin.accda を閉じるまで、Access は PlugIn.accda のファイル ハンドルを開いたままにします。
コードをデバッグすると、Admin.accda で Application.Run() を呼び出すと、PlugIn.accda の VBA コードが Admin.accda にロードされ、PlugIn.accda (PlugIn.laccda) のロックファイルが作成されることがわかります。私のコードが終了すると、Lockfile は 0 バイトですが、まだ存在しています。
Sysinternals の ProcessExplorer を使用すると、Admin.accda が実行されているプロセスに、PlugIn.accda に対して開いているファイルハンドルがまだあることがわかります。
PlugIn.accda を処理する必要がなくなり、ファイル ハンドルが開いていると、プラグインをクライアント コンピュータにコピーするなど、クライアントのクライアント/サーバー展開のプロセスに干渉する可能性があるため、そのファイル ハンドルを閉じたいと考えています。
これまで、2 つの異なるアプローチを試みましたが、成功しませんでした。
最初: Run on Access-Application-Object を呼び出し、その後そのオブジェクトを閉じようとしました
Dim oApplication As Object
Set oApplication = CreateObject("Access.Application")
oApplication.OpenCurrentDatabase Me.txtPathPlugIn
If oApplication.Run("\\Path\To\PlugIn\PlugIn.InstallPlugin", "Params") Then
'Do something
End If
oApplication.CloseCurrentDatabase
Set oApplicaton = Nothing
そのアプローチでは、別のプロセスで独占的に開かれていたため、プラグインは Admin.accda で RegisterPlugIn 関数を呼び出すことができませんでした。
2 番目: Admin.accda で RegisterPlugIn を呼び出した後、次を使用してプラグイン データベースを閉じようとしました。
CodeProject.CloseCurrentDatabase
しかし、それはまったく効果がありませんでした:-(
いくつかの Windows API 関数を使用してファイル ハンドルを閉じる方法はありますか? または、追加の Access ファイルを動的に登録するためのより良い方法を誰かが持っていますか?