C代码转译成Delphi的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 YuZi
  • 开始时间 开始时间
Y

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
typedef struct tagMyStruct {
DWORD dwCount;
LPLISTHEADER* lpListHeader;
}MYSTRUCT,*LPMYSTRUCT;

typedef struct tagListHeader {
DWORD dwCount;
LPMYDATA* lpMyData;
}LISTHEADER,*LPLISTHEADER;

lpMyStruct->lpListHeader =
(LPLISTHEADER*)VirtualAlloc(NULL, dwCount * sizeof(LPVOID),MEM_COMMIT,PAGE_READWRITE);
.....
(lpMyStruct->lpListHeader) =
(LPLISTHEADER*)VirtualAlloc(NULL, dwCount * sizeof LPMYDATA),MEM_COMMIT,PAGE_READWRITE);

我用上面的语句在其它进程空间中动态申请空间和数据访问,lpListHeader和lpDataList是个结构指针,在C中可以用下面的方法访问结构lpData的成员属性,
如:Value = (lpMyStruct->lpListHeader).lpMyData;
但是在DELPHI中我要怎么实现这样的数据访问和修改呢?
 
typedef struct tagMyStruct {
DWORD dwCount;
LPLISTHEADER* lpListHeader;
}MYSTRUCT,*LPMYSTRUCT;

typedef struct tagListHeader {
DWORD dwCount;
LPMYDATA* lpMyData;
}LISTHEADER,*LPLISTHEADER;

lpMyStruct->lpListHeader =
(LPLISTHEADER*)VirtualAlloc(NULL, dwCount * sizeof(LPVOID),MEM_COMMIT,PAGE_READWRITE);
.....
(lpMyStruct->lpListHeader) =
(LPLISTHEADER*)VirtualAlloc(NULL, dwCount * sizeof LPMYDATA),MEM_COMMIT,PAGE_READWRITE);

我用上面的语句在其它进程空间中动态申请空间和数据访问,lpListHeader和lpDataList是个结构指针,在C中可以用下面的方法访问结构lpData的成员属性,
如:Value = (lpMyStruct->lpListHeader).lpMyData;
但是在DELPHI中我要怎么实现这样的数据访问和修改呢?
 
type
//LpMyData =Pointer;

LpListHeader =^tagListHeader;
tagListHeader =packed record
dwCount :DWord;
pMyData :LPMYDATA;
end;

LPMyStruct =^tagMyStruct;
tagMyStruct =packed record
wCount :DWord;
pListHeader :LpListHeader;
end;

//var
// pMyStruct :LpMyStruct;

begin
...
pMyStruct^.pListHeader :=VirtualAlloc(nil,dwCount *4,MEM_COMMIT,PAGE_READWRITE);
...
end;
 
var pList :LpListHeader;
begin
...
Integer(pList) :=Integer(pMyStruct^.pListHeader) + i *sizeof(LpListHeader);
Value := pList^.pMyData;
...
end;
 
谢谢dawnsong!
Delphi 能不能也像C一样类似访问数组一样访问里面的成员,
lpMyStruct.lpListHeader.pMyData:=....
这句有点不明白:
Integer(pList) :=Integer(pMyStruct^.pListHeader) + i *sizeof(LpListHeader);
难道这是先移指针定位,然后再Value := pList^.pMyData;取值吗?
 
难道这是先移指针定位,然后再Value := pList^.pMyData;取值吗?
---------------------------------------------------------------------
是的,这个就是移动指针定位

用数组的话,
var pList :array of tagListHeader;
begin
...
Integer(pList) :=Integer(pMyStruct^.pListHeader);
Value := pList.pMyData;//这样用应该就没问题了
...
end;
 
关键是那个 pList并不是数组,lpListHeader也不是,而是在申请空间、读写数据后已经形成了数组的的形式,C可以通过指针用带下标的形式访问每个lpListHeader的成员属性和值。但Delphi我不知道怎样做,难道真得不能用“abcd”的方式访问吗?
 
只要编译能够通过,应该就能访问:)
 
不能通过
 
Delphi对于这种情况的一般习惯好象是定义一个过程中函数吧
比如 MyList(Index: Integer) 这样的格式。
我见到的一些例子都是这么做的
还有,不要把指针转换成Integer型,这样不安全

Delphi中只有PChar这样的可以用+操作来直接移动指针
比如PP:=P+1
 
谢谢cst_zf!
定义这样的过程 MyList(Index: Integer),具体怎样实现访问修改数据呢?
我还是不懂,您有相关的Delphi的例子吗?
 
type
PTestRec = ^TTestRec;
TTestRec = record
I : Integer;
S : String;
end;

PTestRecArray = ^TTestRecArray;
TTestRecArray = array[0..MAXINT div SizeOf(TTestRec)-1] of TTestRec;

var
P1, P2 : PTestRec;
A : PTestRecArray absolute P1;
I : Integer;
begin
P1 := AllocMem(10 * SizeOf(TTestRec));
try
P2 := P1;
for I := 1 to 10 do
begin
P2^.S := IntToStr(I);
P2^.I := I*10;
Inc(P2);
end;

for I := 0 to 9 do
begin
ShowMessage(Format('I=%d s=%s', [A^.I, A^.S]));
end;

finally
FreeMem(P1);
end;
end;
 
TTestRecArray = array[0..MAXINT div SizeOf(TTestRec)-1] of TTestRec
PTestRecArray absolute P1
这下算是长见识了!我怎么就想不到呢?
唉,我以前对指针和数组的理解和运用真是肤浅之至。虽然还是要变相转为数组,但已经可以使人想到较明朗的解决策略了。。。。

感谢几位大侠!分数就那么一点点,如果分的不均,请您多多包涵!
 
后退
顶部