头文件中的声明如下:
extern "C" __declspec(dllexport) char* GetErr(int ErrNo);
我的引入如下:
function GetErr(ErrNo: integer): PChar; stdcall; external DLL_NAME;写了一个函数封装一下:
function getError(ErrNo: integer): String;
begin
  Result:= GetErr(ErrNo);
end;结果总是报access violation at 0xXXXXXXXXX:read of address 0xXXXXXXXXX的错误。为什么?

解决方案 »

  1.   

    你得问一下vc的开发人员,他们的返回值的内存空间是谁分配的???建议只有修改
    int GetErr(int ErrNo, char** Msg);引入:
    function GetErr(ErrNo: Integer; Msg: string): Integer;使用:
    var
      Msg: string;
    begin
      SetLength(Msg, 100);
      if GetErr(ErrNo, Msg) = 1 then
        ...
    end;
      

  2.   

    faint,写错了,少写了var,函数应该是
    function GetErr(ErrNo: Integer; var  Msg: string): Integer;
      

  3.   

    你用PChar,分配空间了么??
    出现access violation at 0xXXXXXXXXX:read of address 0xXXXXXXXXX的错误
    如果X为0,就是空指针调用;如果X大于0,就是指针已被释放,或者尚未分配
      

  4.   

    API里就是这么写的,我也没办法了,最初我也奇怪为什么直接返回char*,而不是通过参数。空间是分配了的:
    1 function getError(ErrNo: integer): String;
    2 var p: PChar;
    3 begin
    4   p:= GetErr(ErrNo);
    5   Result:= StrPas(p);
    6 end;在5设了断点,可以看到p里面是有值的。但这样还是出错。我后来干脆这么写了,还是不行。
    function getError(ErrNo: integer): String;
    var tmp: array of Char;
        p: PChar;
        i,len: Integer;
    begin
      p:=GetErr(isNo);
      len:= StrLen(p);
      SetLength(tmp,len);
      StrMove(@tmp[0],p,len);
      for i:=0 to len-1 do
        Result:= Result+tmp[i];  
    end;
      

  5.   

    如果可能,你可以把dll及函数原型发给我,我调试一下看看。
    [email protected]
      

  6.   

    function GetErr(ErrNo: integer): PChar; stdcall; external 'DLL_NAME.dll';
      

  7.   

    用这个函数试试
    function StrPas(const Str: PChar): string;
      

  8.   

    你看delphi的SysUtils的源码:function StrPas(const Str: PChar): string;
    begin
      Result := Str;
    end;
      

  9.   

    不要乱用stdcall;由于清栈者不同,就会导致异常发生function GetErr(ErrNo: integer): PChar; cdecl; external DLL_NAME;
    重函数原型看,如果提供的dll没有问题的情况下,该函数没有空间分配问题。最多也只能看看返回是否为NIL
      

  10.   

    今天让同事用vc做了一个最简单的例子,返回类型就是char*,然后我用pchar定义去接收,一点问题都没有,如果你调用完就出错了,那么还是查一下vc的代码吧。
      

  11.   

    仔细比较一下异同,extern "C" char* _stdcall Check(int a);
    我同事在声明的时候用了stdcall,如果不声明stdcall调用的时候会经常出问题的。
      

  12.   

    真的可能是VC代码的问题啊
    你查查VC代码啊
      

  13.   

    我开始写了一个类把它封装起来,就是不行,运行了另一个API后,连我类里的私有变量都改得乱七八糟了。现在直接用API,不封装了。虽然程序以后复用是不行了,但项目时间等不起。以后有时间再仔细看吧。谢谢大家!