Как передать массив объектов (c# .net) в c++ (com)
От: endri  
Дата: 12.10.05 16:32
Оценка:
Господа.

Имеется класс, написанный на c#:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public class UserInfo
{
    private int    _userID        = Null.NullInteger;
    private int    _groupID    = Null.NullInteger;
    private int    _groupTypeID    = Null.NullInteger;
    [MarshalAs(UnmanagedType.BStr)]
    private String    _groupName    = Null.NullString;
    [MarshalAs(UnmanagedType.BStr)]
    private String    _firstName    = Null.NullString;
    [MarshalAs(UnmanagedType.BStr)]
    private string    _lastName    = Null.NullString;
    [MarshalAs(UnmanagedType.BStr)]
    private string    _username    = Null.NullString;
    [MarshalAs(UnmanagedType.BStr)]
    private string    _password    = Null.NullString;
    private bool    _isSuperUser    = Null.NullBoolean;
    [MarshalAs(UnmanagedType.BStr)]
    private string    _universityName = Null.NullString;
}


Так же описан интерфейс для дальнейшего использования в com. В этом интерфейсе есть функция, возвращающая массив объектов UserInfo[].

В tlb формируется следующая структура:


typedef [uuid(8B077412-2955-3343-91FE-A2894BA5FF4F), version(1.0),
custom({0F21F359-AB84-41E8-9A78-36D110E6D2F9}, "NST.BLL.UserInfo")
]
struct tagUserInfo {        
long _userID;       
long _groupID;        
long _groupTypeID;        
BSTR _groupName;        
BSTR _firstName;        
BSTR _lastName;        
BSTR _username;        
BSTR _password;        
long _isSuperUser;        
BSTR _universityName;
} UserInfo;


Функция, возвращающая массив выглядит так:
 [id(0x60020003)]
 HRESULT Users(
               [in] long groupID, 
               [out, retval] SAFEARRAY(UserInfo*)* pRetVal);



Далее в с++ я подключаю com и выполняю следующие действия:


SAFEARRAY* psa;
pITestComponent->Users(1,&psa); // Users - функция, возвращающая массив UserInfo[]

UserInfo* pUserStruct = NULL; // UserInfo - структура, описанная в библиотеке типов(см. выше)
if (psa != NULL)
{     
    hr = SafeArrayAccessData(psa, (void**)&pUserStruct);
    _ASSERT(SUCCEEDED(hr) && pUserStruct);

      // здесь     используем полученный массив структур pUserStruct, но он заполнен  НЕ КОРРЕКТНО

      hr = ::SafeArrayUnaccessData(psa);
    _ASSERT(SUCCEEDED(hr));
}
SafeArrayDestroy(psa);



Проблема в том, что массив pUserStruct в последнем куске кода заполнен не правильно, всякой абракадаброй.
Подскажите, может я что не так делаю?

Заранее благодарю, Андрей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.