gpt4 book ai didi

c++ - 在 C++ 中迭代 BSTR 的 VARIANT/SAFEARRAY 以分配值并打印到控制台

转载 作者:行者123 更新时间:2023-11-30 01:52:12 25 4
gpt4 key购买 nike

我正在尝试用值“test”填充 BSTR 类型的 10 个索引的 SAFEARRAY,并打印出来以在分配后验证 SAFEARRAY 的每个索引的值以验证正确性。我运行了调试器并获得了以下前 5 个索引的值(我的 SAFEARRAY 称为 sa)。不知何故,我错误地迭代了 SAFEARRAY 或使用了错误的类型,每个索引都应该是“测试”。对我做错了什么有什么建议吗?

sa[0] = "test"
sa[1] = "est"
sa[2] = "st"
sa[3] = "t"
sa[4] = ""

....

#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>

using namespace std;

void fillVariant(VARIANT& varIn, BSTR &srcArray);

int main()
{

BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{

theArray[i] = SysAllocString(L"test");
}

VARIANT variantArray;
fillVariant(variantArray, *theArray);


return 0;
}

void fillVariant(VARIANT& varIn, BSTR &srcArray)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);
variantArray->vt = VT_ARRAY|VT_BSTR;

SAFEARRAY* sa;
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = 10;

sa = SafeArrayCreate(VT_BSTR, 1, aDim);

BSTR* dwArray = NULL;
SafeArrayAccessData(sa, (void**)&dwArray);

for(int i = 0; i < 10; i++)
{
dwArray[i] = &srcArray[i];

BSTR tmp = (BSTR) dwArray[i];
std::wstring ws(tmp);
//std::wstring ws(*dwArray[i], SysStringLen(dwArray[i]));
std::wcout << ws << endl;

}
SafeArrayUnaccessData(sa);
variantArray->parray = sa;
}

最佳答案

您没有正确填写 VARIANT。试试这个:

#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>

using namespace std;

void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen);

int main()
{
BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{
theArray[i] = SysAllocString(L"test");
}

VARIANT variantArray;
fillVariant(variantArray, theArray, 10);

// don't forget to free memory when done!
// note: the VARIANT owns the BSTRs, so DON'T free them!
VariantClear(&variantArray);
delete[] theArray;

return 0;
}

void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);

SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = srcArrayLen;

SAFEARRAY* sa = SafeArrayCreate(VT_BSTR, 1, aDim);
if (sa)
{
BSTR* dwArray = NULL;
SafeArrayAccessData(sa, (void**)&dwArray);

for(int i = 0; i < srcArrayLen; i++)
{
// note: passing ownership, NOT making a copy
dwArray[i] = srcArray[i];

//std::wstring ws(dwArray[i], SysStringLen(dwArray[i]));
std::wcout << dwArray[i] << endl;
}

SafeArrayUnaccessData(sa);

variantArray->vt = VT_ARRAY|VT_BSTR;
variantArray->parray = sa;
}
}

或者:

#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>

using namespace std;

void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen);

int main()
{
BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{
theArray[i] = SysAllocString(L"test");
}

VARIANT variantArray;
fillVariant(variantArray, theArray, 10);

// don't forget to free memory when done!

VariantClear(&variantArray);

// note: the VARIANT DOES NOT own the BSTRs, so DO free them!
for(int i = 0 ; i < 10; i++)
{
SysFreeString(theArray[i]);
}
delete[] theArray;

return 0;
}

void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);

SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = srcArrayLen;

SAFEARRAY* sa = SafeArrayCreate(VT_BSTR, 1, aDim);
if (sa)
{
for(LONG i = 0; i < srcArrayLen; i++)
{
// note: makes a copy, DOES NOT pass ownership!
SafeArrayPutElement(sa, &i, srcArray[i]);

//std::wstring ws(srcArray[i], SysStringLen(srcArray[i]));
std::wcout << srcArray[i] << endl;
}

variantArray->vt = VT_ARRAY|VT_BSTR;
variantArray->parray = sa;
}
}

关于c++ - 在 C++ 中迭代 BSTR 的 VARIANT/SAFEARRAY 以分配值并打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com