const
Cryptui = 'Cryptui.dll';
type
PCCRYPTUI_WIZ_EXPORT_INFO = ^CCRYPTUI_WIZ_EXPORT_INFO;
CCRYPTUI_WIZ_EXPORT_INFO = [b]record[/b]
dwSize: DWORD;
pwszExportFileName: LPCWSTR;
dwSubjectChoice: DWORD;
pCertContext: PCCERT_CONTEXT;
cStores: DWORD;
rghStores: HCERTSTORE;
end;
function[/b] CryptUIWizExport(dwFlags: DWORD;
hwndParent: HWND;
pwszWizardTitle: LPCWSTR;
pExportInfo: PCCRYPTUI_WIZ_EXPORT_INFO;
pvoid: PVOID) :BOOL;stdcall;
function CryptUIWizExport ;external Cryptui name 'CryptUIWizExport';
// Описание процедуры экспорта
procedure ExportCert;
var
prov: HCRYPTPROV;
store: HCERTSTORE;
cont, stor: PChar;
err: string;
cert: PCCERT_CONTEXT;
encType: DWORD;
PCCRYPTUI: PCCRYPTUI_WIZ_EXPORT_INFO;
begin
encType := PKCS_7_ASN_ENCODING or X509_ASN_ENCODING;
if CryptAcquireContext(@prov, nil, nil, PROV_RSA_FULL, 0) = false then
ShowMessage('ошибка');
err := 'MY';
stor := StrAlloc(length(err) + 1);
StrPCopy(stor, err);
//открываем хранилище сертификатов
store := CertOpenSystemStore(prov, stor);
//получаем сертификат
cert := CertEnumCertificatesInStore(store, nil);
PCCRYPTUI:=New(PCCRYPTUI_WIZ_EXPORT_INFO); // Выделяем память
PCCRYPTUI.dwSize := sizeof(PCCRYPTUI);
PCCRYPTUI.pwszExportFileName := 'E:\10.cer';
PCCRYPTUI.dwSubjectChoice := 1; // CRYPTUI_WIZ_EXPORT_CERT_CONTEXT
PCCRYPTUI.pCertContext := cert;
PCCRYPTUI.cStores := 0;
PCCRYPTUI.rghStores := store;
// пытаюсь экспортировать сертификат
if [i]CryptUIWizExport[/i](1, // CRYPTUI_WIZ_NO_UI
0, 0, PCCRYPTUI, PCCRYPTUI) = false then
MessageDlg('Ошибка экспорта сертификата: ' + IntToStr(int64(GetLastError)), mtError, [mbOK], 0);
Dispose(PCCRYPTUI); // Уничтожаем память
End; |