【问题标题】:How to use a specific version of a known DLL?如何使用已知 DLL 的特定版本?
【发布时间】:2017-06-06 19:30:29
【问题描述】:

我分发了一个 Win32 Delphi 应用程序,它使用 ADVAPI32.DLL 来调用一些加密和解密例程。它在现代版本的 Windows 上运行良好,但少数客户使用一些非常旧的 Windows 版本,如 Windows Vista 和未修补的 Windows 7。对于这些客户,ADVAPI32.Dll 的版本已过时,有时会导致解密错误。 我知道 advapi32.dll 是一个“已知”的系统 DLL,因此它不能在本地加载(我的意思是,从我的应用程序文件夹而不是 System32),那么我该如何解决这个问题呢?我尝试使用 DLL 的重命名本地副本,但也没有用...

【问题讨论】:

    标签: delphi dll


    【解决方案1】:

    首先,you are not legally allowed to redistribute advapi32.dll。其次,您无法在旧系统上可靠地运行较新的系统 DLL,它们带有依赖项,您需要提供 更新的 依赖项。许多系统 DLL 具有特殊的保护机制,以防止加载不正确的 DLL,作为基本 DLL 劫持预防安全机制的一部分。最后,CryptDecrypt 和朋友以及其他类似功能在 Vista 和 Windows 7 中运行良好。如果您遇到问题,要么是代码中的错误,要么您根本不遵守 Crypto API 的规定限制对于上述平台。所以最好发布你使用的代码,以及你在那些旧系统上遇到的错误。

    【讨论】:

      【解决方案2】:

      即使您能够加载不同版本的advapi32.dll,也不能保证它确实可以在目标系统上运行。

      advapi32.dll 只是一个提供“公共 API”的接口 dll。它在内部将很多功能委托给 Windows 内核,因此如果此接口发生更改或目标系统的内核未实现某个功能,您的应用程序将崩溃。您应该将 advapi32.dllmore 视为一个接口而不是一个实现 - 您调用它提供的方法,但它可能在提供 dll 版本的不同平台上做不同的事情。

      在 Windows Nano Server 上,advapi32.dll 只是一个转发 dll,它将 API 调用委托给其他 DLL(“OneCore”API)。

      【讨论】:

        猜你喜欢
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        相关资源
        最近更新 更多