Нужно как-то начать... :)
Собцтвенно появилась необходимость из COM-сервера передавать массив структур в C#. "В лоб" решить не удалось. После нескольких часов поиска в гугле (да-да, я с COM не очень дружу собцтвенно как и с C#) было найдено решение, которое я и выкладываю.
1. Объявляем структуру в idl файле
[uuid(8DD089EB-418B-41a6-803A-2A26313B4EB7)]
struct USERSLIST
{
int ObjectID;
BSTR Description;
};Syhi-подсветка кода
2. Реализация функции GetUsersList
STDMETHODIMP CMyInterface::GetUsersList(SAFEARRAY **UsersList)
{
GUID GUID_USERSLIST = __uuidof(USERSLIST);
IRecordInfo *pInfo;
HRESULT hr = GetRecordInfoFromGuids(LIBID_VPluginLib, 1, 0, 0,
GUID_USERSLIST, &pInfo);
// Устанавливаем размер будущего массива
*UsersList = SafeArrayCreateVectorEx(VT_RECORD, 0, 4, pInfo);
pInfo->Release();
USERSLIST *pTS = NULL;
// Устанавливаем pTS на переданный UsersList и заполняем
hr = SafeArrayAccessData(*UsersList, (PVOID*)&pTS);
pTS[0].Description = SysAllocString(L"Test1");
pTS[0].ObjectID = 1;
pTS[1].Description = SysAllocString(L"Test2");
pTS[1].ObjectID = 2;
pTS[2].Description = SysAllocString(L"Test3");
pTS[2].ObjectID = 3;
pTS[3].Description = SysAllocString(L"Test4");
pTS[3].ObjectID = 4;
// Все :)
SafeArrayUnaccessData(*UsersList);
return S_OK;
}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-подсветка кода