Re[2]: Массивы в качестве параметров
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 10.12.02 15:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Предвижу вопрос... а как же тогда?


VD>А очень просто ... с помощью SAFEARRAY. При этом код становится oleautomation-совместимым и может вызываться из VB и Delphi.


VD>IDL для oleautomation-варианта буде выглядеть так:

VD>[ccode]
VD>Клиент на C++/ATL:

VD>// Импорт для нашего COM-сервера. В реальной жизни проще пользоваться включение инклюда...

VD>#import "..\Debug\OleautAry.dll" no_namespace, named_guids, no_implementation, raw_interfaces_only, raw_dispinterfaces,
VD>raw_native_types

VD>...


VD>// Использование массива...

VD>LRESULT OnClickedButton1(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
VD>{
VD> // Массив будет состоять из 6-и элементов и иметь нижнюю границу равную нулю
VD> const int iLBound = 0, iCnt = 6;

VD> // Создаем COM-сервер

VD> CComPtr<IOleautIntAry> spObj;
VD> HRESULT hr = spObj.CoCreateInstance(CLSID_OleautIntAry);
VD> if(hr)
VD> return 0;

VD> // Создаем SAFEARRAY long-ов (VT_I4)

VD> LPSAFEARRAY psa = SafeArrayCreateVector(VT_I4, iLBound, iCnt);
VD> if(FAILED(psa))
VD> return 0;

VD> // Получаем доступ к "телу"

VD> long * pLng = NULL;
VD> hr = SafeArrayAccessData(psa, (void**)&pLng);
VD> if(FAILED(hr))
VD> return 0;
VD>
VD> // Помещаем данные в наш массив
VD> for(int i = iLBound; i < iCnt; i++)
VD> {
VD> pLng[i] = i * 6;
VD> }

VD> // "Отпускаем" массив

VD> hr = SafeArrayUnaccessData(psa);
VD> if(FAILED(psa))
VD> return 0;

VD> // Вызываем удаленный вызов

VD> hr = spObj->InLongAry(&psa);
VD> ATLASSERT(!hr);

VD>

VD> // Уничтожаем массив
VD> SafeArrayDestroy(psa);
VD> return 0;
VD>}

VD>

Извините, но может вы подскажите как мне быть в аналогичной ситуации, но только вот с таким методом?
HRESULT AddUrlList (VARIANT * pList );
Пробовал так:

::CoInitialize(NULL);
JCCATCHLib::IJetCarNetscapePtr spObj;
HRESULT hr=spObj.CreateInstance(L"JetCar.Netscape");

LPSAFEARRAY psa = SafeArrayCreateVector(VT_BSTR, iLBound, iCnt);

BSTR * pLng = NULL;
hr = SafeArrayAccessData(psa, (void**)&pLng);
   
pLng[0] = _bstr_t("http://www.one.com.ua/dm/");
pLng[1] = _bstr_t("http://www.one.com.ua/dm/test.exe");

hr = SafeArrayUnaccessData(psa);

VARIANT myVariant; 
myVariant.parray = psa;
myVariant.vt = VT_ARRAY|VT_BSTR;

hr = spObj->AddUrlList(&myVariant);

SafeArrayDestroy(psa);

ругается: "abnormal program termination"
Помогите пожалуйста если можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.