Rayner Nirmal Ответов: 0

Нужно преобразовать вариант выходного типа в 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?

0 Ответов