我试图用值“test”填充BSTR类型的10个索引的SAFEARRAY,并在分配SAFEARRAY的每个索引以验证其正确性后打印出控制台的值。我运行了调试器,并在下面的前5个索引中获得了这些值(我的SAFEARRAY称为sa)。我以某种方式错误地迭代了SAFEARRAY或使用了错误的类型,每个索引都应该是“test”。关于我做错什么的任何建议吗?
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++ - 遍历BSTR的VARIANT/SAFEARRAY以分配值并在C++中打印到控制台,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25004408/