我需要调一个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的语法不是很清楚。客户已经到了,老板不停的催:(

解决方案 »

  1.   

    type
      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;
      

  2.   

    应该和C的含义一样的。谢谢.不过有两个问题不太明白external "xxx.dll";是指连接DLL吧。如果我有library"xxx.dll"就不需要了吧?还有,这样写法中WriteData(Data: PWriteData):返回值一定要是LongBool吗?因为DLL里对应函数是BOOL,BOOL和LongBool有区别吗?
      

  3.   

    还有,我现在编译没有问题
    但运行时,会出现Access violation at address 00000300.Read of address 00000001.
    类似的报错
    实际上该程序数组的第一个元素是端口地址,第二个是向该端口里写的控制字。
    我的数组类型是LongWord,赋的值是十六进制$300,是不是我的类型用的不对,太长了
    把数据类型改为Word