dll 里的函数 如下:
function GetLocalIP(var AResult: PChar): Integer;
var
  wsaData       : TWSAData;
  IP            : String;
begin
  Result:= 0;
  IP := '';
  WSAStartup(257, wsaData);
  IP := inet_ntoa(PInAddr(GetHostByName(nil)^.h_addr_list^)^) ;
  WSACleanup;  ReallocMem(AResult,Length(IP)+ 1);
  StrCopy(AResult,PChar(IP));
  Result := 1;
end;应用中 form1 上按钮 调用: 
procedure TForm1.Button1Click(Sender: TObject);
var
  pStr: PChar;
  str : String;
begin
  try
    GetMem(pStr,64);
    GetLocalIP(pStr);
    Edit1.Text:= String(pStr);
  finally
    FreeMem(pStr);
  end;
end;结果正确, 单关闭窗口 form1 时报错 
access violation at ....: write of address 不知什么原因

解决方案 »

  1.   

    //你可以如下实验一下,估计可能是释放的问题。
    function GetLocalIP(var AResult: PChar): Integer;stdcall;export;
    var
      wsaData       : TWSAData;
      IP            : String;
    begin
      Result:= 0;
      IP := '';
      WSAStartup(257, wsaData);
      IP := inet_ntoa(PInAddr(GetHostByName(nil)^.h_addr_list^)^) ;
      WSACleanup;  ReallocMem(AResult,Length(IP)+ 1);
      StrCopy(AResult,PChar(IP));
      Result := 1;
      IP.Free;//是否需要释放啊!???
    exports
      GetLocalIP;
    end;
      

  2.   

    GetMem(pStr,64);//如果分配的内存比实际需要的大没问题,小了就不行了啊!
      

  3.   

    没有 ReallocMem(AResult,Length(IP)+ 1); 不会报错而且dll外调用 
      try
        GetMem(pStr,64);
        GetLocalIP(pStr);
        Edit1.Text:= String(pStr);
      finally
        FreeMem(pStr);
      end;// FreeMem(pStr); 释放也没有报错  而 关闭窗口时 报错了  肯定是内存释放时哪里不对
    因为 GetLocalIP(pStr); 调用以前 分配的内存 不一定够用 所以在 dll 里边 
    ReallocMem(AResult,Length(IP)+ 1);  重新分配内存的  这样做不知对不对  
    这种情况 不知如何处理??
      

  4.   

    老兄!照我的改:
    function GetLocalIP(AResult: PChar): Integer;stdcall;
    var
      wsaData       : TWSAData;
      IP            : shortString;
    begin
      Result:= 0;
      IP := '';
      WSAStartup(257, wsaData);
      IP := inet_ntoa(PInAddr(GetHostByName(nil)^.h_addr_list^)^) ;
      WSACleanup; // ReallocMem(AResult,Length(IP)+ 1);
      //StrCopy(AResult,IP);
      //strpcopy(AResult,IP);
      Result := 1;
    //在调用该dll时:
    function GetLocalIP(AResult: PChar): Integer;stdcall;external'project2.dll';
    procedure TForm1.Button1Click(Sender: TObject);
    var result:integer;
        p:array[0..128]of char;
    begin
      result:=GetLocalIP(p);
      if result=1 then
         edit1.text:=p
      else
        showmessage('有错');
    end;
      

  5.   

    不好意思:刚刚有个小小的致命错误://strpcopy(AResult,IP);不应该屏蔽 !好的!我已经帮你简单调试过了,没问题的!好运!
      

  6.   

    我覺得可能問題是出在
    ReallocMem(AResult,Length(IP)+ 1);
    你干脆在第一次 
    GetMem(pStr,64) 時取大點, 試試!!
      

  7.   

    強烈建議寫Dll時不要使用string!
    除了Delphi沒人認識這個數據類型。還是用PChar好,就像不用register 而用stdcall 一樣。如果一定要用的話,ShareMem 一定要在uses 子句的第一位。
      

  8.   

    如果一定要用的話,ShareMem 一定要在uses 子句的第一位。
    不僅在Dll 中要放在第一位,
    而且在調用它的程序里也要放在第一位!這樣,兩小伙才可共產共妻。啊,哈哈哈......