各位大佬,请问delphi调用C++ DLL,能不能实现嵌套结构体的互传,和结构体数组的互传

得鹿梦鱼、 2019-04-23 05:04:55

typedef struct Coordinate {
struct Mwinddirectbaseline *mWindDirectBaseLine;
struct Mwinddirectbar *mWindDirectBars;
}Coordinate;


typedef struct Winddirectline {
struct Coordinate* coordinates;
}Winddirectline;


已知C++的结构如上图:结构体重包含数组,在实验过程中单结构例如

typedef struct F {
char* p;
int s;
int i;
}F;

能够传递给delphi,但是F*数据就不能传递给delphi,能传递给C++
论坛分少,高CSDN下载分求一份解决源码,可指定下载。。求大佬!
...全文
1487 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
鶖獼鼀龑 2019-04-26
  • 打赏
  • 举报
回复
我也想知道,有知道的吗
得鹿梦鱼、 2019-04-26
  • 打赏
  • 举报
回复
引用 15 楼 SJS_SL 的回复:
你这个应该不能把

可以的,已经实现了
https://www.cnblogs.com/motao9527/p/10767280.html
得鹿梦鱼、 2019-04-26
  • 打赏
  • 举报
回复
引用 16 楼 luj_1768 的回复:
我觉得,第一个问题是:先不讨论跨语言问题,你在哪个语言环境里实现了这种互传!

C++与Delphi之间
https://www.cnblogs.com/motao9527/p/10767280.html
luj_1768 2019-04-26
  • 打赏
  • 举报
回复
我觉得,第一个问题是:先不讨论跨语言问题,你在哪个语言环境里实现了这种互传!
qq_44845762 2019-04-26
  • 打赏
  • 举报
回复
厉害厉害呀哈哈哈哈哈哈哈哈
  • 打赏
  • 举报
回复
Delphi有内置的JSON库
得鹿梦鱼、 2019-04-25
  • 打赏
  • 举报
回复
解决了,就是读参数的问题;应该

while(bol) do
begin
resd:= root.WindDirectLine.coordinates^ ;
try
Mwind:= root.WindDirectLine.coordinates^.mWindDirectBaseLine^;
Mwbar:= root.WindDirectLine.coordinates^.mWindDirectBars^;
fs:=Mwbar.f;
hs:=Mwbar.h;
hsf:= fs.s;
hsh:=hs.s;

bolbar:=true;
mu:= Mwind.s;

while((mu<>-1414812757)) do
begin
Inc(root.WindDirectLine.coordinates^.mWindDirectBaseLine); {到下一个}
Mwind:= root.WindDirectLine.coordinates^.mWindDirectBaseLine^;
mu:= Mwind.s;
end;

while((hsf<>-1414812757) and (hsh<>-1414812757) ) do
begin
Inc(root.WindDirectLine.coordinates^.mWindDirectBars); {到下一个}

Mwbar:= root.WindDirectLine.coordinates^.mWindDirectBars^;
fs:=Mwbar.f;
hs:=Mwbar.h;
hsf:= fs.s;
hsh:=hs.s;

end;
except
begin
bol:=false;
end;
end;
Inc(root.WindDirectLine.coordinates); {到下一个}
end;

参照了这篇文章:
https://www.cnblogs.com/China3S/p/3286052.html
得鹿梦鱼、 2019-04-25
  • 打赏
  • 举报
回复
引用 11 楼 早打大打打核战争 的回复:
更简单的方法是不要修改指针,而是把指针作为数组来访问(C++中也可以):
for i := 0 to 9 do
q[i].rk := i;
for i := 9 downto 0 do
writeln(q[i].rk);

C++的赋值:

Delphi的结构:

然后就是获取到的参数:

就是像上面这种,只能获取到第一个参数,不能获取为数组,大佬怎么看?
SJS_SL 2019-04-25
  • 打赏
  • 举报
回复
你这个应该不能把
  • 打赏
  • 举报
回复
更简单的方法是不要修改指针,而是把指针作为数组来访问(C++中也可以):
for i := 0 to 9 do
q[i].rk := i;
for i := 9 downto 0 do
writeln(q[i].rk);
  • 打赏
  • 举报
回复

{$APPTYPE CONSOLE}
program test;

{$POINTERMATH ON}

type
rks = record
rk: NativeInt; //integer;
end;

rms = record
//rks * sdak;
end;

procedure TryrmsVOid;
const
num = 10;
var
rmssl: rms;
q: ^rks;
i: integer;
begin
GetMem(q, num * sizeof(rks));
for i := 0 to 9 do
begin
//GetMem(pointer(q.rk), sizeof(q.rk));
q.rk := i;
Inc(q);
end;
for i := 10 downto 1 do
begin
Dec(q);
writeln(q.rk);
end;
FreeMem(q);
end;

{ main }
begin
TryrmsVOid;
end.

得鹿梦鱼、 2019-04-24
  • 打赏
  • 举报
回复
引用 8 楼 早打大打打核战争 的回复:
你都没把q传出来呀


我用Coordinate 试过的,不得行~~类似的结构,。、。、
  • 打赏
  • 举报
回复
你都没把q传出来呀
得鹿梦鱼、 2019-04-24
  • 打赏
  • 举报
回复
引用 6 楼 C井爆破 的回复:
[quote=引用 5 楼 早打大打打核战争 的回复:]
[quote=引用 4 楼 C井爆破 的回复:]
[quote=引用 2 楼 早打大打打核战争 的回复:]
什么叫“F*数据就不能传递给delphi”


