_Vasilisk_,
Подключил. Получил сообщение об утечке
Проблемы в этой процедуре:
function Cert_GetSubjectStr(aCertContext: PCCERT_CONTEXT): string;
type
CERT_RDN_ARRAY = array of CERT_RDN;
var
i: Integer;
pvStructInfo: PVOID;
cbStructInfo: DWORD;
pCertNameInfo: PCERT_NAME_INFO;
vRDNAttr: PCERT_RDN_ATTR;
pszValue: PWIdeChar;
RDNValueSize: DWORD;
pInfo: PCCRYPT_OID_INFO;
szName, szValue: string;
begin
// декодируем Subject
if CryptDecodeObject(
X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
X509_UNICODE_NAME, //X509_NAME,
aCertContext.pCertInfo.Subject.pbData,
aCertContext.pCertInfo.Subject.cbData,
CRYPT_DECODE_NOCOPY_FLAG,
nil,
cbStructInfo
)
then
begin
GetMem(pvStructInfo, cbStructInfo);
try
CryptDecodeObject(
X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
X509_UNICODE_NAME, //X509_NAME,
aCertContext.pCertInfo.Subject.pbData,
aCertContext.pCertInfo.Subject.cbData,
CRYPT_DECODE_NOCOPY_FLAG,
pvStructInfo,
cbStructInfo
);
pCertNameInfo := PCERT_NAME_INFO(pvStructInfo);
// перебираем массив атрибутов Subject-а
for i := 0 to (pCertNameInfo.cRDN - 1) do
begin
vRDNAttr := CERT_RDN_ARRAY(pCertNameInfo.rgRDN)[i].rgRDNAttr;
CertRDNValueToStr(vRDNAttr.dwValueType, @vRDNAttr.Value, nil, RDNValueSize);
if RDNValueSize > 0 then
begin
GetMem(pszValue, RDNValueSize); // <<<<<----- Строка 1323
try
CertRDNValueToStr({vRDNAttr.dwValueType} CERT_RDN_UNICODE_STRING, @vRDNAttr.Value, pszValue, RDNValueSize);
pInfo := CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY, PChar(vRDNAttr.pszObjId), 0);
szName := PWideChar(pInfo.pwszName);
szValue := PWideChar(pszValue);
Result := Result + szName + '=' + szValue + #13#10;
finally
FreeMem(pszValue, RDNValueSize); // <<<<<----- Строка 1331
end;
end;
end;
finally
FreeMem(pvStructInfo, cbStructInfo);
end;
end;
Result := Trim(Result);
end;
Проблемы связаны с вызовом CertRDNValueToStr в строке 1325 - если этот вызов закомментировать, то утечки не будет...
Но что тут не так??