Was ist BSTR?



  • Hi,
    jo, was ist das? Hab in "Rund um..." gelesen, das habe was mit Unicode zu tun. Aber da hat man doch schon den Typen WCHAR bzw. LPWSTR, oder? Was ist der Unterschied?



  • typedef unsigned short wchar_t;
    typedef wchar_t WCHAR;
    typedef WCHAR OLECHAR;
    typedef OLECHAR* BSTR;
    


  • Der Unterschied, den Nemesyzz wohl vergessen hat, zu erläutern, ist, dass BSTR der Typ ist, der für Scriptsprachen verwendet wird.
    Vorteil dessen ist es, dass 4 Byte VOR dem wirklichen Zeiger auf den String die Länge dessen steht. Finde es schade, dass dies nicht schon lange bei C++ eingeführt wurde, da die strlen-Funktion dann wohl wesentlich schneller wäre!



  • Nö, nicht vergessen - das wusste ich nicht... 🙂



  • @RenéG:
    Ich finde das gar nicht schade.
    Turbo-Pascal macht es ja auch so, aber eben nur mit einem Byte. Ich meine im Ernst das uralt DOS Turbopascal, mit dem ich im Info-Unterricht programmieren darf. 😉

    Und da nervt mich das immer gewaltig, dass manche Stringoperationen, wenn man sie manuell programmiert, um einiges komplizierter sind als in C++.

    Achja: Geschwindigkeitsnachteile hats auch:
    Wenn man z.B. das erste Vorkommen eines Leerzeichens in einem String haben will, muss man einfach von links nach rechts die Zeichen durchgehen und vergleichen.
    Nebenbei muss darauf geachtet werden, dass die Zählvariable nicht in den ungültigen Bereich kommt.
    In Pascal vergleicht man mit dem Längenbyte, also ein vergleich mit einem Wert ungleich 0.
    In C++ dagegen vergleicht man das gerade aktuelle Zeichen (kann in einem internen CPU-Register gehalten werden) mit 0. Vergleiche mit 0 sind ein wenig schneller als Vergleiche mit anderen Zahlen. 😃



  • @cd9000
    Ich habe irgendwie den Eindruck, daß Dir der BSTR auch nicht ganz klar ist. Der BSTR ist ein null-terminierter UNICODE-String. Der Pointer zeigt nicht auf die Längenangabe, diese ist einfach nur vorangestellt. Willst Du jetzt die Länge haben, brauchst Du also nur das DWORD direkt davor zu lesen. Alle anderen String-Operationen laufen wie gewohnt (der Pointer zeigt direkt auf den String-Anfang).



  • Das heißt: BSTR == LPWSTR ???



  • BSTR* == LPWSTR 😕



  • Das heißt: BSTR == LPWSTR ???

    Nein. Sie zeigen zwar auf das Gleiche, dem BSTR ist aber noch ein DWORD mit der Stringlänge vorangestellt. Ungefähr so für den String L"Hallo":

    L'H'      L'a'      L'l'      L'l'      L'o'      L'\0'
    0x0A 0x00 0x00 0x00   0x48 0x00 0x61 0x00 0x6C 0x00 0x6C 0x00 0x6F 0x00 0x00 0x00
                        ^
                        |
    BSTR ---------------
    
                          L'H'      L'a'      L'l'      L'l'      L'o'      L'\0'
    0x?? 0x?? 0x?? 0x??   0x48 0x00 0x61 0x00 0x6C 0x00 0x6C 0x00 0x6F 0x00 0x00 0x00
                        ^
                        |
    PWSTR ---------------
    

    BTW: Die Stringlänge wird in Bytes angegeben. Der abschließende Null-Character wird dabei nicht mitgezählt. In unserem Fall ist das (wcslen(L"Hallo") * sizeof(WCHAR)) -> 0x0000000A -> in Little Endian 0x0A, 0x00, 0x00, 0x00.

    [ Dieser Beitrag wurde am 13.12.2002 um 01:44 Uhr von -King- editiert. ]



  • Ah. Verstehe. Aber ich dachte, der Compiler stellt jedem Array im Speicher die Länge dessen voran, um bei delete[] erkennen zu können, wieviele Bytes er zu löschen hat. Hmm, dachte ich...



  • irrer



  • Original erstellt von <:D>:
    irrer

    Achso.


Anmelden zum Antworten