在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]这样做是可以的,为什么我的自定义指针就不行。

解决方案 »

  1.   

    type  
        Pmydata=^TuserDataArray
        TUserDataArray=Array[0..32767] of TuserData;
     
       (pmydata(pmyUL^.pUL))^[3];
      

  2.   

    试试这样呢?
    SendMessage(hWnd,WM_USER+100,wParam,(LPARAM)myUL.pUD);
      

  3.   

    type
      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;
      

  4.   

    谢谢大家!to: zswang(伴水清清)(专家门诊清洁工)//消息必须是同进程产生的,否则普通消息不能传递指针数据~~
    这句话我在帮助文档中也看到了,但我实验简单的数据类型是可以的
    比如:传一个TUserData类型指针,我在Delphi中可以得到它的ID及Name
    我考虑有两种可能:
    1.Exe调用Dll后把Dll的地址空间映射到Exe,所以能取到
    2.是不个不安全的操作。能具体帮我解释一下吗?
    thanks a lot !
      

  5.   

    你的方式我看好像是可行的,
    pmyUL^.pUL[3]--->pmyUl[3].pUL;
    --->pmyUL才是數組!!!
      

  6.   

    Type TUserData = record
      ID:integer;
      pName :pchar;
    end;
    Type TUserList = record
      pUL:^TUserData; ---->pUL:array of TUserData
    end;pmyUL:^TUserList;
      

  7.   

    在C/C++中,指針與數組基金本意思一樣,可互用,但Delphi中卻是不同的兩個Data Type;
    要進行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];//也行
      

  8.   

    Exe和Dll间的内存取是安全的~~Exe创建的资源由Exe释放~~
    Dll创建的资源由Dll释放~~
    如果出现交叉,那么就会出异常~~
      

  9.   

    也就是说我上面的操作是可行的,(只是在Exe中用指针取dll中的数据,不做释放、修改操作)
      

  10.   

    再次感谢  cgh93829(power) 、 zswang(伴水清清)(专家门诊清洁工)以及大家的关注