Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IE UnAdvise проблема 
:(
    Опции темы
sax0n
Дата 1.2.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем.
У меня возникла одна проблема. Я надеюсь, что найдется человек, который сталкивался с ней уже, т.к. я перекопал весь код, но ничего не нашел (
программа подключается к событиям (ConnectionPoint — DWebBrowserEvents2 — Advise) ИЕ при создании окна.
при удалении делает UnAdvise — аргумент проавильный.
если так сделать один раз (запустить, поделать что-то с окнами ИЕ, удалить), то все нормально.
Проблема возникает вот когда:
запускаю прог-у, открываю 5 ИЕ, удаляю прог-у. не закрываю окна ИЕ
повторяю это до 20-25 окон ИЕ — то есть еще раза 3-4.
После минуты простое начинают появляться ошибки Винды вида "отправить отчет" в модуле ИЕ.
Скорее всего ошибка в функции "очистки" ИЕ от моего Sink, т.к. если не делать unadvise, а просто закрывать окна, все работает.
Ниже код. Также интересует, какие интерфейсы нужно очищать и как, потому что с разными комбинациями очистки прог-а по-разному себя ведет

{
    CoInitialize(NULL);
    IWebBrowser2 * PWB;
    IDispatch * iDisp;
    LPCONNECTIONPOINT lpCP;
    LPCONNECTIONPOINTCONTAINER lpCPC;
    SHDocVw::IShellWindowsPtr lpShell = NULL;
    HRESULT rez;
    long lCount = 0;
    BSTR bstrPropName;
    VARIANT varPropValue;
    int dwConnection = 0;
    if(IEVersionIsNew_6())
    {
        rez = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_INPROC_SERVER,IID_IShellWindows,(void**)&lpShell);
    }
    else
    {
        rez = lpShell.CreateInstance(__uuidof(ShellWindows));
    }
    if(SUCCEEDED(rez))
    {
        lpShell->get_Count(&lCount);
        
        for(long i = 0; i < lCount; i++)
        {
            lpCP = NULL;
            lpCPC = NULL;
            PWB = NULL;
            iDisp = NULL;
            dwConnection = 0;
            VARIANT v;
            v.vt=VT_I4;
            v.lVal=i;
            iDisp = lpShell->Item(v);
            if(iDisp != NULL)
            {
                if(SUCCEEDED(iDisp->QueryInterface(IID_IWebBrowser2,(void**)&PWB)))
                {
                    if(PWB != NULL)
                    {
                        bstrPropName = SysAllocString (C_COOKIENAME);
                        varPropValue;
                        VariantInit (&varPropValue);
                        if(SUCCEEDED(PWB->GetProperty(bstrPropName, &varPropValue)))
                        {
                            dwConnection = varPropValue.intVal;
                            if(dwConnection < 0)
                            {

                                /*iDisp->Release();
                                iDisp = NULL;
                                PWB->Release();
                                PWB = NULL;*/
                                continue;
                            }
                            BSTR bstrPropName2 = SysAllocString (C_COOKIENAME);
                            VARIANT varPropValue2;
                            VariantInit (&varPropValue2);
                            V_VT (&varPropValue2) = VT_INT;
                            V_INT (&varPropValue2) = -1;
                            PWB->PutProperty (bstrPropName2, varPropValue2);
                            SysFreeString (bstrPropName2);
                            VariantClear (&varPropValue2);
                            if(SUCCEEDED(PWB->QueryInterface(IID_IConnectionPointContainer,(void**)&lpCPC)))
                            {
                                if(SUCCEEDED(lpCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&lpCP)))
                                {
                                    if(SUCCEEDED(lpCP->Unadvise(dwConnection)))
                                    {
                                        if(SUCCEEDED(lpCP->Release()))
                                        {
                                            if(SUCCEEDED(lpCPC->Release()))
                                            {
                                                /*iDisp->Release();
                                                iDisp = NULL;
                                                PWB->Release();
                                                PWB = NULL;*/
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        SysFreeString (bstrPropName);
                        VariantClear (&varPropValue);
                    }
                }
            }
        }
    }
    /*lpShell->Release();
    lpShell = NULL;
    CoUninitialize();*/
}
PM MAIL   Вверх
Yama
Дата 16.2.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



sax0n, 
Цитата(sax0n @  1.2.2007,  17:03 Найти цитируемый пост)
программа подключается к событиям (ConnectionPoint — DWebBrowserEvents2 — Advise) ИЕ при создании окна.

как программа подключается к этим событиям?

Цитата(sax0n @  1.2.2007,  17:03 Найти цитируемый пост)
запускаю прог-у, открываю 5 ИЕ, удаляю прог-у. не закрываю окна ИЕ

что значит удаляешь прогу? End process в Диспетчере задач?
Цитата(sax0n @  1.2.2007,  17:03 Найти цитируемый пост)
Скорее всего ошибка в функции "очистки" ИЕ от моего Sink, т.к. если не делать unadvise, а просто закрывать окна, все работает.

это поподробнее опиши, плз, т.к. я не знаю, от чего ты очищаешь ИЕ smile

Цитата(sax0n @  1.2.2007,  17:03 Найти цитируемый пост)
Ниже код. Также интересует, какие интерфейсы нужно очищать и как, потому что с разными комбинациями очистки прог-а по-разному себя ведет

а какие интерфейсы ты используешь?
--------------------
Если бы строители строили дома так же, как программисты пишут программы, то первый же залетевший в форточку дятел разрушил бы всю нашу цивилизацию.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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