如何使用已知DLL的特定版本?

时间:2017-06-06 19:30:30

标签: delphi dll

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

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