在一个项目中,由于客户端采用了usb密码锁加密,也就是当服务器端返回一个数字串后需要在客户端插上usb key以后才能进行加密,然后将加密的结果传给服务器端进行认证,这就使得传统的压力测试录制脚本变得无效。例如使用工商银行的U盾,就是类似的情况。因此必须在脚本中加入调用客户端加密代码的功能,同时必须插入usb device,测试时候使用的测试工具是QALoad,因此可以直接用vc++来调用加密程序,但是由于加密程序直接调用存在一定的困难,因此使用vb连编写一个类并编译为dll,然后使用vc++再QALoad中进行调用。下面是在QALoad中使用vc++调用vb编写的dll相关的代码:
HRESULT hresult;
CLSID clsid;
hresult=CoInitialize(NULL);
//初始化COM接口
hresult=CLSIDFromProgID(OLESTR("ca.clsCA"), &clsid); //其中clsCA为在dll中定义的类名
_clsCA *t;
hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_clsCA),(void **) &t);
if(FAILED(hresult))
{
}
char * Field[1];
Field[0]="0.6727308047538793";//这个就是服务器端返回的字串
try{
t->ranNum=Field[0];//传入要加密的字串
t->sign();// 进行加密,该函数是在vb中的进行加密的函数
_bstr_t s=t->strSignedData;//取得加密的数据
const char * v=s;
char q[1000];
strcpy(q,v);
char tmp[1000]="/0";
for(int i=0;i<strlen(q);i++)//进行编码的转换
{
if(q[i]=='+' || q[i]=='-' || q[i]=='*' ||q[i]=='/' || q[i]=='=')
{
if(q[i]=='+')
strcat(tmp,"%2B");
if(q[i]=='-')
strcat(tmp,"%2D");
if(q[i]=='/')
strcat(tmp,"%2F");
if(q[i]=='*')
strcat(tmp,"%2A");
if(q[i]=='=')
strcat(tmp,"%3D");
}
else
{
strcat(tmp,"0");
tmp[strlen(tmp)-1]=q[i];
}
}
// _bstr_t s=t->strErr;
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("%s",e.ErrorMessage());
}
t->Release();
CoUninitialize();
2.vb dll程序