возврат массивов из COM-объекта и клиенты late binding
От: mich_ael http://www.basstream.ru
Дата: 27.05.03 11:41
Оценка:
Есть примерно следующий код в проекте ATL VS.NET:

// idl
[propget, id(1), helpstring("property")] HRESULT PropName([out, retval] VARIANT* pVal);

// реализация

STDMETHODIMP ClassName::get_PropName(VARIANT* pVal)
{    
  
  VariantInit(pVal);
  pVal->vt = VT_ARRAY | VT_BSTR;
  SAFEARRAY* psa;
  SAFEARRAYBOUND bounds = {4, 0};
  psa = SafeArrayCreate(VT_BSTR, 1, &bounds);
  
  BSTR* pBstrStrings;
  SafeArrayAccessData(psa, (void**)&pBstrStrings);
  
  for(UINT i = 0; i < psa->rgsabound->cElements; i++) {
    pBstrStrings[i] = SysAllocString(L"SomeString");
  }  
  SafeArrayUnaccessData(psa);
  pVal->parray = psa;
  
  return S_OK;
}


код клиента раннего связывания:

Dim obj As New ClassName
MsgBox obj.PropName(0) ' все работает прекрасно


как только снимаем ссылку в проекте на билиотеку и пишем

Dim obj As Object
Set obj = CreateObject("Lib.Object")
MsgBox obj.PropName(0) ' все умерло


сразу выдается ошибка "Wrong number of arguments or invalid property assignment".

Причем при просмотре объекта в дебагере видно, что свойство действидетьно содержит массив с указанными значениями.

В чем проблема?

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.