2016-04-27 9 views
-2
FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)) 

solchen Code von oben habe ich bei VBA-Makros. Jetzt das gleiche, was ich in einem C++ Code erstellen sollte. Soweit ich bis jetzt verstehen konnte - ich sollte SAFEARRAY Typ verwenden. Aber ich verstehe immer noch nicht, wie richtig ich das machen soll. Hauptproblem - Ich habe praktisch reinen C++ Code. Keine MSVC-Erweiterungen wie COleSafeArray, keine ATL-Unterstützung. Die einzige Sache, die ich verwenden kann - STLSoft, die eine 100% Header-only-Bibliothek ist, die die Erstellung solcher Elemente wie SAFEARRAY erheblich vereinfacht.SafeArray von SafeArrays? Hilfe zur Übertragung von VBA-Code nach C++

Aber in irgendeiner Weise - welche Struktur sollte es sein? 1D SafeArray von 1D SafeArrays von zwei VT_I4 Typelementen?

P.S. Ich sollte MinGW + gcc 4.x-Umgebung verwenden.

+0

Soweit ich weiß, SAFEARRAY ist MSVC Sache. Hast du damit kein Problem? –

+0

Oups - Entschuldigung - ich habe völlig vergessen hinzuzufügen, dass ich bei MinGW + gcc Umgebung arbeiten sollte. Und SAFEARRAY Deklaration ist für mich out-of-Box von MinGW einfach verfügbar. Also - ich habe nicht einmal versucht zu analysieren - wer war das erste Unternehmen - wer hat es entwickelt. – graphElem

+0

@HumamHelfawi, nein, SAFEARRAY ist genau das, was in VBA/VB6 weitergegeben wird, wenn Sie einen Array-Typ in einer COM-exposed-Methode verwenden. –

Antwort

0
// Create a 5x2 safearray of integer arrays with VT_I4 fields... 
comstl::variant fieldInfo; 
fieldInfo.vt = VT_ARRAY | VT_VARIANT; 
{ 
    SAFEARRAYBOUND sab[2]; 
    sab[0].lLbound = 1; sab[0].cElements = 5; // i 
    sab[1].lLbound = 1; sab[1].cElements = 2; // j 
    fieldInfo.parray = SafeArrayCreate(VT_VARIANT, 2, sab); 
} 

// Fill safearray with values like: 
/* 
    FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2)) 
*/ 
// first of all fill the first column with data... 
for(int i=1; i<=5; i++) { 
    VARIANT tmp; 
    tmp.vt = VT_I4; 
    tmp.lVal = i; 
    // Add to safearray... 
    long indices[] = {i,1}; 
    SafeArrayPutElement(fieldInfo.parray, indices, (void *)&tmp); 
} 
// ...after that - fill the second column. 
for(int i=1; i<=5; i++) { 
    VARIANT tmp; 
    tmp.vt = VT_I4; 
    tmp.lVal = 2; 
    // Add to safearray... 
    long indices[] = {i,2}; 
    SafeArrayPutElement(fieldInfo.parray, indices, (void *)&tmp); 
} 

Und dieser Code erlaubt mir, mein Ziel zu erreichen!

Verwandte Themen