vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück

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!

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

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))
und
SetAttr = 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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2019 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