delphi 写的DLL 结构指针传递问题

sunli_py 2012-08-09 04:38:49
dll结构
type
TCardInfo = packed record // the Communication Block used in both parts (Server+Client)
consequence: Integer; //标志
H_cardsn: array[0..9] of char; //卡序列号
Name: array[0..15] of char; //姓名
Sex: array[0..1] of char; //性别
end;
pCardInfo = ^TCardInfo;

函数
function ReadCard1(var tag_: Integer; RCardInfo:pCardInfo): integer; stdcall;
begin
getMem(_pCardInfo, sizeof(TCardInfo));

_pCardInfo^.consequence := 0;
StrPCopy(_pCardInfo^.H_cardsn, '0000FFFFFF');//卡序列号
StrPCopy(_pCardInfo^.Name, '张三'); //姓名
StrPCopy(_pCardInfo^.Sex, '男'); //性别

RCardinfo := _pCardInfo;
freemem(_pCardInfo);
end;

现在我要在主程序中调用DLL
function ReadCard1(tag_: Integer; RCardInfo: pCardInfo): integer; stdcall; external 'ReadCard.dll' name 'ReadCard1';
procedure TForm1.btn1Click(Sender: TObject);
var i: Integer;
str: string;
CardInfo: TCardInfo;
begin
try
ReadCard1(0, @CardInfo);
edt3.Text := string(CardInfo.H_cardsn);
except
on e: exception do
showmessage(e.Message);
end;
end;


现在主程序调用时提示‘read of address 00000000’
请问我上面的DLL程序和主程序是否都写的正确,不知为何会出错。求解。谢谢
我是想在主程序中取出DLL中返回的结构中的值,请问该如何做?
...全文
382 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hexpate 2012-08-09
  • 打赏
  • 举报
回复
就你示例里的代码, 我觉得不需要分配内存, 完全可以用栈上的数据, 因为你没有在函数外面再使用这个数据了, 如果在函数外还需要使用该数据, 那么你就得自己getmem freemem了, 按照kk的建议做就对了
kaikai_kk 2012-08-09
  • 打赏
  • 举报
回复
建议在主程序分配,释放
sunli_py 2012-08-09
  • 打赏
  • 举报
回复
对了,我还想问下,我在主程序里面需要用getMem分配内存吗?因为现在整个程序主程序和DLL中都没有分配内存,这样会不会不好啊!
sunli_py 2012-08-09
  • 打赏
  • 举报
回复
解决了,后面一个问题的确是我其中有一个变量范围太小导致,真是谢谢你啊!
Hexpate 2012-08-09
  • 打赏
  • 举报
回复
应该是你程序的问题了, 你应该把你的程序代码贴出来, 才好分析, 这样说帮不了你
sunli_py 2012-08-09
  • 打赏
  • 举报
回复
谢谢,上面的方法的确可以了,但是我放到程序中运行后在主程序成功调用并取出结果运行结束后总是报
access violation at address 30323130.read of address 30323130 的错误,不知是什么原因。跟踪后发现整个程序段已经运行完了。都END结束了,可以就在跳出END的时候报错了,不知为什么?
thx1180 2012-08-09
  • 打赏
  • 举报
回复
var
RCardInfo: TCardInfo;
调用:
ReadCard1(0, @RCardInfo);

另:把ReadCard1里面的 getMem和 freemem去掉
Hexpate 2012-08-09
  • 打赏
  • 举报
回复
edt3.Text := string(CardInfo.H_cardsn);
这段代码也不要加string强制转换
Hexpate 2012-08-09
  • 打赏
  • 举报
回复
按我写的改, 你先试试
function ReadCard1(var tag_: Integer; RCardInfo:pCardInfo): integer; stdcall;
begin
if Assigned(RCardInfo) then
begin
RCardInfo^.consequence := 0;
StrPCopy(RCardInfo^.H_cardsn, '0000FFFFFF');//卡序列号
StrPCopy(RCardInfo^.Name, '张三'); //姓名
StrPCopy(RCardInfo^.Sex, '男'); //性别
Result:= 0;
end
else begin
result:= -1;
end;
end;

你调用的那段代码就不要改了, 就那么写
sunli_py 2012-08-09
  • 打赏
  • 举报
回复
如何写啊?我对指针不太熟悉!搞了几天 头晕了
thx1180 2012-08-09
  • 打赏
  • 举报
回复
你的pCardInfo要由调用者分配和释放内存

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