+ -
当前位置:首页 → 问答吧 → 继续追问delphi调用C动态库问题

继续追问delphi调用C动态库问题

时间:2011-09-09

来源:互联网

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,而我的目标是要传入整个结构体数组。
我对数组、指针这些概念比较糊涂,上面程序基本是照葫芦画瓢写出来的,所以不知道什么地方存在问题,
还请大家帮忙看看程序该如何调整,谢谢!

作者: miaoyuli   发布时间: 2011-09-09


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;

 
 

作者: jingtuzhong   发布时间: 2011-09-09

热门下载

更多