最近手头的项目需要windows导出证书,上网找了好久也没有现成的,所以自己研究了,拿出来和大家分享一下.
利用windows的CAPICOM组件,来实现
#import "../capicom.dll" no_namespace
CoInitialize(NULL);
CLSID CLSID_Store;
HRESULT hRes = ::CLSIDFromProgID(_T("CAPICOM.Store.2"),&CLSID_Store);
if (FAILED(hRes))
return FALSE;
IStore2 *pStore=NULL;
hRes = CoCreateInstance(CLSID_Store,NULL,
CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,__uuidof(IStore2),(void **)&pStore);
if (FAILED(hRes))
return FALSE;
hRes = pStore->Open(CAPICOM_CURRENT_USER_STORE,_T("MY"),CAPICOM_STORE_OPEN_READ_ONLY);
if (FAILED(hRes))
return FALSE;
ICertificates2 *pCerts=NULL;
try
{
pStore->get_Certificates((ICertificates**)&pCerts);
ICertificates2Ptr pTemp = pCerts->Select((_bstr_t)_T("首信科技"),(_bstr_t)_T("请选择证书"),0);
if (pTemp)
_variant_t vt = pTemp->GetItem(1);
ICertificate2 *pCert = NULL;
IDispatch *pDispatch = vt.pdispVal;
pDispatch->QueryInterface(__uuidof(ICertificate2),(void**)&pCert);
pCert->Save(_T("test.cer"),_T(""),CAPICOM_CERTIFICATE_SAVE_AS_CER,
CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN);
if (pCert)
pCert->Release();
} catch (_com_error e)
{
//如果错误号为0x80880902即没选种,不管他
AfxMessageBox(e.ErrorMessage());
}
if (pCerts)
pCerts->Release();
if (pStore)
pStore->Release();
CoUninitialize();