Нужно преобразовать вариант выходного типа в SAFEARRAY
CComVariant platformOutVar; ..... hr = (pDSPEngine->foo(LibraryName,SpecialFunctionName,inVar,&platformOutVar));
STDMETHODIMP CDSPEnginePC_PI::foo(/*[in]*/ BSTR LibraryName, /*[in]*/ BSTR SpecialFunctionName, /*[in,optional]*/ VARIANT paramIn, /*[out, optional]*/ VARIANT * paramOut) { for (auto it = m_vectorCommBuff.begin(); it != m_vectorCommBuff.end(); it++) { HRESULT hr = it->get()->foo1(LibraryName,SpecialFunctionName,paramIn,paramOut); } }
HRESULT CDSPEngPCCommBuff::foo1(/*[in]*/ BSTR LibraryName, /*[in]*/ BSTR SpecialFunctionName, /*[in,optional]*/ VARIANT paramIn, /*[out, optional]*/ VARIANT * paramOut) { CommBufEntry buf(SYNC, AAA); //local parameters used for assignments CComVariant inVar(paramIn); CComBSTR libName(LibraryName); CComBSTR sfuncName(SpecialFunctionName); buf.bstrData1 = libName.Detach(); buf.bstrData2 = sfuncName.Detach(); inVar.Detach(&buf.varData1); buf.pVarPtr1 = paramOut; AddCommand(buf); //releasing BSTRs to avoid memory leak SysFreeString(buf.bstrData1); SysFreeString(buf.bstrData2); LogHResultError(buf.err, __FUNCTION__" LibraryName=%S, SpecialFunctionName=%S", LibraryName, SpecialFunctionName); return buf.err; }
Метод CDSPEnginePC_PI:: foo имеет выходной параметр типа Variant *. Мне нужно преобразовать этот вариант * в Safearray *.
Но выходным параметром функции foo1 должен быть Varaint *. поэтому мне нужно создать локальный указатель варианта и передать его в foo1 вместо paramOut.
Мне нужно создать safearray и передать этот выходной вариант foo1 в этот safearray и вернуть его. Пожалуйста, помогите в этом.
Что я уже пробовал:
Я попытался изменить сигнатуру функции с variant на safearray и получил ошибку при компиляции, не могу инициировать абстрактный класс. Я тоже внес изменения в заголовочный файл. все еще получаю эту ошибку.
Jochen Arndt
Каков тип выходного параметра foo1 (это вариант, но что там внутри)?
Я бы ожидал, что какой-то базовый тип должен быть добавлен к списку во время итерации.
Таким образом, Сначала вам нужно будет получить количество итераций, выделить безопасный массив, заполнить его в цикле значениями, возвращаемыми foo1, и вернуть этот массив.
Rayner Nirmal
Значение HRESULT CDSPEngPCCommBuff::foo1(/*[в]*/ BSTR для Имябиблиотеки, /*[в]*/ BSTR для SpecialFunctionName, /*[необязательно]*/ вариант paramIn, /*[нет, необязательно]*/ вариант * paramOut)
{
CommBufEntry баф(синхронизация, ААА);
CComVariant Inver(paramIn);
CComBSTR libName(LibraryName);
CComBSTR sfuncName(SpecialFunctionName);
параметр buf.bstrData1 = libимя.Отсоединить();
параметр buf.bstrData2 = sfuncName.Отсоединить();
Инвар.Отсоединить(&усилителя;буфер buf.varData1);
баф.pVarPtr1 = paramOut;
AddCommand(buf);
// освобождение BSTRs во избежание утечки памяти
SysFreeString(буфер buf.bstrData1);
SysFreeString(буфер buf.bstrData2);
LogHResultError(буфер buf.ошибаться, функции ____" Имябиблиотеки=%с SpecialFunctionName=%Ы", Имябиблиотеки, SpecialFunctionName);
вернуть баф.ошибаться;
}
0x01AA
Как насчет LPSAFEARRAY* против вашего LPSAFEARRAY?