Zugriff auf Safearray mit C++ Methoden?



  • Hi!

    Ich greife mit VC++ 2008 auf ein über die COM-Schnittstelle arbeitendes Programm zu und konvertiere mir die _variant_t Werte direkt in ein passendes Format:

    int laneWidth = (int) link->GetAttValue("LANEWIDTH");
    

    Nun habe ich Probleme auf ein im _variant_t liegendes zwei elementiges Safearray zuzugreifen.

    link->GetAttValue("POINTS");
    

    Hat jemand einen Ahnung, wie ich mit C++-Mitteln an die beiden ints/doubles kommen kann?

    Normalerweise programmiere ich in Java oder C++ 🙂

    Danek schon mal voran!

    Markus


  • Mod

    Es gibt keine guten C++ Klassen für SafeArray.

    Mach Dich mit der SafeArray Syntax vertraut, nutze SafeArrayAccessData oder SafeArrayGetElement!



  • Hi!

    Danke erstmal

    So richtig komme mich mit SafeArrayAccessData allerdings nicht weiter, da ich nicht wirklich weiß in welchen Format die Daten abgespeichert sind.

    Als Hilfe habe ich nur den VB-Snytax:

    [in] BSTR Attribute : attribute name (see below) 
    [out, retval] VARIANT *pValue : returned value of the attribute 
    
    Example 
    length = link.AttValue(„LENGTH“) 
    polyline = link.AttValue(„POINTS“) 
    FOR i = LBOUND(polyline) TO UBOUND(polyline) 
       x = polyline (i).X 
       y = polyline (i).Y 
    NEXT i
    

    Ich habe daher vermutet, dass vielleicht das Safearray direkt zurückgegeben wird:

    SAFEARRAY x = link->GetAttValue("POINTS");
    

    Hierbei kommt es allerdings mit zu einer Fehlermeldung, da der Rückgabetyp _variant_t ist und ein Casten in ein Safearray nicht möglich ist ...

    Hat jemand eine Idee, wie ich konkret an die Wertepaare im Safearray kommen kann?

    Gruß

    JackShepard



  • Hallo,

    JackShepard schrieb:

    Hi!

    Danke erstmal

    So richtig komme mich mit SafeArrayAccessData allerdings nicht weiter, da ich nicht wirklich weiß in welchen Format die Daten abgespeichert sind.

    Als Hilfe habe ich nur den VB-Snytax:

    [in] BSTR Attribute : attribute name (see below) 
    [out, retval] VARIANT *pValue : returned value of the attribute 
    
    Example 
    length = link.AttValue(„LENGTH“) 
    polyline = link.AttValue(„POINTS“) 
    FOR i = LBOUND(polyline) TO UBOUND(polyline) 
       x = polyline (i).X 
       y = polyline (i).Y 
    NEXT i
    

    Ich habe daher vermutet, dass vielleicht das Safearray direkt zurückgegeben wird:

    SAFEARRAY x = link->GetAttValue("POINTS");
    

    Hierbei kommt es allerdings mit zu einer Fehlermeldung, da der Rückgabetyp _variant_t ist und ein Casten in ein Safearray nicht möglich ist ...

    Hat jemand eine Idee, wie ich konkret an die Wertepaare im Safearray kommen kann?

    Gruß

    JackShepard

    _variant_t ist nur ein Wrapper für VARIANT, du hast also auch Zugriff auf den Zeiger parray, der auf das SAFEARRAY verweist. Elemente kann man dann direkt mit SafeArrayGetElement holen:

    long index = 0;
    int x = 0, y = 0; // oder double
    _variant_t points = link->GetAttValue("POINTS");
    SafeArrayGetElement(points.parray, &index, &x);
    ++index;
    SafeArrayGetElement(points.parray, &index, &y);
    

    MfG,

    Probe-Nutzer


Log in to reply