![]() |
string ein Alias für UnicodeString
Zitat:
Kann ich alle WideString mit String ersetzen (Unter D2010 32Bit und DCE 64Bit? ) oder gibt es Konvertierungsprobleme in welcher Art auch immer? Zitat:
UnicodeString oder String wenn String doch das gleiche sein soll wie UnicodeString Die Beschreibungen sind manchmal wirklich unverständlich. Warum die Frage.. Hatte gestern einen Absturz nur bei einer Zuweisung eines ToolTip mit WideString. (Ausschließlich 64Bit, unter 32Bit war das kein Problem) Nach der Änderung der Variable auf string war das Problem behoben. Um so etwas in der Zukunft zu vermeiden möchte ich alle WideString nach string umlegen. (Nur was habe ich dann zu erwarten? ) gruss |
AW: string ein Alias für UnicodeString
Ja kannst Du.
Allerdings mit einer Einschränkung. Immer wenn Du Delphi verlässt also z.B ein Interface zu COM, oder Eine Dll lass es auf Widestring. Alles was innerhalb von Delphi läuft sollte kein Problem darstellen. |
AW: string ein Alias für UnicodeString
Zitat:
Also so lassen wie es ist. Danke! PS: Zitat:
Also die Frage ist wann verlasse ich Delphi.. gruss |
AW: string ein Alias für UnicodeString
Zitat:
Widestring würde ich da nur benutzen wenn es auf der API Seite verlangt wird als BSTR und consorted auf der C, C++ Seite. Aber ohne konkretes Beispiel kann man da nicht mehr sagen...... |
AW: string ein Alias für UnicodeString
Ich habe es mal versucht..
Das geht leider nicht nach der ändern alles auf String kracht die Anwendung ;) War ein test dachte könnte mir damit solche Probleme wie mit dem ToolTip dadurch ersparen. gruss |
AW: string ein Alias für UnicodeString
Zitat:
Du arbeitest doch viel direkt mit Windows-Funktionen, um deine GUIs aufzubauen. Du kennst ja die Funktion
Delphi-Quellcode:
aus der Windows-Unit.
function GetDC(hWnd: HWND): HDC; stdcall;
Da kannst du nicht reingucken, weil sie extern in der user32.dll von Windows definiert ist.
Delphi-Quellcode:
function GetDC; external user32 name 'GetDC';
|
AW: string ein Alias für UnicodeString
Danke.
gruss |
AW: string ein Alias für UnicodeString
Zitat:
|
AW: string ein Alias für UnicodeString
Muss nochmal nachhaken..
Wenn string ein Alias für UnicodeString ist warum bekomme ich dann einen Speicherleck. bsp. Mein Hint ist ein string die Funktion die den Hint füllen soll gibt WideString zurück. Warum wird mir jetzt ein Speicherleck angezeigt wenn beides doch eigentlich das gleiche sein soll ? WideString und string = UnicodeString (D2010) Oder bin ich heute einfach nur blöd! Den Widestring bekomme ich einfach nicht nach string konvertiert andauernd Speicherlecks. gruss |
AW: string ein Alias für UnicodeString
UnicodeString ist ein (von der Delphi RTL) verwalteter Typ, WideString nicht.
|
AW: string ein Alias für UnicodeString
Zitat:
Ka was du mir damit sagen willst. ;) gruss |
AW: string ein Alias für UnicodeString
In Delphi ist
Delphi-Quellcode:
ein managed type, um dessen Freigabe man sich nicht kümmern muss. UnicodeString ist nur ein Alias für
string
Delphi-Quellcode:
, so in der Art:
string
Delphi-Quellcode:
Ein
type
UnicodeString = string;
Delphi-Quellcode:
ist ein non-managed type, um dessen Freigabe sich jemand kümmern muss. Eine Konvertierung von
WideString
Delphi-Quellcode:
nach
WideString
Delphi-Quellcode:
erzeugt einen neuen
string
Delphi-Quellcode:
, entbindet aber nicht von der Pflicht zur Freigabe des
string
Delphi-Quellcode:
.
WideString
|
AW: string ein Alias für UnicodeString
Danke.
Er meldet mir hier einen Speicherleck.
Delphi-Quellcode:
FAudioSessionInfo.DisplayName := string(GetVerInfo(FileName));
DisplayName = string GetVerInfo = WideString Wenn ich jetzt den WideString von GetVerInfo an DisplayName übergebe wie soll ich ihn dann freigeben er wird im weiteren verlauf benötigt. Hmmm.... gruss |
AW: string ein Alias für UnicodeString
Zitat:
Delphi-Quellcode:
liefert einen
GetVerInfo
Delphi-Quellcode:
zurück, um dessen Freigabe du dich kümmern musst. Die Konvertierung nach
WideString
Delphi-Quellcode:
erzeugt einen neuen
string
Delphi-Quellcode:
, lässt aber den Speicherbereich des
string
Delphi-Quellcode:
unangetastet. Da du an den
WideString
Delphi-Quellcode:
so aber nicht mehr herankommst, kannst du ihn auch nicht freigeben. Daher entsteht hier ein Speicherleck.
WideString
|
AW: string ein Alias für UnicodeString
Zitat:
gruss |
AW: string ein Alias für UnicodeString
Zitat:
Ein WideString ist einfach nur ein Pointer auf ein WideChar-Array mit einem Längenbyte davor: ![]() Bei einem string gibt es viel mehr Informationen: ![]() Delphi kann ja nicht einfach ein paar Daten vor dem WideString in den Speicher schreiben, um die fehlenden Informationen herzuzaubern. |
AW: string ein Alias für UnicodeString
Danke Uwe muss mal sehen wie ich das gelöst bekomme.
gruss |
AW: string ein Alias für UnicodeString
Woher kommt denn diese Funktion GetVerInfo?
Sie scheint weder Bestandteil der Windows-API noch zum Delphi-Framework zugehörig zu sein. |
AW: string ein Alias für UnicodeString
Zitat:
![]() ![]() ![]() Ich habe es gelöst musste nur an der untersten Ebene anfangen zu suchen und dort die Datentypen nach WideString umlegen. Da mir EurekaLog und ReportMemoryLeaksOnShutdown nichts mehr melden sollte es in Ordnung sein. gruss |
AW: string ein Alias für UnicodeString
Also in der Unit UVerInfoRoutines.pas aus dem article-20-demo.zip ist das wie folgt definiert:
Delphi-Quellcode:
{
GetVerInfo: Thin wrapper around API routine. Loads version information for a given file into a buffer. Raises exception if version information can't be read. } procedure GetVerInfo(const FileName: string; const Size: Integer; const Buffer: Pointer);
Delphi-Quellcode:
Das ist doch gänzlich was anderes als was du weiter oben im Thread verwendest.
procedure GetVerInfo(const FileName: string; const Size: Integer;
const Buffer: Pointer); begin if not GetFileVersionInfo(PChar(FileName), 0, Size, Buffer) then raise Exception.Create('Can''t load version information'); end; Da scheint es eine function anstatt procedure zu sein. Auch von WideString ist nichts zu lesen. |
AW: string ein Alias für UnicodeString
Zitat:
Delphi-Quellcode:
Siehe..
function GetVerInfo(FileName: string): WideString;
var VI: TVerInfo; TransIdx: integer; Trans: string; StrIdx: integer; StrName: string; begin VI := TVerInfo.Create(FileName); try if VI.HasVerInfo then begin for TransIdx := 0 to Pred(VI.TranslationCount) do begin Trans := VI.Translations[TransIdx]; // display all standard strings for StrIdx := Low(cStrNames) to High(cStrNames) do begin StrName := cStrNames[StrIdx]; if StrName = 'FileDescription' then begin Result := VI.Strings[Trans, StrName]; Break; end; end; end; end else Result := ''; finally VI.free; end; end;
Delphi-Quellcode:
Result := VI.Strings[Trans, StrName];
Delphi-Quellcode:
property Strings[const Trans, Name: string]: string read GetString;
Delphi-Quellcode:
function TVerInfo.GetString(const Trans, Name: string): string;
begin Assert(fHasVerInfo); Result := GetVerInfoStr(fVerInfo, Trans, Name); // <<< hier der Part end;
Delphi-Quellcode:
gruss
function GetVerInfoStr(const Buffer: Pointer;
const Trans, StrName: string): string; |
AW: string ein Alias für UnicodeString
Kannst du vernünftig und logisch schlüssig erklären, warum du an der Stelle als Result-Typ WideString nimmst?
Warum benennst du deine eigene Funktion exakt gleich zu einer Funktion aus einen fremden verwendeten Quelltext? Du machst dir doch selber das Leben schwer. |
AW: string ein Alias für UnicodeString
Zitat:
Zitat:
GetVerInfo <> GetVerInfoStr Die andere GetVerInfo wird gar nicht aufgerufen bzw. verwendet. Aber.. Das Thema ist eigentlich erledigt weil ich es innerhalb meiner DLL gefixt habe. ;) gruss |
AW: string ein Alias für UnicodeString
Innerhalb deines eigenen Moduls besteht doch gar keine Notwendigkeit auf WideString zu gehen.
|
AW: string ein Alias für UnicodeString
Zitat:
gruss |
AW: string ein Alias für UnicodeString
Keine Ahnung, ob das hier relevant ist, aber vielleicht hilft es ja:
![]() Zitat:
|
AW: string ein Alias für UnicodeString
Danke für eure Informationen.
Wie ich schon sagte.. Zitat:
Innerhalb der Anwendung besteht kein Grund mehr WideStrings zu verwenden habe es korrigiert und nochmals auf Speicherlecks geprüft. Scheint alles IO zu sein wenn man sich denn auf EurekaLog und ReportMemoryLeaksOnShutdown verlassen kann. gruss |
AW: string ein Alias für UnicodeString
Welches war der Stringtyp der von Windows als OLE Objekt verwaltet wurde und weder Freigabe noch Management durch den Delphi Memorymanager oder fastmem brauchte?
|
AW: string ein Alias für UnicodeString
WideString. Aber nur bei Verwendung von OLE.
|
AW: string ein Alias für UnicodeString
Ich verwende viele WideStrings innerhalb meiner DLL diese arbeitet aber global mit Interfaces
Mein Fehler war früher das ich nicht wusste das Strings Unicode fähig sind das war der einzige Grund das ich WideString eingebaut habe. Das jetzt alles umzuschreiben macht am ende mehr kaputt als das es irgendeinen Vorteil bringt, daher lasse ich es so. Habe bisher hier keine Probleme. (Abgesehen vom ToolTip warum auch immer 64Bit) Ja jetzt kommt der Aufschrei.. Nein lieber PWideChar verwenden. :) Ist aber auch kein Allheilmittel gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz