在c 中定义结构体
struct _User
{
int ID;
char * pName;
} UserData;struct _UserList
{
UserData * pUD;
}UserListData;UserListData myUL;
用 (UserData*)realloc(myUL.pUD, sizeof(UserData) * 10);
就可以产生一个数组,可以用 myUL.pUD[3]来取得数据。
我把myUL的地址以一个消息参数传给delphi写的exe
SendMessage(hWnd,WM_USER+100,wParam,(LPARAM)&myUL);
在Delphi中定义
Type TUserData = record
ID:integer;
pName :pchar;
end;
Type TUserList = record
pUL:^TUserData
end;
pmyUL:^TUserList;
让pmyUL = Pointer(Message.LParam)
我想取得一个UserData怎么做?
我试了用pmyUL^.pUL[3] 报Array type required.但若定义 pChar = 'abcdef'
pChar[3]这样做是可以的,为什么我的自定义指针就不行。
struct _User
{
int ID;
char * pName;
} UserData;struct _UserList
{
UserData * pUD;
}UserListData;UserListData myUL;
用 (UserData*)realloc(myUL.pUD, sizeof(UserData) * 10);
就可以产生一个数组,可以用 myUL.pUD[3]来取得数据。
我把myUL的地址以一个消息参数传给delphi写的exe
SendMessage(hWnd,WM_USER+100,wParam,(LPARAM)&myUL);
在Delphi中定义
Type TUserData = record
ID:integer;
pName :pchar;
end;
Type TUserList = record
pUL:^TUserData
end;
pmyUL:^TUserList;
让pmyUL = Pointer(Message.LParam)
我想取得一个UserData怎么做?
我试了用pmyUL^.pUL[3] 报Array type required.但若定义 pChar = 'abcdef'
pChar[3]这样做是可以的,为什么我的自定义指针就不行。
Pmydata=^TuserDataArray
TUserDataArray=Array[0..32767] of TuserData;
(pmydata(pmyUL^.pUL))^[3];
SendMessage(hWnd,WM_USER+100,wParam,(LPARAM)myUL.pUD);
TUserData = packed record //加上packed和c定义的记录类型匹配~~
ID: Integer;
pName: PChar;
end; TUserList = packed record
pUL: ^TUserData
end; PUserDataArray = ^TUserDataArray;
TUserDataArray = array[0..32767] of TUserData;//...
var
vUserListArray: PUserDataArray;
begin
vUserListArray := Pointer(Message.LParam); //消息必须是同进程产生的,否则普通消息不能传递指针数据~~
{ TODO : 使用PUserDataArray(vUserListArray)^[N] }
end;
这句话我在帮助文档中也看到了,但我实验简单的数据类型是可以的
比如:传一个TUserData类型指针,我在Delphi中可以得到它的ID及Name
我考虑有两种可能:
1.Exe调用Dll后把Dll的地址空间映射到Exe,所以能取到
2.是不个不安全的操作。能具体帮我解释一下吗?
thanks a lot !
pmyUL^.pUL[3]--->pmyUl[3].pUL;
--->pmyUL才是數組!!!
ID:integer;
pName :pchar;
end;
Type TUserList = record
pUL:^TUserData; ---->pUL:array of TUserData
end;pmyUL:^TUserList;
要進行Cast:type PTUserData=^TUserData;
type PATUserData=array of TUserData;Type TUserData = record
ID:integer;
pName :pchar;
end;
Type TUserList = record
pUL:^TUserData;
end;pmyUL:^TUserList;PATUserData(pmyUL.pUL)[3];//也行
Dll创建的资源由Dll释放~~
如果出现交叉,那么就会出异常~~