c#调用DLL如何返回结构数据

zsx222 2009-09-28 05:32:18
调用的是delphi的dll

结构如下:

type
TMachineList = record
IpAddr: array [0..3] of char; //机器IP地址
MachineType: array [0..19] of char; //机器型号
MachineSN: array [0..15] of char; //机器序号
MachinePordTime: array [0..7] of char;//机器生产日期
MachineDescr: array [0..39] of char; //机器描述
CtrlManuf: array [0..19] of char; //控制器厂商
CtrlType: array [0..19] of char; //控制器型号
CtrlSerNr: array [0..19] of char; //控制器序号
CtrlHWVers: array [0..19] of char; //控制器硬件版本
CtrlSWVers: array [0..39] of char; //控制器软件版本
CtrlNetVers: array [0..19] of char; //控制器联网程序版本
CtrlDescr: array [0..39] of char; //控制器描述
MoldDataVers: array [0..19] of char; //模具资料版本
end;
PMachineList = ^TMachineList;
AMachineList = array [0..0] of TMachineList;
PAMachineList = ^AMachineList;



函数
function GetMachineList(MachineList: PMachineList): integer;stdcall;
var
i: integer;
PML: PAMachineList;
begin
PML := PAMachineList(MachineList);
LockXY.Acquire;
try
for i := 0 to UsedCount - 1 do
begin
application.messagebox(pchar(inttostr(Integer(UsedCount))),'标题',mb_ok);
CharArrayCopy(PML[i].IpAddr, ThreadMap[i].IpAddr, 4);

//CharArrayCopy(PML[i].MachineType, ThreadMap[i].MachineType, 20);

//CharArrayCopy(PML[i].MachineSN, ThreadMap[i].MachineSN, 16);
//CharArrayCopy(PML[i].MachinePordTime, ThreadMap[i].MachinePordTime, 8);
//CharArrayCopy(PML[i].MachineDescr, ThreadMap[i].MachineDescr, 40);
//CharArrayCopy(PML[i].CtrlManuf, ThreadMap[i].CtrlManuf, 20);


//CharArrayCopy(PML[i].CtrlType, ThreadMap[i].CtrlType, 20);
//CharArrayCopy(PML[i].CtrlSerNr, ThreadMap[i].CtrlSerNr, 20);
//CharArrayCopy(PML[i].CtrlHWVers, ThreadMap[i].CtrlHWVers, 20);
//CharArrayCopy(PML[i].CtrlSWVers, ThreadMap[i].CtrlSWVers, 40);
//CharArrayCopy(PML[i].CtrlNetVers, ThreadMap[i].CtrlNetVers, 20);
//CharArrayCopy(PML[i].CtrlDescr, ThreadMap[i].CtrlDescr, 40);
//CharArrayCopy(PML[i].MoldDataVers, ThreadMap[i].MoldDataVers, 20);

end; //for
finally
LockXY.Release;
end;//try
Result := UsedCount;
end;





我在c#处这么定义
[DllImport(DLLFILENAME)]
public static extern int GetMachineList(ref MachineListStruct MachineList);

是可以调用的,但是只能返一个结构的值,不能返回结构数组
...全文
178 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zsx222 2010-02-24
  • 打赏
  • 举报
回复
[DllImport(DLLFILENAME)]
public static extern int GetMachineList([In, Out] MachineListStruct[] MachineList);


这样定义就可以取到了,[In, Out]
zsx222 2009-09-29
  • 打赏
  • 举报
回复
请提供一下PMachineList定义及初始,在下实在没搞过指针这一块,象下面这样,系统提示:
Use of unassigned local variable 'PMachineList'



private void button3_Click(object sender, EventArgs e)
{
MachineListStruct[] MachineList;
MachineList = new MachineListStruct[250];
IntPtr PMachineList;
GetMachineList(PMachineList);
System.Runtime.InteropServices.Marshal.PtrToStructure(PMachineList, MachineList);
}
wartim 2009-09-29
  • 打赏
  • 举报
回复


[DllImport(DLLFILENAME)]
public static extern int GetMachineList(IntPtr PMachineList);

MachineListStruct[] MLS = new MachineListStruct[10];
System.Runtime.InteropServices.Marshal.PtrToStructure(PMachineList, MLS);


没法测试
System.Runtime.InteropServices.Marshal命名空间下都是托管和非托管交互的方法,或者你可以用用unsafe下的指针
zsx222 2009-09-29
  • 打赏
  • 举报
回复
楼上,我不太清楚在c#里整指针,能给个简单的示例吗?多谢了!
fpcc 2009-09-29
  • 打赏
  • 举报
回复
整个指针,自己跳不就可以了。
鸭梨山大帝 2009-09-28
  • 打赏
  • 举报
回复
"public static extern int GetMachineList(ref MachineListStruct MachineList);"

int GetMachineList
<--返回結構值

ref MachineListStruct MachineList
<--雖然你設定了是ref,但是 "function GetMachineList(MachineList: PMachineList): integer;stdcall; " 你的函數聲明并未返回參數 MachineList 吧?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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