Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   PChar in Delphi 7 (https://www.delphipraxis.net/175727-pchar-delphi-7-a.html)

kwhk 12. Jul 2013 08:39

PChar in Delphi 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, ich bin gerade dabei, einige SourceCodes, die noch für Delphi 3 entwickelt wurden, für Delphi 7 anzupassen. Dabei habe ich z.B. so etwas
Delphi-Quellcode:
Procedure xxx(sTx : AnsiString, sTit : AnsiString);
Begin
  if Application.MessageBox
   ( PChar(sTx),
     PChar(sTit),
     MB_OK ) = 0 then Begin End;
End;
Wenn ich die Warnungen Unsicherer Typ nicht ausschalte, bekomme ich immer folgende Warnung angezeigt.
[Warnung] xxx.pas(148): Unsicherer Typ 'PChar'
Ich habe beim Googeln gefunden, daß das etwas mit .NET usw. zu tun hat. Ich kann auch die Warnung unterdrücken. Ich möchte aber gern wissen, wie ich Application.MessageBox korrekt ohne PChar aufrufen soll. In C++ benutze ich ja ausschliesslich PChar, d.h. einen NULL-terminierten String 'xxxxx',0x00.
Das Programm selbst funktioniert einwandfrei.
Die Delphi-7-Hilfe zeigt es ja so, wie ich es geschrieben habe, an.

DeddyH 12. Jul 2013 09:09

AW: PChar in Delphi 7
 
Schau mal hier: http://entwickler-forum.de/showthrea...-Typumwandlung

sx2008 12. Jul 2013 10:51

AW: PChar in Delphi 7
 
Delphi 7 hat einige Projektoptionen, die den Compiler ganz erheblich ausbremsen.
Dazu gehört diese Prüfung der "unsicheren Typumwandlung".
Leider kann ich nicht genau sagen um welche Optionen es sich handelt;
soweit ich mich erinnern kann stehen sie ganz am Anfang und am Ende der Optionenliste und es müssten einmal 3 und dann noch 6 Optionen sein.

kwhk 12. Jul 2013 10:57

AW: PChar in Delphi 7
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Optionen sind ja schnell so eingestellt. Offernbar gibt es keine warnungsfreie Codiermöglichkeit. Wie ruft man denn in den neueren Delphi-Versionen Aplication.MessageBox auf ?

DeddyH 12. Jul 2013 11:02

AW: PChar in Delphi 7
 
Am Aufruf hat sich nichts geändert: TApplication.MessageBox, außer dass PChar nun nicht mehr PAnsiChar, sondern PWideChar ist.

kwhk 12. Jul 2013 11:37

AW: PChar in Delphi 7
 
In Deiner Hilfe steht ja ebenfalls PChar, genau wie bei Delphi 7, die API-Funktion erwartet das auch so, egal ob Delphi, C++ oder irgend ein anderer Compiler.
Ich habe PChar mal durch PWideChar ersetzt, da bekomme ich folgenden Fehler.

[Fehler] CompHKwPgm.pas(2448): Inkompatible Typen: 'WideChar' und 'Char'

WideChar bedeutet eigentlich, daß pro Zeichen 2 Bytes benutzt werden, bei Char jeweils nur 1 Byte pro Zeichen. Application.MessageBox will doch Char und nicht WideChar.

Der schöne Günther 12. Jul 2013 11:39

AW: PChar in Delphi 7
 
Du hast ja auch nach neueren Delphi-Versionene gefragt

DeddyH 12. Jul 2013 12:00

AW: PChar in Delphi 7
 
Eben, mit PAnsiChar wird es funktionieren (in Delphi <= 2007).

kwhk 12. Jul 2013 13:21

AW: PChar in Delphi 7
 
Zitat:

Du hast ja auch nach neueren Delphi-Versionene gefragt
Ja, aber in der XE3-Hilfe wurde doch wieder PChar angezeigt, genau wie bei Delphi 7. Nun mag das dabei ein WideChar sein, das angebliche .NET Sicherheitsproblem ist dabei doch dasselbe, ein Pointer auf den Anfang eines Stringes, dessen Ende man erst suchen muss.
Zitat:

Eben, mit PAnsiChar wird es funktionieren (in Delphi <= 2007).
Bei Delphi 7 kommt mit PAnsiChar dergleiche Warnhinweis, wie bei PChar, ich habe beides ausprobiert.

Der schöne Günther 12. Jul 2013 13:25

AW: PChar in Delphi 7
 
Delphi-Quellcode:
PChar
ist ja bei neueren Versionen ein Alias für
Delphi-Quellcode:
PWideChar
. Früher war ein
Delphi-Quellcode:
PChar
das, was heute ein
Delphi-Quellcode:
PAnsiChar
ist.

Der Warnhinweis hat damit nichts zu tun, der möchte dir nur sagen "Vorsicht bei Zeigern".

kwhk 12. Jul 2013 13:51

AW: PChar in Delphi 7
 
Zitat:

Der Warnhinweis hat damit nichts zu tun, der möchte dir nur sagen "Vorsicht bei Zeigern".
Das ist ja nett von dem Warnhinweis. Aber das hättest der denen sagen mussen, die PChar-Zeiger als Parameter für MessageBox haben wollen, und nicht denen, die bei der Nutzung einer derartigen Funktion eben solche Pointer angeben müssen und gar keine andere Wahl haben, egal ob AnsiString oder WideString.
Wenn ich PChar(txt) übergeben und txt ist selbst als String oder AnsiString (also als ein Delphistring mit Länge ohne abschließendes Hex-00) vereinbart, dann macht ja Delphi die Anpassung - was soll dabei schief gehen ? Wenn man die Texte direkt als Literal angibt ( ' Hallo AnsiString' ), dann kommt ja keinerlei Warnhinweis, intern muss das aber auch in einen Pointer konvertiert werden.

DeddyH 12. Jul 2013 13:56

AW: PChar in Delphi 7
 
Die, die den PChar haben wollen, sitzen bei Microsoft, denn intern wird ja nur die Win-API-Funktion MessageBox aufgerufen. Und die Meldung kommt ja nur, weil Zeigertypen in .NET eben unmanaged sind und somit als unsicher gelten. Kommen diese Meldungen denn immer noch, trotz Optionen bzw. Compilerschalter?

kwhk 12. Jul 2013 14:07

AW: PChar in Delphi 7
 
Und die, die .NET immer weiter entwickeln und anwenden, sitzen ja auch bei Microsoft. Ist da ein Problem LINKE und RECHTE Hand. Was der eine macht, wird von dem anderen reklamiert.

Wenn ich die Warnungen ausschalte, kommen sie natürlich nicht. Aber eigentlich sind Warnungen ja etwas sehr Sinnvolles, nur wenn sie dort kommen, wo es gar nicht anders zu machen geht, dann sind sie nicht sinnvoll. Beim Ausschalten, sind auch alle anderen Warnungen weg, die evtl. sinnvoll wären.

DeddyH 12. Jul 2013 14:26

AW: PChar in Delphi 7
 
Aber speziell diese Warnungen sind AFAIK für eine gemeinsame Codebasis von Win32- und .NET-Programmen gedacht gewesen. Da man aber mit Delphi 7 sowieso keine .NET-Programme schreiben kann (dafür bekam man ja mal Delphi 8 im Bundle dazu), sind sie eher hinderlich als nützlich.

Der schöne Günther 12. Jul 2013 14:33

AW: PChar in Delphi 7
 
Zitat:

Zitat von kwhk (Beitrag 1221590)
Beim Ausschalten, sind auch alle anderen Warnungen weg, die evtl. sinnvoll wären.

Und welche wären das? Entweder "Vorsicht bei Zeigern" oder nicht. Woher soll der Compiler denn wissen, wo Zeiger dir deiner Meinung nach gefährlich werden und wo nicht? An oder aus. Komplizierter muss man es doch wirklich nicht machen 8-)

