在一个c的DLL库里面定义了一个结构,调用函数时需要使用到这个结构:
typedef struct _USERDEVICEINFO
{
char szname[17];
BYTE mac[6];
char szIP[16];
USHORT uPort;
char szMask[16];
char szGate[16];
char szRemoteIP[16];
USHORT uRemotePort;
BYTE NetMode; }USERDEVICEINFO,*PUSERDEVICEINFO;函数定义:BOOL __stdcall EzCfg_GetNodeConfig (char* szIpAddr,PUSERDEVICEINFO pUserDevInfo);我再delphi里面定义了同样的结构:
type PUSERDEVICEINFO = record
szname: array[0..16] of Char;
mac: array[0..5] of byte;
szIP: array[0..15] of Char;
uPort: word;
szMask: array[0..15] of Char;
szGate: array[0..15] of Char;
szRemoteIP: array[0..15] of Char;
uRemotePort: word;
NetMode: byte;
end;puserInf :PUSERDEVICEINFO ;EzCfg_GetNodeConfig(pansichar(edtIP.Text), puserInf);静态调用dll, 可是返回的有些数据总是不对,有的字符串少了开头一个字符,有的正确,这是为什么?
这样调用对吗?谢谢各位!
typedef struct _USERDEVICEINFO
{
char szname[17];
BYTE mac[6];
char szIP[16];
USHORT uPort;
char szMask[16];
char szGate[16];
char szRemoteIP[16];
USHORT uRemotePort;
BYTE NetMode; }USERDEVICEINFO,*PUSERDEVICEINFO;函数定义:BOOL __stdcall EzCfg_GetNodeConfig (char* szIpAddr,PUSERDEVICEINFO pUserDevInfo);我再delphi里面定义了同样的结构:
type PUSERDEVICEINFO = record
szname: array[0..16] of Char;
mac: array[0..5] of byte;
szIP: array[0..15] of Char;
uPort: word;
szMask: array[0..15] of Char;
szGate: array[0..15] of Char;
szRemoteIP: array[0..15] of Char;
uRemotePort: word;
NetMode: byte;
end;puserInf :PUSERDEVICEINFO ;EzCfg_GetNodeConfig(pansichar(edtIP.Text), puserInf);静态调用dll, 可是返回的有些数据总是不对,有的字符串少了开头一个字符,有的正确,这是为什么?
这样调用对吗?谢谢各位!
解决方案 »
- delphi开发active控件,如何公布一个接口类型的属性供vb使用?
- dbgrid行多选:options里设定multiselect为true,如何用代码实现
- 求一加密解密算法:要加密的是些数字类型的东西,我想生成成加密后的东西
- 关于DBGrid多选问题请教
- 用clientDataSet执行SQL语句时传参发生中文被截断的问题
- 恩 怎么回事?
- jbuilder6怎么注册呀?
- WebSnap中Checkbox 提交问题,谁能解决?
- delphi dbgrid 点击一个dbgrid内的单元,在另一个DBGRID中显示其相关内容
- 请问Window xp上的桌面右键shell菜单如何移植到vista上面?急
- 在memo控件输入内容,用QRRichText在报表中显示.为什么显示的格式和输入时的格式不同呢
- 我们公司正在招兵买马!
{
char szname[17];
BYTE mac[6];
char szIP[16];
USHORT uPort;
char szMask[16];
char szGate[16];
char szRemoteIP[16];
USHORT uRemotePort;
BYTE NetMode;}USERDEVICEINFO,*PUSERDEVICEINFO;这个 PUSERDEVICEINFO 是指针类型的啊..puserInf :PUSERDEVICEINFO ;EzCfg_GetNodeConfig(pansichar(edtIP.Text), puserInf);你传的好像不一致吧.
type USERDEVICEINFO = record
szname: array[0..16] of Char;
mac: array[0..5] of byte;
szIP: array[0..15] of Char;
uPort: word;
szMask: array[0..15] of Char;
szGate: array[0..15] of Char;
szRemoteIP: array[0..15] of Char;
uRemotePort: word;
NetMode: byte;
end;type PUSERDEVICEINFO = ^USERDEVICEINFO;puserInf :PUSERDEVICEINFO ;
szname: array[0..16] of Char;
mac: array[0..5] of byte;
szIP: array[0..15] of Char;
uPort: word;
szMask: array[0..15] of Char;
szGate: array[0..15] of Char;
szRemoteIP: array[0..15] of Char;
uRemotePort: word;
NetMode: byte;
end;puserInf :PUSERDEVICEINFO
向上面这样定义就行了!
关键是要双方协议好,楼主的错误在于不知道那个VC写的程序定义结构时采用的是1字节对齐。
但是也不能只要碰到VC的结构就认为是一字节对齐呀,如果它采用缺省的设置(8字节对齐),那么你加了packed反而还错了。我再多说两句,呵呵。
Delphi里面record的对齐方式可以在project->options->compiler里面设置record field alignment,默认是8字节对齐。
如果你在里面设置为1字节对齐,那么这个地方你不加packed一样OK。
至于packed record它会忽略这个设置选项,由它定义的结构都采用1字节对齐。所以你在这个地方加packed是碰巧对的!!!
如果VC里面并不是设置的1字节对齐而是2、4字节对齐,你就完蛋了这个问题虽然看起来不起眼,但是很重要哦,特别是网络编程的时候,Delphi写的程序和VC写的程序进行通讯尤其要注意。如果想测试设置是否成功,可以用sizeof看看效果。
#pragma pack(push, 1)
#pragma pack(pop)今天又学了一招:)