【问题标题】:How does one decompile and recompile a database application?如何反编译和重新编译数据库应用程序?
【发布时间】:2011-03-17 01:02:52
【问题描述】:

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

【问题讨论】:

标签: ms-access vba maintenance decompiler


【解决方案1】:

要反编译 Access 数据库,您需要创建一个包含以下元素的快捷方式:

  1. MS Access 可执行文件 (MSACESS.exe) 的路径
  2. 要反编译的数据库路径
  3. /反编译标志

那么,快捷方式将如下所示:

"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 反编译快捷方式自定义“发送至”菜单

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

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

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

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

    %APPDATA%\Microsoft\Windows\SendTo

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

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

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

【讨论】:

  • 要找到 MSACCESS.EXE 的路径,请在控制台中运行:reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MSACCESS.EXE" /ve
【解决方案2】:

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

  1. 备份您的数据库。

  2. 压缩数据库。

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

  4. 关闭该 Access 实例。

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

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

  7. 打开 VBE 并在“调试”菜单上,选择“编译 [项目名称]”。

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

  9. 再次压缩。

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

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

我也推荐:

  1. 在 VBE 选项中,关闭 COMPILE ON DEMAND

  2. 在 VBE 中,将编译按钮添加到您的工具栏。

  3. 在每两三行代码之后,经常使用工具栏上的那个按钮进行编译。

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

最后,阅读Michael Kaplan's article on the subject 以更好地理解它。

【讨论】:

  • 这可能听起来是一个愚蠢的问题,但是即使数据库是纯数据数据库,我也应该使用反编译吗?
  • @Paul - 这应该不是必需的,因为纯数据数据库可能不包含任何 VBA 代码。 (顺便说一句,你必须原谅大卫没有回应;他几年前去世了。)
  • @GordThompdon:哦!不!这绝对是一个致命的例外。感谢您代替他回答。
  • 第 6 步中的括号似乎是关键。我已经从多个网站完成了所有这些步骤,并在打开时按住 shift 键,最后给了我一个在 VBE 中编译的选项。
【解决方案3】:

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)'
【解决方案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 代码。

【讨论】:

    【解决方案5】:

    这里的其他答案对我来说似乎都有点复杂。

    反编译 Access 数据库:

    从开始菜单打开运行对话框,或点击Win + R

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

    Access 现在打开。在刚刚打开的 Access 窗口中打开您的数据库。这将反编译它。

    【讨论】:

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

    只是想加我的两分钱。我每天都使用 SQL Server、SSIS 和 MS Access 数据库,我们的网络允许我们使用不同的 Citrix 桌面;有些是 Win Serv 2003 SP2,有些是基于 Win Serv 2008 R2。当您在一个桌面上压缩和修复 MS Access 数据库时,数据库很好。但是,当您反编译时,您必须确保其他使用 dbs 的人能够打开它们。检查所有控件以查看它们在工作站之间的工作方式是否相同。当其他人安装的 MS Access 不包含相同的库时,您会遇到问题。这导致我们禁止所有具有非常规控件的前端开发,特别是您必须添加对数据库的引用才能使用的前端。虽然它是减小代码大小和加快代码速度的绝佳资源,但反编译可能会在多用户环境中造成大量麻烦

    【讨论】:

    • 我不确定您指的是因为反编译访问 VBA 代码。您所指的似乎是 ActiveX 控件的使用(即引用)。
    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2012-06-17
      相关资源
      最近更新 更多