![]() |
Delphi-Version: 10 Seattle
Bedenkliche Typumwandlung AnsiString in PWideChar
Ich bin leider gezwungen, eine .dll zu Nutzen, dessen Signatur eine IP-Adresse in PChar verlangt:
Code:
Diese Compiler-Warnung verfolgt mich schon lange im Schlaf, da ich trotz langer googlereien keine Moeglichkeit finde, galant zu Typen/Casten.
IPS7Open (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Code:
Mein aktueller Aufbau abstrahiert
[dcc32 Warnung] TCP.pas(170): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'AnsiString'
Code:
Natuerlich kann ich die Signatur der .dll nicht aendern. Was ist die eleganteste Loesung die Warnung loszuwerden?
var
IP: AnsiString; IPvonAusserhalbEingelesen: String; begin //... IP := AnsiString(IPvonAusserhalbEingelesen); Connection.ref := IPS7Open( PChar(IP), Connection.Rack { ... } ); Ich hab die Zeile Connection.ref := {...} mal mit
Code:
und ON ON ummantelt, kriege die Warnung aber trotzdem. Ich habe noch nicht oft mit CompilerFlag-Aenderungen On-The-Fly gearbeitet. Wahrscheinlich muss ich die woanders setzen...
{$WARN IMPLICIT_STRING_CAST OFF}
{$WARN IMPLICIT_STRING_CAST_LOSS OFF} Schoener waere natuerlich eine "echte" Loesung anstatt einfach die Warnung wegzumogeln. |
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Was erwartet die DLL denn nun, einen PAnsiChar oder einen PWideChar? PChar ist ja nur ein Alias für den einen oder anderen Typen, je nach Delphi-Version.
[edit] Nach einer kurzen Recherche scheint es ANSI zu sein. Dann würde ich zunächst die Importdatei ändern:
Delphi-Quellcode:
und dann den Aufruf:
IPS7Open (IPAdr : PAnsiChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Delphi-Quellcode:
[/edit]
var
IP: AnsiString; IPvonAusserhalbEingelesen: String; begin //... IP := AnsiString(IPvonAusserhalbEingelesen); Connection.ref := IPS7Open( PAnsiChar(IP), Connection.Rack { ... } ); |
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Zitat:
Welcher waere das? |
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Ich habe meinen vorherigen Beitrag editiert. Funktioniert es so?
|
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Hoffentlich hab ich Recht (Pchar=PAnsiChar), dann verstehe ich die Warnung nicht, denn an
Delphi-Quellcode:
ist eigentlich nicht viel implizites.:gruebel:
IP := AnsiString(IPvonAusserhalbEingelesen);
Gruß K-H |
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Yes, many Thanks!
Ich bin irgendwie nicht darauf gekommen, die Import Signatur zu aendern. Ich hatte immer im Kopf, dass die .dll fix diese Typen braucht. Dass davon einer uneindeutig gewaehlt ist, ist mir nicht eingefallen. Danke! |
AW: Bedenkliche Typumwandlung AnsiString in PWideChar
Jupp, Schnittstellen (DLL) und Transportformate (Dateien) müssen immer feste Typen besitzen,
außer es wird mitgegeben welches Format gerade verwendet wird. Hier kommt es natürlich auf das Format der DLL an und dein Import muß das richtige Format verwenden. PS: Warum es hier geknallt hat: Delphi kann/darf bei ziwschen PAnsiChar und PWideChar die referenzierten Daten nicht konvertieren. Bei AnsiString <> UnicodeString geht da, da dort eine dem Delphi bekannte Speicherverwaltung dahinter liegt und Delphi somit die Daten und deren Speicher (als Kopie) verändern kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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