COM. Передача массива структур в C#

Nov 15, 2010 14:22

Нужно как-то начать... :)
Собцтвенно появилась необходимость из COM-сервера передавать массив структур в C#. "В лоб" решить не удалось. После нескольких часов поиска в гугле (да-да, я с COM не очень дружу собцтвенно как и с C#) было найдено решение, которое я и выкладываю.

1. Объявляем структуру в idl файле


  1. [uuid(8DD089EB-418B-41a6-803A-2A26313B4EB7)]

  2. struct USERSLIST

  3. {

  4.    int ObjectID;

  5.    BSTR Description;

  6. };Syhi-подсветка кода


2. Реализация функции GetUsersList


  1. STDMETHODIMP CMyInterface::GetUsersList(SAFEARRAY **UsersList)

  2. {

  3.   GUID GUID_USERSLIST = __uuidof(USERSLIST);

  4.   IRecordInfo *pInfo;

  5.   HRESULT hr = GetRecordInfoFromGuids(LIBID_VPluginLib, 1, 0, 0,

  6.        GUID_USERSLIST, &pInfo);

  7.   // Устанавливаем размер будущего массива

  8.   *UsersList = SafeArrayCreateVectorEx(VT_RECORD, 0, 4, pInfo);

  9.   pInfo->Release();

  10.  

  11.   USERSLIST *pTS = NULL;

  12.   // Устанавливаем pTS на переданный UsersList и заполняем

  13.   hr = SafeArrayAccessData(*UsersList, (PVOID*)&pTS);

  14.  

  15.   pTS[0].Description = SysAllocString(L"Test1");

  16.   pTS[0].ObjectID = 1;

  17.  

  18.   pTS[1].Description = SysAllocString(L"Test2");

  19.   pTS[1].ObjectID = 2;

  20.  

  21.   pTS[2].Description = SysAllocString(L"Test3");

  22.   pTS[2].ObjectID = 3;

  23.  

  24.   pTS[3].Description = SysAllocString(L"Test4");

  25.   pTS[3].ObjectID = 4;

  26.  

  27.   // Все :)

  28.   SafeArrayUnaccessData(*UsersList);

  29.   return S_OK;

  30. }Syhi-подсветка кода


3. Пользуемся из C#
(предварительно использовал Add reference чтобы использовать свой интерфейс)

VPluginLib.IVInterface vk = new VPluginLib.VInterfaceClass();
VPluginLib.USERSLIST[] arr;
arr = (VPluginLib.USERSLIST[])vk.GetUsersList();
string OutStr = "";
foreach (VPluginLib.USERSLIST Current in arr)
    OutStr += Current.ObjectID + ") " + Current.Description + "\n";

MessageBox.Show(OutStr);Syhi-подсветка кода

it, c#, c++

Previous post Next post
Up