Информация об изменениях

Сообщение SAFEARRAY как средство возврата массива от 16.07.2018 5:21

Изменено 16.07.2018 5:23 AlexGin

SAFEARRAY как средство возврата массива
Доброе время суток, уважаемые коллеги!

Я сделал COM In-Pocess сервер (в виде DLL). Эта штука на C++ делает некоторую вычислительную работу, а массив результатов должен вернуться в головное приложение.

Мне хотелось бы использовать SAFEARRAY — как средство возврата массива.

Для этого, метод (или свойство "get") должно иметь [out] параметр вида:

    [propget, id(7)] HRESULT Array1([out, retval] SAFEARRAY** pVal);


Вот рекомендации:
https://msdn.microsoft.com/en-us/magazine/mt795188.aspx

Метод заполнения массива должен выглядеть примерно так:
STDMETHODIMP CMyComComponent::DoSomething(/* [out] */ SAFEARRAY** ppsa) noexcept
{
  try
  {
    // Create a safe array storing 'count' BYTEs
    const LONG count = /* some count value */;
    CComSafeArray<BYTE> sa(count);
    // Fill the safe array with some data
    for (LONG i = 0; i < count; i++)
    {
      sa[i] = /* some value */;
    }
    // Return ("move") the safe array to the caller
    // as an output parameter
    *ppsa = sa.Detach();
  }
  catch (const CAtlException& e)
  {
    // Convert ATL exceptions to HRESULTs
    return e;
  }
  // All right
  return S_OK;
}



Проблема — в том, что MIDL компилятор всё время ругается, на попытку компиляции этого:

AlexGinTest1.idl(25): error MIDL2139: type of the parameter cannot derive from void or void * : [ Type 'PVOID' ( Parameter 'pVal' ) ]
AlexGinTest1.idl(25): error MIDL2105: pointee / array does not derive any size : [ Field 'rgsabound' of Struct 'tagSAFEARRAY' ( Parameter 'pVal' ) ]


Просматривал ссылочки на материалы по применению SAFEARRAY:
https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray
https://www.codeproject.com/Articles/2452/Passing-C-Object-in-ATL-DLL-Server

Но понять, как решить данную проблему
SAFEARRAY как средство возврата массива
Доброе время суток, уважаемые коллеги!

Я сделал COM In-Pocess сервер (в виде DLL). Эта штука на C++ делает некоторую вычислительную работу, а массив результатов должен вернуться в головное приложение.

Мне хотелось бы использовать SAFEARRAY — как средство возврата массива.

Для этого, метод (или свойство "get") должно иметь [out] параметр вида:

    [propget, id(7)] HRESULT Array1([out, retval] SAFEARRAY** pVal);


Вот рекомендации:
https://msdn.microsoft.com/en-us/magazine/mt795188.aspx

Метод заполнения массива должен выглядеть примерно так:
STDMETHODIMP CMyComComponent::DoSomething(/* [out] */ SAFEARRAY** ppsa) noexcept
{
  try
  {
    // Create a safe array storing 'count' BYTEs
    const LONG count = /* some count value */;
    CComSafeArray<BYTE> sa(count);
    // Fill the safe array with some data
    for (LONG i = 0; i < count; i++)
    {
      sa[i] = /* some value */;
    }
    // Return ("move") the safe array to the caller
    // as an output parameter
    *ppsa = sa.Detach();
  }
  catch (const CAtlException& e)
  {
    // Convert ATL exceptions to HRESULTs
    return e;
  }
  // All right
  return S_OK;
}



Проблема — в том, что MIDL компилятор всё время ругается, на попытку компиляции этого:

AlexGinTest1.idl(25): error MIDL2139: type of the parameter cannot derive from void or void * : [ Type 'PVOID' ( Parameter 'pVal' ) ]
AlexGinTest1.idl(25): error MIDL2105: pointee / array does not derive any size : [ Field 'rgsabound' of Struct 'tagSAFEARRAY' ( Parameter 'pVal' ) ]


Просматривал ссылочки на материалы по применению SAFEARRAY:
https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray
https://www.codeproject.com/Articles/2452/Passing-C-Object-in-ATL-DLL-Server

Но понять, как решить данную проблему пока невозможно.

Какие есть мысли по этому поводу?

P.S. Заранее благодарю за любые подсказки.