AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Ältere Funktion mit inkompatiblen Typen PAnsiChar
Thema durchsuchen
Ansicht
Themen-Optionen

Ältere Funktion mit inkompatiblen Typen PAnsiChar

Ein Thema von Jonas Shinaniganz · begonnen am 22. Aug 2012 · letzter Beitrag vom 23. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 10:47
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)
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 10:55
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (22. Aug 2012 um 11:04 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 10:59
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 11:12
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?
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".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#5

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 11:16
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
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 11:38
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#7

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 22. Aug 2012, 14:17
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#8

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 23. Aug 2012, 07:35
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (23. Aug 2012 um 08:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 23. Aug 2012, 07:47
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

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:
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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#10

AW: Ältere Funktion mit inkompatiblen Typen PAnsiChar

  Alt 23. Aug 2012, 08:42
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
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:59 Uhr.
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