Wert eines Varianten (String) auslesen



  • Hallo,
    bin Newbie in C++, wer hilft mir etwas weiter:

    Ein Programm übergibt an eine DLL einen String-Wert als Variable (VARIANT),
    genauer gesagt ein Datum: 2007-04-21

    Diesen Varianten muss ich in der DLL jetzt wieder als String auslesen, damit ich den Wert in der DLL weiterverarbeiten kann.

    Habe Folgendes gemacht:

    HRESULT hResult;
    VARIANT vDatum;   
    VariantInit(&vDatum);  
    variables[2]->GetValue(&vDatum); //Hier steckt er den Wert der Var.2 in vDatum
    //Variant in String umwandeln
    hResult = VariantChangeType(&vDatum, &vDatum, 0, VT_BSTR);
    

    ..
    weiter unten dann:

    ...

    if( strLine.substr(0,10).compare(V_BSTR(&vDatum)) == 0 )
    

    ...

    in dieser Zeile kommt dann der Fehler:
    Konvertierung von 'BSTR' in 'const std::basic_string<_Elem,_Traits,_Ax>' nicht möglich
    with
    [
    _Elem=char,
    _Traits=std::char_traits,
    _Ax=std::allocator
    ]
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig

    Wie komme ich an den String-Wert des Varianten? 😕
    Danke.



  • Hallo

    Ausgehend von der Fehlermeldung versuchst du den aus V_BSTR gelieferten Unicode-String in die Methode std::string::substr einzusetzen, das aber einen Ansi-String brauchst. Das verweigert der Compiler natürlich, da er w_char* und char* nicht implizit umwandeln kann.
    Um das Problem zu lösen must du nur die Umwandlung von VARIANT in char* machen, mit der passenden WinAPI-Funktionen. ich vermute die lautet V_STR.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Ausgehend von der Fehlermeldung versuchst du den aus V_BSTR gelieferten Unicode-String in die Methode std::string::substr einzusetzen, das aber einen Ansi-String brauchst. Das verweigert der Compiler natürlich, da er w_char* und char* nicht implizit umwandeln kann.
    Um das Problem zu lösen must du nur die Umwandlung von VARIANT in char* machen, mit der passenden WinAPI-Funktionen. ich vermute die lautet V_STR.

    bis bald
    akari

    Hallo,
    V_STR stimmt wohl..

    Habe es jetzt aber so gemacht; um den Varianten erstmal als BSTR zu lesen

    BSTR bstr = _bstr_t(&vDatum);
    

    Um ihn danach als string zu bekommen, das ist noch etwas komplizierter..
    Scheint nicht gerade einfach zu sein mit den Typen, in C++



  • Hallo

    CLange schrieb:

    V_STR stimmt wohl..

    Warum nimmst du es nicht?

    Habe es jetzt aber so gemacht; um den Varianten erstmal als BSTR zu lesen

    BSTR bstr = _bstr_t(&vDatum);
    

    Um ihn danach als string zu bekommen, das ist noch etwas komplizierter..
    Scheint nicht gerade einfach zu sein mit den Typen, in C++

    In C++ geht die Umwandlung mittels der locals, auf die Schnelle hab ich nur char* nach w_char* gefunden. Die Gegenrichtung ist aber auch irgendwo im C++ Forum schon besprochen.
    Es gibt auch direkte WinAPI-Funktionen die das machen, siehe WinAPI-Forum.

    Im Builder könnte man auch WideString benutzen, das eine denkbar einfache Konvertierung anbietet :

    WideString w = L"Hallo"; // Hier dein w_char* zuweisen
    AnsiString a = w; // Konvertierung
    

    bis bald
    akari



  • Warum nimmst du es nicht?

    Weil ich beginner in C++ bin und gerade froh, daß es funzt,
    siehe oben.

    Aber irgendwie müsste das auch so gehen
    //Typ festlegen

    V_VT(xy) = VT_STR
    V_STR(xy) = ...
    

    Umwandlung BSTR in string, dazu musste ich dann ne eigene Funktion schreiben.
    Nutze außerdem gerade VC++ Express, habe keine MFC.
    Mit MFC wohl etwas einfacher..
    Viele Gr



  • Hallo

    CLange_ schrieb:

    Warum nimmst du es nicht?

    Weil ich beginner in C++ bin und gerade froh, daß es funzt,
    siehe oben.

    Dein vorletzter Post klingt aber nicht so als ob "es funzt" 😕

    Aber irgendwie müsste das auch so gehen
    //Typ festlegen

    V_VT(xy) = VT_STR
    V_STR(xy) = ...
    

    Umwandlung BSTR in string, dazu musste ich dann ne eigene Funktion schreiben.

    😕

    Nutze außerdem gerade VC++ Express, habe keine MFC.
    Mit MFC wohl etwas einfacher..

    MS VC? MFC? Du bist dir schon im klaren das du hier im Builder-Forum bist? 😕

    bis bald
    akari


Log in to reply