【问题标题】:Delphi XE2 incompatible types pointer and PAnsiCharDelphi XE2 不兼容类型指针和 PAnsiChar
【发布时间】:2012-06-06 10:54:30
【问题描述】:

我正在 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 上运行??。

【问题讨论】:

  • 错误出现在哪一行?
  • 我刚才标记为ERROR...

标签: delphi delphi-xe2


【解决方案1】:

我的 Delphi 知识可能有点生疏,但据我所知:

PChar 是(有点像,不完全是)一个指向字符串本身的指针,所以这个类型实际上是一个由 101 个 PChars(字符串)组成的数组:

Name = array[0..100] of PChar;

我认为您应该将其更改为array [0..100] of Char,或者为什么不从一开始就将HName 声明为PAnsiChar

【讨论】:

  • 如果我将它声明为 char 数组,那么它会给出相同的错误。如果 HName 被声明为 PAnsiChar,那么它会显示“不兼容的类型:PAnsiChar 和 AnsiChar”。
【解决方案2】:

这不是使用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;

【讨论】:

  • 哦,好吧...我做了更改...非常感谢:)
【解决方案3】:

是的……我明白了:) 我将 HName 声明为 HName:PAnsiChar;

if GetHostName(PAnsiChar(HName^), SizeOf(Name)) = 0 
HostName := StrPas(PAnsiChar(HName^)); 
HEnt := GetHostByName(PAnsiChar(HName^));     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多