系统:windows server 2008 r2 64bit
调用InstallResponse返回 E_POINTER,为什么?
同样的代码使用C#实现没有问题。
BSTR bstrDN = NULL;
BSTR bstrReq = NULL;
BSTR bstrOID = NULL;
/*HRESULT pEnroll = NULL;*/
HRESULT hr;
IX509Enrollment* pEnroll = NULL;
IID clsid;
IID riid ;
//728AB348-217D-11DA-B2A4-000E7BBB2B09
//728AB350-217D-11DA-B2A4-000E7BBB2B09
hr = ::CLSIDFromString( L"{884e2049-217d-11da-b2a4-000e7bbb2b09}",&clsid);
hr = ::CLSIDFromString( L"{728AB346-217D-11DA-B2A4-000E7BBB2B09}",&riid); // initialize COM
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED);//COINIT_APARTMENTTHREADED );
if (FAILED(hr))
{
printf("Failed CoInitializeEx - %x\n", hr);
goto error;
}

clsid = __uuidof(CX509Enrollment);
riid = __uuidof(IX509Enrollment); hr = CoCreateInstance(clsid,
NULL,
CLSCTX_INPROC_SERVER,
riid,
(void **)&pEnroll);
if (FAILED(hr))
{
printf("Failed CoCreateInstance - pEnroll [%x]\n", hr);
}
else
{
printf("..........");
hr = pEnroll->Initialize(ContextUser); hr = NULL;
                //证书内容 cert pkcs7 format
BSTR ss =_T("MIIHEQYJKoZIhvcNAQcCoIIHAjCCBv4CAQExADALBgkqhkiG9w0BBwGgggbmMIID\r\n1TCCAr2gAwIBAgIKEd2Y/QAAAAAAMDANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQD\r\nEwxQQy0xMjA0MDEtQ0EwHhcNMTMwODA2MDkyNDE1WhcNMTQwODA2MDkzNDE1WjCB\r\nsTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCeays+WNl+ecgTESMBAGA1UEBwwJ6YOR\r\n5bee5biCMSQwIgYDVQQKDBvmlrDlvIDmma7nlLXlrZDogqHku73lhazlj7gxHjAc\r\nBgNVBAsMFeWVhuWvhuaKgOacr+eglOeptumDqDESMBAGA1UEAwwJ55m957Sg6LSe\r\nMSAwHgYJKoZIhvcNAQkBFhF0ZXN0QG5ld2NhcGVjLm5ldDCBnzANBgkqhkiG9w0B\r\nAQEFAAOBjQAwgYkCgYEAuUxqtTB/X864AWMmPSPoBo+OeHH83bku9UYoGe0sF/4p\r\niyn8NyQsMDUTpaoB2EBJeruiootjS9q+SZxlMvGvREcB+gQCeOPaJi7kBuwJXHaZ\r\nC+LdzEU9jmVeN/kx6FPF8Zj3/Q2hjx5N06nuYOOijrXFerxPIIkvIzVVS3/2bfUC\r\nAwEAAaOCAQowggEGMA4GA1UdDwEB/wQEAwIE8DATBgNVHSUEDDAKBggrBgEFBQcD\r\nAjAdBgNVHQ4EFgQUlKTSIxw0nacL5cPk9yDx/zvp+nMwHwYDVR0jBBgwFoAU8R1T\r\nak/CxcDDAoguihaBtEu00tUwPQYDVR0fBDYwNDAyoDCgLoYsZmlsZTovL1BDLTEy\r\nMDQwMS9DZXJ0RW5yb2xsL1BDLTEyMDQwMS1DQS5jcmwwUgYIKwYBBQUHAQEERjBE\r\nMEIGCCsGAQUFBzAChjZmaWxlOi8vUEMtMTIwNDAxL0NlcnRFbnJvbGwvUEMtMTIw\r\nNDAxX1BDLTEyMDQwMS1DQS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQUF\r\nAAOCAQEAfaa01c0iKkGWGkXVipZkTey7SgqgcL+kHG1ma2rds9P9PlqL6uYYVoMU\r\ntCkYcxTTVuhyFM/cSi9rLvdX/2463clvR+jaa/uyqvsTeepXuPW6g1Em0OA5sqKf\r\nCqBlVC6/KlPnvveG3kcMrD0OO22ywCzsN8FZuBZAFobuVmAK6/FXjKYfIYwLEat4\r\nHUPXZWwvPAEq3XrNRyrUfGL1DgRAbeeLho3YjYDuWLAeP6p8Tt2YU11WRkJcYZ2d\r\nf8oZ84YRoAycxixBqBAGEWrh5ElAGxGosTCWT29QU1qiyMWWqat2mJZuwivWdFhU\r\nXywvUQ3NF67oPM/frAl4bXFN8HR+GTCCAwkwggHxoAMCAQICECeZqM+smByBQtzt\r\neE2u0VYwDQYJKoZIhvcNAQEFBQAwFzEVMBMGA1UEAxMMUEMtMTIwNDAxLUNBMB4X\r\nDTEzMDcyNzA3MDAyMloXDTE4MDcyNzA3MTAyMVowFzEVMBMGA1UEAxMMUEMtMTIw\r\nNDAxLUNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkn+XpkJZZnO8\r\nLOqOJGe/p0kVPROSXgauGcOt8twNPZHL4ux8rZ4kxDVPMCh0D3/eqqU5eGP1NN3L\r\nWOVm4KCskgHEpwbju54XTVH0iKAO2YqqenWxRhSH6skS1GVfP4t5Dxr90UR4+ri7\r\n0MsAjHVCqnEWfCfvmBY7gcPdAQEdjEVqqqPRmwsDzy+q80D0TEMho6jbiQIrkLuc\r\nlc3D9hEiq45XpBfNM/NdO1kEm2tzbqQpeMFk5n7P3oJKisBbULWPS5cmmt+QErA+\r\nefHwvhMk+MZEeIvzxST38Uej1oZ/sGhhUnNEoQ4NLnmShmEJ1odKcK5U15VxZXel\r\nFx9MIXBUIwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAd\r\nBgNVHQ4EFgQU8R1Tak/CxcDDAoguihaBtEu00tUwEAYJKwYBBAGCNxUBBAMCAQAw\r\nDQYJKoZIhvcNAQEFBQADggEBAAorBbhj6x+oUMu4/IIj4QutEn5k3VQ+RJk4i8Lb\r\nZJTxRLySKJ74Kx35R2Hq7isYX3ZiLHjbkYP2Pon73Cv2STK97Nj+fKUQbsfaeVT7\r\ncVhV60W5rQLRnr+FXWevMZJ3L4qj6m0HvAR4fDnw5UD/SOoT8PbACD5QHFYDwzpy\r\nxUSdOehAs5ZFeJdKIJ+maXjKcp5gJRS+XXr1J4RUfAqitYHALNyys2W+q2qq+Lcs\r\nr1dftjcEyy699xYtiwZsZKV1bcR6QNtlQnnawXGpoF/0TAyFf0ZCqG1OZ/6UoXO/\r\nuZcwRx/fakMIxwPETd2k7YZ+y3UCNiNkzoBP+3Qfu6quci4xAA==\r\n"); hr = pEnroll->InstallResponse(
AllowNone, //InstallResponseRestrictionFlags.AllowNone,
ss,
XCN_CRYPT_STRING_ANY,//7 //EncodingType.XCN_CRYPT_STRING_ANY, ""
NULL);
                 //this funcation return E_POINTER  ? why
int nErrCode = GetLastError();
hr = NULL;
}
C#代码:// Install response from CA
        private int _AcceptPKCS7(string strCert, ref string ErrMsg)
        {
            int nRet = 0;
            //  Create all the objects that will be required
            CX509Enrollment objEnroll = new CX509EnrollmentClass();            try
            {                // Install the certificate
                objEnroll.Initialize(X509CertificateEnrollmentContext.ContextUser);                //安装到UKEY中
                objEnroll.InstallResponse(
                    InstallResponseRestrictionFlags.AllowNone,
                    strCert,
                    EncodingType.XCN_CRYPT_STRING_ANY, ""
                );                return nRet;
            }
            catch (Exception ex)
            {
                ErrMsg = ex.Message;
                return -1;
            }
        }

解决方案 »

  1.   

    原来是BSTR初始化不对的问题,现在贡献代码如下: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;
    }