[LoadRunner]包装一个DLL的经验总结

Posted on 2008-07-15 21:26 CoderZh 阅读(4423) 评论(1)  编辑 收藏 所属分类: 性能测试C/C++
LoadRunner里可以直接调用VC++的DLL,关于DLL基本的制作及调用请见: http://www.cnblogs.com/coderzh/archive/2008/04/02/1135118.html
今天包装一个由开发写好的加密解模块,中间遇到不少问题,记录一下:

问题1: debug编的过,但运行时出现系统无法执行指定程序。。。release版本编不过(fatal error LNK1257: code generation failed)

解决办法:安装VS2005的SP1补丁(狂晕~~)

问题2:#pragma comment(lib, "zlibmdd.lib") 编译后出现:


解决办法:
    1.  将xxx.lib拷贝到工程当前目录
    2. "Project" - "Propertites" - "Linker" - "Input" - "Additional Dependencies",把xxx.lib加进去

问题3:把开发的代码直接添加进工程后,编译,出现unexpected end of file while looking for precompiled hearder:


解决办法:找到出错的文件,右键"Property" - "C/C++" - "Precompiled Headers" - "Create/Use Precompild Header",设置 "Not Using Precompiled Headers"

问题4:工程有的时候编译没问题,关闭后再打开时,编译出现_DllMain@12 already defined in MSVCRTD.lib(dllmain.obj):


解决办法:没有什么很好的解决办法,具体的原因不知。暂时使用下面的方法解决:
    "Project" - "Propertites" - "Linker" -"Command Line" ,加入:"/FORCE:MULTIPLE"     (注意:需要引号)

问题5:char* 与 wchar_t* 的转换

解决办法:使用 mbstowcs(wchar_t*转char*) 和 wcstombs(char* 转 wchar_t*)

#include   <stdlib.h>  
#include   
<stdio.h>  
   
void   main(   void   )  
{  
          
int   i;  
          
char         *pmbnull     =   NULL;  
          
char         *pmbhello   =   (char   *)malloc(   MB_CUR_MAX   );  
          wchar_t   
*pwchello   =   L"Hi";  
          wchar_t   
*pwc             =   (wchar_t   *)malloc(   sizeof(   wchar_t   ));  
   
          printf(   
"Convert   to   multibyte   string:\n"   );  
          i   
=   wcstombs(   pmbhello,   pwchello,   MB_CUR_MAX   );  
          printf(   
"\tCharacters   converted:   %u\n",   i   );  
          printf(   
"\tHex   value   of   first"   );  
          printf(   
"   multibyte   character:   %#.4x\n\n",   pmbhello   );  
   
          printf(   
"Convert   back   to   wide-character   string:\n"   );  
          i   
=   mbstowcs(   pwc,   pmbhello,   MB_CUR_MAX   );  
          printf(   
"\tCharacters   converted:   %u\n",   i   );  
          printf(   
"\tHex   value   of   first"   );  
          printf(   
"   wide   character:   %#.4x\n\n",   pwc   );  
}
  

问题6:C++如何调用DLL

解决办法:详见http://blog.csdn.net/huahua70528158/archive/2007/11/08/1872827.aspx
    1. 隐式链接
#pragma comment(lib,"MyDll.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
#include
#include
"Dlltest.h"
void main()
{
        
int c;
        c
=Max(1,2)
}
    2. 显式链接
void main(void)
{
        typedef 
int(*pMax)(int a,int b);
        typedef 
int(*pMin)(int a,int b);
        HINSTANCE hDLL;
        PMax Max
        HDLL
=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件;
        Max=(pMax)GetProcAddress(hDLL,"Max");
        A
=Max(5,8);
        Printf(
"比较的结果为%d\n",a);
        FreeLibrary(hDLL);
//卸载MyDll.dll文件;
}

问题7:C语言没有Dictionary,因此要返回Name,Value这样的键值对列表,采用返回两个数组的方式。需要使用到指针数组。

解决办法:指针数组使用示例
#include <stdio.h>

int main()
{
    
char *name[6= {"Rainer","Richie","Crystal","Stef","Sammy"};
    
//定义一个指针数组,并将其初始化。这时候name[0]将存储字符串"Rainer"的
    
//第一个字符'R'的地址,依此类推。
    char *p;
    
//定义一个指向字符变量的指针变量
    int i;
    name[
5= "Jacky";
    
//将数组第六个元素赋值为"Jacky"
    for(i = 0;i < 6;++i)
    
{//输出数组内容
        p = *(name + i);
        
//name + i即为name[i],*name[i]即为数组name的第i个元素的值,
        
//即为第i个元素中字符串的首字符的地址
        printf("%s ",p);
       
//注意格式字符串中的s
    }

    printf(
"\n");
    
return 0;
}

Feedback

#1楼 [楼主]   回复  引用  查看    

2008-07-15 21:59 by CoderZh      
自己飞过,有些东西不记下来就会忘记的

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-19 11:50 编辑过


相关链接: