100分求助,vc類性轉delphi類型 ( 积分: 100 )

  • 主题发起人 主题发起人 psynet123
  • 开始时间 开始时间
P

psynet123

Unregistered / Unconfirmed
GUEST, unregistred user!
vc 為:
struct STRUCT_SUBMIT_HEADER
{
STRUCT_CTKP_MSG_HEADER sHeader;
WORD wAppID;
BYTE cReSubmit_Count;
BYTE cTNO; BYTE cReserve;
BYTE cService_ChannelID;
char szReserve[6];
BYTE cService_PlatID; 
BYTE cReserve2;
BYTE cPriority_Flag; BYTE cTimeOut;
BYTE cCredibility_Transmit;
BYTE cSaveForTramSmit;
BYTE cProtocol_Type;
WORD wProtocol_Length;

STRUCT_SUBMIT_HEADER()
{
ZeroMemory(this,sizeof(STRUCT_SUBMIT_HEADER));
}
};

struct STRUCT_CMPP12_SUBMIT
{
STRUCT_CMPP12_MSG_HEADER sHeader;
__int64 n64Msg_ID;
BYTE cPk_total;
BYTE cPk_number; BYTE cRegistered_Delivery;
BYTE cMsg_Level; char szService_ID[10];
BYTE cFee_UserType;
char szFee_terminal_ID[21];
BYTE cTP_pid;
BYTE cTP_udhi;
BYTE cMsg_Fmt;
char szMsg_src[6];
char szFeeType[2]; char szFeeCode[6];
char szValid_Time[17]; 
char szAt_Time[17]; char szSrc_terminal_id[21];
BYTE cDestUsr_tl;
char szDest_terminal_ids[21];
WORD wMsg_Length;
char szMsg_Content[512];
char szReserve[8];
STRUCT_CMPP12_SUBMIT()
{
ZeroMemory(this,sizeof(STRUCT_CMPP12_SUBMIT));
}
};

struct STRUCT_SUBMIT //CTKP_SUBMIT
{
STRUCT_SUBMIT_HEADER sSubmitHeader; STRUCT_CMPP12_SUBMIT sCMPP12Submit;
STRUCT_SUBMIT()
{
ZeroMemory(this,sizeof(STRUCT_SUBMIT));
}
};

delphi我轉為:
STRUCT_SUBMIT_HEADER = ^TSTRUCT_SUBMIT_HEADER;
TSTRUCT_SUBMIT_HEADER = record
sHeader : TSTRUCT_CTKP_MSG_HEADER;
wAppID : WORD; cReSubmit_Count : BYTE;
cTNO : BYTE; cReserve : BYTE;
cService_ChannelID : BYTE;
szReserve : array[0..5] of char;
cService_PlatID : BYTE;
cReserve2 : BYTE;
cPriority_Flag : BYTE;
cTimeOut : BYTE;
cCredibility_Transmit : BYTE;
cSaveForTramSmit : BYTE;
cProtocol_Type : BYTE; wProtocol_Length : WORD;
end;

type
STRUCT_CMPP12_SUBMIT = ^TSTRUCT_CMPP12_SUBMIT;
TSTRUCT_CMPP12_SUBMIT = record
sHeader : TSTRUCT_CMPP12_MSG_HEADER ;
n64Msg_ID : int64;
cPk_total : BYTE;
cPk_number : BYTE; cRegistered_Delivery : BYTE ;
cMsg_Level : BYTE;
szService_ID : array[0..9] of Char;
cFee_UserType : BYTE;
szFee_terminal_ID : array[0..20] of Char;
cTP_pid : BYTE;
cTP_udhi : BYTE ;
cMsg_Fmt : BYTE ;
szMsg_src : array[0..5] of char; szFeeType : array[0..1] of char; szFeeCode : array [0..5] of Char;
szValid_Time : array [0..16] of Char;
szAt_Time : array [0..16] of Char; szSrc_terminal_id : array[0..20] of Char;
cDestUsr_tl : BYTE ;
szDest_terminal_ids : array[0..20] of Char;
wMsg_Length : WORD ;
szMsg_Content : array [0..511] of char;
szReserve : array [0..7] of char;
end;


type
STRUCT_SUBMIT = ^TSTRUCT_SUBMIT;
TSTRUCT_SUBMIT = record
sSubmitHeader : TSTRUCT_SUBMIT_HEADER ;
sCMPP12Submit : TSTRUCT_CMPP12_SUBMIT ;
end;

請問各位,我上面的轉換有問題嗎?為什麼她們不相等?delphi的
sizeof( TSTRUCT_SUBMIT)=720 而vc
等於 709
 
