AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mit PChar arbeiten

Ein Thema von Pseudemys Nelsoni · begonnen am 23. Jun 2004 · letzter Beitrag vom 23. Jun 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#11

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 14:49
Werd ich machen mathis, danke für die mühe . Ging mir da nur mehr ums Prinzip wie das mit dem #0 zeichen ist.

Achja, eine weitere Frage habe ich und zwar...PChar kann man ja "einfach so" deklarieren und benutzen, richtig? (scheint ja so)
Wozu gibt es denn Beispiele wie diese hier(aus der Delphi-Hilfe):

Delphi-Quellcode:
var

  F: file;
  Size: Integer;
  Buffer: PChar;
begin
  AssignFile(F, 'test.txt');
  Reset(F, 1);
  try
    Size := FileSize(F);
    GetMem(Buffer, Size);
    try
      BlockRead(F, Buffer^, Size);
      ProcessFile(Buffer, Size);
    finally
      FreeMem(Buffer);
    end;
  finally
    CloseFile(F);
  end;

end;
ich meine wozu ist da Getmem gut wenns auch ohne geht?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#12

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 14:58
Das ist anders gemeint -

Wenn du bspw. mit DLLs arbeiten willst/musst, die aber Strings als Parameter erwarten, dann ist normalerweise diese "ShareMem"-Unit notwendig. (War doch so, @all?) Jedenfalls kannst du die Parameter aber auch als "pchar" deklarieren, weil du dann ja keinen Speicher erzeugst, sondern (vereinfacht ausgedrückt; die Profis mögen es mir nachsehen) weil du auf den Speicherbereich der übergebenen "Strings" zugreifst.

Aus dem Grund brauchst du in so einem Fall:
Delphi-Quellcode:
procedure ShowMe(const p: pchar);
begin
  MessageBox(0,p,nil,0);
end;

var
  ca : array[0..MAX_PATH]of char;
  s : string;
begin
  ca := 'Hallo, Welt!';
  ShowMe(ca);

  s := 'Hallo, Welt!';
  ShowMe(pchar(s));
end.
keinen Speicher deklarieren, weil ja der pchar (Muetze1 sagte es schon) ein Zeiger auf das Zeichenarray ist.

Anders sieht es aus, wenn du in deinem Programm mit einem PChar arbeiten willst/musst, bspw. wenn du vorher nicht weißt ob ein
  ca : array[0..MAX_PATH]of char; ausreichen wird. Denke bspw. an "GetWindowsDirectory". Diese Funktion liefert, wenn der Puffer zu klein ist, die Anzahl der benötigten Bytes (= Zeichen) zurück. Nach dem Muster funktioniert ja auch die von mir weiter oben gepostete Funktion, die den "%windir%\help"-Ordner zurückliefert - nur, dass ich dort anstelle des PChar eben den String (Result) benutzt habe.

In so einem Fall musst du den Speicher(bereich) mit "GetMem" erzeugen, sonst ist deine PChar-Variable nur ein Pointer, und jeder Versuch, sie zu verwenden oder mit Inhalt zu füllen, hat einen Fehler zur Folge.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#13

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 15:08
Gut erklät, danke sehr
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#14

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 15:26
Ich danke dir.
Hier ist so ein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  p : pchar;
  dwLen : dword;
begin
  // folgender Witz: Wenn der Puffer zu klein ist, dann
  // liefert "GetWindowsDirectory" die erforderliche
  // Größe zurück, DAS #0-ZEICHEN EINGESCHLOSSEN ...
  dwLen := GetWindowsDirectory(nil,0);
  if(dwLen > 0) then
  begin
    GetMem(p,dwLen);
    try
      ZeroMemory(p,dwLen);

      // ... da der Puffer nun groß genug ist, liefert
      // die Funktion die Anzahl der kopierten Zeichen
      // zurück, die abschließende #0 diesmal NICHT
      // eingeschlossen (deswegen "dwLen - 1")
      if(GetWindowsDirectory(p,dwLen) = dwLen - 1) and
        (p[0] <> #0) then
      MessageBox(0,p,nil,0);
    finally
      FreeMem(p);
    end;
  end;
end;
Wenn du da mal das Erstellen des Speichers weglässt, dann kracht´s ...
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#15

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 15:36
So ein Beispiel habe ich gebraucht, ich glaube ich verstehe es hehe 8)

Danke nochmal für das schreiben des Codes
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#16

Re: Mit PChar arbeiten

  Alt 23. Jun 2004, 16:32
Hier hast du noch ein Beispiel (dann hör ich aber auch auf, dich zu nerven) aus der Rubrik: "Es ist zwar ein PChar, aber ..." -

Die Funktion [msdn]"InternetCrackUrl"[/msdn] zerlegt einen Grafen () in seine Bestandteile; sprich: Host, Schema, usw. Die entsprechenden Membervariablen sind zwar als pchar deklariert, allerdings dienen sie hier der Ausgabe der Daten. Das heißt, die Funktion erwartet von dir, dass du einen Puffer bereitstellst, der groß genug ist.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
const
  szUrl =
    'http://www.delphipraxis.net/topic28303_profil+temp+verzeichniss.html';
var
  url : TUrlComponents;
  scheme,
  buf,
  urlpath : array[0..MAX_PATH]of char;
begin
  ZeroMemory(@url,sizeof(url));
  url.dwStructSize := sizeof(url);

  url.lpszHostName := buf;
  url.dwHostNameLength := sizeof(buf);
  url.lpszScheme := scheme;
  url.dwSchemeLength := sizeof(scheme);
  url.lpszUrlPath := urlpath;
  url.dwUrlPathLength := sizeof(urlpath);

  if(InternetCrackUrl(szUrl,length(szUrl),0,url)) then
    MessageBox(0,pchar(Format('Host: %s' + #13#10 + 'Schema: %s' + #13#10 +
    'URL: %s',[buf,scheme,urlpath])),nil,0);
end;
Wenn du denkst, dass das statische Array (0-MAX_PATH) nicht ausreicht, dann kannst du auch hier mit "pchar"-Variablen arbeiten, wobei du dann natürlich den Puffer vorher mit "GetMem" erzeugen musst. Ansonsten rumpelt´s wieder ...

So, genug jetzt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:30 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