Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ? (https://www.delphipraxis.net/194272-pchar-pansichar-pwidechar-integer-lparam.html)

Glados 4. Nov 2017 22:01

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Nur woher soll ich dann den richtigen Typen kennen, wenn die IDE mir schon PWideChar anzeigt?

Beispiele

Delphi-Quellcode:
// #1
var
 pName: PWideChar;
begin
 pName := PWideChar('Test');
 CopyData.dwData := 0;
 CopyData.cbData := (StrLen(pName) + 1) * SizeOf(WideChar);
 CopyData.lpData := pName;
 SendMessage(hExistingInstance, WM_COPYDATA, 0, LPARAM(@CopyData));
end;

// #2
... := FindWindow(PWideChar('Test'));

// #3
... := GetFileAttributes(PWideChar('Test'));

Dalai 4. Nov 2017 22:14

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Zitat:

Zitat von Glados (Beitrag 1385193)
Nur woher soll ich dann den richtigen Typen kennen, wenn die IDE mir schon PWideChar anzeigt?

Ich sehe es so: Einfach immer PChar und String benutzen, bis der Compiler meckert. Manchmal weiß man es sogar vorher, dass (API-)Funktionen einen konkreten Typen wie PWideChar oder WideString erwarten, weil man eine Funktion bereits in der Vergangenheit benutzt hat.

Zitat:

Beispiele

Delphi-Quellcode:
// #1
var
 pName: PWideChar;
begin
 pName := PWideChar('Test');
 CopyData.dwData := 0;
 CopyData.cbData := (StrLen(pName) + 1) * SizeOf(WideChar);
 CopyData.lpData := pName;
 SendMessage(hExistingInstance, WM_COPYDATA, 0, LPARAM(@CopyData));
end;

// #2
... := FindWindow(PWideChar('Test'));

// #3
... := GetFileAttributes(PWideChar('Test'));

GetFileAttributes und FindWindow sind beides Aliase (für FindWindowA/W bzw. GetFileAttributesA/W). Daher sollte hier besser jeweils PChar benutzt werden. Bzgl. des SendMessage kommt es darauf an, was der Empfänger der Nachricht erwartet - das kann man nicht pauschal sagen. Anders ausgedrückt: erwartet der Empfänger einen Zeiger auf einen Ansi-String, ist die Verwendung von PWideChar mit Sicherheit falsch.

Grüße
Dalai

Glados 4. Nov 2017 22:15

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Zitat:

Ich sehe es so: Einfach immer PChar und String benutzen, bis der Compiler meckert.
Werde ich mir merken.

Dalai 4. Nov 2017 22:22

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Wobei "meckern" in dem Zusammenhang nicht nur bedeuten kann, dass der Code nicht kompiliert, sondern auch, dass der Compiler Warnungen bzgl. impliziter Stringumwandlung ausgibt. Also immer schön auf die Meldungen des Compilers achten, und versuchen, Warnungen zu verstehen und zu beheben.

Grüße
Dalai

Luckie 5. Nov 2017 03:30

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Zitat:

Zitat von Glados (Beitrag 1385157)
Ich frage mich jetzt aber: was ist wirklich richtig? Herr Puff (Moderator hier im Forum) hat damals selber Integer() genutzt.
http://www.delphipraxis.net/110825-f...n-dateien.html

Ach du scheiße. Wer gräb denn solche Jungendsünden aus? :shock: Das war noch zu 32-Bit Zeiten, da entsprach einem positiven Integer der LPARAM. Der Cast zu LPARAM wäre natürlich besser und sicherer gewesen.

HolgerX 5. Nov 2017 08:56

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Hmm...

Zitat:

Zitat von Glados (Beitrag 1385193)
Nur woher soll ich dann den richtigen Typen kennen, wenn die IDE mir schon PWideChar anzeigt?

Dann nimm doch direkt den direkten Aufruf und nicht den Alias:

(Auszug D6)

Delphi-Quellcode:
function FindWindow; external user32 name 'FindWindowA';
function FindWindowA; external user32 name 'FindWindowA';
function FindWindowW; external user32 name 'FindWindowW';
Somit kannst Du unter jedem Delphi

FindWindowA mit PAnsiChar
FindWindowW mit PWideChar

verwenden!

Kein Alias, keine Verwechslung und der Compiler meckert nur noch zurecht!

Unter D6 verwende ich impliziert die 'W'-Funktionen mit PWideChar und meine Funktionen geben WideString als Result, diese kann ich nun als WideString weiterverwenden (z.B. TNT-Controls) und bin damit auch bedingt UNICode tauglich und dass mit D6! ;)

Glados 5. Nov 2017 12:30

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Zitat:

Wer gräb denn solche Jungendsünden aus?
Ich :lol:

Zitat:

Dann nimm doch direkt den direkten Aufruf und nicht den Alias:
Muss ich mir heute mal angucken. Es sind vielleicht ein paar dutzend Winapi-Aufrufe die ich abändern muss.

Eine echt dumme Frage nur noch. Wenn ich den Alias verwende, verwendet Delphi dann in der heutigen Zeit ausnahmslos immer bei Übergabe von string die W-Variante?

himitsu 5. Nov 2017 13:36

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Zitat:

Zitat von Glados (Beitrag 1385193)
Nur woher soll ich dann den richtigen Typen kennen, wenn die IDE mir schon PWideChar anzeigt?

In die OH oder die Deklaration schauen? (Letzeres geht bei den Starter leider nicht)

Wie bereits gesagt, am Einfachsten immer String/PChar verwenden, da Delphi seine Deklarationen auch so schreibt.
Außer man weiß schon genau, dass hier feste Typen verwendet werden müssen.

Es gibt einige APIs, die es nur in einer Version (ANSI/Unicode) gibt.
Und auch Daten nach Extern (z.B. in Datei oder Stream zu einem anderen Programm) sollten besser immer statisch sein. (so lange nicht irgendwo das Format mit übergeben wird)
Wenn das eine Programm als ANSI compiliert wurde und das Andere als Unicode, würde es sonst Probleme geben. Das gilt auch für die Übergabe zwischen EXE und DLL.
Nur bei 32 und 64 Bit gibt es mit EXE und DLL keine Probleme, da Beide gleich sein müssen. (abgesehn von einem OutOfProcess-Server bei COM-DLLs)

Alias werden "leider" nicht angezeigt. Das wäre mal ein gutes Feature, aber nach dem Compilieren ist nur der "Ursprungstyp" und nicht der Alias bekannt, da der Alias beim Compilieren durch diesen Typen ersetzt wird.

Glados 5. Nov 2017 13:40

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
 
Mein Kopf raucht und ich verstehe nichts. Ich bleibe einfach bei den Alias-Aufrufen mit PChar, Ende.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
Seite 3 von 3     123   

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