Access データベース アプリケーションがあり、それを逆コンパイルおよび再コンパイルする適切な方法を知りたいです。
7 に答える
Access データベースを逆コンパイルするには、次の要素を含むショートカットを作成する必要があります。
- MS Access 実行可能ファイル (MSACESS.exe) へのパス
- 逆コンパイルするデータベースへのパス
- /decompile フラグ
まとめると、ショートカットは次のようになります。
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" "C:\users\tim\documents\Mydatabase.mdb" /decompile
明らかに、パスはシステムによって異なります。
このコマンドを実行する前に、データベースのバックアップを作成することをお勧めします。
データベースにスタートアップ コードがある場合は、Shift キーを押したままにして、スタートアップ コードの実行をバイパスする必要があります。
データベースが開いたら、データベースを圧縮および修復して、最適なパフォーマンスを確保できます。
圧縮と修復の後、任意のモジュールを開いてDebug Compile [DatabaseName]
コマンドを使用することにより、VBA コードを再コンパイルできます。
これを頻繁に行う場合は、SendTo メニューに「Access Decompile」ショートカットを作成できます。SendTo メニューにこのショートカットを作成すると、任意の Access データベースを右クリックして [送信 --> Access Decompile] を選択できるようになります。これは、特定のデータベースへのショートカットを作成するよりもはるかに簡単です。
次の手順に従って、Access Decompile ショートカットを使用して [送信先] メニューをカスタマイズします。
Access 実行可能ファイルへのショートカットを作成します。
ショートカットのターゲットに /decompile フラグを追加します。ショートカットは次のようになります。
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" /decompile
Windows エクスプローラーを開き、次をアドレス バーに貼り付けます。
%APPDATA%\Microsoft\Windows\SendTo
作成したショートカットを SendTo フォルダーにコピーします。
Access Decompile Shortcut が使用できるようになります。
Access Decompile ショートカットを呼び出すには、Windows Explorer で Access データベースを右クリックし、[送る] --> [Access Decompile] を選択します。Shift キーを押したままにして、データベース内のスタートアップ コードをバイパスしてください。
@Tim Lentine の実践的な指示は優れていますが、逆コンパイルを実行する価値があるために必要な実際の手順を省略しています。
データベースをバックアップします。
データベースを圧縮します。
Tim の指示に従って作成されたショートカットを使用して、データベースを開きます。
その Access のインスタンスを閉じます。
Access の新しいインスタンスを開き、逆コンパイルしたばかりのデータベースを開きます。ただし、必ずすべてのスタートアップ コードをバイパスしてください (つまり、Shift キーを押したままにしてください)。そうしない場合は、ステップ 3 に戻って再試行することをお勧めします。これは、スタートアップ コードが実行されると、準備が整う前にコードが再コンパイルされるためです。
逆コンパイルされたデータベースを圧縮します (そして、スタートアップ コードをバイパスするためにシフト キーを押したままにしてください。#5 を参照してください)。
VBE を開き、[デバッグ] メニューで [コンパイル [プロジェクト名]] を選択します。
ファイル メニューで、プロジェクトを保存します。
再びコンパクトに。
なぜこれらすべての手順が必要なのですか?
VBA を逆コンパイルするだけでなく、再コンパイルする前に、コンパイル済みの p-code が格納されていたすべてのデータ ページが完全に破棄されていることを確認する必要があります。
私もお勧めします:
VBE オプションで、COMPILE ON DEMAND をオフにします
VBE で、[コンパイル] ボタンをツールバーに追加します。
2 ~ 3 行のコードごとに、ツールバーのそのボタンを使用して頻繁にコンパイルします。
逆コンパイルは常に使用する必要があるものではありませんが、負荷の高いコーディング中は、1 日に数回逆コンパイルを行うことがあります。そして、私は通常、アプリを本番環境にリリースする前の最後のステップとして逆コンパイル/再コンパイルします。
最後に、このテーマに関する Michael Kaplan の記事を読んで理解を深めてください。
受け入れられた答えは素晴らしいですが、すべてのデータベースにショートカットを作成するのは少し非現実的です。
これをpowershellモジュールとして保存できます。
#for use with MSAccess 2010
Function Decompile-AccessDB{
param ([string]$dbFileName)
[string]$argument = '"' + $dbFileName + '"' + "/Decompile"
Start-Process -FilePath 'C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE' -ArgumentList $argument
}
次に、次のように呼び出します。
Decompile-AccessDB -Path "C:\Path\to\some.accdb"
これにより、Power Shell コマンド ラインから任意のデータベースをすばやく簡単に逆コンパイルできます。
アプリケーションの起動をバイパスするには、これを実行するときに Shift キーを押し続ける必要があることに注意してください。
逆コンパイルのプロセスを自動化する VBS スクリプトを作成しました。Microsoft がこれを Access に統合していないのは愚かなことです。なぜなら、VBA を多用するアプリケーションを開発する際には必要だからです。
スクリプトは MSACCESS.exe を見つけ、コードで名前が指定されているスクリプトの親ディレクトリにあるデータベースで逆コンパイル フラグを指定して Access を実行します。
Option Explicit
Dim MSAccPath
Dim RegKey
Dim WSHShell
Dim currentDirectory
' Get MSACCESS.exe directory
RegKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\" _
& "CurrentVersion\App Paths\MSACCESS.EXE\Path"
Set WSHShell = WScript.CreateObject("WScript.Shell")
' Get parent directory
MSAccPath = WSHShell.RegRead(RegKey)
currentDirectory = WSHShell.CurrentDirectory
' Decompile
WSHShell.Run Chr(34) & MSAccPath & "MSACCESS.EXE" & Chr(34) & " " & Chr(34) & currentDirectory & "\..\testdb.accdb" & Chr(34) & " /decompile"
' Clear shell var
Set WSHShell = Nothing
このテキストを拡張子付きのドキュメントに貼り付け.vbs
、ダブルクリックして実行するだけです。Access が起動し、コンパイルされた P コード (「パックされた」コード) を逆コンパイルし、VBA ソースを自動的に再コンパイルして P コードに戻します。
私の2セントを追加したかっただけです。私は毎日、SQL Server、SSIS、および MS Access データベースを使用して作業しており、私たちのネットワークでは、さまざまな Citrix デスクトップを使用できます。一部は Win Serv 2003 SP2 で、一部は Win Serv 2008 R2 ベースです。1 つのデスクトップで MS Access データベースを圧縮および修復すると、データベースは問題ありません。ただし、逆コンパイルするときは、データベースを使用する他の人がデータベースを開くことができるようにする必要があります。すべてのコントロールをチェックして、どのワークステーションでも同じように機能するかどうかを確認します。他の誰かがインストールした MS Access に同じライブラリが含まれていない場合、問題が発生します。そのため、型にはまらないコントロールを備えたフロントエンド、特に使用するためにデータベースへの参照を追加する必要があるフロントエンドの開発をすべて禁止することになりました。ただし、サイズを小さくしてコードを高速化するための優れたリソースです。