DLL文件内容:
library hos_function;
... ...
uses
  SysUtils,
  Classes;
 function GetNumFromStr(const str: String;const hex:boolean=false):String;stdcall ;
... ...
end;
exports
GetNumFromStr ;//index 1 name 'get' resident;{$R *.res}begin
end.调用DLL文件的内容:
... ...
  public
    end;
  function GetNumFromStr(const str: String;const hex:boolean=false): String;stdcall;external 'hos_function.dll' ;
var
  Form1: TForm1;
implementation
{$R *.dfm}
 procedure TForm1.Button1Click(Sender: TObject);
begin
    showmessage(  GetNumFromStr(self.Edit1.Text)) ;
end;
end.
问题:
联系调用时,DLL中的函数可以执行,但总要报“access violation at address 00232347 in module "hos_function.all".
read of address ooggd698”的错误!
求解决办法!!

解决方案 »

  1.   

    去掉Const 和 默认值看看
      

  2.   

    把函数体写出来。
    //建议这样试试看
    var str: String;
      str := GetNumFromStr(self.Edit1.Text);
      showmessage(str);
      

  3.   

    别用STRING了,用PCHAR,这个问题回答不知道多久了;
      

  4.   

    Dll接口中不能使用String,会有错误access violation at XXX 的
    改为PChar指针,内部可以使用String,接口一定不行,
    改为
    function GetNumFromStr(str: PChar;const hex:boolean=false):PChar;stdcall ;
      

  5.   

    接口使用string其实是可以的(delphi写delphi调用),使用Pchar不过是为了和C等的类型进行兼容转换。
    搂主的错误估计不在这里。为什么不调试一下呢?
      

  6.   

    推荐还是使用PChar,虽然String也可以,但会有内存访问错误,这确实对。
      

  7.   

    在dll 中一定要用成pchar的不能用string的因为它们是二个不同的格式。
      

  8.   

    DLL中的函数如下:
    function GetNumFromStr(const str: String;const hex:boolean=false):string;stdcall ;
    var
     i:integer;
     charset:Set of char;
    begin
    if hex then
     charset:=['0'..'9','a'..'f','A'..'F','.']
    else
     charset:=['0'..'9','.'];
    for i := 1 to Length(str) do
      begin
        if (str[i] in charset) then
          result:= result + uppercase(str[i]);  end;
    end;
    返回值改为PCHAR后,报" result:= result + uppercase(str[i]);"的错误为“Incompatible types: 'String' and 'PChar'”我该怎么修改这个函数!
      

  9.   

    Delphi中Dll中如果使用String而没有包含Share????.pas那个单元就会有内存访问错误
      

  10.   

    包含Sharemem.pas单元,在软件发布的时侯也把borlndmm.dll(好像是这样写)也一并发不。
      

  11.   

    如果用String,在DLL文件和引用的TForm1那个单元uses部分的最前面都加上uses ShareMem即可;
      

  12.   

    var s:string;p:pchar;
    begin
    ....// do some code to initialize p
    s:=string(p)// type convertionend;
      

  13.   

    如果字符串不是很长的话,用ShortString也可以
      

  14.   

    包含Sharemem.pas单元后,函数的调用没问了!
    但是,在关闭窗体时,又报内存地址错误!
    为什么?
    各位大哥帮帮忙!!!
      

  15.   

    for i := 1 to Length(str) do//
    ...
    这一行里如果str是string 类型的话下标是:0----->length(str)-1,(如果你的string是AnisString而不是ShortString)所以可能里面的str[i]访问越界了吧.
      

  16.   

    Dll接口中不能使用String,会有错误access violation at XXX 的
    改为PChar指针,内部可以使用String,接口一定不行,
    改为
    function GetNumFromStr(str: PChar;const hex:boolean=false):PChar;stdcall ;