DLL中传递结构指针的问题
dll中函数:
procedure getCardInfo(var aList:pInfo;iPort:integer=0);stdcall;
var
p : pInfo;
begin
getMem(p,sizeof(TInfo));
p^.Succmk := 1;
p^.aMess := 'ee';
p^.aNum := '2003';
p^.CardNo := 'AF53D7E2';
p^.aName := 'Test';
p^.aMoneyje := 24;
p^.aLimitM := 30;
aList := p;
freemem(p);
end;
结构体声明:
pInfo = ^TInfo;
//反馈信息
TInfo = record
Succmk : Integer; //成功标志 0 成功 1 失败
aMess: pchar; //失败原因
aNum : pchar; //编号
CardNo : pchar; //卡号
aName : pchar; //姓名
aMoneyje : Double; //当前卡余额
aLimitM : Double; //交易上限额度
end;
主程序调用:
procedure getCardInfo(var stuList:pStuInfo;iPort:integer=0);external 'PaySelf.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
tt : pInfo;
begin
try
getMem(tt,Sizeof(TInfo));
getCardInfo(@tt);
getCardInfo(tt);
//test(tt);
Memo1.Lines.Add(tt.aNum);
Memo1.Lines.Add(tt.CardNo);
FreeMem(tt);
except
on e:exception do
showmessage(e.Message);
end;
end;
想实现的功能是传入一个空结构体,由DLL处理后返回
现在的问题是在DLL中读取传入指针被改变后的值都是对的,但是在主程序中无法获得改变的值。
并且在未添加try语句时会报内存错误
哪位高手能为我答疑?
procedure getCardInfo(var aList:pInfo;iPort:integer=0);stdcall;
var
p : pInfo;
begin
getMem(p,sizeof(TInfo));
p^.Succmk := 1;
p^.aMess := 'ee';
p^.aNum := '2003';
p^.CardNo := 'AF53D7E2';
p^.aName := 'Test';
p^.aMoneyje := 24;
p^.aLimitM := 30;
aList := p;
freemem(p);
end;
结构体声明:
pInfo = ^TInfo;
//反馈信息
TInfo = record
Succmk : Integer; //成功标志 0 成功 1 失败
aMess: pchar; //失败原因
aNum : pchar; //编号
CardNo : pchar; //卡号
aName : pchar; //姓名
aMoneyje : Double; //当前卡余额
aLimitM : Double; //交易上限额度
end;
主程序调用:
procedure getCardInfo(var stuList:pStuInfo;iPort:integer=0);external 'PaySelf.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
tt : pInfo;
begin
try
getMem(tt,Sizeof(TInfo));
getCardInfo(@tt);
getCardInfo(tt);
//test(tt);
Memo1.Lines.Add(tt.aNum);
Memo1.Lines.Add(tt.CardNo);
FreeMem(tt);
except
on e:exception do
showmessage(e.Message);
end;
end;
想实现的功能是传入一个空结构体,由DLL处理后返回
现在的问题是在DLL中读取传入指针被改变后的值都是对的,但是在主程序中无法获得改变的值。
并且在未添加try语句时会报内存错误
哪位高手能为我答疑?
...全文
相关推荐
C#调用C++DLL传递结构体数组的终极解决方案
由于C#和C++对内存管理的方式不同,直接传递结构体数组可能会遇到问题。本文将详细介绍如何解决这个问题,确保C#成功调用C++DLL并正确传递结构体数组。首先,C#和C++之间的数据类型兼容性是关键。
C#调用C++编写的DLL函数各种参数传递问题
本文主要探讨了C#如何调用C++编写的DLL函数,并详细介绍了在不同情况下,如无返回值、返回字符串、返回其他类型以及传递结构体指针等参数传递的问题。C#调用C++编写的DLL函数是跨语言编程中常
c# 调用C++编写 的DLL函数各种参数传递问题。
这篇文章将详细介绍 C# 调用 C++ 编写的 DLL 函数各种参数传递问题,包括不返回值的参数、带返回值的参数、传递结构体指针和传递结构体数组等。1.
VB和VC制作的dll中参数是结构体的传递
**数据的传递和接收**:在VB中,创建一个结构体实例,然后调用DLL函数并传递该实例。在VC的DLL函数内部,通过指针访问并修改结构体成员。完成后,VB中的结构体会反映出这些变化。6.
避坑指南:LabVIEW调用C++ DLL时指针传递的5个常见错误
本文深入剖析了LabVIEW调用C++ DLL时指针传递的五大常见错误,包括内存管理混淆、数据结构对齐错位、指针层级误解、调用约定不匹配及参数配置细节。重点探讨了如何正确使用MoveBlock进行数据交互,并提供了清晰的内存管理策略与结构体对齐方案,帮助工程师有效规避内存泄漏与程序崩溃风险,实现稳定高效的跨语言集成。


Windows SDK/API
