Ghost Writer,
Набросал код:
var
i: Integer;
pvStructInfo: PVOID;
cbStructInfo: DWORD;
pCertNameInfo: PCERT_NAME_INFO;
vRDNAttr: PCERT_RDN_ATTR;
psz: PWideChar;
begin
// откроем хранилище
vCertStore := CertOpenSystemStore( 0, PChar( 'MY' ));
try
// ищем сертификат
vCertContext := Cert_FindCertificate_BySHA1(PWideChar( edtSHA1FingerPrint.Text ), vCertStore);
try
// декодируем Subject
if CryptDecodeObject(
X509_ASN_ENCODING or PKCS_7_ASN_ENCODING,
X509_UNICODE_NAME, //X509_NAME,
vCertContext.pCertInfo.Subject.pbData,
vCertContext.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,
vCertContext.pCertInfo.Subject.pbData,
vCertContext.pCertInfo.Subject.cbData,
CRYPT_DECODE_NOCOPY_FLAG,
pvStructInfo,
@cbStructInfo
);
pCertNameInfo := PCERT_NAME_INFO(cbStructInfo);
// перебираем массив атрибутов Subject-а
for I := 0 to pCertNameInfo.cRDN-1 do
begin
vRDNAttr := pCertNameInfo.rgRDN[i].rgRDNAttr;
CertRDNValueToStr(vRDNAttr.dwValueType, @(vRDNAttr.Value), nil, size);
if size > 0 then
begin
GetMem(psz, size);
CertRDNValueToStr(vRDNAttr.dwValueType, @(vRDNAttr.Value), psz, size);
Memo1.Lines.Append(psz);
end;
end;
finally
FreeMem(pvStructInfo, cbStructInfo);
end;
end;
finally
Win32Check( CertFreeCertificateContext( vCertContext ));
end;
finally
Win32Check( CertCloseStore( vCertStore, CERT_CLOSE_STORE_CHECK_FLAG ));
end;
end;
Не компилируется , останавливается на первом же
CryptDecodeObject и говорит - "E2033 Types of actual and formal var parameters must be identical"
Не могу понять где ошибка...