type
STRUCT_CMPP12_SUBMIT = ^TSTRUCT_CMPP12_SUBMIT;
TSTRUCT_CMPP12_SUBMIT = (此处加PACKED) record
sHeader : TSTRUCT_CMPP12_MSG_HEADER ;
n64Msg_ID : int64;
cPk_total : BYTE;
cPk_number : BYTE; cRegistered_Delivery : BYTE ;
cMsg_Level : BYTE;
szService_ID : array[0..9] of Char;
cFee_UserType : BYTE;
szFee_terminal_ID : array[0..20] of Char;
cTP_pid : BYTE;
cTP_udhi : BYTE ;
cMsg_Fmt : BYTE ;
szMsg_src : array[0..5] of char; szFeeType : array[0..1] of char; szFeeCode : array [0..5] of Char;
szValid_Time : array [0..16] of Char;
szAt_Time : array [0..16] of Char; szSrc_terminal_id : array[0..20] of Char;
cDestUsr_tl : BYTE ;
szDest_terminal_ids : array[0..20] of Char;
wMsg_Length : WORD ;
szMsg_Content : array [0..511] of char;
szReserve : array [0..7] of char;
end;
需要加PACKED 进行数据对齐
一看就知道是短信协议
 
自己頂上去
 
这应该与编译器的字节对齐优化有关,编译器会将无法合并的小于32位空间的数据域填充到32位大小,以加快存取速度。(你用Packed record看看)看看下面



TObject实现了一个InstanceSize()方法,它可以取得对象实例的大小。下面以一个示例说明对象在内存中的布局。首先定义一个TMyClass,其中包含4个数据成员和1个方法。先看一下类的定义: Type TMyClass = class
Public
FMember1 : Integer;
FMember2 : Integer;
FMember3 : WORD;
FMember4 : Integer;
Procedure Method();
End; 然后,在Application的主Form中放入一个Memo和一个Button,并在Button的OnClick事件中写下在Memo中显示出对象位置的代码。该程序源代码清单如下: unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Label1: TLabel;
procedure Button1Click(Sender: TObject); end; // 自定义的TMyClass类
TMyClass = class
Public FMember1 : Integer;
FMember2 : Integer;
FMember3 : WORD;
FMember4 : Integer;
Procedure Method();
End;
var
Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Obj : TMyClass;
begin
Obj := TMyClass.Create();
with memo1.Lines do
begin
Add('对象大小:' + IntToStr(Obj.InstanceSize));
Add('对象所在地址 :' + IntToStr(Integer(Obj)));
Add('FMember1所在地址:' + IntToStr(Integer(@Obj.FMember1)));
Add('FMember2所在地址:' + IntToStr(Integer(@Obj.FMember2)));
Add('FMember3所在地址:' + IntToStr(Integer(@Obj.FMember3)));
Add('FMember4所在地址:' + IntToStr(Integer(@Obj.FMember4)));
end;
Obj.Free(); e
nd; { TMyClass } procedure TMyClass.Method; begin //no code end; end. Button的Click事件中所做的事情是,首先创建TMyClass类的实例,然后将对象大小以及每个数据成员的地址输出到Memo中。 该程序的代码和可执行文件可在配书光盘的ObjectSize目录下找到,运行程序并单击“开始”按钮后,其界面如图2.1所示。 ·17·
Delphi 高手突破
图2.1 ObjectSize程序界面 图2.1的Memo中显示出了想要的结果。也许读者会看不清图片中的结果,不妨介绍一下:其中显示了对象大小为20个字节,对象所在首地址是13443352(也许每次运行对象被创建的地址会不同,这没有关系,在此主要关心的是各地址之间的差值),FMember1所在地址是13443356,FMember2为13443360,FMember3为13443364,FMember4为13443368。现在来分析一下: 根据对象首地址以及大小可以算出,对象占用的内存空间范围为13443352~13443371。而第一个成员却在13443356,它与对象的首地址之间有一个4字节的空缺,这4个字节存放的是一个指向对象的VMT(虚方法表)的指针。关于VMT将在2.4节多态的本质中详细讨论,此处暂且不表。 13443356~13443359这4个字节即FMember1所占空间(32位整数)。同样,13443360~13443363为FMember2所占空间。比较容易令人疑惑的是FMember3,计算可知,它所占地址范围为13443364~13443367,同样也是4个字节,但在此定义的FMember3其实是Word类型(16位),为什么它会占用32位空间呢?这与编译器的字节对齐优化有关,编译器会将无法合并的小于32位空间的数据域填充到32位大小,以加快存取速度。也就是说,FMember3同样需要占用4个字节空间。可以自己试一下,如果将以上TMyClass类定义中的FMember2也改成Word类型,编译器会把FMember2和FMember3合并成一个32位空间,于是对象大小就变成了16。 FMember4所占的空间没什么意外,为13443368~13443371。 整个对象的内存布局如图2.2所示。 1344335213443356134433601344336413443368内存地址 VMT 指向VMT的指针FMember1 FMember2 FMember3FMember4 图2.2 对象内存布局图(阴影部分为字节对齐优化时被填充的区域)
 
上面兩位,說清楚一點啊,我還有100分,每人一百分,希望能幫幫忙
 
加關鍵字packed就可以了嗎?還要不要做什麼?
 
我要怎麼樣給你們每人100分阿?
 
滿意!!!!!!!!!!!!
 
搞定了?
 

Similar threads

后退
顶部