如何反编译和重新编译数据库应用程序?

How does one decompile and recompile a database application?

提问人:Alex Gordon 提问时间:7/16/2010 最后编辑:Daniel WiddisAlex Gordon 更新时间:9/26/2023 访问量:91652

问:

我有一个 Access 数据库应用程序,我想知道反编译和重新编译它的正确方法。

VBA MS-Access 反编译器

评论

2赞 Fionnuala 7/16/2010
在上一个问题 stackoverflow.com/questions/3258488/ 中,您接受了包含反编译和重新编译信息的答案。

答:

55赞 Tim Lentine 7/17/2010 #1

若要反编译 Access 数据库,需要使用以下元素创建快捷方式:

  1. MS Access 可执行文件 (MSACESS.exe) 的路径
  2. 要反编译的数据库的路径
  3. /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 反编译快捷方式自定义“发送到”菜单

  1. 创建 Access 可执行文件的快捷方式。

  2. 在快捷方式的 Target 中追加 /decompile 标志。快捷方式将如下所示:

    "C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" /decompile

  3. 打开 Windows 资源管理器并将以下内容粘贴到地址栏中:

    %APPDATA%\Microsoft\Windows\SendTo

  4. 将您创建的快捷方式复制到 SendTo 文件夹中。

  5. Access 反编译快捷方式现在可供使用。

要调用“Access 反编译”快捷方式,请右键单击 Windows 资源管理器中的 Access 数据库,然后选择“发送到 --> Access 反编译”。请务必按住 shift 键以绕过数据库中的任何启动代码。

评论

2赞 Brian Burns 4/11/2015
若要查找 MSACCESS.EXE 的路径,请在控制台中运行以下命令:reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE" /ve
42赞 David-W-Fenton 7/17/2010 #2

@Tim Lentine 的实用说明很好,但他遗漏了反编译所需的实际步骤:

  1. 备份数据库。

  2. 压缩数据库。

  3. 使用根据 Tim 的说明创建的快捷方式,打开您的数据库。

  4. 关闭该 Access 实例。

  5. 打开一个新的 Access 实例并打开您刚刚反编译的数据库,但请确保绕过所有启动代码(即按住 shift 键)。如果不这样做,那么你不妨返回步骤 3 并重试,因为如果启动代码运行,您的代码将在您准备好执行此操作之前重新编译。

  6. 压缩反编译的数据库(并确保按住 Shift 键以绕过启动代码;请参阅 #5)。

  7. 打开 VBE,然后在 Debug 菜单上,选择 COMPILE [name of project]。

  8. 在“文件”菜单上,保存项目。

  9. 再次紧凑。

为什么所有这些步骤都是必要的?

因为您不仅要反编译 VBA,还要确保在重新编译之前完全丢弃存储已编译的 p 代码的所有数据页。

我还建议:

  1. 在 VBE 选项中,关闭按需编译

  2. 在 VBE 中,将 COMPILE 按钮添加到工具栏中。

  3. 通常使用工具栏上的该按钮进行编译,每两到三行代码之后。

反编译不是你应该一直使用的东西,但在繁重的编码期间,我可能会每天进行几次反编译。我通常会将反编译/重新编译作为将应用程序发布到生产环境中之前的最后一步。

最后,阅读迈克尔·卡普兰(Michael Kaplan)关于该主题的文章以更好地理解它。

评论

0赞 5/16/2016
听起来像是一个愚蠢的问题,但是即使数据库是纯数据数据库,我是否应该使用反编译?
3赞 Gord Thompson 7/30/2016
@Paul - 这应该不是必需的,因为纯数据数据库可能不包含任何 VBA 代码。(顺便说一句,你必须原谅大卫没有回应;他几年前就去世了。
0赞 7/31/2016
@GordThompdon:哦!不!这绝对是一个致命的例外。感谢您代替他回答。
2赞 Lux Claridge 6/17/2019
步骤 6 中的括号似乎是关键。我已经从多个网站完成了所有这些步骤,打开时按住 shift 键终于给了我一个在 VBE 中编译的选项。
6赞 StockB 12/19/2013 #3

我编写了一个 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

14赞 RubberDuck 3/1/2014 #4

公认的答案很好,但为每个数据库创建一个快捷方式有点不切实际。

可以将其另存为 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 键以绕过应用程序启动。

评论

4赞 HackSlash 11/7/2019
通过以下方式动态获取访问可执行文件的完整路径:(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE").'(default)'
7赞 Erik A 3/11/2018 #5

这里的其他答案在我看来都有点复杂。

要反编译 Access 数据库,请执行以下操作:

从开始菜单中打开“运行”对话框,或按Win + R

键入:(正确安装应打开 Access 应用程序,还可以提供 MSACCESS.EXE 的完整路径),然后按 OK。MSACCESS.EXE /decompile

访问权限现已开放。在刚刚打开的 Access 窗口中打开数据库。这将反编译它。

评论

0赞 Ben 6/18/2019
这是一种简单的方法,但我想进一步澄清。你是说使用 /decompile 开关打开 MSACCESS.EXE 而不传递文件名,然后从该实例打开数据库文件将强制对该数据库进行反编译吗?这是否也意味着我从该 Access 实例打开的任何其他数据库在打开时也会反编译?我不习惯以这种方式打开数据库文件。我一直认为开关应用于正在打开的文件,而不是正在打开的 Access 实例。我们怎么能确定呢?/decompile
0赞 Erik A 6/18/2019
@Ben一种方法是使用它并检查。当我的一个数据库在调试导致 VB 项目损坏和启动时硬崩溃的错误时,我已经广泛使用了这种技术,经常需要反编译。但是,您可以通过首先编译多个数据库,然后使用 decompile 标志打开一个 Access 实例,然后查看是否可以再次编译它们(如果它们已编译并且没有任何更改,则应该不可能)来轻松验证它的工作原理。您将看到只有打开的第一个数据库才会被反编译。
1赞 John 4/24/2019 #6

或者,您可以在桌面上创建一个快捷方式(使用 /Decompile 标志),然后拖放按住 SHIFT 键的 Access 应用程序以绕过任何代码