function CheckGuestCard(var RoomID:PChar;var GuestID,CardState:Integer):Boolean;stdcall...
对方用PB调用该函数时返回的RoomID是乱码?
我在DLL中是这样定义的
var DoorNo:string;
begin
...
RoomID:=PChar(DoorNo);
...
end;
我觉得是PChar这里的问题,帮我看看
对方用PB调用该函数时返回的RoomID是乱码?
我在DLL中是这样定义的
var DoorNo:string;
begin
...
RoomID:=PChar(DoorNo);
...
end;
我觉得是PChar这里的问题,帮我看看
解决方案 »
- Sleep在Delphi7中是什么意思?
- 为什么论坛里看不到大家的头像啊?
- 获取正在复制的文件大小
- delphi打开一个空word文档编辑后,怎样把这个编辑的WORD文件存储到access数据库的
- 如何使最小化的表单再重新显示出来?
- 关于database的问题?
- 应用DEILPHI实现在DBGRIDEH中实现多重查询
- 关于模糊查找的问题???一定给分!!!
- 怎么才能让鼠标跑不出子窗口?或是fsStayOnTop类型的窗口?
- 单机使用SQL7,安装时本地SQL服务器默认为AAA,现须建立一个名为BBB的SQL服务器,该如何设置
- 如何发布软件?做成安装程序?
- 曾经看到一道大家天天都在运用,但小生我不解的一道让人深思的题,最后的10分,祝大家十分健康
function CheckGuestCard(RoomID:PChar;var GuestID,CardState:Integer):Boolean;stdcall...
这是一个变参,需要返回值的
在使用Pchar时应先创建内存
GetMem(str,10);
在把字面值或String类型赋给它时应用
StrPCopy(str,'123456789')
StrPCopy(str,str1)
2.DLL认定阶段:首先,我感觉你的代码没有问题,不过你可以现在Delphi下调用DLL,如果没有问题,则DLL认定成功,反之,至少发现一个问题。
3.PB调用认定阶段:PB调用我没有用过,所以在前者通过的基础上想必楼主是调用的时候出现了错误。可以到PB区问问,比如PB中如何使用PChar的问题。
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正确再谈跨语言调用的问题。
还有,只要参数里不用string,Delphi程序里用String做DLL应该是没有问题的。
我是在c++builder里调用,出现乱码!
Move(PChar(DoorNo)^, RoomID^, Length(DoorNo));调用者在调用之前先分配内存。并且建议函数传入一个缓冲区RoomID的大小的参数,你在函数内部要判断DoorNo的长度是否超过了缓冲区的长度,做相应的错误处理。看一看Windows的API,基本上都是这样做的。你应该相信,Windows API的许多做法都是最优秀的。good luck!
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中同样要分配空间,具体方法忘记了.