我一直在 Delphi 10.2 中通过显式加载(LoadLibrary 和 GetProcAddress)使用旧的 OpenSSL libeay32.dll。现在我想切换到更新的 libcrypto-1_1.dll(从 OpenSSL 1.1.1i 编译)。下面测试代码中的函数 BIO_read 与 libeay32.dll 一起工作正常('w' 中返回的值是 256),但是它在 libcrypto-1_1.dll 中失败('w' 中返回的值是 -1 并且 ERR_get_error 返回 0)。但是,如果我尝试隐式加载 libcrypto-1_1.dll,则下面的代码可以正常工作。
知道这里出了什么问题吗?也许Delphi在加载库时做了一些特别的事情,所以我试图在德里的源代码中找到Delphi加载dll的地方,但我没有找到它。有谁知道 Delphi 在哪个单元处理隐式加载?
procedute Test;
var sigLen,r,w:integer;
base64Sig:TMemoryStream;
mem,b64,bio:pBio;
sig:pointer;
begin
base64Sig:=TMemoryStream.Create;
base64Sig.LoadFromFile(SignatureFileName);
mem:=BIO_new(BIO_s_mem);
b64:=BIO_new(BIO_f_base64);
bio:=BIO_push(b64,mem);
BIO_set_flags(b64,BIO_FLAGS_BASE64_NO_NL);
r:=BIO_write(mem,base64Sig.Memory,base64Sig.Size);
writeln(r);
GetMem(sig,sigLen);
w:=BIO_read(b64,sig,sigLen);
writeln(w);
end;