SafeArray of SafeArrays? Помогите перенести код VBA на C++

FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2))

такой код сверху у меня есть у VBA макросов. Теперь то же самое, что я должен создать в коде C++. Насколько я мог понять до сих пор - я должен использовать тип SAFEARRAY. Но я до сих пор не понимаю, как правильно я должен это делать. Основная проблема - у меня практически чистый C++ код. Нет расширений MSVC, таких как COleSafeArray, нет поддержки ATL. Единственное, что я могу использовать - это STLSoft, которая на 100% основана только на заголовках, что значительно упрощает создание таких элементов, как SAFEARRAY.

Но в любом случае - какой должна быть структура? 1D SafeArray 1D SafeArrays двух элементов типа VT_I4?

PS Я должен использовать среду MinGW + gcc 4.x.

1 ответ

Решение
// 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);
}

И этот код позволил мне достичь моей цели!

Другие вопросы по тегам