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

40

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


2
在您之前的问题http://stackoverflow.com/questions/3258488/ms-access-2003-form-does-not-open-help/3260422#3260422中,您接受了一个包含反编译和重新编译信息的答案。 - Fionnuala
6个回答

55

要反编译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键绕过启动代码执行。

打开数据库后,可以压缩和修复数据库以保证最佳性能。

压缩和修复后,可以通过打开任何模块并使用Debug Compile [DatabaseName]命令来重新编译VBA代码。

如果这是您想经常执行的操作,可以在SendTo菜单中创建“Access Decompile”快捷方式。一旦在SendTo菜单中拥有了这个快捷方式,就可以右键单击任何Access数据库,选择“发送到 -> Access Decompile”,这比创建特定数据库的快捷方式要容易得多。

按照以下步骤自定义Send To菜单以添加Access Decompile快捷方式:

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

  2. 在快捷方式的目标中追加/decompile标志。快捷方式看起来像这样:

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

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

    %APPDATA%\Microsoft\Windows\SendTo

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

  5. 现在可以使用Access Decompile快捷方式了。

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


2
要找到MSACCESS.EXE的路径,请在控制台中运行以下命令:reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE" /ve - Brian Burns

42
@Tim Lentine的实用指南很好,但他忽略了进行反编译所需的实际步骤:
  1. 备份数据库。

  2. 压缩数据库。

  3. 使用Tim的指南创建的快捷方式打开数据库。

  4. 关闭Access的该实例。

  5. 打开一个新的Access实例,并打开刚刚反编译的数据库,但务必绕过所有启动代码(即按住Shift键)。如果不这样做,那么你可以回到第3步重新尝试,因为如果启动代码运行,你的代码将在你准备好之前重新编译。

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

  7. 打开VBE,在调试菜单中选择编译[name of project]。

  8. 在文件菜单中保存项目。

  9. 再次压缩。

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

因为你不仅想要反编译VBA,还想要确保在重新编译之前完全丢弃存储编译p-code的所有数据页面。
我还建议:
1. 在VBE选项中,关闭按需编译。 2. 在VBE中,将编译按钮添加到工具栏上。 3. 在每写两三行代码后,经常使用工具栏上的按钮进行编译。
反编译不是你应该一直使用的东西,但在进行大量编码时,我可能会每天进行几次反编译。而且通常在将应用程序发布到生产环境之前,我会在最后一步进行反编译/重新编译。
最后,请阅读Michael Kaplan关于此主题的文章以更好地理解它。

这可能听起来像一个愚蠢的问题,但即使数据库只是一个数据库,我是否应该使用反编译? - user1945782
3
@Paul- 这应该是不必要的,因为一个纯数据的数据库很可能不包含任何VBA代码。(顺便说一句,你需要原谅大卫没有回复;他已经去世几年了。) - Gord Thompson
@GordThompson:哦!不好了!那绝对是一个致命的异常。谢谢你代替他回答。 - user1945782
2
第6步中的括号似乎是关键。我从多个网站完成了所有这些步骤,并在打开时进行了Shift + 单击,最终给了我在VBE中编译的选项。 - Lux Claridge

14

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

你可以将其保存为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"

这使你能够从PowerShell命令行快速轻松地反编译任何数据库。
请注意,在运行此操作时,您仍需要按住Shift键以绕过应用程序启动。

4
可以这样动态获取访问可执行文件的完整路径:(Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE").'(default)' - HackSlash

7
这里的其他答案似乎都有点复杂。
要反编译Access数据库:
从开始菜单打开“运行”对话框,或按下Win + R键。
输入:MSACCESS.EXE /decompile(正确的安装应该会打开Access应用程序,您也可以提供MSACCESS.EXE的完整路径),然后点击确定。
现在Access已经打开。在刚刚打开的Access窗口中打开您的数据库。这将对其进行反编译。

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

6
我写了一个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代码。

1

或者,您可以在桌面上创建一个快捷方式(带有 /Decompile 标志),并按住 SHIFT 拖放您的访问应用程序以绕过任何代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接