Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Ältere Funktion mit inkompatiblen Typen PAnsiChar (https://www.delphipraxis.net/169951-aeltere-funktion-mit-inkompatiblen-typen-pansichar.html)

Jonas Shinaniganz 22. Aug 2012 10:47

Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Ich habe folgende Funktion zum ermitteln der Lokalen IP Adresse ausgegraben:

Delphi-Quellcode:
function GetLocalIP: Integer;
type
  PaPInAddr = ^TaPInAddr;
  TaPInAddr = array[0..$FFFE] of PInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer : array[0..MAXGETHOSTSTRUCT - 1] of Char;
  I: Integer;
begin
  Result := -1;
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(Buffer);
  if phe = nil then Exit;
  pptr := PaPInAddr(Phe^.h_addr_list);
  I := 0;
  while pptr^[I] <> nil do
  begin
    Result := pptr^[I]^.S_addr;
    Inc(I);
  end;
end;
Ich weiß nicht genau welchen Datentyp Buffer annehmen muss damit die Funktionalität erhalten bleibt... Ich wollte aus Buffer einen PAnsiChar machen aber dann wird phe = nil durch die fehlgeschlagene GetHostByName Funktion... (Welche ja auch schon veraltet ist)

s.h.a.r.k 22. Aug 2012 10:55

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Bei mir schaut es wie folgt aus:
Delphi-Quellcode:
function GetComputerName(): string;
var
  Size: DWORD;
begin
  Size := MAX_COMPUTERNAME_LENGTH + 1;
  SetLength(Result, Size);
  if (not Winapi.Windows.GetComputerName(PChar(Result), Size)) then
    RaiseLastOSError();
  SetLength(Result, lstrlen(PChar(Result));
end;

function GetIpAddresses(): TArray<string>;
const
  PPInAddr = ^PInAddr;
var
  wsaData: TWSAData;
  HostInfo : PHostEnt;
  HostName : Array[0..255] of AnsiChar;
  Addr: PPInAddr;
  n : Integer;
begin
  SetLength(Result, 0);
  if (WSAStartup($0101, wsaData) = 0) then
  begin
    try
      HostName := '';
      if (Winapi.Winsock.GetHostName(@HostName, SizeOf(HostName)) = 0) then
      begin
        HostInfo := GetHostByName(@HostName);
        if (Assigned(HostInfo)) then
        begin
          Addr := Pointer(HostInfo^.h_addr_list);
          if (Assigned(Addr)) and (Assigned(Addr^)) then
          begin
            n := 0;
            while (Addr^ <> nil) do
            begin
              Inc(Addr);
              Inc(n);
            end;

            Addr := Pointer(HostInfo^.h_addr_list);
            SetLength(Result, n);
            n := 0;
            while (Addr^ <> nil) do
            begin
              Result[n] := string(inet_ntoa(Addr^^));
              Inc(n);
              Inc(Addr);
            end;
          end;
        end;
      end;
    finally
      WSACleanup();
    end;
  end;
end;
Der Code für das Auslesen der IP-Adressen ist nicht von mit und ich weiß auch leider nicht mehr woher ich ihn habe. Habe ihn gerade auch abgetippt, von dem her hoffe ich mal, dass alles korrekt und vollständig ist.

Klaus01 22. Aug 2012 10:59

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Wieso willst Du jetzt aus dem Buffer ein Pointer Array machen.
Denn pAnsiChar ist ein Pointer.

Versuche char mal durch ansiChar zu ersetzen.

Grüße
Klaus

himitsu 22. Aug 2012 11:12

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1179312)
Ich weiß nicht genau welchen Datentyp Buffer annehmen muss damit die Funktionalität erhalten bleibt...

Schau ins MSDN und du siehst, daß es z.B. GetHostName nur als ANSI gibt, also was wird man da wohl nehmen müssen?
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1179312)
Ich wollte aus Buffer einen PAnsiChar machen aber dann wird phe = nil durch die fehlgeschlagene GetHostByName Funktion... (Welche ja auch schon veraltet ist)

Wie wäre es, wenn du mal die Fehlermeldungen auswertest und dir sagen läßt, was die Funktione(n) zu meckern haben?
Es gibt nicht umsonst die Abschnitte "Return value" und "Remarks".

Jonas Shinaniganz 22. Aug 2012 11:16

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Zitat:

Versuche char mal durch ansiChar zu ersetzen.
Okay die Funktion ist damit behoben und erstellt alles wie vorher. Ich wollte ja auch keinen Pointer of AnsiChar Array sondern einen AnsiChar Array. Danke.

