crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Утекание памяти при использовании querySubObject
Гость_Саша_*
сообщение 16.6.2008, 20:35
Сообщение #1





Гости








    


Я использую ActivX компонент браузера. И хочу получать активный элемент. Для этого выполняю следующие действия:
CODE

QAxObject *Doc = pwb->querySubObject("Document");
QAxObject *activeElement = Doc->querySubObject("activeElement");

//... некоторые действия

delete activeElement;
delete Doc;

После этого кода память и утекает. Почему? Я же вроде всё, что взял удалил.
Причём, что интересно, если брать только документ, память не утекает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Гость_Саша_*
сообщение 17.6.2008, 12:44
Сообщение #2





Гости








    


Я вот думаю, может можно получить активный элемент не ф-ей querySubObject, а какой-нибудь другой? Только пока не знаю как.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Саша_*
сообщение 17.6.2008, 16:33
Сообщение #3





Гости








    


Если кому интересно, то я кажется нашёл.

Во-первых с версии 3.3.5 этого глюка наверное нет. А я работаю с 3.3.4.
Во-вторых глюк у них в деструкторе, точнее в ф-ии clear(). см:

http://trolltech.com/developer/resources/n.../changes-3.3.5/
Fixed a bug where QAxObject::clear() did not reset the metaobject when it was cached.

Мне пришлось извращаться и написать свой querySubObject, в котором я запрещаю для полученого объекта кэшировать. Код примерно следующий:
CODE

#include <qdict.h>
class QAxMetaObject;
struct querySubObjectEx
{
QAxObject *operator ()( QAxBase *objParent, const QCString &name, const QVariant &v1 = QVariant(),
const QVariant &v2 = QVariant(),
const QVariant &v3 = QVariant(),
const QVariant &v4 = QVariant(),
const QVariant &v5 = QVariant(),
const QVariant &v6 = QVariant(),
const QVariant &v7 = QVariant(),
const QVariant &v8 = QVariant() )
{
QAxObject *obj = objParent->querySubObject( name, v1, v2, v3, v4, v5, v6, v7, v8 );

if( obj!=NULL )
{
class QAxBasePrivate
{
public:
QDict<QAxEventSink> eventSink;
bool useEventSink :1;
bool useMetaObject :1;
bool useClassInfo :1;
bool cachedMetaObject :1;
bool initialized :1;
bool tryCache :1;

IUnknown *ptr;
IDispatch *disp;

QMap<QCString, bool> *propWritable;
QAxMetaObject *metaobj;
};
QAxBasePrivate *pd = (QAxBasePrivate*)(((QAxBase*)obj)->d);
pd->tryCache = 0;
}

return obj;
}
};


Использовать можно, например, так:

querySubObjectEx()(Document,"activeElement");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 11.3.2025, 14:51