51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 3642|回复: 13
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-11-20 10:29:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
被调用的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 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2008-11-20 11:06:36 | 只看该作者
我在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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-11-20 11:08:52 | 只看该作者
指针类型转换成字符型和整形的时候出错吧。。。
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2008-11-20 11:16:15 | 只看该作者
对呀,问题是为什么要出错呢,用VC调都没有出错呀,难不成是LR编译器有问题?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2008-11-20 11:21:54 | 只看该作者
晕,我加了一个pMsgbuf =(char*) CreateMsg(pMsg, &msglength);
就没错了,XXOO????
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2015-6-25 18:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    6#
    发表于 2008-11-20 11:24:38 | 只看该作者
    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);
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-6-25 18:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    7#
    发表于 2008-11-20 11:26:14 | 只看该作者
    你调用的DLL返回的不是指针?用强制类型转换就没事,那么是你的DLL问题吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2008-11-20 11:27:38 | 只看该作者
    不要 char* pMsgbuf;
    试试 char  pMsgbuf[1024];

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

    不行就别用=号,直接把 pMsgbuf作为参数传给 CreateMsg函数。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
     楼主| 发表于 2008-11-20 11:28:57 | 只看该作者
    DLL没问题呀,定义的返回值是char*的,没问题,如果有问题,在VC中也就报错了,为什么只是LR报错,为什么LR
    要用强制转换?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
     楼主| 发表于 2008-11-20 11:31:14 | 只看该作者
    原帖由 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要强制转换?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
     楼主| 发表于 2008-11-20 11:53:33 | 只看该作者
    呵呵,我的测试代码有一堆Bug,找人来测测,然后又编程对我的测试代码进行测试,于是对测试的测试的测试进行测试,OOXXY……*……(%—¥……%#¥……#
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-6-25 18:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    12#
    发表于 2008-11-20 12:01:09 | 只看该作者
    operands of = have illegal types `pointer to char' and `int'

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

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

    不知道LZ的DLL每次返回的结果都是固定的么?有没有可能DLL有分支可以返回其他值
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
     楼主| 发表于 2008-11-20 12:16:34 | 只看该作者
    固定的,一定是一个字符指针
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
     楼主| 发表于 2008-11-20 12:39:37 | 只看该作者
    唉,管它呢,强制就强制吧,反正最后结果都对了!
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-28 18:22 , Processed in 0.083343 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表