CryptoAPI的证书库基本操作的C代码,提示C2664错误,怎么解决啊

C语言 码拜 9年前 (2016-05-28) 1262次浏览
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

引用

那位高手能告诉本人这是怎么回事,这段代码是书上带的光盘上面的,应该不会错。谢谢

解决方案

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明CryptoAPI的证书库基本操作的C代码,提示C2664错误,怎么解决啊
喜欢 (0)
[1034331897@qq.com]
分享 (0)