AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?
Thema durchsuchen
Ansicht
Themen-Optionen

PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

Ein Thema von Glados · begonnen am 4. Nov 2017 · letzter Beitrag vom 5. Nov 2017
Antwort Antwort
Seite 3 von 3     123   
Glados
(Gast)

n/a Beiträge
 
#21

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

  Alt 4. Nov 2017, 23:01
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'));

Geändert von Glados ( 4. Nov 2017 um 23:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#22

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

  Alt 4. Nov 2017, 23:14
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
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#23

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

  Alt 4. Nov 2017, 23:15
Zitat:
Ich sehe es so: Einfach immer PChar und String benutzen, bis der Compiler meckert.
Werde ich mir merken.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#24

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

  Alt 4. Nov 2017, 23:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#25

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

  Alt 5. Nov 2017, 04:30
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? 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#26

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

  Alt 5. Nov 2017, 09:56
Hmm...

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!
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#27

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

  Alt 5. Nov 2017, 13:30
Zitat:
Wer gräb denn solche Jungendsünden aus?
Ich

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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#28

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

  Alt 5. Nov 2017, 14:36
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#29

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

  Alt 5. Nov 2017, 14:40
Mein Kopf raucht und ich verstehe nichts. Ich bleibe einfach bei den Alias-Aufrufen mit PChar, Ende.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 17:54 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