AGB  ·  Datenschutz  ·  Impressum  







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

PChar Problem

Ein Thema von WorstNightmare · begonnen am 22. Mär 2009 · letzter Beitrag vom 23. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#1

PChar Problem

  Alt 22. Mär 2009, 19:52
Hi,
ich habe mal wieder ein Problem mit Pointern

In eine Funktion werden mehrere string Parameter übergeben, wovon einer dann zu einem PChar umgewandelt werden muss.
Die Funktion sieht in etwa so aus:
Delphi-Quellcode:
function Test(const proc: Pointer; const a, b, c, s: string): einRecord;
var
  PS: PChar;
begin
  if s <> 'then
    PS := PChar(s)
  else
    PS := nil;

  Showmessage(IntToStr(Length(PS)));
end;
Das ganze spielt sich in einer DLL ab, diese Funktion wird jedoch nur intern verwendet. Nun ist mein Problem, dass die Länge immer 0 ist (obwohl sie in Wahrheit 49 oder so ist), wenn s Binary-Material enthält, welches am Anfang 5x #0 hat. Liegt das daran, dass die mit #0 abgeschlossen werden?

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

Re: PChar Problem

  Alt 22. Mär 2009, 20:05
Bei mir funktionierts... bei mir ist String aber auch noch ein AnsiString und bei Dir Unicode.

Vielleicht ist es OK, in der Funktion AnsiString statt String zu verwenden?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: PChar Problem

  Alt 22. Mär 2009, 21:32
Zitat von WorstNightmare:
Length(PS)
Da solltest du besser gleich StrLen(PS) benutzen, denn so macht der Compiler aus PS wieder einen String (bis zum erst #0) und ruft dann die Length() Funktion auf.


Zitat:
wenn s Binary-Material enthält, welches am Anfang 5x #0 hat. Liegt das daran, dass die mit #0 abgeschlossen werden?
Ja, ein Nullterminierter String (aka PChar) endent nun mal an #0.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#4

Re: PChar Problem

  Alt 22. Mär 2009, 21:36
Ok, dann vergiss meinen Vorschlag. Ich hatte dem letzten Satz zu wenig Beachtung geschenkt
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: PChar Problem

  Alt 23. Mär 2009, 14:48
#0#0 ist das Ende eines Strings
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#6

Re: PChar Problem

  Alt 23. Mär 2009, 14:52
Hm, ok. Kann man das denn irgendwie ohne hässliche Workarounds (z.B. "n#0" dahin zu schreiben und es dann im Hauptprogramm ersetzen zu lassen) lösen? Ich kann leider keinen anderen Typen benutzen, weil der PChar dann einer Methode, die nach außen geht, übergeben wird, und ein ShortString wäre zu kurz.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: PChar Problem

  Alt 23. Mär 2009, 15:28
Array of Byte?
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#8

Re: PChar Problem

  Alt 23. Mär 2009, 16:19
Hm, ok, dann muss ich das System etwas umstellen, was aber kein Problem sein sollte. Ist in Delphi zufällig eine Methode integriert mit der ich einen string in ein AOB umwandeln kann oder muss ich mir das selber schreiben?
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: PChar Problem

  Alt 23. Mär 2009, 17:05
Wie wärs damit?
Delphi-Quellcode:
type
  TDynByteArr = Array of Byte;

function TryByteArrayToString(const bArr: TDynByteArr;
  var Str: String): Boolean;
var
  i : Integer;
begin
  Result := (sizeof(bArr) <> 0) or false;
  if Result then
  begin
    SetLength(Str, High(bArr)+2);
    for i := 0 to High(bArr) do
      try
        Str[i+1] := chr(bArr[i]);
      except
        Result := false;
      end;
  end;
end;

function TryStringToByteArray(const Str: String;
  var bArr: TDynByteArr): Boolean;
var
  i : Integer;
begin
  Result := (Str <> '') or false;
  if Result then
  begin
    SetLength(bArr, sizeof(Str));
    for i := 1 to sizeof(Str) do
      try
        bArr[i-1] := ord(Str[i]);
      except
        Result := false;
      end;
  end;
end;
Dürfte eigentlich alles einwandfrei funktionieren. Wenn du Array of Bytes verwendest musst du beim Funktionsaufruf erst zu TDynByteArray casten.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#10

Re: PChar Problem

  Alt 23. Mär 2009, 17:32
Okay, danke für deine Hilfe!
  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:15 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