Savearray -> _variant_t



  • Hallo zusammen.

    Ich habe mit SafeArrayCreate ein neues SaveArray erstellt. Nun würde ich gerne dieses SaveArray in einen _variant_t packen bzw. einen neuen _variant_t erzeugen.

    SAFEARRAYBOUND sabound;
    sabound.lLbound = 0;    // Element startet bei Index 0
    sabound.cElements = 10;	// Anzahl der Bytes
    auto savearray = SafeArrayCreate(VT_UI1, 1, &sabound);
    
    // so gehts nicht:
    auto variant = _variant_t(savearray);
    

    Hat mir jemand eine Lösung.



  • SaveArray? _variant_t?





  • @hustbear

    Die Lösung darin lautet ja wie folgt

    // Initialize the variant
    VARIANT vt;
    VariantInit(&vt);
    vt.vt = VT_ARRAY | VT_INT;
    vt.parray = safeArray.Detach();
    
    // Create the _variant_t
    _variant_t variant;
    variant.Attach(vt);
    

    na ok. Dachte ich kann den _variant_t direkt erzeugen ohne noch zusätlich einen VARIANT zu erzeugen.

    Akutell habe ich es wie folgt implementiert:

    _variant_t variant;
    variant.vt = VT_ARRAY | VT_INT;
    variant.parray = savearray;
    

    funktioniert auch. Aber ich weiß nicht ob das doch zu Problemen führen kann. Die oben genannte Variante ist wohl die sicherere.

    Wobei ich mich frage: Muss ich nach einem VariantInit nicht auch ein VartiantClear aufrufen?

    Eigentlich kapselt _variant_t den VARIANT und übernimmt die init und clear aufgabe.



  • Func()() schrieb:

    Wobei ich mich frage: Muss ich nach einem VariantInit nicht auch ein VartiantClear aufrufen?

    Eigentlich kapselt _variant_t den VARIANT und übernimmt die init und clear aufgabe.

    Nach VariantInit muss du nix freigeben, VariantInit macht dir nen "leeren" VARIANT.
    Freigeben musst du nur das was du angefordert hast, und dabei aufpassen dass du es nicht 2x freigibst.

    Dem Konstruktor von _variant_t der nen VARIANT als Parameter kannst du sagen ob er den VARIANT kopieren soll (=dann musst du das Original freigeben), oder ob er den VARIANT "übernehmen" soll. Dann darfst du das Original nicht mehr freigeben.
    Da man normalerweise nicht unnötig kopieren will, ist die 2. Variante vorzuziehen.

    Func()() schrieb:

    Akutell habe ich es wie folgt implementiert:

    _variant_t variant;
    variant.vt = VT_ARRAY | VT_INT;
    variant.parray = savearray;
    

    funktioniert auch. Aber ich weiß nicht ob das doch zu Problemen führen kann. Die oben genannte Variante ist wohl die sicherere.

    Ich sehe kein Problem, das sollte so passen.
    Also vorausgesetzt du gibt savearray NICHT selbst frei, denn so wie du das da machst gehört das dann dem _variant_t und der wird es dann freigeben.



  • @hustbear

    Ok. Ich danke dir für deine Ausführliche Erklärung


Log in to reply