CryptoAPI的证书库基本操作代码:
#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #include <stdio.h> #include <windows.h> #include <wincrypt.h> #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) void HandleError(char *s); void main(void) { //-- // 变量申明与初始化 HCERTSTORE hCollectionStore; // 集合证书库句柄 HCERTSTORE hSystemStore; // 系统证书库句柄 HCERTSTORE hMemoryStore; // 内存证书库句柄 PCCERT_CONTEXT pDesiredCert = NULL; // 证书句柄 HANDLE hStoreFileHandle ; // 输出文件句柄 LPCSTR pszFileName = "TestStor.sto"; // 输出文件名 LPWSTR pswzFirstCert = L"TEST_SIGNER_NAME";// 第一个证书客体名称,必须确定在“my”证书库中有此证书 LPWSTR pswzSecondCert = L"China-wuhan-ruanou"; // 第二个证书客体名称 ,必须确定在“my”证书库中有此证书 //-- // 打开一个证书库集合 if(hCollectionStore = CertOpenStore( CERT_STORE_PROV_COLLECTION, // 集合证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP 0, // 不需要标志位 NULL)) // 不需要此参数 { printf("打开一个证书库集合. \n"); } else { HandleError( "打开集合证书库出错."); } //-- // 打开一个新内存证书库,它是一个临时证书库 if(hMemoryStore = CertOpenStore( CERT_STORE_PROV_MEMORY, // 内存证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP 0, // 不需要标志位 NULL)) // 不需要此参数 { printf("打开一个内存证书库. \n"); } else { HandleError( "打开内存证书库出错."); } //-- // 打开系统证书库“my” if(hSystemStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, // 系统证书库 0, // 编码类型,这里不需要 NULL, // 使用默认的CSP CERT_SYSTEM_STORE_CURRENT_USER,//系统库存储位置 L"MY")) // 系统库名称 { printf("打开系统证书库 MY. \n"); } else { HandleError( "不能打开 MY 系统证书库."); } //-- // 从系统证书库中寻找证书客体名称为DUMMY_SIGNER_NAME的证书 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hSystemStore, // 证书库句柄,系统证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书被找到. \n",pswzFirstCert); } else { HandleError("未能找到所期望的证书."); } //-- // 把刚寻找到的第一个证书添加到内存证书库中 if(CertAddCertificateContextToStore( hMemoryStore, // 证书库句柄 pDesiredCert, // 欲添加的证书结构指针 CERT_STORE_ADD_USE_EXISTING, // 当证书库中存在有和此证书匹配的证书或链接时 // 不添加证书,但会把新证书的属性添加到匹配证书中 NULL)) // 添加的证书结构指针的拷贝 { printf("所找到的证书添加到了内存证书库中. \n"); } else { HandleError("未能将此证书添加到内存证书库中."); } //-- // 把内存库添加到证书库集合中。内存库中的全部证书在证书库集合中均有效 if(CertAddStoreToCollection( hCollectionStore, //证书库集合句柄 hMemoryStore, //欲添加的成员证书库句柄 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,// 表示证书、CRL、CTL可以添加到此成员证书库中 1)) // 此成员证书库的优先级 { printf("内存证书库添加到了证书库集合中.\n"); } else { HandleError("内存证书库未被添加到证书库集合中."); } //-- // 在系统证书库my中寻找另一个证书 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hSystemStore, // 证书库句柄,系统证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书被找到. \n",pswzSecondCert); } else { HandleError("未能找到另一个证书."); } //-- // 添加一个对刚寻找到第二个证书的链接到内存库 if(CertAddCertificateLinkToStore( hMemoryStore, // 证书库句柄 pDesiredCert, // 欲添加链接的证书结构指针 CERT_STORE_ADD_USE_EXISTING, // 当存在匹配时,不添加证书链接 NULL)) // 添加的证书结构链接指针的拷贝 { printf("%S 证书的链接添加到了内存证书库. \n",pswzSecondCert); } else { HandleError("未能将此证书的链接添加到内存证书库中."); } //-- // 在内存库中寻找第一个证书,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, // 证书库句柄,内存证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书在内存证书库中找到了. \n",pswzFirstCert); } else { printf("%S 证书不在内存证书库中.\n", pswzFirstCert); } //-- // 在证书库集合中寻找第一个证书,预期查找成功 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, // 证书库句柄,集合证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzFirstCert pswzFirstCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书在集合证书库中被找到. \n", pswzFirstCert); } else { printf("%S 证书不在集合证书库中.\n", pswzFirstCert); } if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, // 证书库句柄,集合证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书的链接在集合证书库中被找到. \n", pswzSecondCert); } else { printf("%S 证书的链接不在内存证书库中.\n", pswzSecondCert); } if(hStoreFileHandle = CreateFile( pszFileName, // 文件路径 GENERIC_WRITE, // 访问方式,可写 0, // 共享模式 NULL, // 安全机制 CREATE_ALWAYS, // 直接创建 FILE_ATTRIBUTE_NORMAL, // 文件属性 NULL)) // 文件模版 { printf("在磁盘上创建了一个新的文件. \n"); } else { HandleError("不能在磁盘上创建文件."); } if( CertSaveStore( hMemoryStore, // 欲保存的证书库句柄 0, // 编码类型不需要 CERT_STORE_SAVE_AS_STORE,// 证书库保存为序列化信息。 CERT_STORE_SAVE_TO_FILE, // 保存到文件中 hStoreFileHandle, // 打开的文件句柄 0)) { printf("保存了内存证书库到磁盘. \n"); } else { HandleError("未能将内存证书库保存到磁盘上."); } printf("\n从集合证书库中删除内存证书库.\n"); CertRemoveStoreFromCollection( hCollectionStore, hMemoryStore); if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, // 证书库句柄,内存证书库 MY_ENCODING_TYPE, // 编码类型 0, // 不需要设置标志位 CERT_FIND_SUBJECT_STR, // 查找标准为:证书客体名称为pswzSecondCert pswzSecondCert, // 证书客体名称 NULL)) // 第一次查找,从证书库开始位置查找 { printf("%S 证书的链接仍在内存证书库中. \n", pswzSecondCert); } else { printf("此证书的链接不在内存证书库.\n"); } if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hCollectionStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, pswzSecondCert, NULL)) { printf("The %S link was found in the collection store. \n", pswzSecondCert); } else { printf("从集合证书库中删除此证书库生效.\n"); printf("%S 证书的链接在集合证书库中未找到.\n",pswzSecondCert); } if(hMemoryStore) CertCloseStore( hMemoryStore, CERT_CLOSE_STORE_CHECK_FLAG); if(hSystemStore) CertCloseStore( hSystemStore, CERT_CLOSE_STORE_CHECK_FLAG); if(hStoreFileHandle) CloseHandle(hStoreFileHandle); printf("全部证书库和文件均已关闭. \n"); if(hMemoryStore = CertOpenStore( CERT_STORE_PROV_FILENAME, // 文件证书库 MY_ENCODING_TYPE, // 编码类型 NULL, // 使用默认的CSP 0, // 不需要设置 L"TestStor.sto" )) // 文件名 { printf("文件证书库已经被重新打开. \n"); } else { printf("文件证书不能被重新打开. \n"); } if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(pDesiredCert=CertFindCertificateInStore( hMemoryStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, pswzSecondCert, NULL)) { printf("%S 证书的链接在文件证书库中被找到. \n",pswzSecondCert); } else { printf("此证书的链接不在文件证书库.\n"); } //-- // 释放内存 if(pDesiredCert) CertFreeCertificateContext(pDesiredCert); if(hMemoryStore) CertCloseStore( hMemoryStore, CERT_CLOSE_STORE_CHECK_FLAG); printf("全部的证书库和文件均关闭. \n"); } // End of main void HandleError(char *s) { printf("程序运行出错.\n"); printf("%s\n",s); printf("错误代码 %x\n.",GetLastError()); printf("程序终止.\n"); exit(1); }
用vs2010错误提示:error C2664 “CreateFileW”:不能将参数1从“LPCSTR”转化为“LPCWSTR” OPESTORES.CPP 228 1 1
IntelliSemse:”LPCSTR”类型的实参与“LPCWSTR”类型的形参不兼容 opestores.cpp 222 5 1
那位高手能告诉本人这是怎么回事,这段代码是书上带的光盘上面的,应该不会错。谢谢
解决方案