C中结构体定义如下
typedef struct srcobj {
int line;
int objline;
char objtype[255];
char objname[255];
char data[7*1024 + 10];// 长度对齐
}pbsrc;
//s 为 srcobj s[500];
long __stdcall pb_search(char * src, char * regstr, srcobj * s) ;
pb中定义如下
type srcobj from structure
unsignedlong line
unsignedlong objline
char objtype[255]
char objname[255]
char data[7178]
end type
//这两种定义是正常的
function long pb_search(string s,string p ,ref blob s)library "easypj.dll"
function long pb_search(string s,string p ,ref srcobj s[] )library "easypj.dll"
// 下面两种定义插入的数据会是错误的
function long pb_search(string s,string p ,ref srcobj s)library "easypj.dll"
function long pb_search(string s,string p ,ref unsignedlong _srcobj_line)library "easypj.dll"
解释一下 ref srcobj s 和 ref unsignedlong _srcobj_line这种尝试的原因
在C语言中
srcobj s[500];
s == &s[0] == & s[0].line
//在c中这三种写法取到的指针都是结构体数组指向结构体数组s开始位置
在pb中则不是这样子的
/*
实例变量
blob ib_isobj
sobj isobj_t[500]
*/
//ib_isobj 指向 0x7f23003c 这个指向地址不会变化
c = this.pb_search(src, regstr, ib_isobj)//方式1
//ref isobj_t 指向 0x13a40040 每次都不一样
pb_search(src, regstr, ref isobj_t)//方式2
//ref isobj_t[1]指向 0x13a461d8 每次都不一样
pb_search(src, regstr, ref isobj_t[1])//无效方式1
//isobj_t[1].line 指向 0x0e7303f8 每次都不一样
pb_search(src, regstr, ref isobj_t[1].line)//无效方式2
1 无效方式1和无效方式2 都表名 ref isobj_t[1].line ,ref isobj_t[1] 和 ref isobj_t 指针完全不一样所以不能和c一样等效处理
2 针对方式2,传到c后指针会变化,这个说明传入到c中的结构体会发生内存拷贝操作,传入的是拷贝出来的数据。所以pb中数组存放和c并不一样,只是在调用的时候会生成一个和c一样的结构传入到动态库,调用完了后再把对应的数据同步会结构体上
所以 对结构体数组引用在pb中每次都会拷贝一份数据到内存不同的位置,并不是传的实例变量的原始指针。因为我这个场景下sobj这个结构体是比较巨大的,如果通过传递结构体指针的方式传递到c中每调用一次都会发生至少一次的内存拷贝这样是比较费时的所以方式1和方式2运行速度完全不可比,方式1只需要1秒能完成任务,方式二需要几分钟才能完成。