【发布时间】:2011-03-17 01:02:52
【问题描述】:
我有一个 Access 数据库应用程序,我想知道反编译和重新编译它的正确方法。
【问题讨论】:
-
在您之前的问题stackoverflow.com/questions/3258488/… 中,您接受了一个包含反编译和重新编译信息的答案。
标签: ms-access vba maintenance decompiler
我有一个 Access 数据库应用程序,我想知道反编译和重新编译它的正确方法。
【问题讨论】:
标签: ms-access vba maintenance decompiler
要反编译 Access 数据库,您需要创建一个包含以下元素的快捷方式:
那么,快捷方式将如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" "C:\users\tim\documents\Mydatabase.mdb" /decompile
显然,您的系统上的路径会有所不同。
我建议在运行此命令之前备份您的数据库。
如果您的数据库中有任何启动代码,您应该按住 shift 键绕过启动代码执行。
数据库打开后,您可以压缩和修复数据库以确保最佳性能。
压缩修复后,可以打开任意模块,使用Debug Compile [DatabaseName]命令重新编译VBA代码。
如果这是您想要经常做的事情,您可以在您的发送至菜单中创建一个“访问反编译”快捷方式。在 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 数据库并选择“发送到 --> Access Decompile”。请务必按住 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 并在“调试”菜单上,选择“编译 [项目名称]”。
在文件菜单上,保存项目。
再次压缩。
为什么所有这些步骤都是必要的?
因为您不仅要反编译 VBA,还要确保在重新编译之前完全丢弃存储已编译 p 代码的所有数据页。
我也推荐:
在 VBE 选项中,关闭 COMPILE ON DEMAND
在 VBE 中,将编译按钮添加到您的工具栏。
在每两三行代码之后,经常使用工具栏上的那个按钮进行编译。
反编译不是你应该一直使用的东西,但是在繁重的编码过程中,我可能一天会反编译几次。我通常将反编译/重新编译作为将应用发布到生产使用之前的最后一步。
最后,阅读Michael Kaplan's article on the subject 以更好地理解它。
【讨论】:
accepted answer 很棒,但是为每个数据库创建快捷方式有点不切实际。
您可以将其保存为 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 命令行快速轻松地反编译 any db。
请注意,运行此程序时仍需要按住 Shift 键以绕过应用程序启动。
【讨论】:
(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE").'(default)'
我编写了一个 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 现在打开。在刚刚打开的 Access 窗口中打开您的数据库。这将反编译它。
【讨论】:
/decompile 开关应用于正在打开的文件,而不是正在打开的Access 实例。我们怎么能确定呢?
只是想加我的两分钱。我每天都使用 SQL Server、SSIS 和 MS Access 数据库,我们的网络允许我们使用不同的 Citrix 桌面;有些是 Win Serv 2003 SP2,有些是基于 Win Serv 2008 R2。当您在一个桌面上压缩和修复 MS Access 数据库时,数据库很好。但是,当您反编译时,您必须确保其他使用 dbs 的人能够打开它们。检查所有控件以查看它们在工作站之间的工作方式是否相同。当其他人安装的 MS Access 不包含相同的库时,您会遇到问题。这导致我们禁止所有具有非常规控件的前端开发,特别是您必须添加对数据库的引用才能使用的前端。虽然它是减小代码大小和加快代码速度的绝佳资源,但反编译可能会在多用户环境中造成大量麻烦
【讨论】:
或者只是您可以在桌面上创建一个快捷方式(使用 /Decompile 标志),然后按住 SHIFT 拖放您的 Access 应用程序以绕过任何代码
【讨论】: