Я пытаюсь заполнить SAFEARRAY из 10 индексов типа BSTR со значением «тест» и распечатать для консоли значение каждого индекса 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;
}
SAFEARRAY
? CComSafeArray предоставляет оболочку, которую гораздо проще использовать. - person lcs   schedule 29.07.2014BSTR *theArray = new BSTR[10];
можно упростить доBSTR theArray[10];
- person M.M   schedule 29.07.2014