| |
| In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.
Hinweis: Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden! | Fragen zu Tipps & Tricks und Workshops im vb@rchivTipp 2271: Erweiterte Dateiattribute | | | Autor: Preisser | Tipp anzeigenDatum: 10.05.11 14:20 |
| Hallo,
die Unicode-Konvertierungen in diesem Tipp sind leider nicht ganz korrekt.
Dies betrifft die Zeilen
GetAttr = GetFileAttributesW(StrConv("\\?\" & fName, vbUnicode)) undSetAttr = CBool(SetFileAttributesW(StrConv("\\?\" & fName, vbUnicode), _
Attributes)) .
VB-Strings sind ja bereits in Unicode (16 Bit pro Zeichen), und diese Verwendung von StrConv ist dafür vorgesehen, dass eine Bytekette von der lokalen ANSI-Kodierung nach Unicode konvertiert wird.
Hier jedoch handelt es sich bereits um Unicode-Text, dessen einzelne Bytes nochmal als ANSI angesehen und nach Unicode konvertiert werden, und dann beim Aufruf der API wieder zurück. Dies führt zum einen dazu, dass unnötigerweise 2 Konvertierungsvorgänge durchgeführt werden würden, was natürlich auch doppelt so viel RAM belegt. Zum anderen kann es auf anderssprachigen Systemen dazu führen, dass die Konvertierung falsch wird. Beispielsweise gibt es auf japanischen Systemen im dortigen ANSI-Zeichensatz einige Zeichen, die durch 2 konsekutive Bytes anstatt nur durch 1 Byte dargestellt werden. Wenn es dort beim Konvertieren von ANSI nach Unicode keine Entsprechung gibt, geht die Information verloren und der Text wird falsch.
Korrekterweise kann man beispielsweise einfach einen Pointer auf den String mit StrPtr() übergeben. Dazu müsste die Deklaration der Unicode-APIs (mit "W" am Schluss) so lauten:
Private Declare Function GetFileAttributesW Lib "kernel32" ( _
ByVal lpFileName As Long) As Long
Private Declare Function SetFileAttributesW Lib "kernel32" ( _
ByVal lpFileName As Long, _
ByVal dwFileAttributes As Long) As Long Der Aufruf müsste dann geändert werden in GetAttr = GetFileAttributesW(StrPtr("\\?\" & fName)) und SetAttr = CBool(SetFileAttributesW(StrPtr("\\?\" & fName), Attributes)) .
Beitrag wurde zuletzt am 10.05.11 um 14:21:44 editiert. | |
Re: Erweiterte Dateiattribute | | | Autor: Ralf Schlegel | Datum: 10.05.11 15:49 |
| Völlig richtig!!!
Hätte mir bei der Deklaration der Unicode Varianten schon aufgehen müssen,
denn hier werden Strings nie als String, sondern als Pointer (As Long) übergeben.
Ich hoffe das vb@rchiv-Team kann den Tipp gemäß Deiner Änderung aktualisieren,
bevor er in Serie geht?!?!
mea culpa
Ralf Schlegel | |
| Sie sind nicht angemeldet! Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|