在Delphi中如何直接对内存操作?(急!!!!)(100分)

S

stormxu

Unregistered / Unconfirmed
GUEST, unregistred user!
char szBuf[1100];
char *pData;
pData=szBuf;
//初始化
memset((void*)pData, 0, 1100);
/*组装数据包*/
//消息头
((RcmhgComInfo_T *)pData)->dEvent=RcmhgInsUserReqEvent
//事件号
((RcmhgComInfo_T *)pData)->dLen=914;//sizeof(RcmhgInsUserReq_T);//消息长度
((RcmhgComInfo_T *)pData)->dNode=101
//发送请求的节点号(固定)
((RcmhgComInfo_T *)pData)->dServerID=100
//服务器进程号(固定)

// 设置发送数据
memcpy(pData + sizeof(RcmhgComInfo_T), <_InsUserReq, sizeof(lt_InsUserReq));
请问如何将上面这段C++程序改写为Delphi程序呢?
(其中RcmhgComInfo_T为一个结构,lt_InsUserReq为另外一个结构的实例)
 
type
PRcmhgComInfo_T:^RcmhgComInfo_T;
var
szBuf:array [0..1100-1] of Char;
pData:pChar;
pInfo:pRcmhgComInfo_T;
begin
pData:=szBuf[0];

FillMemory(pData,0,1100);
New(pInfo);
pInfo.dEvent:=RcmhgInsUserReqEvent
//事件号
pInfo.dLen:=914;//sizeof(RcmhgInsUserReq_T);//消息长度
pInfo.dNode:=101
//发送请求的节点号(固定)
pInfo.dServerID:=100
//服务器进程号(固定)
Move(pInfo,pData,SizeOF(RcmhgComInfo_T));
Move(lt_InsUserReq,pData + sizeof(RcmhgComInfo_T),, sizeof(lt_InsUserReq));
Dispose(pInfo);
end;
 
Type
PRcmhgComInfo_T=^RcmhgComInfo_T;
var
szBuf:array[0..1099] of char;
pData:pChar;//或者 pData:^Char;
begin
......
//初始化
FillMemory(pData,0,1100);
PRcmhgComInfo_T(pData).dEvent:=RcmhgInsUserReqEvent;
PRcmhgComInfo_T(pData).dLen:=914;
PRcmhgComInfo_T(pData).dNode:=101;
PRcmhgComInfo_T(pData).dServerID:=100;
CopyMemory(.....);
 
假如返回的消息是一个两个结构,那么如何利用结构接收呢?
例如:
pcmessage char[999];
...
send(...)
recv(pcmessage...)
....
it_ModPPCReq.ConfigId=((RcmhgWinCfgAck_T *)pcmessage)->ConfigId;
it_Mod.Event=((RcmghQryWinCfgAck_T *)(pcmessage+8))->Event;

其中it_ModPPCReq,it_Mod为两个结构的实例,RcmhgWinCfgAck_T,RcmghQryWinCfgAck_T为两个结构. pcmessage为返回消息(它包括两个结构RcmhgWinCfgAck_T,RcmghQryWinCfgAck_T),
其中RcmghQryWinCfgAck_T位于头指针+8的位置.
上面的C++程序又如何改写为Delphi程序呢?  
首先对(爱元元的哥哥)表示万分感谢,不知可否帮我解决这个问题呢!!!
 
var
pcmessage:Array[0..999-1] of char;
myRcmhgWinCfgAck_T:RcmhgWinCfgAck_T;
myRcmghQryWinCfgAck_T:RcmghQryWinCfgAck_T;
begin
Move(pcmessage[0],myRcmhgWinCfgAck_T,sizeof(RcmhgWinCfgAck_T));
it_ModPPCReq.ConfigId:=myRcmhgWinCfgAck_T.ConfigId;
Move(pcmessage[0+8],myRcmghQryWinCfgAck_T,sizeof(RcmghQryWinCfgAck_T));
it_Mod.Event:=myRcmghQryWinCfgAck_T.Event;
end;

呵呵,VC到delphi是很好玩的事情
 
多人接受答案了。
 
顶部