D.h. also, der Compiler macht aus
'Irgendein String' PChar('Irgendein String'), wenn ein PChar benötigt wird?[/b]
Fast. Beispiel:
Delphi-Quellcode:
var
s: String;
begin
s := 'Hello world';
Shellexecute(0, 'open', s, nil, nil, SW_SHOW);
Das geht nicht.
Aber:
Shellexecute(0, 'open', 'Hello world', nil, nil, SW_SHOW);
Das geht.
Im ersten Fall ist s ein String und bleibt es auch. Im zweiten Fall macht der Compiler aus 'Hello world' einen nullterminierenden String.
Möglichkeiten, um aus s einen nullterminierenden String zu machen:
- Mit PChar casten: PChar(s). PChar gibt die Adresse des ersten Zeichens zurück. Wenn der String leer ist, wird ein NULL-Zeiger zurückgegeben.
- Direkt die Adresse des ersten Zeichens angeben: Integer(@s[1]). Dies erzwingt einen Aufruf von UniqueString, welche sicher stellt, dass eine gültige Adresse zurückgegeben wird. Davor erfolgt noch ein Aufruf von setlength.
procedure UniqueString(var str: string); overload;
Zitat:
Following a call to SetString, str is guaranteed to reference a unique string—that is, a string with a reference count of one. For normal string handling, there is no need to call UniqueString. UniqueString is used only in cases where an application casts a string to a PChar or PWideChar and then modifies the contents of the string.
Wird also auch bei einem Cast mit PChar aufgerufen.
- pointer(s), hier wird einfach der String zu einem Pointer gecastet. Das ist auch gleichzeitig die schnellste Methode, da keine versteckten Funktionsaufrufe, wie bei einem Cast mit PChar, durchgeführt werden.
Nach zu lesen hier:
High Performance Delphi - String Optimization Guidlines. Die Seite ist sehr zu empfehelen, wenn es darum geht Programmcode zu optimieren. Einfach mal etwas drin rumlesen.