Es ist doch nicht so, dass man auf andere Warnungen ("Methode X überdeckt Methode Y", ...) verzichten müsste, nur wenn nicht bei Zeigern, die in der .NET-Welt als "unsicher" gelten, gewarnt werden soll.

DeddyH 12. Jul 2013 14:38

AW: PChar in Delphi 7
 
Genau, Warnungen, die mich gar nicht betreffen, möchte ich auch nicht sehen. Oder was würdest Du von einem Schild im Oberhemd denken, auf dem steht "Achtung: Kleidung nicht am Körper bügeln" (das soll es tatsächlich geben)?

Union 12. Jul 2013 14:47

AW: PChar in Delphi 7
 
Wenn Du Dir eine Stelle im Programm angesehen hast und diese als nicht "gefährlich" geprüft hast, kannst Du das doch auch so machen:
Delphi-Quellcode:
{$WARNINGS OFF}
   Application.MessageBox(PChar('Hallo'), PChar('Hallo'));
{$WARNINGS ON}
Oder unter neueren Delphi Versionen:
Delphi-Quellcode:
{$WARN UNSAFE_TYPE OFF}

kwhk 12. Jul 2013 14:48

AW: PChar in Delphi 7
 
Ich glaube, um es Warnungsfrei und 100% korrekt zu machen, müsste man den Delphi-String in seiner belegten Länge in ein Char-Array eintragen, nach dem letzten String-Zeichen ein Hex-00 dahinterschreiben und den Zeiger auf das erste Zeichen des Arr als PChar übergeben. Ich vermute, daß Delphi das beim Ausdruck PChar(stringvariable) so ähnlich macht, also temporär den String umkopiert und mit Hex-00 abschließt. Funktionieren tut es jedenfalls. Wenn man es bewußt selbst macht, dann wäre es warnungsfrei korrekt.

sx2008 12. Jul 2013 14:56

AW: PChar in Delphi 7
 
Zitat:

Zitat von DeddyH (Beitrag 1221592)
Aber speziell diese Warnungen sind AFAIK für eine gemeinsame Codebasis von Win32- und .NET-Programmen gedacht gewesen. Da man aber mit Delphi 7 sowieso keine .NET-Programme schreiben kann (dafür bekam man ja mal Delphi 8 im Bundle dazu), sind sie eher hinderlich als nützlich.

Genau.
Deshalb diese "Unsafe" Meldungen abschalten.
http://www.delphisources.ru/pages/fa...fig01_10_0.jpg

Und zusätzlich die ersten 6 Meldungen ("Deprecated Symbol" bis "Deprecated Unit") ebenfalls abschalten.
http://www.rsdn.ru/article/Delphi/De...hi_7_07_13.png (im diesem Bild sind sie allerdings noch aktiv)

DeddyH 12. Jul 2013 15:04

AW: PChar in Delphi 7
 
Exakt, das sind noch die Kylix-Altlasten. Irgendwie wird die Liste der gestorbenen Projekte immer länger, mal sehen, wie sich der Feueraffe bewähren wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 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