Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Bedenkliche Typumwandlung AnsiString in PWideChar (https://www.delphipraxis.net/192310-bedenkliche-typumwandlung-ansistring-pwidechar.html)

hzzm 7. Apr 2017 11:44

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:
IPS7Open (IPAdr : PChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
Diese Compiler-Warnung verfolgt mich schon lange im Schlaf, da ich trotz langer googlereien keine Moeglichkeit finde, galant zu Typen/Casten.
Code:
[dcc32 Warnung] TCP.pas(170): W1058 Implizite String-Umwandlung mit potenziellem Datenverlust von 'string' zu 'AnsiString'
Mein aktueller Aufbau abstrahiert
Code:
var
  IP: AnsiString;
  IPvonAusserhalbEingelesen: String;
begin
  //...
  IP := AnsiString(IPvonAusserhalbEingelesen);
  Connection.ref := IPS7Open( PChar(IP), Connection.Rack { ... } );
Natuerlich kann ich die Signatur der .dll nicht aendern. Was ist die eleganteste Loesung die Warnung loszuwerden?
Ich hab die Zeile Connection.ref := {...} mal mit
Code:
{$WARN IMPLICIT_STRING_CAST OFF}
{$WARN IMPLICIT_STRING_CAST_LOSS OFF}
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...

Schoener waere natuerlich eine "echte" Loesung anstatt einfach die Warnung wegzumogeln.

DeddyH 7. Apr 2017 12:03

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:
IPS7Open (IPAdr : PAnsiChar; Rack : LongWord; Slot : LongWord; RxTimeout : LongWord; TxTimeout : LongWord ; ConnectTimeout : LongWord) : LongInt; stdcall; external 'IPS7LNK.DLL';
und dann den Aufruf:
Delphi-Quellcode:
var
  IP: AnsiString;
  IPvonAusserhalbEingelesen: String;
begin
  //...
  IP := AnsiString(IPvonAusserhalbEingelesen);
  Connection.ref := IPS7Open( PAnsiChar(IP), Connection.Rack { ... } );
[/edit]

hzzm 7. Apr 2017 12:07

AW: Bedenkliche Typumwandlung AnsiString in PWideChar
 
Zitat:

Zitat von DeddyH (Beitrag 1366766)
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.

Den, fuer den PChar das Alias in Delphi 10.1 Seattle ist :shock:, denn es funktioniert so wie geschrieben.
Welcher waere das?

DeddyH 7. Apr 2017 12:08

AW: Bedenkliche Typumwandlung AnsiString in PWideChar
 
Ich habe meinen vorherigen Beitrag editiert. Funktioniert es so?

p80286 7. Apr 2017 12:09

AW: Bedenkliche Typumwandlung AnsiString in PWideChar
 
Hoffentlich hab ich Recht (Pchar=PAnsiChar), dann verstehe ich die Warnung nicht, denn an
Delphi-Quellcode:
 IP := AnsiString(IPvonAusserhalbEingelesen);
ist eigentlich nicht viel implizites.:gruebel:


Gruß
K-H

hzzm 7. Apr 2017 12:13

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!

himitsu 7. Apr 2017 13:22

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 07:03 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