我正在 Delphi XE2 编译我的应用程序。它是在 delphi 7。中开发的。我的代码如下:
type
Name = array[0..100] of PChar;
PName = ^Name;
var
HEnt: pHostEnt;
HName: PName;
WSAData: TWSAData;
i: Integer;
begin
Result := False;
if WSAStartup($0101, WSAData) <> 0 then begin
WSAErr := 'Winsock is not responding."';
Exit;
end;
IPaddr := '';
New(HName);
if GetHostName(HName^, SizeOf(Name)) = 0 then <-----ERROR
begin
HostName := StrPas(HName^);
HEnt := GetHostByName(HName^);
"
"
so on...
end;
当我尝试编译代码时,我收到以下错误:
当我在另一个应用程序中尝试此代码时,它在Delphi 7中正常工作。 如何将字符指针转换为 PAnsiChar 类型以使其在 Delphi XE2 上运行。
答案 0 :(得分:6)
我的德尔福知识可能有点生疏,但据我记得:
PChar(有点像,不完全是)指向字符串本身的指针,所以这种类型实际上是101个PChars(字符串)的数组:
Name = array[0..100] of PChar;
我认为您应该将其更改为array [0..100] of Char
,或者为什么不从一开始就将HName
声明为PAnsiChar
?
答案 1 :(得分:5)
这不是使用gethostname()
的正确方法。请改用:
var
HName: array[0..100] of AnsiChar;
HEnt: pHostEnt;
WSAData: TWSAData;
i: Integer;
begin
Result := False;
if WSAStartup($0101, WSAData) <> 0 then begin
WSAErr := 'Winsock is not responding."';
Exit;
end;
IPaddr := '';
if gethostname(HName, SizeOf(Name)) = 0 then
begin
HostName := StrPas(HName);
HEnt := gethostbyname(HName);
...
end;
...
end;
答案 2 :(得分:2)
if GetHostName(PAnsiChar(HName^), SizeOf(Name)) = 0
HostName := StrPas(PAnsiChar(HName^));
HEnt := GetHostByName(PAnsiChar(HName^));