我有一个 Access 数据库应用程序,我想知道反编译和重新编译它的正确方法。
7 回答
要反编译 Access 数据库,您需要使用以下元素创建快捷方式:
- MS Access 可执行文件 (MSACESS.exe) 的路径
- 您要反编译的数据库的路径
- /反编译标志
总而言之,快捷方式将如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" "C:\users\tim\documents\Mydatabase.mdb" /decompile
显然,您的系统上的路径会有所不同。
我建议在运行此命令之前备份您的数据库。
如果您的数据库中有任何启动代码,您应该按住 shift 键来绕过启动代码执行。
数据库打开后,您可以压缩和修复数据库以确保最佳性能。
压缩和修复后,您可以通过打开任何模块并使用Debug Compile [DatabaseName]
命令重新编译VBA代码。
如果这是您想要经常做的事情,您可以在您的 SendTo 菜单中创建一个“访问反编译”快捷方式。在 SendTo 菜单中拥有此快捷方式后,您将能够右键单击任何 Access 数据库并选择“Send To --> Access Decompile”,这比创建特定数据库的快捷方式要容易得多。
按照以下步骤使用 Access 反编译快捷方式自定义发送到菜单
创建 Access 可执行文件的快捷方式。
在快捷方式的目标中附加 /decompile 标志。快捷方式将如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" /decompile
打开 Windows 资源管理器并将以下内容粘贴到地址栏中:
%APPDATA%\Microsoft\Windows\SendTo
将您创建的快捷方式复制到 SendTo 文件夹中。
现在可以使用 Access 反编译快捷方式。
要调用 Access Decompile 快捷方式,请在 Windows 资源管理器中右键单击 Access 数据库并选择“Send To --> Access Decompile”。请务必按住 shift 键以绕过数据库中的任何启动代码。
@Tim Lentine 的实用说明很好,但他忽略了反编译所需的实际步骤是值得做的:
备份你的数据库。
压缩你的数据库。
使用根据 Tim 的说明创建的快捷方式,打开您的数据库。
关闭该 Access 实例。
打开一个新的 Access 实例并打开您刚刚反编译的数据库,但请确保您绕过所有启动代码(即,按住 shift 键)。如果你不这样做,那么你还不如回到第 3 步再试一次,因为如果启动代码运行,你的代码会在你准备好之前重新编译。
压缩反编译的数据库(并确保按住 shift 键以绕过启动代码;参见 #5)。
打开 VBE 并在 Debug 菜单上,选择 COMPILE [name of project]。
在文件菜单上,保存项目。
再次紧凑。
为什么所有这些步骤都是必要的?
因为您不仅要反编译 VBA,还要确保在重新编译之前完全丢弃存储已编译 p 代码的所有数据页。
我还推荐:
在 VBE 选项中,关闭按需编译
在 VBE 中,将编译按钮添加到您的工具栏。
在每两三行代码之后,经常使用工具栏上的那个按钮进行编译。
反编译不是你应该一直使用的东西,但是在繁重的编码过程中,我可能一天会反编译几次。我通常将反编译/重新编译作为将应用程序发布到生产使用之前的最后一步。
最后,阅读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 命令行快速轻松地反编译任何db。
请注意,当您运行此程序以绕过应用程序启动时,您仍然需要按住 Shift 键。
我写了一个 VBS 脚本来自动化反编译过程。微软没有将它集成到 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 代码。
这里的其他答案对我来说似乎都有点复杂。
反编译 Access 数据库:
从开始菜单打开“运行”Win对话框,或点击+R
输入:(MSACCESS.EXE /decompile
正确安装应该会打开 Access 应用程序,您还可以提供 MSACCESS.EXE 的完整路径),然后按 OK。
访问现在打开。在刚刚打开的 Access 窗口中打开您的数据库。那将反编译它。
只是想加我的两分钱。我每天都使用 SQL Server、SSIS 和 MS Access 数据库,我们的网络允许我们使用不同的 Citrix 桌面;有些是 Win Serv 2003 SP2,有些是基于 Win Serv 2008 R2。当您在一个桌面上压缩和修复 MS Access 数据库时,数据库很好。但是,当你反编译时,你必须确保其他使用 dbs 的人能够打开它们。检查所有控件以查看它们在工作站之间的工作方式是否相同。当其他人安装的 MS Access 不包含相同的库时,您将遇到问题。这导致我们禁止所有具有非常规控件的前端开发,特别是您必须添加对数据库的引用才能使用的前端。不过,它是减小代码大小和加快代码速度的绝佳资源,
或者只是您可以在桌面上创建一个快捷方式(使用 /Decompile 标志)并按住 SHIFT 拖放您的 Access 应用程序以绕过任何代码