Com BSTR _bstr_t



  • Hi zusammen,

    ich hoffe mir kann hier jemand helfen.
    Ich habe eine Basic Exe die einige Funktionen zur Verfügung stellt.
    Bei einer Funktionen gibt es eine, die über einen BSTR eingestellt werden.
    z.B.
    Postleitzahl(_bstr_t sOrt, long* lPlz)

    long lPlz;
    _exe->Postleitzahl((_bstr_t)"Berlin",&lPlz)
    

    Kann mir jemand sagen wieso das nicht Funktioniert?
    Wenn ich es umschreibe:

    long lPlz;
    BSTR sOrt =(BSTR) SysAllocString(L"Berlin");
    _exe->Postleitzahl(sOrt,&lPlz)
    

    dann funktioniert es.
    Allerdings wenn ich dann danach SysFreeString(sOrt) aufrufe geht es wieder schief.
    Gibt es hier eine Möglichkeit wie ich meinen Speicher anders wieder aufräumen kann?
    Oder ist er schon wieder Frei gegeben?

    Gruß
    Rocketbuehler


  • Mod

    IMHO müsste es

    _exe->Postleitzahl(_bstr_t("Berlin"),&lPlz)
    

    heißen!



  • Hi,

    dies geht leider auch nicht.
    _exe->Postleitzahl(_bstr_t("Berlin"),&lPlz)

    Ich habe auch
    _exe->Postleitzahl(BSTR(L"Berlin"),&lPlz)
    probiert und geht auch nicht.

    Eine Idee?

    Gruß
    Rocketbuehler



  • Hallo,

    und was passiert, wenn du es so:

    _bstr_t ort(L"Berlin");
    
    _exe->Postleitzahl(ort,&lPlz);
    

    schreibst?

    MfG,

    Probe-Nutzer



  • Hi,

    also da bricht er auch ab.
    Immer an in der Datei "cmutil.h"
    in der Funktion

    inline void _bstr_t::Data_t::_Free() throw()
    

  • Mod

    Dann würde ich mal tippen, dass die Funktion die Du aufrufst Käse baut und den Zeiger zerstört oder freigibt...



  • Rocketbuehler schrieb:

    Hi zusammen,

    ...
    long lPlz;
    BSTR sOrt =(BSTR) SysAllocString(L"Berlin");
    _exe->Postleitzahl(sOrt,&lPlz)
    

    ...

    BSTR sOrt = SysAllocString(OLESTR("Berlin");
    

    Sollte ebenso wie dein Code funktionieren. Vielleicht stimmt die Signatur
    der Funktion nicht, oder aber die Implementierung ist fehlerhaft. Du solltest
    aber schon ordnungsgemäß prüfen, ob die Funktion auch erfolgreich war(HRESULT)



  • BSTRs sollten eigentlich nur freigegeben werden, wenn Sie als __out-Parameter definiert sind. _exe->Postleitzahl hält sich nicht dran und gibt den BSTR selbst frei.

    Wie Martin schon sagte, der Fehler liegt in der aufgerufenen Funktion.


Anmelden zum Antworten