C++Builder XEn使用BCB6的DLL(以BCB6中流行的DES加密控件WCDESComp通过DLL供XE使用的方法为例)

1)BCB6的DLL部分:

 

/*
C++Builder XEn(如XE2等)使用BCB6的DLL,主要是C++Builder XEn的AnsiString和BCB6的AnsiString及Application等不兼容,因此要使用char或wchar_t之流才可以正常传递数据,此处说明传值方法并借此说明BCB6中流行的DES加密控件WCDESComp通过DLL供XE使用的方法
*/

  #include "WCDESComp.hpp"

  extern "C" __declspec(dllexport)
  __stdcall void EncryStrHex( // 字符串加密
    char * T_QZHB // 待加密的字符串
    ,
    char * T_YMOZ // 密钥
    ,
    char * T_BLZA // 存放结果
  ){
    AnsiString T_QOMG=static_cast<AnsiString>(T_QZHB); // 待加密的字符串
    AnsiString T_HWMJ=static_cast<AnsiString>(T_YMOZ); // 密钥
    AnsiString T_PRJO=""; // 结果

    TWCDESComp * K_VHQZ=new TWCDESComp(NULL);
    T_PRJO=K_VHQZ->EncryStrHex(
      T_QOMG // 待加密的字符串
      ,
      T_HWMJ // 密钥
    );//加密

    strcpy(T_BLZA,T_PRJO.c_str());

    delete K_VHQZ;
    //return true;
  }
  extern "C" __declspec(dllexport)
  __stdcall void DecryStrHex( // 字符串解密
    char * T_QZHB // 待解密的字符串
    ,
    char * T_YMOZ // 密钥
    ,
    char * T_BLZA // 存放结果
  ){
    AnsiString T_QOMG=static_cast<AnsiString>(T_QZHB); // 待解密的字符串
    AnsiString T_HWMJ=static_cast<AnsiString>(T_YMOZ); // 密钥
    AnsiString T_PRJO=""; // 结果

    TWCDESComp * K_VHQZ=new TWCDESComp(NULL);
    T_PRJO=K_VHQZ->DecryStrHex(
      T_QOMG // 待解密的字符串
      ,
      T_HWMJ // 密钥
    );//解密

    strcpy(T_BLZA,T_PRJO.c_str());

    delete K_VHQZ;
    //return true;
  }


2)XE可执行文件部分:

 

  AnsiString EncryStrHex(
	AnsiString sBig1 // 待加密的字符串
	,
	AnsiString sBig2 // 密钥
  ){
	int Long1=sBig1.Length();
	char* x=new char[Long1+1];
	memset(x,'\0',(Long1 + 1));
	strcpy(x,sBig1.c_str());

	int Long2=sBig2.Length();
	char* y=new char[Long2+1];
	memset(y,'\0',(Long2 + 1));
	strcpy(y,sBig2.c_str());

	char* z=new char[(Long1+Long2)*4+1];
	memset(z,'\0',(Long1+Long2)*4+1);

	String T_LQCM=ExtractFilePath(ExpandFileName(Application->ExeName))+L"WCDESComp.dll";
	//String T_LQCM=L"R:\\TEMP\\新建文件夹\\Project1.dll";
	//String T_LQCM=ExtractFilePath(ExpandFileName(Application->ExeName))+L"..\\..\\..\\Project1.dll";
	  if(FileExists(T_LQCM)!=true){
		return "";
      }
	//载入连接DLL完成连接
	void __stdcall(*EncryStrHex)(
	  char * // 待加密的字符串
	  ,
	  char * // 密钥
	  ,
	  char * // 加密结果
	);//声明DLL中的函数指针
	HINSTANCE hInst1=LoadLibrary(T_LQCM.c_str());//加载DLL并获取handle
	  if(hInst1!=NULL){
		(FARPROC &)EncryStrHex=GetProcAddress(hInst1,"EncryStrHex");//获取DLL中的函数地址
		   if(EncryStrHex!=NULL){
			 EncryStrHex(
			   x // 待加密的字符串
			   ,
			   y // 密钥
			   ,
			   z // 存放结果
			 );
		   }//else return 0;//调用DLL中的函数
	  }//else return 0;//调用DLL中的函数
	FreeLibrary(hInst1);//释放DLL
	AnsiString T_ABWR=static_cast<AnsiString>(z);

	memset(x,'\0',(Long1 + 1));
	delete [] x;
	//delete x;
	x=NULL;

	memset(y,'\0',(Long2 + 1));
	delete [] y;
	//delete y;
	y=NULL;

	memset(z,'\0',(Long1+Long2)*4+1);
	delete [] z;
	//delete z;
	z=NULL;
	return T_ABWR;
  }
  AnsiString DecryStrHex(
	AnsiString sBig1 // 待解密的字符串
	  ,
	AnsiString sBig2 // 密钥
  ){
	int Long1=sBig1.Length();
	char* x=new char[Long1+1];
	memset(x,'\0',(Long1 + 1));
	strcpy(x,sBig1.c_str());

	int Long2=sBig2.Length();
	char* y=new char[Long2+1];
	memset(y,'\0',(Long2 + 1));
	strcpy(y,sBig2.c_str());

	char* z=new char[Long1+Long2+1];
	memset(z,'\0',Long1+Long2+1);

	String T_LQCM=ExtractFilePath(ExpandFileName(Application->ExeName))+L"WCDESComp.dll";
	//String T_LQCM=L"R:\\TEMP\\新建文件夹\\Project1.dll";
	//String T_LQCM=ExtractFilePath(ExpandFileName(Application->ExeName))+L"..\\..\\..\\Project1.dll";
	  if(FileExists(T_LQCM)!=true){
		return "";
      }
	//载入连接DLL完成连接
	void __stdcall(*DecryStrHex)(
	  char * // 待解密的字符串
	  ,
	  char * // 密钥
	  ,
	  char * // 解密结果
	);//声明DLL中的函数指针

	HINSTANCE hInst1=LoadLibrary(T_LQCM.c_str());//加载DLL并获取handle
	  if(hInst1!=NULL){
		(FARPROC &)DecryStrHex=GetProcAddress(hInst1,"DecryStrHex");//获取DLL中的函数地址
		   if(DecryStrHex!=NULL){
			 DecryStrHex(
			   x // 待解密的字符串
			   ,
			   y // 密钥
			   ,
			   z // 存放结果
			 );
		   }//else return 0;//调用DLL中的函数
	  }//else return 0;//调用DLL中的函数
	FreeLibrary(hInst1);//释放DLL
	AnsiString T_ABWR=static_cast<AnsiString>(z);

	memset(x,'\0',(Long1 + 1));
	delete [] x;
	//delete x;
	x=NULL;

	memset(y,'\0',(Long2 + 1));
	delete [] y;
	//delete y;
	y=NULL;

	memset(z,'\0',Long1+Long2+1);
	delete [] z;
	//delete z;
	z=NULL;
	return T_ABWR;
  }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值