Доступ к COM объекту

Тема в разделе "WASM.WIN32", создана пользователем 2FED, 2 апр 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    как раз таки и использую ком.lib спасиб за процедуру!

    q_q а вот у меня не работает, но прабда у меня .dll =)
     
  2. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    в хуке функции процесса к которому подгружаюсь

    к стате тут такая неприятная штука вылезла, в общем инжекчу я процесс, перехватываю у него кое какую функцию и если кое какие параметры совпадают вызываю в его IE окне Navigate, всё вроде бы нормально но процесс после этого зависает, и именно если я использую Navigate, когда сдираю страницу ничего не виснет, ещё заметил если после Navigate поставить MessageBox то по выходу из MessageBox всё нормально, странно не прабда ли? я думал может задержка нужна, ставил sleep,10000 но после этих 10 сек процесс виснит. функции CoInitialize, CoUninitialize не вызываю так как процесс их уже наверника вызвал, в прочем пробывал вызывать, тот же эффект! Navigate работает даже страница успевает загрузится, а потом процесс просто замерает =(
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Вот от вызова именно этой строчки
    invoke PropGetVal, hwnd, offset aLocationurl, addr pVarnt

    и причём виснет не именно на ней а на выходе из потока, если эта строка не вызывалась то зависание при выходе из потока не будет
     
  5. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Переписал процедуру, всёравно эффект тот же
    Код (Text):
    1. IENavigate2  proc hwnd:dword,url:dword
    2. LOCAL ppIE  : dword
    3. LOCAL ppSp  : dword
    4. LOCAL pVarnt: VARIANT  
    5. LOCAL pVarnt5: VARIANT
    6. LOCAL parentWindow:dword
    7. LOCAL buf[50]:byte
    8.  
    9.     mov ebx,hwnd
    10.     mov ebx,[ebx]
    11.     lea eax,parentWindow
    12.     push eax
    13.     push hwnd
    14.     call dword ptr [ebx+432]           
    15.     cmp eax, S_OK
    16.     jne err
    17.    
    18.     mov ebx,parentWindow
    19.     mov ebx,[ebx]
    20.      lea eax,ppSp
    21.      push eax
    22.      push offset IID_IServiceprovider
    23.      push parentWindow
    24.     call dword ptr [ebx]           
    25.     cmp eax, S_OK
    26.     jne err
    27.    
    28.     mov ebx,ppSp
    29.     mov ebx,[ebx]
    30.      lea eax,ppIE
    31.      push eax
    32.      push offset IID_IWebBrowser2
    33.      push offset IID_IWebbrowserApp
    34.      push ppSp
    35.     call dword ptr [ebx+12]        
    36.     cmp eax, S_OK
    37.     jne err
    38.    
    39.     mov         pVarnt.vt, VT_NULL
    40.    
    41.     mov ebx,ppIE
    42.     mov ebx,[ebx]
    43.      lea eax,pVarnt
    44.      push eax
    45.      push eax
    46.      push eax
    47.      push eax
    48.      push url
    49.      push ppIE
    50.     call dword ptr [ebx+2Ch]           
    51.     cmp eax, S_OK
    52.     jne err
    53.    
    54.    
    55.     jmp exit
    56. err:
    57.     invoke wsprintf,addr buf,$CTA0("%d"),eax
    58.     invoke MessageBox,0,addr buf,$CTA0("ERROR"),0
    59. exit:
    60.     ret
    61. IENavigate2 endp
    пока кроме как вызвать её в потоке а поток потом усыпить ничего в голову не приходит, но это уж очень криво! что это будет если она после каждого вызова будут оставлять спящий поток =(
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    CoInitialize Вызывается для целого процесса или для каждого потока отдельно?
     
  7. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  8. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  9. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    чегото там не хватает
    IWebBrowserEvents2.asm(76) : error A2006: undefined symbol : free
    MHOOK.asm(146) : error A2006: undefined symbol : malloc
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А вот это воабще круто, как раз то что мне нужно, спасибо большое! буду разбиратся
     
  11. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Заменил на VirtualAlloc и VirtualFree, работает =)
     
  12. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    А как можно кроме Navigate загрузить страницу, например локально если он на компе уже сохранена?

    Просто есть одно окошко которое грузит страницу без Navigate! Предположительно через метод Set_innerHTML но когда я пробовал так загрузить страницу на дельфях оно мне выдало что интерфейс не поддерживается =)
     
  13. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  14. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    да в Body.

    но мне надо перехватить события вывода страницы и подставить туда свою, вот тот пример который заменеят страницу гугла на васм, работает везде кроме этого окна, но тем немение в нём выводится MessageBox с DISPID_DOCUMENTCOMPLETE из перевого примера, но не происходит событие Navigate
     
  15. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Блин не могли мне сказать что объекты надо освобождать =)))

    coinvoke ppIE, IUnknown, Release
    coinvoke ppSp, IUnknown, Release
    coinvoke parentWindow, IUnknown, Release

    я то думал чо мой навигайт зависает при выходе из потока =)))
     
  16. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  17. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Сделал как в примере, работает но как всегда :) есть одно НО!

    В общем вызываю я код который устанавливает обработчик IWebBrowserEvents2 в отдельном потоке, и как я выяснил, обработчик IWebBrowserEvents2 выполняется в том же потоке откуда он был установлен, тоесть если я разрушу поток то ничего обрабатыватся не будет и вся программа просто повиснит, пробовал зациклить поток

    ...
    exit:
    invoke sleep,100
    jmp exit

    но это эффекта не дало, при вызове invoke sleep,100 поток как бы усыпает и IWebBrowserEvents2 не может выполнится и всё опять виснит, работает только если поставить MessageBox в конце процедуры потока устанавливающего перехват, но как обойтий без MessageBox? как зациклить его так чтобы он нормально всё обробатывал?
     
  18. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  19. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Блина не работает! а я ведь тоже об этом думал, это был мой последний вариант =(
     
  20. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141