我有一个Access数据库应用程序,我想知道反编译和重新编译它的正确方法。
答案 0 :(得分:44)
要反编译Access数据库,您需要使用以下元素创建快捷方式:
然后,快捷方式将如下所示:
"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快捷方式自定义“发送至”菜单
在目标中附加/ decompile标志以获取快捷方式。快捷方式如下所示:
"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" /decompile
打开Windows资源管理器并将以下内容粘贴到地址栏中:
%APPDATA%\Microsoft\Windows\SendTo
将您创建的快捷方式复制到SendTo文件夹中。
现在可以使用Access Decompile Shortcut。
要调用Access Decompile快捷方式,请在Windows资源管理器中右键单击Access数据库,然后选择“Send To - > Access Decompile”。确保按住shift键以绕过数据库中的任何启动代码。
答案 1 :(得分:36)
备份您的数据库。
压缩您的数据库。
使用Tim的说明创建的快捷方式,打开您的数据库。
关闭该Access实例。
打开一个新的Access实例并打开你刚刚反编译的数据库,但是请确保你绕过所有启动代码(即按住shift键)。如果你不这样做,那么你可以回到第3步并再试一次,因为如果启动代码运行,你的代码将在你准备好之前重新编译。
压缩反编译数据库(并确保按住shift键以便绕过启动代码;请参阅#5)。
打开VBE,在Debug菜单上选择COMPILE [project of project]。
在文件菜单上,保存项目。
再次紧凑。
为什么所有这些步骤都必要?
因为您不想只反编译VBA,所以您需要确保在重新编译之前完全丢弃存储已编译p代码的所有数据页。
我还建议:
在VBE选项中,关闭COMPILE ON DEMAND
,将COMPILE按钮添加到工具栏中。
在每两到三行代码后,经常使用工具栏上的那个按钮进行编译。
反编译不是你应该一直使用的东西,但在重载编码期间,我可能每天做几次反编译。在将应用程序发布到生产用途之前,我通常会反编译/重新编译作为最后一步。
最后,请阅读Michael Kaplan's article on the subject以更好地理解它。
答案 2 :(得分:9)
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命令行快速轻松地反编译 任何 数据库。
请注意,在运行此按钮时仍需要按住Shift键以绕过应用程序启动。
答案 3 :(得分:4)
我写了一个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代码。
答案 4 :(得分:3)
这里的其他答案似乎都有点复杂我的口味。
要反编译Access数据库:
从开始菜单打开运行对话框,或点击 Win + R
键入:MSACCESS.EXE /decompile
(正确的安装应该打开Access应用程序,您也可以提供MSACCESS.EXE的完整路径),然后按确定。
现在可以打开Access。在刚刚打开的Access窗口中打开您的数据库。这会反编译它。
答案 5 :(得分:2)
只想加我的两分钱。我每天使用SQL Server,SSIS和MS Access数据库,我们的网络允许我们使用不同的Citrix桌面;一些是Win Serv 2003 SP2,一些是Win Serv 2008 R2。在一个桌面中压缩和修复MS Access dbs时,数据库很好。但是,当你反编译时,你必须确保使用dbs的其他人能够打开它们。检查所有控件,看它们在工作站之间的工作方式是否相同。当其他人安装MS Access不包含相同的库时,您将遇到问题。这导致我们禁止使用非传统控件进行前端的所有开发,特别是那些你必须添加对db的引用才能使用的控件。虽然,这是一个很好的资源,可以减少大小并加快代码速度,但反编译可能会在多用户环境中造成大量麻烦
答案 6 :(得分:1)
或者简单地,您可以在桌面上创建快捷方式(带有/ Decompile标志),然后按住SHIFT拖放Access应用程序以绕过任何代码