COM (Unnecessary 3 thread)

Тема в разделе "WASM.RESEARCH", создана пользователем PaCHER, 22 май 2007.

  1. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Есть код, который по существу ничего не делает, только получает интерфейс сразу его освобождает и завершается. НО, перерыв все статьи ненашел ответа на вопрос.
    После вызова CoCreateInstance из моего контекста создается 3 потока, когда происходит деинициализация, потоки остаютя висеть кагбы из под моего процеса, естественно по завершению главного потока процес просто повисает в памяти.

    Как собтвенно избавится от этих трех потоков, на других примерах потоки не создаются проблема именно с этим интерфейсом IWebBrowser2.

    Код (Text):
    1. include 'win32ax.inc'
    2. section '.data' data readable writeable
    3. OleUninitialize     dd 0
    4. OleInitialize       dd 0
    5. CoCreateInstance    dd 0
    6. CoUninitialize      dd 0
    7. hOle                dd 0
    8. CLSCTX_LOCAL_SERVER     = 0x4
    9. Browser             dd 0
    10. struc GUID def
    11.  {
    12.    match d1-d2-d3-d4-d5, def
    13.     \{
    14.       .Data1 dd 0x\#d1
    15.       .Data2 dw 0x\#d2
    16.       .Data3 dw 0x\#d3
    17.       .Data4 db 0x\#d4 shr 8,0x\#d4 and 0FFh
    18.       .Data5 db 0x\#d5 shr 40,0x\#d5 shr 32 and 0FFh,0x\#d5 shr 24 and 0FFh,0x\#d5 shr 16 and 0FFh,0x\#d5 shr 8 and 0FFh,0x\#d5 and 0FFh
    19.     \}
    20.  }
    21. rclsid              GUID 0002DF01-0000-0000-C000-000000000046;IWebBrowser2
    22. riid                GUID D30C1661-CDAF-11D0-8A3E-00C04FC9E26E;IWebBrowserApp- IWebBrowser2
    23. section '.code' code readable writable executable
    24. start:                
    25.         invoke LoadLibrary,"OLE32.DLL"
    26.         mov [hOle],eax
    27.         invoke GetProcAddress,[hOle],"OleInitialize"
    28.         mov [OleInitialize],eax
    29.         invoke GetProcAddress,[hOle],"OleUninitialize"
    30.         mov [OleUninitialize],eax
    31.         invoke GetProcAddress,[hOle],"CoCreateInstance"
    32.         mov [CoCreateInstance],eax
    33.                
    34. ;===========начало инициализации
    35.  
    36.                 push    0               ;Инициализируем библиотеку Component Object Model (COM)
    37.                 call  [OleInitialize]
    38.                 test    eax,eax        ;ошибка, если MSB = 1
    39.                                        ; (MSB = бит знака)
    40.                 js      ex_f           ; js = переход, если установлен бит знака
    41.    
    42.                 lea     ecx, [Browser];: [out] указатель на интерфейс, который запрашивается. Если интерфейс не поддерживается, значение переменной будет приравнено 0.
    43.                 push    ecx           ;
    44.                 push    riid     ; riid
    45.                 push    CLSCTX_LOCAL_SERVER; dwClsContext
    46.                 push    0               ; pUnkOuter
    47.                 push    rclsid   ; rclsid
    48.                 call    [CoCreateInstance]; clsid:{0002DF01-0000-0000-C000-000000000046}
    49.        
    50.         mov     eax, [Browser]
    51.                 push    eax
    52.                 mov     edx, [eax]
    53.                 call    dword [edx+80h];IWebBrowser2_Quit
    54.        
    55.         ;cominvk Browser,IWebBrowser2_Release
    56.         mov     eax, [Browser]
    57.                 push    eax
    58.                 mov     edx, [eax]
    59.                 call    dword [edx+8];IWebBrowser2_Release
    60.                
    61. ex_f:           call    [OleUninitialize]
    62.                 ret
    63. .end start
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    PaCHER
    Вообще-то твой rclsid - это CLSID_InternetExplorer, riid - это IID_IWebBrowser2, поэтому прежде чем делать IWebBrowser2_Release, надо сделать IWebBrowser2_Quit
    Код (Text):
    1.                 mov     eax, [Browser]
    2.                 push    eax
    3.                 mov     edx, [eax]
    4.                 call    dword [edx+80h];IWebBrowser2_Quit
     
  3. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Поправил код, просто копировал именно проблемный кусок не захватил IWebBrowser2_Quit.
    Но проблема никуда не делась, потоки так и остались.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    PaCHER
    добавь invoke ExitProcess, 0
     
  5. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    :) гы, к этому решению я склонялся, но оно меня не устраивает. Мне нужно именно избавится от этих 3ех лишних потоков.
     
  6. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Может у кого есть рабочая версия на Ц++ или на худой конец на Дэлфи, которая используя этот интерфейс при его освобождении убирает лишние потоки, или просто работает как нужно?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    создай снапшот, пройдись по потокам и кильни все, кроме текущего :))
     
  8. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    :) мне нужен легальный способ :) тоесть тот который используется остальными приложениями которые юзают этот интерфейс в отдельных потоках.
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    PaCHER
    есть, ничего сложного там нет.
     
  10. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    censored
    Клево, выложи скомпиленый ЕХЕ, который делает то что я описывал, я посмотрю в чем там отличие, что у меня остаются потоки, а у тебя нет.
    Может, если ничего сложного там нет, подскажеш где ошибка в моем коде? А то неособо информативное ообщение получилось.
     
  11. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Краткое продолжение проблемы. После винального ret когда завершается главный поток, остаетяс 3 потока созданых (как говорит процес эксплорер) из kernel32.dll после того как процес повисел в памяти пару часов там остался уже один поток, но он походу и не думае завершатся.
    censored
    Ты куда пропал?