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 不知什么原因
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 不知什么原因
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;
try
GetMem(pStr,64);
GetLocalIP(pStr);
Edit1.Text:= String(pStr);
finally
FreeMem(pStr);
end;// FreeMem(pStr); 释放也没有报错 而 关闭窗口时 报错了 肯定是内存释放时哪里不对
因为 GetLocalIP(pStr); 调用以前 分配的内存 不一定够用 所以在 dll 里边
ReallocMem(AResult,Length(IP)+ 1); 重新分配内存的 这样做不知对不对
这种情况 不知如何处理??
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;
ReallocMem(AResult,Length(IP)+ 1);
你干脆在第一次
GetMem(pStr,64) 時取大點, 試試!!
除了Delphi沒人認識這個數據類型。還是用PChar好,就像不用register 而用stdcall 一樣。如果一定要用的話,ShareMem 一定要在uses 子句的第一位。
不僅在Dll 中要放在第一位,
而且在調用它的程序里也要放在第一位!這樣,兩小伙才可共產共妻。啊,哈哈哈......