继续追问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,而我的目标是要传入整个结构体数组。
我对数组、指针这些概念比较糊涂,上面程序基本是照葫芦画瓢写出来的,所以不知道什么地方存在问题,
还请大家帮忙看看程序该如何调整,谢谢!
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28