Wo liegt die Zeichengrenze von BSTR (Newbee)



  • Wo liegt die Zeichengrenze von BSTR (Newbee)

    Hallo!

    Ich muß an eine c++-dll (ohne MFC!) einen String-Array übergeben. Dies habe ich mit SAFEARRAY auch gelöst. Solange die Strings nicht "alzu" groß sind, gibt es keine Probleme.

    Also der VB-Code sieht so aus:

    Option Explicit
    Private Declare Function StringArray Lib "test.dll" Alias "_StringArray@4" _
        (s() As String) As Integer
    Private Sub Command1_Click()
        ReDim str(2) As String
        Dim i As Integer
        str(1) = "String 1"
        str(2) = a$21			//Siehe unten! zu str(2)
        i = StringArray(str)
    End Sub
    

    zu str(2):

    mein str(2) ist ein String, der ca. 200.000 Zeichen lang ist.

    Nun bin ich in vb an die Grenzen gestoßen, als ich diesen String manuell eingeben wollte. Ich teilte also den String in 20 verschiedene Strings auf:

    a1,a2, a2 ... a20$

    Zum Schluß habe ich alle 20 Strings in einen einzigen String "a21$" gepackt:

    a21$ = a1$ + a2$ + ....+ a20$

    und habe:

    str(2) = a21$

    geschrieben

    Wenn ich beim Debuggen Len(a21(a21) eingebe, zeigt er mir korrekterweise 200.000 an, d.h. er hat den Gesamtstring in a21$ gespeichert und müßte (normalerweise) diesen Gesamtstring ja auch an "str(2) übergeben! Bis hierhin ist alles korrekt.

    Aber in der c++-DLL ist vom Gesamtstring nur ein winziger Teil (nämlich nur 1/10 des Strings a1$ zu sehen!).

    Wo liegt das Problem?

    - Sind die 200.000 Zeichen einfach nur zu viel und ist (char*)bstr nicht in der Lage so viele Zeichen aufzunehmen?

    Hat jemand vielleicht eine Idee dazu?

    Danke!



  • (char*)bstr

    Ich hoffe ich sehe nicht das was ich da sehe ???

    Zum Thema ....
    BSTR ist nen Window eigener Datentyp fuer Strings, besonders fuer datenaustausch (OLE) richtig.
    der Kann MULTIBYTE Zeichenfolgen aufnehmen ... also ein Zeichenbereich von 0 .. 65535 .... also nicht char sondern short oder Besser den dafuer vorgesehenen Typ OLECHAR nehmen ....

    Fuer Multibyte Zeichenfolgen gibt es spezielle Versionen, die fangen alle mit "wcs" (widechar) an. Sollte man nur lesend damit zugreifen, und niemals die Stringlaenge damit manipulieren !

    Weiterhin hat der BSTR eine besonderheit. Der string besteht aus fuehrenden 2 Byte, die die Laenge angeben ... dannach die zeichenfolge als Folge OLECHAR Zeichen + Abschliesendes NULL zeichen.

    Das Null zeichen ist da aber auch nen gueltiges Zeichen in der Kette, wenn man die BSTR API funktionen nimmt. Nimst die wcs- funktionen, erkennt er den String nur bis zum Null zeichen. (Wobei NULL Zeichen mitten im BSTR relativ selten sind)

    DU kannst also auch einen BSTR nicht mittels BSTR mystring = new OLECHAR[200] erzeugen, weil dem BSTR dann der bereich fuer die Laengenangabe fehlen wuerde.
    Dafuer gibts extra API - funktionen ... SysAllocString() etc ...
    Ein delete ist aus selbigen Grund auch falsch.

    Der BSTR selber ist ein Zeiger auf OLECHAR und zeigt auf das Erste zeichen, ned auf die Laengenangabe !!!

    Wo liegt die Zeichengrenze von BSTR (Newbee)

    2 Byte Laengenangabe .... 65535 wuerd ich schaetzen 🙂

    Ciao



  • Noch nen Tipp

    Dll, mit COM funktionen (Datentyp BSTR weisst darauf hin), keine MFC, wirst hoffentlich nicht per hand coden ... also vermute ich du nimmst die ATL ???

    Wenn ja ... CComBSTR anschauen, der nimmt viel arbeit ab ...
    Wenn nein ... ATL-Header einbinden unt trotzdem CCOmBSTR verwenden :-)))

    Ciao ...


Anmelden zum Antworten