function CheckGuestCard(var RoomID:PChar;var GuestID,CardState:Integer):Boolean;stdcall...
对方用PB调用该函数时返回的RoomID是乱码?
我在DLL中是这样定义的
var DoorNo:string;
begin
...
  RoomID:=PChar(DoorNo);
...
end;
我觉得是PChar这里的问题,帮我看看

解决方案 »

  1.   

    这是标准的CONVERTION啊,应该不会有问题吧。
      

  2.   

    改成下面的试试
    function CheckGuestCard(RoomID:PChar;var GuestID,CardState:Integer):Boolean;stdcall...
      

  3.   

    var RoomID:PChar;
    这是一个变参,需要返回值的
      

  4.   

    为什么要用PChar PChar并不是通用的数据类型啊
      

  5.   

    dll不应该有string类型,应把他换成Pchar
    在使用Pchar时应先创建内存
    GetMem(str,10);
    在把字面值或String类型赋给它时应用
    StrPCopy(str,'123456789')
    StrPCopy(str,str1)
      

  6.   

    1.楼主请采用合理的步骤测试你的代码;
    2.DLL认定阶段:首先,我感觉你的代码没有问题,不过你可以现在Delphi下调用DLL,如果没有问题,则DLL认定成功,反之,至少发现一个问题。
    3.PB调用认定阶段:PB调用我没有用过,所以在前者通过的基础上想必楼主是调用的时候出现了错误。可以到PB区问问,比如PB中如何使用PChar的问题。
      

  7.   

    昨天我研究了一下Delphi帮助里的这样一段话:
    A common error when working with PChars is to store a local variable in a data structure, or return it as a value. When your routine ends, the PChar disappears because it is a pointer to memory, and not a reference counted copy of the string. 
    ===========================
    var DoorNo:string;
    问一下你这个变量是在哪里定义的,函数内部吗?也就是a local variable,对吗?
    那你就要考虑一下上面的那段代码了,它的主要意思就是,如果你:
    RoomID:=PChar(DoorNo);
    那么当函数返回的时候,DoorNo这个局部变量将可能被系统清栈,则var RoomID:PChar所指向的内存区域的值可能不正确。
    ============================
    上面的资料不知道对楼主有无益处,希望楼主能够先从Delphi本身入手,确保DLL正确再谈跨语言调用的问题。
      

  8.   

    我经常自己做DLL给PB用,对方在PB里用的时候从声明到调用都是传地址,不是传变量吗?我觉得可能是PB调用的问题。
    还有,只要参数里不用string,Delphi程序里用String做DLL应该是没有问题的。
      

  9.   

    怎么没有人呀
    我是在c++builder里调用,出现乱码!
      

  10.   

    RoomID:=PChar(DoorNo); 改为下面这句:
    Move(PChar(DoorNo)^, RoomID^, Length(DoorNo));调用者在调用之前先分配内存。并且建议函数传入一个缓冲区RoomID的大小的参数,你在函数内部要判断DoorNo的长度是否超过了缓冲区的长度,做相应的错误处理。看一看Windows的API,基本上都是这样做的。你应该相信,Windows API的许多做法都是最优秀的。good luck!
      

  11.   

    问题解决:
    dll-----function(取掉那个var标识符)
    function CheckGuestCard(RoomID:PChar;var GuestID,CardState:Integer):Boolean;stdcall...
    赋值时用
    StrPCopy(RoomID,'123456789')
    不要用
    RoomID:='123478';---exe---调用时
    c++:
    char a[10];
    memset(a,0,sizeof(a));
    function(a,....);即可
    pb中同样要分配空间,具体方法忘记了.