关于dll指针传递问题,真的不知道是怎么回事情了。如果解决500分 ( 积分: 200 )

Z

zywcd

Unregistered / Unconfirmed
GUEST, unregistred user!
Cvi动态库的函数说明:
int Pack(int16 *pData);
参数:pdata是数组指针,用于存放读取的数据;
在DELPHI中测试的情况。
第一次:
type tIDTS_Pack=function(data:array of smallint):integer;
stdcall;
var data:array of smallint;
setlength(data,262144);
IDTS_Pack(data);
结果:运行出错,无数据返回。
第二次:
Type tdata=array of smallint;
type tIDTS_Pack=function(data:tdata):integer;
stdcall;
var data:tdata;
setlength(data,262144);
IDTS_Pack(data);
结果:运行出错,无数据返回。
第三种:
type tIDTS_Pack=function(data: variant):integer;
stdcall;
var data: variant;
data:= VarArrayCreate([0,262144], varSmallint);
IDTS_Pack(data);
结果:运行不出错,无数据返回。
 
Cvi动态库的函数说明:
int Pack(int16 *pData);
参数:pdata是数组指针,用于存放读取的数据;
在DELPHI中测试的情况。
第一次:
type tIDTS_Pack=function(data:array of smallint):integer;
stdcall;
var data:array of smallint;
setlength(data,262144);
IDTS_Pack(data);
结果:运行出错,无数据返回。
第二次:
Type tdata=array of smallint;
type tIDTS_Pack=function(data:tdata):integer;
stdcall;
var data:tdata;
setlength(data,262144);
IDTS_Pack(data);
结果:运行出错,无数据返回。
第三种:
type tIDTS_Pack=function(data: variant):integer;
stdcall;
var data: variant;
data:= VarArrayCreate([0,262144], varSmallint);
IDTS_Pack(data);
结果:运行不出错,无数据返回。
 
在C中数组指针就是数组首地址
所以在调用C函数的时候,应该传数组的地址
修改一下第一种方法,楼主试一下
type tIDTS_Pack=function(data:array of smallint):integer;
stdcall;
var data:array of smallint;
setlength(data,262144);
IDTS_Pack(@data);
//@是取地址
 
Cvi动态库的函数说明:
int Pack(int16 *pData);
1.请确认C中编译的压占是stdcall 还是 cdecl (比如vc默认情况不是stdcall)
2.delphi中声明:以cdecl为例
可以 tIDTS_Pack=function(var a:smallint):integer;
cdecl;
或者 tIDTS_Pack=function(a:psmallint):integer;
cdecl;
 
确认是使用的STDCALL调用。
现在我这样,
type tIDTS_Pack=function(data:psmallint):integer;
stdcall;
var data: array of smallint
setlength(data,262144);
IDTS_Pack(data);
运行不出错,但是还是无返回数据,现在还在找是我的程序出错,还是其他原因。
 
问题是A/D卡驱动程序的原因。DLL问题,和DELPHI程序代码无关。
多谢二位,一人100分。
 
多人接受答案了。
 
顶部