AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi PChar to String & zurück - Zeichen geht verloren
Thema durchsuchen
Ansicht
Themen-Optionen

PChar to String & zurück - Zeichen geht verloren

Offene Frage von "ThE_-_BliZZarD"
Ein Thema von ThE_-_BliZZarD · begonnen am 14. Okt 2007 · letzter Beitrag vom 16. Okt 2007
Antwort Antwort
Seite 2 von 3     12 3      
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 17:37
Zitat von brechi:
Nein versuchs so nicht. Funktionen geben keine PChars zurück. Nimm nen String oder packs als Parameter rein und lass die Aufrufende Funktion den Speicher allokieren.
Funktionen in Dlls schon!
Markus Kinzler
  Mit Zitat antworten Zitat
ThE_-_BliZZarD

Registriert seit: 15. Sep 2006
Ort: Wiesbaden/Hessen
89 Beiträge
 
Delphi 2010 Professional
 
#12

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 17:37
@mkinzler: Danke.
/me sets mode: +gott mkinzler

Das wars.. *freu* tausend dank xD

Lösung falls jemand auch mal dieses Problem hat:

Delphi-Quellcode:
function aufreg(meinParameter: PChar): PChar;
var
  meinString: String;
begin
   meinString := meinParameter
   result := PChar(meinString+#0);
end;
MSVC2008 (C/C++ with QT), Delphi RAD 2010, Flash CS5 (FDT/Adobe), Java EE (Eclipse), PHP5
Antwortsprachen: Deutsch, Englisch, Französisch, Japanisch
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 17:40
Wurde doch schon von Dax vorgeschlagen, habe nur seinen Vorschlag in deinen Code eingebaut.
Markus Kinzler
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#14

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 17:40
Zitat von brechi:
Nein versuchs so nicht. Funktionen geben keine PChars zurück. Nimm nen String oder packs als Parameter rein und lass die Aufrufende Funktion den Speicher allokieren.
/signed

Wenn man es anders löst, wird man sich vor nicht auffindbaren Speicherlecks nach einer Weile nicht mehr retten können.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#15

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 17:53
wtf? Entweder ich hab nen Denkfehler weil ich noch zu besoffen bin, hab das Prinzip von String/PChar in Delphi nicht verstanden oder ihr programmiert alle grauenhaft.

Strings werden von Delphi verwaltet, sind also auch gültig wenn man sie als Rückgabewert missbraucht.

PChar ist das selbe wie ein Pointer. Und wenn ihr das so programmiert dann ist dieser Pointer nicht mehr gültig da dieser auf eine Lokale Variable zeigt. Sowas macht man eben nicht.
Machs so wie MS mit ihren APIs: Sobald du PChars zurückbekommen willst, muss die aufrufende Funktion den Speicher allokieren und freigeben wenn sie den nicht mehr braucht.

z.B. GetModuleFileName

Meienr Meinung nach kann es auftreten, dass Delphi merkt, dass der lokale String nicht mehr benutzt wird und ihn überschreibt, bzw. dessen Speicher freigibt. Du arbeitest u.U. noch weiter mit diesem String (bzw. nur der Adresse) und es kann ggf crashen.

Oder schreibt ihr auch so geniale Funktionen wie:
Delphi-Quellcode:
function blub(a: integer): pinteger;
var s: integer;
begin
  s := a;
  result := @s;
end;
Wäre nett wenn mir mal jemand meine falsche denkweise erklärt.
Danke!

Edit:
Zitat von mkinzler:
Zitat von brechi:
Nein versuchs so nicht. Funktionen geben keine PChars zurück. Nimm nen String oder packs als Parameter rein und lass die Aufrufende Funktion den Speicher allokieren.
Funktionen in Dlls schon!
Was hat ein allgemeines Stack/Speicher/Addressproblem mit Dlls zu tun. Da wäre das genau so falsch (meiner Auffassung nach)


Edit2:
wer es testen will (Aufruf mit dem wort 'lol')

Rückabe: lol
Delphi-Quellcode:
var
  meinString: String;
function aufreg(meinParameter: PChar): PChar;
begin
   meinString := meinParameter;
   result := PChar(meinString);
end;
Rückgabe: lo
Delphi-Quellcode:
function aufreg(meinParameter: PChar): PChar;
var
  meinString: String;
begin
   meinString := meinParameter;
   result := PChar(meinString);
end;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 18:35
Brechi hast vollkommen Recht. Es ist immer eine temporäre PChar Konvertierung und die verliert genauso ihre Gültigkeit wie auch die lokale string Variable mit verlassen der Funktion. Der Rückgabewert zeigt auf einen ehemals alloziierte/benutzten Block und von daher ist der Rückgabewert reiner Zufall. Grundlegend wird der Speicher bis zum auslesen des Wertes nicht erneut genutzt, und das ergibt hier den Anschein der Gültigkeit.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#17

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 20:27
also GetMem benutzen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#18

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 21:40
Wie denn? In der DLL mit dem Speichermanager alloziieren und in der App mit deren Speichermanager wieder freigeben? Naja, ich sage dir jetzt schon, der eine weiss vom anderen nichts. Ausnahme: sharemem, aber dann kannste auch gleich Strings übergeben. Ich empfehle die schon zuvor genannte Methode wie es auch schon die WinAPI erfolgreich seit ein paar Jahren macht: App erzeugt einen Buffer und übergibt ihn. Siehe auch Luckies Tutorial dazu...
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#19

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 14. Okt 2007, 21:48
wenn die App den Buffer erzeugt, dann muss man auch erstmal wissen wie groß der Buffer sein soll.
GetTokenInformation macht das z.B. so.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#20

Re: PChar to String & zurück - Zeichen geht verloren

  Alt 15. Okt 2007, 01:09
Zitat von Dezipaitor:
wenn die App den Buffer erzeugt, dann muss man auch erstmal wissen wie groß der Buffer sein soll.
GetTokenInformation macht das z.B. so.
Siehe WinAPI: Entweder einen Rückgabewert definieren der darauf hinweist, dass der Puffer zu klein ist oder bei der Übergabe von NIL als PChar wird die benötigte Länge zurück geliefert. Ganz einfach und simple...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 13:02 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