Доброго всем времени суток.
Проблема следующая: DCOM сервер написан на C++, клиент — VB.NET.
Сервер отдает клиенту VARIANT, в котором — SAFEARRAY(BSTR)*. Клиент получает в результате ссылку на Nothing.
IDL:
interface IServiceMgr : IDispatch{
[id(1), helpstring("Asks manager for specified action")] HRESULT Manage([in] VARIANT Action, [in] VARIANT Params ,
[out] VARIANT* Result);
};
C++:
VARIANT tmp;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements =2;
BSTR HUGEP *pBSTR;
VariantInit(&tmp);
VariantClear(Result);
VariantChangeType(&tmp,&tmp,VARIANT_NOVALUEPROP,VT_ARRAY);
VariantChangeType(Result,Result,VARIANT_NOVALUEPROP,VT_ARRAY);
tmp.parray=SafeArrayCreate(VT_BSTR,1,rgsabound);
Result->parray=SafeArrayCreate(VT_BSTR,1,rgsabound);
hr = SafeArrayAccessData(tmp.parray, (void HUGEP* FAR*)&pBSTR);
pBSTR[0]=SysAllocString(L"Hello!");
pBSTR[1]=SysAllocString(L"World!");
SafeArrayUnaccessData(tmp.parray );;
VariantCopy(Result,&tmp);
VariantClear(&tmp);
return S_OK;
VB:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim SM As ServiceManagerLib.ServiceMgr = New ServiceManagerLib.ServiceMgr
Dim Result(2) As String
Result(0) = New String("Hi")
Result(1) = New String("All!")
Dim Action As String = "StartService"
Dim Parameter As String = "Parameter"
SM.Manage(Action, Parameter, Result)
If Result.GetType().IsArray Then
MessageBox.Show(Result(0))
MessageBox.Show(Result(1))
End If
СОМ сервер зарегистрирован через сборку взаимодействия, Result обьявлен как ByRef Object
После вызова Manage Result получает Nothing. МСДН по маршалингу обьектов по умолчанию уже перечитал весь — бесполезно, там четко
говорится, что VT_ARRAY|VT_BSTR должен преобразовываться в System.Array(String)....Но — не работает