DLL中对应的调用函数GetItem定义如下:
function GetItem(pvSelect:pointer;nItem:integer):DWORD;cdecl;
//pvSelect参数是一个结构体数组,nItem为结构体的个数。结构体定义如下
type
  PP1=^TT1;
  TT1= record
    wID:WORD;
    pValue:pointer;
  end;程序如下:
var
  S1:array of PP1; //S1为结构体数组
begin
  SetLength(S1,2); //结构体个数设置为2个
  GetMem(S1[0],Sizeof(TT1));
  GetMem(S1[1],Sizeof(TT1));  S1[0].wID=1;
  S1[0].pValue:=GetMemory(30); 
  S1[1].wID=2;
  S1[0].pValue:=GetMemory(30);  GetItem(@S1[0],2); //目标是传入整个结构体数组,这样一次返回每个结构体的pValue  showmessage(strpas(S1[0].pValue));
  showmessage(strpas(S1[1].pValue));  FreeMem(S1[0].pValue);
  FreeMem(S1[1].pValue);
  FreeMem(S1[0]);
  FreeMem(S1[1]);
  S1:=nil;
end;问题出现在GetItem函数调用时结构体数组传参这里,无论写成@S1,还是@S1[0],都无法返回正确的pValue,
只有写成单个的S1[0]或者S1[1]时,可以正确得到对应的单个pValue,而我的目标是要传入整个结构体数组。
我对数组、指针这些概念比较糊涂,上面程序基本是照葫芦画瓢写出来的,所以不知道什么地方存在问题,
还请大家帮忙看看程序该如何调整,谢谢!

解决方案 »

  1.   


    1.定义一个结构体:struct info  
    {  
      char name[10];  
      int sex;  
      char address[50];  
      int age;  
    }
    2.动态分配空间info * myinfo = new info[5];
    3.函数处理//处理结构体数组的函数  
    int Manage(info * pInfo)  
    {  
      // 读写第一个数组元素
      pInfo->age = 25;  strcpy( pInfo->name , "Tom" );  // 读写第二个数组元素
      (pInfo+1)->age = 23;  strcpy( (pInfo+1)->name , "Jerry" );  // 后边指针加1即可处理下一个数组元素,但不要超出
      ...  
      return 0;  
    }// 因为此函数传递的是个指针参数,所以直接修改了数据,不要再 return 那个参数了// return 0 ; 只表示函数操作是否满意
    4.函数出来后,如果使用完了,记得要释放申请的缓冲区delete [] myinfo; 
     
      

  2.   

    PP1=^TT1;
      TT1= record
      wID:WORD;
      pValue:pointer;
      end;我觉得 C的程序里应该是要求 Pvalue也要分配好空间吧,GetItem 方法应该只是给你的空间中返回数据。
    看你后面的代码,pValue返回的应该是一个字符串吧。
      GetMem(S1[0],Sizeof(TT1));GetMem(S1[1],Sizeof(TT1)); 这两行代码就是错误的,你本意是想做什么??
      
    S1[0].pValue:=GetMemory(30); 你这样分配,pValue指向空间应该和wID:WORD;不是连续的。PP1=^TT1;
      TT1= packed record
      wID:WORD;
      pValue:Array[0..29] of Char;
      end;
    var
      Arr:Array of TT1;
    begin
      setLength(Arr,2);
      Arr[0]:=1;
      Arr[1]:=2;
      GetItem(@Arr[0],2);
      showmessage(Arr[0].pValue);
      showmessage(Arr[1].pValue);
      setLength(Arr,0);  //这样就可以释放了。end;