05.10.2005 8:58:56Запись сертификата в хранилище Ответов: 1
Олег
не выполняется даже совершенно невинный тестовый код

PCCERT_CONTEXT pUserCert = NULL;
HANDLE hCertStore = 0;
HANDLE hMyStore = 0;

// Другие люди
hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
0,
CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_CURRENT_USER,
L"AddressBook"
);

// Личные
hMyStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
0,
CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG | CERT_SYSTEM_STORE_CURRENT_USER,
L"My"
);

while( pUserCert = CertEnumCertificatesInStore(hMyStore, pUserCert)) {

//Тут можно засветить сертификат в окошке
CryptUIDlgViewContext(
CERT_STORE_CERTIFICATE_CONTEXT,
pUserCert,
NULL,
NULL,
0,
NULL));

ret = CertAddCertificateContextToStore(hCertStore, pUserCert, CERT_STORE_ADD_ALWAYS /*dwAddDisposition */, NULL);
if (!ret) {
HandleError("Cannot add certificate to store.");
}

}

CertFreeCertificateContext(pUserCert);

if (!CertCloseStore (hCertStore, 0)) {
HandleError("CertCloseStore");
}
if (!CertCloseStore (hMyStore, 0)) {
HandleError("CertCloseStore");
}

здесь CertAddCertificateContextToStore возвращает ошибку E_INVALIDARG которая согласно MSDN может означать только неверное значение dwAddDisposition. но что здесь может быть неверно?
 
Ответы:
05.10.2005 10:13:59Kirill Sobolev
Вы сначала делаете CertOpenStore(..., CERT_STORE_READONLY_FLAG, ...), а потом пытаетесь туда что-то записать.