我需要调一个C的动态连接库,里有一个函数,形式为WriteData(DWORD pData[2])
在VC写的应用程序中,对数组pData的两个元素赋值后,直接执行语句WriteData(pData),便可以将pData数组的两个元素送入该函数。现在要用delphi调一个C的动态连接库。
不知道delphi里有没有向C一样的使用方式(WriteData(pData)),就可以将一个数组的两个元素传给函数。我在应用程序中是这样写的
type
WriteDataISA=ARRAY [1..2] OF LongWord;
var
WData;WriteDataISA;
在函数中,声明函数类型为
TWriteFunc=function(WData;WriteDataISA):Bool;stdcall;
然后通过打开DLL,找到相关函数等一系列的操作,
最终用函数TWData对应了C写的DLL里的WriteData(DWORD pData[2]);
我在Delphi写的应用程序中
直接写了
WData[1]=$300;
WData[2]=$01;
TWData(WData);
编译可以通过,但一运行就告诉我
Access violation at address 00457C02 in module 'project1.exe',write of address 00000001我不知道我的这种用法对吗?能将一个数组的两个元素顺序传给函数吗?
因为编译通过,TWData(WData)的含义又是什么?
我是学C的,对delphi的语法不是很清楚。客户已经到了,老板不停的催:(
在VC写的应用程序中,对数组pData的两个元素赋值后,直接执行语句WriteData(pData),便可以将pData数组的两个元素送入该函数。现在要用delphi调一个C的动态连接库。
不知道delphi里有没有向C一样的使用方式(WriteData(pData)),就可以将一个数组的两个元素传给函数。我在应用程序中是这样写的
type
WriteDataISA=ARRAY [1..2] OF LongWord;
var
WData;WriteDataISA;
在函数中,声明函数类型为
TWriteFunc=function(WData;WriteDataISA):Bool;stdcall;
然后通过打开DLL,找到相关函数等一系列的操作,
最终用函数TWData对应了C写的DLL里的WriteData(DWORD pData[2]);
我在Delphi写的应用程序中
直接写了
WData[1]=$300;
WData[2]=$01;
TWData(WData);
编译可以通过,但一运行就告诉我
Access violation at address 00457C02 in module 'project1.exe',write of address 00000001我不知道我的这种用法对吗?能将一个数组的两个元素顺序传给函数吗?
因为编译通过,TWData(WData)的含义又是什么?
我是学C的,对delphi的语法不是很清楚。客户已经到了,老板不停的催:(
TWriteDataISA = ARRAY [0..1] OF LongWord;
PWriteDataISA = ^WriteDataISA;function WriteData(Data: PWriteData): LongBool; stdcall; external "xxx.dll"; // LongBool对应BOOLvar
WData; TWriteDataISA;
begin
WData[1]=$300;
WData[2]=$01;
WriteData(@WData);
end;
但运行时,会出现Access violation at address 00000300.Read of address 00000001.
类似的报错
实际上该程序数组的第一个元素是端口地址,第二个是向该端口里写的控制字。
我的数组类型是LongWord,赋的值是十六进制$300,是不是我的类型用的不对,太长了
把数据类型改为Word