Проблемы с освобождением памяти клиентом
От: okgluck Ниоткуда none
Дата: 23.07.05 11:49
Оценка:
Доброго время суток!

Проблема такая:

Есть сервер (пашет как часы — 99.9%). — сервер *.exe (OUT-PROCESS)

Есть клиент, который вызывает некоторый метод M(..., LPOLESTR*, ...) интерфейса объекта сервера.

Метод возвращает LPOLESTR*,

Вызов осуществляется так:

CComBSTR bstrString;
pIxxx->M(..., &bstrString,...);

Всё прекрасно отрабатывает и т. п. (HRESULT — S_OK).

Строка передаётся, но когда отрабатывает деструктор CComBSTR, вылетает

"Unhandled exception at..."

Бьюсь с этим вторые сутки (НОВИЧОК) — всё облазил на форумах и т. п. ничего не нашёл

МОЖЕТ ПРОБЛЕМА В ТОМ ЧТО SysFreeString (в деструкторе класса CComBSTR) пытается освободить память принадлежащую
OUT-PROCESS модулю???

Помогите советом пожалуйста.

Заранее благодарен,
Александр.
Re: Проблемы с освобождением памяти клиентом
От: SergH Россия  
Дата: 23.07.05 12:09
Оценка:
Здравствуйте, okgluck, Вы писали:

O>Доброго время суток!


O>Проблема такая:


O>Есть сервер (пашет как часы — 99.9%). — сервер *.exe (OUT-PROCESS)


O>Есть клиент, который вызывает некоторый метод M(..., LPOLESTR*, ...) интерфейса объекта сервера.


Точно описание метода на idl, пожалуйста. Есть принципиальная разница между BSTR* и LPOLESTR*

O>МОЖЕТ ПРОБЛЕМА В ТОМ ЧТО SysFreeString (в деструкторе класса CComBSTR) пытается освободить память принадлежащую

O>OUT-PROCESS модулю???

Нет, это невозможно физически.
Делай что должно, и будь что будет
Re: Проблемы с освобождением памяти клиентом
От: Tom Россия http://www.RSDN.ru
Дата: 23.07.05 12:12
Оценка:
А в IDL-е строка обьявлена как LPOLESTR* или как BSTR*?
Если первое — обьяви, как второе.
Первая строка освобождается через CoTaskMemFree, вторая через SysFreeString, которая, фактически отнимает от указателя sizeof(int) и вызывает CoTaskMemFree
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[2]: Проблемы с освобождением памяти клиентом
От: okgluck Ниоткуда none
Дата: 23.07.05 12:15
Оценка:
Здравствуйте, 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>Нет, это невозможно физически.


Спасибо за то что откликнулись

ВОТ ТОЧНОЕ ОПИСАНИЕ

HRESULT GetClassDetails(
[in] REFCLSID clsid,
[out] LPOLESTR* ppszProgID,
[out] LPOLESTR* ppszUserType
);
КАКИЕ БУДУТ СООБРАЖЕНИЯ?

Ещё раз спасибо за помощь!
Re[2]: Проблемы с освобождением памяти клиентом
От: okgluck Ниоткуда none
Дата: 23.07.05 12:21
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>А в IDL-е строка обьявлена как LPOLESTR* или как BSTR*?

Tom>Если первое — обьяви, как второе.
Tom>Первая строка освобождается через CoTaskMemFree, вторая через SysFreeString, которая, фактически отнимает от указателя sizeof(int) и вызывает CoTaskMemFree


Спасибо боьшое за ответ

В IDL ОПИСАНИЕ ТАКОЕ

HRESULT GetClassDetails(
[in] REFCLSID clsid,
[out] LPOLESTR* ppszProgID,
[out] LPOLESTR* ppszUserType
);

Как эффективней реализовать получение параметров метода объявленных как [out] и являющимися LPOLECHAR*

ИСПОЛЬЗУЯ ATL??

Заранее благодарен!
Re[3]: Проблемы с освобождением памяти клиентом
От: Tom Россия http://www.RSDN.ru
Дата: 23.07.05 12:26
Оценка:
Здравствуйте, 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.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[3]: Проблемы с освобождением памяти клиентом
От: SergH Россия  
Дата: 23.07.05 12:34
Оценка:
Здравствуйте, okgluck, Вы писали:

O>ВОТ ТОЧНОЕ ОПИСАНИЕ


O> HRESULT GetClassDetails(

O> [in] REFCLSID clsid,
O> [out] LPOLESTR* ppszProgID,
O> [out] LPOLESTR* ppszUserType
O> );
O>КАКИЕ БУДУТ СООБРАЖЕНИЯ?

Вообще, довольно странный idl, я бы сказал, что это работать не будет. На мой взгляд, эта штука будет возвращать строчку из одного символа. Т.к. ничего типа [string] нету..
Если можешь менять сервер, переделай на BSTR. Если не можешь, и всё-таки работает, не используй CComBSTR. В общем, как сказал Tom
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.