Здравствуйте, okgluck, Вы писали:
O>Доброго время суток!
O>Проблема такая:
O>Есть сервер (пашет как часы — 99.9%). — сервер *.exe (OUT-PROCESS)
O>Есть клиент, который вызывает некоторый метод M(..., LPOLESTR*, ...) интерфейса объекта сервера.
Точно описание метода на idl, пожалуйста. Есть принципиальная разница между BSTR* и LPOLESTR*
O>МОЖЕТ ПРОБЛЕМА В ТОМ ЧТО SysFreeString (в деструкторе класса CComBSTR) пытается освободить память принадлежащую O>OUT-PROCESS модулю???
А в IDL-е строка обьявлена как LPOLESTR* или как BSTR*?
Если первое — обьяви, как второе.
Первая строка освобождается через CoTaskMemFree, вторая через SysFreeString, которая, фактически отнимает от указателя sizeof(int) и вызывает CoTaskMemFree
Здравствуйте, SergH, Вы писали:
SH>Здравствуйте, okgluck, Вы писали:
O>>Доброго время суток!
O>>Проблема такая:
O>>Есть сервер (пашет как часы — 99.9%). — сервер *.exe (OUT-PROCESS)
O>>Есть клиент, который вызывает некоторый метод M(..., LPOLESTR*, ...) интерфейса объекта сервера.
SH>Точно описание метода на idl, пожалуйста. Есть принципиальная разница между BSTR* и LPOLESTR*
O>>МОЖЕТ ПРОБЛЕМА В ТОМ ЧТО SysFreeString (в деструкторе класса CComBSTR) пытается освободить память принадлежащую O>>OUT-PROCESS модулю???
SH>Нет, это невозможно физически.
Здравствуйте, Tom, Вы писали:
Tom>А в IDL-е строка обьявлена как LPOLESTR* или как BSTR*? Tom>Если первое — обьяви, как второе. Tom>Первая строка освобождается через CoTaskMemFree, вторая через SysFreeString, которая, фактически отнимает от указателя sizeof(int) и вызывает CoTaskMemFree
Здравствуйте, okgluck, Вы писали:
O>Здравствуйте, Tom, Вы писали:
Tom>>А в IDL-е строка обьявлена как LPOLESTR* или как BSTR*? Tom>>Если первое — обьяви, как второе. Tom>>Первая строка освобождается через CoTaskMemFree, вторая через SysFreeString, которая, фактически отнимает от указателя sizeof(int) и вызывает CoTaskMemFree
O>Спасибо боьшое за ответ
O>В IDL ОПИСАНИЕ ТАКОЕ
O> HRESULT GetClassDetails( O> [in] REFCLSID clsid, O> [out] LPOLESTR* ppszProgID, O> [out] LPOLESTR* ppszUserType O> );
O>Как эффективней реализовать получение параметров метода объявленных как [out] и являющимися LPOLECHAR*
O>ИСПОЛЬЗУЯ ATL??
O>Заранее благодарен!
Если строка именно LPOLESTR, то использовать на клиенте CComBSTR нельзя. Освобождай строку при помощи CoTaskMemFree, а ещё лучше таки используй BSTR. BSTR тот же LPOLESTR, только освобождается и выделяется через Sys***, а не CoTask... и в COM считается стандартной строкой именно BSTR а не LPOLESTR.
Здравствуйте, okgluck, Вы писали:
O>ВОТ ТОЧНОЕ ОПИСАНИЕ
O> HRESULT GetClassDetails( O> [in] REFCLSID clsid, O> [out] LPOLESTR* ppszProgID, O> [out] LPOLESTR* ppszUserType O> ); O>КАКИЕ БУДУТ СООБРАЖЕНИЯ?
Вообще, довольно странный idl, я бы сказал, что это работать не будет. На мой взгляд, эта штука будет возвращать строчку из одного символа. Т.к. ничего типа [string] нету..
Если можешь менять сервер, переделай на BSTR. Если не можешь, и всё-таки работает, не используй CComBSTR. В общем, как сказал Tom