【发布时间】:2019-06-22 17:43:45
【问题描述】:
错误 127 是“ERROR_PROC_NOT_FOUND”(“找不到指定的过程”)。
我正在运行带有远程桌面服务的 Citrix XenApp 的 Windows Server 2016 上运行。 CryptAcquireContext API 位于 advapi32.dll 中。我在上面运行了 Microsoft 的 Depends32.exe,函数 CryptAcquireContextA 和 CryptAcquireContextW 在 DLL 文件中肯定。所有加密 api 函数似乎都发生了同样的错误。我测试了 CryptDestroyHash,它还返回错误 127 (ERROR_PROC_NOT_FOUND)。
这是我的 C++ 代码:
HCRYPTPROV hProv = 0;
BOOL bCryptAcquireContext = CryptAcquireContext(&hProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0);
dwError = GetLastError();
这个 C++ 可以在 EXE 中工作,但如果将相同的代码放入从 VB6 调用的 DLL 中,它就不起作用。几乎就像任何 vb6 应用都被这些 API 屏蔽了一样?
这是VB6代码:
Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Sub Form_Load()
Dim sProvider As String
Dim rv as Long
Dim sContainer As String
Dim m_lProvider As Long
Const PROV_RSA_FULL = 1
Const CRYPT_VERIFYCONTEXT As Long = &HF0000000
Const MS_DEF_PROV As String = "Microsoft Base Cryptographic Provider v1.0"
sProvider = MS_DEF_PROV & vbNullChar
sContainer = vbNullChar
rv = CryptAcquireContext(m_lProvider, 0, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)
dwError = Err.LastDllError
If rv = 0 and dwError <> 127 Then
rv = CryptAcquireContext(m_lProvider, 0&, ByVal sProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET)
End If
End Sub
【问题讨论】:
-
在GetLastError之前检查BOOL返回值了吗?
-
是的,FALSE (0),表示函数失败。
-
调试它,看看 GetProcAddress 失败的地方。
-
你甚至可以使用 Dependency Walker;尝试记录功能...
-
这些工作:lb = LoadLibrary("advapi32.dll") / pa = GetProcAddress(lb, "CryptAcquireContextA"),但是当我从 Declare 语句中调用 CryptAcquireContext 时,它失败了。如何在 loadlibrary 和 getprocaddress 之后直接调用 CryptAcquireContextA?
标签: windows api cryptography vb6 citrix