Господа.
Имеется класс, написанный на 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 в последнем куске кода заполнен не правильно, всякой абракадаброй.
Подскажите, может я что не так делаю?
Заранее благодарю, Андрей.