Ich habe hier eine ältere ICQ lib gezogen weil Ich versuchen wollte die pas files mit IntraWeb zu benutzen (hat mich intressiert) : http://heanet.dl.sourceforge.net/pro...q_20040630.zip

Leider verbindet die DemoAnwendung welche mit dabei ist trotzdem nicht. Naja... Dann mach Ichs mit meinem eigenen kleinen Chat tool, jedenfalls wüsste Ich jetzt nicht wo Ich in den paar tausend Zeilen nen Fehler finden sollte zumal ich mich überhaupt nicht mit der API auskenne oder sonderlich viel Zeit aufbringen mag.

Hat jemand von euch ansonsten ne funktionierende Demo dafür?

Vielen Dank auch an shark,

Grüße

himitsu 22. Aug 2012 11:38

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Die alte Lib, mit einem alten Delphi (bis D2007) compiliert, funktioniert?

ICQ und Co. ändern abundzu mal ihre Protokolle, weswegen die Libs abundzu auch mal angepaßt werden müßten.

Jonas Shinaniganz 22. Aug 2012 14:17

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Ja die lib funktioniert. In Xe2 läuft alles und die Demo startet ohne Fehler. Ich habe ca 30 Warnungen und wenn Ich mit meiner ID verbinde kommt keine Fehlermeldung oder sonstiges sondern als Status: Verbindung fehlgeschlagen. Den Server habe Ich auch 1-2 mal gewechselt ohne Erfolg. Ich glaube nicht das sich am grundsätzlichen Protokoll (OSCAR) viel ändert. Die erweiterten ICQ Funktionen brauche Ich eh nicht... leider ist das ICQ Thema auch scheinbar schon etwas länger vom Tisch.

Jonas Shinaniganz 23. Aug 2012 07:35

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Zitat:

Schau ins MSDN und du siehst, daß es z.B. GetHostName nur als ANSI gibt, also was wird man da wohl nehmen müssen?
Ich schaue immer in die Delphi Hilfe, welche Ich auf dem aktuellsten Stand habe, um etwas nachzusehen und dort steht zu gethostname:
Zitat:

int gethostname(
char* name,
int namelen
);
Obwohl bei char ein Sternchen ist, wird weiter nichts im Artikel dazu angemerkt...

Zitat:

Es gibt nicht umsonst die Abschnitte "Return value" und "Remarks".
Wo sehe Ich denn diese Abschnitte? Return value ist ja warscheinlich der mommentane Rückgabewert und Remarks sagt mir garnichts.


Zitat:

Die alte Lib, mit einem alten Delphi (bis D2007) compiliert, funktioniert?
Die Lib compiliert mit Warnungen unter XE2, funktionieren tut sie nicht, jedenfalls kann die Demo keine Verbindung herstellen.

s.h.a.r.k 23. Aug 2012 07:47

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1179448)
Zitat:

Schau ins MSDN und du siehst, daß es z.B. GetHostName nur als ANSI gibt, also was wird man da wohl nehmen müssen?
Ich benutze immer in die Delphi Hilfe, welche Ich auf dem aktuellsten Stand habe, um etwas nachzusehen [...]

Nimm hin und wieder doch das MSDN zum Nachlesen. Ist meist aktueller, hat Kommentare und da stehen hin und wieder nützliche Dinge unter Remarks ;)

Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1179448)
und dort steht zu gethostname:
Zitat:

int gethostname(
char* name,
int namelen
);
Obwohl bei char ein Sternchen ist, wird weiter nichts im Artikel dazu angemerkt...

Der Stern gehört zur C-Syntax und sagt nur, dass die Methode einen Zeiger auf einen String übergeben haben will, d.h. in Delphi nutzt du einen PChar. Das Ding hat nichts mit Fussnoten zu tun. Im Code wirst du auch selten Fussnoten finden, sondern immer nur Kommentare und die sind direkt da, wo sie hingehören.

Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1179448)
Zitat:

Es gibt nicht umsonst die Abschnitte "Return value" und "Remarks".
Wo sehe Ich denn diese Abschnitte? Return value ist ja warscheinlich der mommentane Rückgabewert und Remarks sagt mir garnichts.

Die siehst du im MSDN ;)

Jonas Shinaniganz 23. Aug 2012 08:42

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar
 
Okay alles klar! Ich hab doch wirklich gedacht, dass das MSDN mit in der Delphi-Hilfe verwurschtelt ist und browse grade ein bisschen durch die WebSite. Ich werd das Gefühl nicht los das mich Himitsu jetzt für blöd hält :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz