如何用DELPHI调用并取得VC中的VOID类型的函数返回值 急急急!!!!!(200分)

  • 主题发起人 主题发起人 一剑封喉
  • 开始时间 开始时间

一剑封喉

Unregistered / Unconfirmed
GUEST, unregistred user!
现用delphi调用vc编写的一个动态连接库中的void类型函数,
在该函数中返回一个结构指针,
如何取得该指针(p_fieldItem)所指的值.

该函数如下:
void test(int handle,FIELD_ITEM *p_fieldItem);

typedef struct _DB_FIELD_ITEM
{
long field_Name[5];
long field_Type;
} FIELD_ITEM;


 
照着c的代码声明结构体,把结构体变量的地址传进去就是了
 

TDB_FIELD_ITEM = record
field_Name[5],
field_Type: integer
end;

procedure test(handle:integer
var p_fieldItem: TDB_FIELD_ITEM);



 
申明:
type
FIELD_ITEM = record
field_Name : array[0..5] of Longint;
field_Type : Longint;
end;
pFIELD_ITEM = ^FIELD_ITEM;

写原型:
procedure test(Hander: Integer
var p_fieldItem : pFIELD_ITEM);

没有调试过,也不知道对不对:)
 
:iamcaca兄,你说的到和我想的一样,可是当用一个指针来取值的时候,程序就会报错,
我是这样做的
pFIELD_ITEM = ^FIELD_ITEM;
getmem(pFIELD_ITEM,10000);
test(Hander, pFIELD_ITEM);
当执行到test的时候就会出错。说内存地址错误以及动态库错误,请各位多多指教


 
type
FIELD_ITEM = record
field_Name : array[0..4] of Longint;//试试是否应该为4
field_Type : Longint;
end;
pFIELD_ITEM = ^FIELD_ITEM;

写原型:
procedure test(Hander: Integer
var p_fieldItem : pFIELD_ITEM)
stdcall//这个很重要哦。

调的时候这样写
getmem(pFIELD_ITEM,sizeof(FIELD_ITEM);

 
同意shangshang
>>stdcall
 
同意shangshang的意见。
type
FIELD_ITEM = record
field_Name : array[0..5] of Longint;
field_Type : Longint;
end;
pFIELD_ITEM = ^FIELD_ITEM
>>声明一个指向结构FIELD_ITEM类型的指针类型。
这个类型用来定义指针。
procedure test(Hander: Integer
var p_fieldItem : pFIELD_ITEM)
stdcall
>>这个关键字是非常重要的,它告诉Delphi采用
windows的方式(c++方式)的调用约定。
而不是默认的register方式的调用约定
(虽然register调用约定在delphi中更高效,也很先进)

getmem(pFIELD_ITEM,sizeof(FIELD_ITEM)+1)
>>这个sizeof是一般的习惯性写法。
在其后加一是防止内存泄漏。
分配出足够的空间来。


 
procedure test(Hander: Integer
[red]var[/red] p_fieldItem : [red]pFIELD_ITEM[/red])
stdcall;
既然有了var为什么还要传指针?
 
对对对,是我错了。楼上指正的好。
有了var就不该再传指针了。应该这样。

type
_DB_FIELD_ITEM = record
field_Name : array[0..4] of Longint;//试试是否应该为4
field_Type : Longint;
end;
var
FIELD_ITEM:_DB_FIELD_ITEM;

写原型:
procedure test(Handle: Integer
var p_fieldItem : _DB_FIELD_ITEM)
stdcall//这个很重要哦。

调的时候这样写,不必再手工分配内存了。
test(aHandle,FIELD_ITEM);

试试吧。
 
procedure test(handle:integer
var fieldItem: TDB_FIELD_ITEM);
或者
procedure test(handle:integer
p_fieldItem: PDB_FIELD_ITEM);
选择其中之一
 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部