在项目开发时,结构体作为一个数据结构,非常适合用语存储某一设备或某一类事务的信息,自然的,将其用作参数也是必然的事。然而在将结构体作为参数生成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