【问题标题】:SafeArray of SafeArrays? Help to transfer VBA code to C++安全阵列的安全阵列?帮助将 VBA 代码转换为 C++
【发布时间】:2016-08-21 09:53:56
【问题描述】:
FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 2), Array(5, 2))

我在 VBA 宏中的上述代码。现在我应该在 C++ 代码中创建同样的东西。 据我到目前为止所了解的 - 我应该使用 SAFEARRAY 类型。 但我仍然不明白我应该如何正确地做到这一点。 主要问题 - 我有几乎纯 C++ 代码。没有像 COleSafeArray 这样的 MSVC 扩展,没有 ATL 支持。 我唯一可以使用的东西——STLSoft,它是一个 100% 纯头文件库 这大大简化了 SAFEARRAY 等元素的创建。

但无论如何 - 它应该是哪种结构?两个 VT_I4 类型元素的 1D SafeArrays 的 1D SafeArray?

附:我应该使用 MinGW + gcc 4.x 环境。

【问题讨论】:

  • 据我所知,SAFEARRAY 是 MSVC 的东西。你对此没有任何问题吗?
  • Oups - 抱歉 - 我完全忘记补充说我应该在 MinGW+gcc 环境中工作。 SAFEARRAY 声明对我来说是开箱即用的 MinGW。所以 - 我什至没有尝试分析 - 谁是第一家公司 - 谁开发了它。
  • @HumamHelfawi,不,当您在 COM 公开的方法中使用数组类型时,SAFEARRAY 正是在 VBA/VB6 中传递的内容。

标签: c++ excel com safearray vba


【解决方案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);
}

这段代码让我实现了我的目标!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多