Entwickler-Ecke

Programmierwerkzeuge - Delphi 6 nach XE migrieren


Apo95 - So 16.02.14 01:35
Titel: Delphi 6 nach XE migrieren
Hallo,

ich habe versucht, ein altes Delphi6-Projekt unter XE5 zu kompilieren; allerdings werden dort fast alle Methoden, die unter Delphi 6 noch in Ordnung waren, als fehlerhaft dargestellt.

Anbei die fehlerhaften Methoden :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function IsNetworkConnected: Boolean;        
begin 
  if GetSystemMetrics(SM_NETWORK) AND $01 = $01 then 
    Result := True        
  else 
    Result := False; 
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
// IP-Adresse
function GetIpAddressByName(const Lines: TStrings; const AHost: String)
  : Boolean;
type
  PPInAddr = ^PInAddr;
var
  WSA: TWSAData;
  HostInfo: PHostEnt;
  Addr: PPInAddr;
begin
  Result := false;
  if WSAStartUp($101, WSA) = 0 then
  begin
    try
      HostInfo := getHostByName(PChar(AHost));
      Result := HostInfo <> nil;
      if Result then
      begin
        Addr := Pointer(HostInfo^.h_addr_list);
        if (Addr <> nilAND (Addr^ <> nilthen
        begin
          Repeat
            Lines.add(StrPas(inet_ntoa(Addr^^)));
            inc(Addr);
          Until Addr^ = nil;
        end;
      end;
    finally
      WSACleanup;
    end;
  end;
end;


und


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
// IP-Adresse (Ersatzmethode)
function GetIPFromHost(const HostName: string): string;
type
  TaPInAddr = array [0 .. 10of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
  GInitData: TWSAData;
begin
  WSAStartUp($101, GInitData);
  Result := '';
  phe := getHostByName(PChar(HostName));
  if phe = nil then
    Exit;
  pptr := PaPInAddr(phe^.h_addr_list);
  i := 0;
  while pptr^[i] <> nil do
  begin
    Result := inet_ntoa(pptr^[i]^);
    inc(i);
  end;
  WSACleanup;
end;


Kann es sein, dass sich die Sprache deutlich verändert hat?? Ich meine, dass gewisse Befehle veraltet sind, ist normal; dies kann die Fehler wohl kaum erklären... .

Ich könnte darüber Informationen brauchen.

LG,

Apo95


jaenicke - So 16.02.14 02:12

Du hast leider vergessen dazuzuschreiben was für Fehler kommen...

Abgesehen davon, dass es keinen Sinn macht das so umständlich zu schreiben funktioniert dein IsNetworkConnected problemlos bei mir mit XE5. Besser:

Delphi-Quelltext
1:
2:
3:
4:
function IsNetworkConnected: Boolean;
begin
  Result := GetSystemMetrics(SM_NETWORK) and $01 > 0;
end;

Und zu den anderen beiden Funktionen: Da reicht es doch sich anzuschauen was für ein Parameter erwartet wird und mit dem zu vergleichen was man angibt... steht doch deutlich da:
Zitat:
[dcc32 Fehler] Unit62.pas(39): E2010 Inkompatible Typen: 'PAnsiChar' und 'PWideChar'

Also castet man das halt auch auf den richtigen Typ:

Delphi-Quelltext
1:
GetHostByName(PAnsiChar(AnsiString(HostName)));                    

Das liegt einfach daran, dass Delphi nun Unicode kann und PChar nun PWideChar statt wie früher PAnsiChar ist. Es ist eben ein Metaty. (Ja, ich weiß, für Integer galt das auch mal, aber bei PChar wurde die Doku zumindest richtig umgesetzt.)


OlafSt - So 16.02.14 02:43

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
function IsNetworkConnected: Boolean;
begin
  Result := GetSystemMetrics(SM_NETWORK) and $01 > 0;
end;


Oha, das funktioniert ? Nicht das der Compiler wegen Operator-Rangfolge folgendes draus compiliert:

Delphi-Quelltext
1:
Result := GetSystemMetrics(SM_NETWORK) and ($01 > 0);                    


WasWeißDennIch - So 16.02.14 02:47

http://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Operatoren#Rangfolge_der_Operatoren