结构体的字节对齐(跨语言传参时尤为重要)

在项目开发时,结构体作为一个数据结构,非常适合用语存储某一设备或某一类事务的信息,自然的,将其用作参数也是必然的事。然而在将结构体作为参数生成DLL后,用其他语言调用时,则会有一些问题。比如在用C#调用C++的DLL时,结构体的大小就会有不一样,导到调用出问题。

基于以前的BCB开发的产品,需要增加一些接口以实现新的功能,于是将相应的信息封装到了结构体中,然后传出。但是当我用C#调用时,发现怎么调都不对,后来用了C#调用C++DLL传递结构体数组的终极解决方案所说的,用最蛮力的办法,开了一个大的byte数组去接收(数组最好能基于DLL的结构体估算一下大小),数据接收成功了,也分析得到了想要的数据。之后再细加分析,发现原来BCB导出DLL时调用的结构体大小和我们用C#的Marsh弄出来的大小有差异,C#的小了2个字节,于是我就强行补了2个字节进去,最终算是达到了目的。

不过想想就这样,还是觉得有问题。因为这个接口最终可能会发布,供第三方调用。要是他们用其他的语言呢?第三方可不一定会知道是这个原因的,所以想着有没有办法可以解决。经过测试分析,发现是结构体的字节对齐问题。以下结构体是基于win7 32下BCB编写与测试的。

struct Info
{
    int OrderNO;
    float CpuPercent;
    char UniqueCode[33];    
};

void __fastcall TForm
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值