51Testing软件测试论坛

标题: 来看看我这段调用自己的dll创建协议数据Buff的LR代码,为什么会编译出类型转换错? [打印本页]

作者: zengyixun    时间: 2008-11-20 10:29
标题: 来看看我这段调用自己的dll创建协议数据Buff的LR代码,为什么会编译出类型转换错?
被调用的dll中的函数原形为:
extern "C"  __declspec(dllexport)  char* CreateMsg(char* p, unsigned short* msglen);


#include "lrs.h"


vuser_init()
{
        int nRet;
        char pMsg[1024];
        char* pMsgbuf;
    unsigned short msglength = 0;

        lrs_startup(257);
       

        nRet = lr_load_dll("E:\\scripts\\test7\\MsgProtocol.dll");

        if(nRet!=0){
               
                lr_output_message("MsgProtocol.dll Load Fail!");
                lr_exit(LR_EXIT_VUSER, LR_FAIL);

        }
        pMsgbuf = CreateMsg(pMsg, &msglength);//此处编译报错
        lr_output_message(lr_eval_string(pMsgbuf));
        //lr_exit(LR_EXIT_VUSER, LR_PASS);
    return 0;
}

//pMsgbuf = CreateMsg(pMsg, msglength);报错内容为:
vuser_init.c (32): operands of = have illegal types `pointer to char' and `int'
e:\\scripts\\test7\\\\combined_test7.c (4): 1 errors, not writing pre_cci.ci

为什么呢?

[ 本帖最后由 zengyixun 于 2008-11-20 11:26 编辑 ]
作者: zengyixun    时间: 2008-11-20 11:06
我在VC中调用这个函数就没有问题,为什么LR就调用通不过?
VC:
char* MyCreateMsg(char* p, unsigned short* msglen)
{
        char* pRet;
        CreateMsgFun __CreateMsgFun;
        HINSTANCE hdll = LoadLibrary("MsgProtocol.dll");
        if (hdll == NULL){
        FreeLibrary(hdll);
        }
       
        __CreateMsgFun = (CreateMsgFun)GetProcAddress(hdll,"CreateMsg");
        if(__CreateMsgFun == NULL){
        FreeLibrary(hdll);
        }
        pRet = __CreateMsgFun(p,msglen);
        FreeLibrary(hdll);
        return pRet;
}

[ 本帖最后由 zengyixun 于 2008-11-20 11:27 编辑 ]
作者: 泥泥虫    时间: 2008-11-20 11:08
指针类型转换成字符型和整形的时候出错吧。。。
作者: zengyixun    时间: 2008-11-20 11:16
对呀,问题是为什么要出错呢,用VC调都没有出错呀,难不成是LR编译器有问题?
作者: zengyixun    时间: 2008-11-20 11:21
晕,我加了一个pMsgbuf =(char*) CreateMsg(pMsg, &msglength);
就没错了,XXOO????
作者: qiguojie    时间: 2008-11-20 11:24
char* CreateMsg(char* p, unsigned short msglen)
{
        char *abc;
        lr_message("p=%s,meglen=%d\n",p,msglen);
        abc = "这是一个字符指针!!";
        return abc;
}

Action()
{
   //     int nRet;
        char pMsg[1024];
        char* pMsgbuf;
                unsigned short msglength = 0;
        strcat(pMsg,"this is a char array!!");               
        pMsgbuf = CreateMsg(pMsg, msglength);//此处编译报错
        lr_message(pMsgbuf);
    return 0;
}

调用和返回都没有问题。

你的C函数声明里的:“&”是做啥的??
char* CreateMsg(char* p, unsigned short& msglen);
作者: qiguojie    时间: 2008-11-20 11:26
你调用的DLL返回的不是指针?用强制类型转换就没事,那么是你的DLL问题吧
作者: leey    时间: 2008-11-20 11:27
不要 char* pMsgbuf;
试试 char  pMsgbuf[1024];

看看是否可以,以前貌似也遇到过这类,

不行就别用=号,直接把 pMsgbuf作为参数传给 CreateMsg函数。
作者: zengyixun    时间: 2008-11-20 11:28
DLL没问题呀,定义的返回值是char*的,没问题,如果有问题,在VC中也就报错了,为什么只是LR报错,为什么LR
要用强制转换?
作者: zengyixun    时间: 2008-11-20 11:31
原帖由 qiguojie 于 2008-11-20 11:24 发表
char* CreateMsg(char* p, unsigned short msglen)
{
        char *abc;
        lr_message("p=%s,meglen=%d\n",p,msglen);
        abc = "这是一个字符指针!!";
        return abc;
}

Action()
{
   //     int nRet;
        ...

-----------------------------------------------------------------------------


&是为了引用地址做的,DLL中有处理,现在改成指针了。问题是为什么LR要强制转换?
作者: zengyixun    时间: 2008-11-20 11:53
呵呵,我的测试代码有一堆Bug,找人来测测,然后又编程对我的测试代码进行测试,于是对测试的测试的测试进行测试,OOXXY……*……(%—¥……%#¥……#
作者: qiguojie    时间: 2008-11-20 12:01
operands of = have illegal types `pointer to char' and `int'

那么我们来分析一下,这个错误明显是因为LR编译器期望得到字符指针,而从函数返回的是整形。

在不知道你的DLL代码情况下,假设你的DLL返回的确实是一个字符指针,那么在LR就误认为整形变量?

不知道LZ的DLL每次返回的结果都是固定的么?有没有可能DLL有分支可以返回其他值
作者: zengyixun    时间: 2008-11-20 12:16
固定的,一定是一个字符指针
作者: zengyixun    时间: 2008-11-20 12:39
唉,管它呢,强制就强制吧,反正最后结果都对了!




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2