VC安装证书到指定CSP,支持Win7,Windows Server2008 r2 64bit
ULONG InstallResponse_CertEnrollDLL(LPCTSTR strCert)
{
int nRet = 0;
BSTR bstrCert = NULL;
BSTR bstrPassword = NULL;
HRESULT hr;
IX509Enrollment* pEnroll = NULL;
IID clsid;
IID riid ;
//获取证书信息
bstrCert = SysAllocString(strCert);
bstrPassword = SysAllocString(_T(""));
// initialize COM
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED);//COINIT_APARTMENTTHREADED );
if (FAILED(hr))
{
nRet = 6; //6 初始化COM组件CoInitializeEx调用失败
goto error;
}
//获得class id 和 iid
clsid = __uuidof(CX509Enrollment);
riid = __uuidof(IX509Enrollment);
hr = CoCreateInstance(clsid,
NULL,
CLSCTX_INPROC_SERVER,
riid,
(void **)&pEnroll);
if (FAILED(hr))
{
nRet = 7; //7 调用CoCreateInstance失败
goto error;
}
hr = pEnroll->Initialize(ContextUser);
if (FAILED(hr))
{
nRet =8;// Enroll Initialize调用失败
goto error;
}
hr = pEnroll->InstallResponse(
AllowNone, //InstallResponseRestrictionFlags.AllowNone,
bstrCert,
XCN_CRYPT_STRING_ANY,//7 //EncodingType.XCN_CRYPT_STRING_ANY, ""
bstrPassword);
if (FAILED(hr))
{
nRet =9;// 9 Enroll InstallResponse接口调用失败
goto error;
}
error:
//clean up resources, etc.
if ( bstrCert )
SysFreeString( bstrCert );
if ( bstrPassword )
SysFreeString( bstrPassword );
if ( pEnroll )
pEnroll->Release();
CoUninitialize();
return 0;
}