Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Invoke() приводит к unhandled exception 
V
    Опции темы
Dogo
  Дата 18.10.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 9



Создаю клиент-сервер, сервер виндовая служба. Содержит всего одну функцию GetFileNameEx(BSTR*).
Клиент пишу С++. 
 
Клиент:
Код

HRESULT hr = OleInitialize(NULL);
    wchar_t progid[] = L"FileServer._MyFileServer.1";
    CLSID clsid;
    hr = ::CLSIDFromProgID(progid, &clsid);

    ErrorMessage((UINT)hr, "hr = ::CLSIDFromProgID(progid, &clsid)");

    IDispatch* pIDispatch = NULL;

    MULTI_QI qi;
    qi.pIID = &IID_IDispatch;
    qi.pItf = NULL;

    hr = ::CoCreateInstanceEx(clsid, 
                              NULL,
                              CLSCTX_LOCAL_SERVER, //CLSCTX_INPROC_SERVER,
                              NULL,
                              1,
                              &qi);

    ErrorMessage((UINT)hr, "hr = ::CoCreateInstanceEx(clsid, NULL, CLSCTX_LOCAL_SERVER, NULL, 1, &qi)");

    pIDispatch = (IDispatch*)qi.pItf;
    DISPID dispid;
    OLECHAR* name = L"GetFileNameEx";

    hr = pIDispatch->GetIDsOfNames(IID_NULL, &name, 1, GetUserDefaultLCID(), &dispid);

    ErrorMessage((UINT)hr, "hr = pIDispatch->GetIDsOfNames(IDD_NULL, &name, 1, GetUserDefaultLCID(), &dispid)");

    wchar_t wszIn[] = L"bla-bla-bla";
    BSTR bstrIn = ::SysAllocString(wszIn);
    VARIANTARG varg;
    ::VariantInit(&varg);
    varg.vt = VT_BYREF|VT_BSTR;
    varg.bstrVal = bstrIn;

    DISPPARAMS param;
    param.cArgs             = 1;
    param.rgvarg            = &varg;
    param.cNamedArgs        = 0;
    param.rgdispidNamedArgs = NULL;

    
    hr = pIDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(),  DISPATCH_METHOD, &param, NULL, NULL, NULL);
     
        ErrorMessage((UINT)hr, "hr = pIDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &param, NULL, NULL, NULL)");

    ::SysFreeString(bstrIn);
    pIDispatch->Release();
    pIDispatch = NULL; 


функция ErrorMessage() - просто выдает месседж бокс с ошибкой.
Эксепшн возникает после вызова pIDispatch->Invoke();
Причем судя по всему где-то внутри инвоука, т.к. программа завершается до записи в hr результата. 
логично предположить что код приводящий к ошибке - нужно искать в серверном приложении.
Но Месседж бокс сервер показывает, ниже приведен код функции сервера.

Сервер:
Код

TDMETHODIMP C_MyFileServer::GetFileNameEx(BSTR* pbstrFileName)
{
    MessageBox(NULL, "I'm here!", "", MB_OK);
    return S_OK;
}


Помогите найти ошибку, буду очень благодарен.


Это сообщение отредактировал(а) Dogo - 18.10.2007, 00:32
--------------------
 
PM MAIL ICQ   Вверх
Dogo
  Дата 18.10.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 9



Уф...разобрался... smile 

Заменил
Код

varg.bstrVal = bstrIn;

на
Код

varg.pbstrVal = &bstrIn;

Естественно метод принимает/возвращает BSTR*

В серверной части поправил объявление метода. Забыл указать [in,out] у параметра
Код

[id(1), helpstring("method GetFileNameEx")] HRESULT GetFileNameEx([in,out] BSTR* pbstrFileName);


В общем RTFM  smile 

Это сообщение отредактировал(а) Dogo - 18.10.2007, 22:13
--------------------
 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0406 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.