提问人:Alex Gordon 提问时间:7/16/2010 最后编辑:Daniel WiddisAlex Gordon 更新时间:9/26/2023 访问量:91652
如何反编译和重新编译数据库应用程序?
How does one decompile and recompile a database application?
答:
若要反编译 Access 数据库,需要使用以下元素创建快捷方式:
- MS Access 可执行文件 (MSACESS.exe) 的路径
- 要反编译的数据库的路径
- /decompile 标志
然后,快捷方式将如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" "C:\users\tim\documents\Mydatabase.mdb" /decompile
显然,系统上的路径会有所不同。
我建议在运行此命令之前对数据库进行备份。
如果数据库中有任何启动代码,则应按住 shift 键以绕过启动代码执行。
数据库打开后,可以压缩和修复数据库以确保最佳性能。
压缩和修复后,您可以通过打开任何模块并使用命令来重新编译VBA代码。Debug Compile [DatabaseName]
如果这是您想经常做的事情,您可以在 SendTo 菜单中创建“访问反编译”快捷方式。在 SendTo 菜单中拥有此快捷方式后,您将能够右键单击任何 Access 数据库并选择“发送到 --> Access 反编译”,这比创建特定数据库的快捷方式要容易得多。
按照以下步骤使用 Access 反编译快捷方式自定义“发送到”菜单
创建 Access 可执行文件的快捷方式。
在快捷方式的 Target 中追加 /decompile 标志。快捷方式将如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" /decompile
打开 Windows 资源管理器并将以下内容粘贴到地址栏中:
%APPDATA%\Microsoft\Windows\SendTo
将您创建的快捷方式复制到 SendTo 文件夹中。
Access 反编译快捷方式现在可供使用。
要调用“Access 反编译”快捷方式,请右键单击 Windows 资源管理器中的 Access 数据库,然后选择“发送到 --> Access 反编译”。请务必按住 shift 键以绕过数据库中的任何启动代码。
评论
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE" /ve
@Tim Lentine 的实用说明很好,但他遗漏了反编译所需的实际步骤:
备份数据库。
压缩数据库。
使用根据 Tim 的说明创建的快捷方式,打开您的数据库。
关闭该 Access 实例。
打开一个新的 Access 实例并打开您刚刚反编译的数据库,但请确保绕过所有启动代码(即按住 shift 键)。如果不这样做,那么你不妨返回步骤 3 并重试,因为如果启动代码运行,您的代码将在您准备好执行此操作之前重新编译。
压缩反编译的数据库(并确保按住 Shift 键以绕过启动代码;请参阅 #5)。
打开 VBE,然后在 Debug 菜单上,选择 COMPILE [name of project]。
在“文件”菜单上,保存项目。
再次紧凑。
为什么所有这些步骤都是必要的?
因为您不仅要反编译 VBA,还要确保在重新编译之前完全丢弃存储已编译的 p 代码的所有数据页。
我还建议:
在 VBE 选项中,关闭按需编译
在 VBE 中,将 COMPILE 按钮添加到工具栏中。
通常使用工具栏上的该按钮进行编译,每两到三行代码之后。
反编译不是你应该一直使用的东西,但在繁重的编码期间,我可能会每天进行几次反编译。我通常会将反编译/重新编译作为将应用程序发布到生产环境中之前的最后一步。
最后,阅读迈克尔·卡普兰(Michael Kaplan)关于该主题的文章以更好地理解它。
评论
我编写了一个 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
只需将此文本粘贴到带有扩展名的文档中,然后双击即可运行。Access 将启动,反编译编译的 P 代码(“打包”代码),并自动将 VBA 源代码重新编译回 P 代码。.vbs
公认的答案很好,但为每个数据库创建一个快捷方式有点不切实际。
可以将其另存为 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 键以绕过应用程序启动。
评论
(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE").'(default)'
这里的其他答案在我看来都有点复杂。
要反编译 Access 数据库,请执行以下操作:
从开始菜单中打开“运行”对话框,或按Win + R
键入:(正确安装应打开 Access 应用程序,还可以提供 MSACCESS.EXE 的完整路径),然后按 OK。MSACCESS.EXE /decompile
访问权限现已开放。在刚刚打开的 Access 窗口中打开数据库。这将反编译它。
评论
/decompile
或者,您可以在桌面上创建一个快捷方式(使用 /Decompile 标志),然后拖放按住 SHIFT 键的 Access 应用程序以绕过任何代码
评论