|
| |

 | 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@rchiv| Tipp 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. |  |
 | Sie sind nicht angemeldet! Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
sevOutBar 4.0 
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR...
Jetzt nur 979,00 EURWeitere Infos
|
| |
|
Copyright ©2000-2025 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
|
|