也就是F的数组数据,现在经过测试可以传递,
但是嵌套的结构还是不行,只能获取第一个结构的数据,嵌套的获取不到。[/quote]

是可以的
首先,要启用指针算术,在你的程序前部加入{$POINTERMATH ON},出于安全考虑,Delphi编译器默认禁止指针算术运算(PChar/PAnsiChar、PByte等类型默认支持指针算术,其他类型指针仍然可以cast为整数类型来运算),启用之后就可以了
其次,array of Mwinddirectbaseline;类型是Delphi的动态数组,并不对应C++的数组
直接对等翻译为有类型指针就可以
Coordinate = record
mWindDirectBaseLine: ^Mwinddirectbaseline;
mWindDirectBars: ^Mwinddirectbar;
end;

然后就可以:
var
Coord: Coordinate;
// 从DLL取得Coord数据
Coord.mWindDirectBaseLine[9].s := 99;
[/quote]

还是不行,改了之后如果C++的结构指针只有一个数据则能够获取到数据,
但是如果C++通过 (struct Coordinate *)malloc(10* sizeof(struct Coordinate));
创建多个结构数据的指针,
就获取不到相关数据了,,

[/quote]


例如在C++中声明:

typedef struct rks {
int rk;
}rks;

typedef struct rms {
rks * sdak;
}rms;

__declspec(dllexport) void __stdcall TryrmsVOid()
{
int num = 10;
rms rmssl;
rks* q = (struct rks *)malloc(num * sizeof(struct rks));

for (int i = 0; i < 10; i++)
{
q->rk = (int)malloc(sizeof(int));
q->rk = i;
q++;
}

for (int i = 10; i>0; i--)
{
--q;
printf("%d\n", q->rk);
}
}

这种最后的数据*q按照同样的结构在delphi中就获取不到数据了。。
得鹿梦鱼、 2019-04-24
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
[quote=引用 4 楼 C井爆破 的回复:]
[quote=引用 2 楼 早打大打打核战争 的回复:]
什么叫“F*数据就不能传递给delphi”


也就是F的数组数据,现在经过测试可以传递,
但是嵌套的结构还是不行,只能获取第一个结构的数据,嵌套的获取不到。[/quote]

是可以的
首先,要启用指针算术,在你的程序前部加入{$POINTERMATH ON},出于安全考虑,Delphi编译器默认禁止指针算术运算(PChar/PAnsiChar、PByte等类型默认支持指针算术,其他类型指针仍然可以cast为整数类型来运算),启用之后就可以了
其次,array of Mwinddirectbaseline;类型是Delphi的动态数组,并不对应C++的数组
直接对等翻译为有类型指针就可以
Coordinate = record
mWindDirectBaseLine: ^Mwinddirectbaseline;
mWindDirectBars: ^Mwinddirectbar;
end;

然后就可以:
var
Coord: Coordinate;
// 从DLL取得Coord数据
Coord.mWindDirectBaseLine[9].s := 99;
[/quote]

还是不行,改了之后如果C++的结构指针只有一个数据则能够获取到数据,
但是如果C++通过 (struct Coordinate *)malloc(10* sizeof(struct Coordinate));
创建多个结构数据的指针,
就获取不到相关数据了,,

  • 打赏
  • 举报
回复
引用 4 楼 C井爆破 的回复:
[quote=引用 2 楼 早打大打打核战争 的回复:]
什么叫“F*数据就不能传递给delphi”


也就是F的数组数据,现在经过测试可以传递,
但是嵌套的结构还是不行,只能获取第一个结构的数据,嵌套的获取不到。[/quote]

是可以的
首先,要启用指针算术,在你的程序前部加入{$POINTERMATH ON},出于安全考虑,Delphi编译器默认禁止指针算术运算(PChar/PAnsiChar、PByte等类型默认支持指针算术,其他类型指针仍然可以cast为整数类型来运算),启用之后就可以了
其次,array of Mwinddirectbaseline;类型是Delphi的动态数组,并不对应C++的数组
直接对等翻译为有类型指针就可以
Coordinate = record
mWindDirectBaseLine: ^Mwinddirectbaseline;
mWindDirectBars: ^Mwinddirectbar;
end;

然后就可以:
var
Coord: Coordinate;
// 从DLL取得Coord数据
Coord.mWindDirectBaseLine[9].s := 99;
得鹿梦鱼、 2019-04-24
  • 打赏
  • 举报
回复
引用 2 楼 早打大打打核战争 的回复:
什么叫“F*数据就不能传递给delphi”


也就是F的数组数据,现在经过测试可以传递,
但是嵌套的结构还是不行,只能获取第一个结构的数据,嵌套的获取不到。
得鹿梦鱼、 2019-04-24
  • 打赏
  • 举报
回复
引用 1 楼 武稀松 的回复:
完全没问题的,是在Delphi中你声明的结构体不对


type
Mwinddirectbaseline = record
p:pansiChar;
s:Integer;
i:Integer;
end;

type
Coordinate = record
mWindDirectBaseLine:array of Mwinddirectbaseline;
mWindDirectBars:array of Mwinddirectbar;
end;

delphi的结构体声明,单结构体能够传参的,只是嵌套了就获取不到了。
  • 打赏
  • 举报
回复
什么叫“F*数据就不能传递给delphi”
武稀松 2019-04-24
  • 打赏
  • 举报
回复
完全没问题的,是在Delphi中你声明的结构体不对

1,184

社区成员

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

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