dll函数说明:
Read_Iodata(Sy_id,Iodata)
功能:读取进出资料
参数:Sy_id:控制器地址(2 字节字符串)
返回:a.返回整型值  0-表示成功,4-表示失败。
      b.Iodata:进出资料(45位字符)我在delphi中的声明:function Read_Iodata(sy_id:string;iodata:array of char):Shortint;stdcall; external 'syris.dll' name 'Read_Iodata';
//首先写了一个函数ReadIoData,在这个函数中调用dll中的Read_Iodata函数:
function TForm1.ReadIoData(sy_id: string): string;
 var
  str_IOData:array[1..45] of char;
  str1:string;
  //int_result:Integer;
begin  if Read_IoData(sy_id,str_IOData)=0 then
      begin
         result:=string(PChar(@str_IOData));
      end
      else
      begin
        result:='';
      end;
end;然后我在按钮事件中调用:
procedure TForm1.Btn_ReadIODataClick(Sender: TObject);
var
  str_data:string;    
begin  
  str_data:=ReadIodata(Edit_Controler.Text);
  if str_data='' then
  begin
    Edit_IOData.Text:='Read Error!';
 end
 else
 begin 
    Edit_IOData.Text:=str_data;
 end
end;//为什么执行到  Edit_IOData.Text:=str_data; 会出现"access violation at 0x4d8dd88b:read of address 0x4d8dd88b" 错误呢,请高手指导一下,在线等...
还有一个奇怪的现象,就是我把 Edit_IOData.Text:=str_data; 改成 form1.Edit_IOData.Text:=str_data; 错误就消失了,但是再加上别的语句就又有错误了,???

解决方案 »

  1.   

    有无uses Sharemem 单元, DLL接口函数的参数最好不要用string类型
      

  2.   

    不用string用Pchar吗,数据类型不对啊
      

  3.   

    按下面的方式修改一下试试:申明改成:
    function Read_Iodata(sy_id, iodata:PChar):Shortint;stdcall; external 'syris.dll' name 'Read_Iodata';ReadIoData函数改成:
    function TForm1.ReadIoData(sy_id: string): string;
    var
      str_IOData: String;
    begin
      Result := '';
      SetLength(str_IOData, 46);
      if Read_IoData(PChar(sy_id), PChar(str_IOData)) = 0 then
        Result := String(PChar(str_IOData));
    end;
      

  4.   

    PChar和array of char一样的麽!接口调用传递指针还是比较好使的。
      

  5.   

    谢谢大家了,问题解决!特别感谢jadeluo(秀峰) ,o(∩_∩)o...哈哈