SafeArray 的 SafeArray?帮助将 VBA 代码转移到 C++
SafeArray of SafeArrays? Help to transfer VBA code to C++
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?
P.S。我应该使用 MinGW + gcc 4.x 环境。
// 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);
}
这段代码让我实现了我的目标!
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?
P.S。我应该使用 MinGW + gcc 4.x 环境。
// 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);
}
这段代码让我实现了我的目标!