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

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

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    получаю доступ к IHTMLDocument2, всё нормально свойства читаются, но мне надо получить IHTMLElement, ну вызываю функцию Get_body по смешению 24h, вродебы всё нормально, указатель правильный возвращяет, но но когда я пытаюсь вызвать из IHTMLElement функцию Get_innerHTML по смещению 0E8h мне возвращяется пустая строка, что я делаю не так?

    Вот код

    IID_IHTMLDocument2 GUID <332C4425h, 26CBh, 11D0h, <0B4h, 83h, 0, 0C0h, 4Fh, 0D9h, 1, 19h>>

    GetIEFromHWND proc uses ebx hwnd:dword
    LOCAL pVarnt: VARIANT
    LOCAL lRes: dword
    LOCAL ppv: DWORD
    LOCAL ppv2: DWORD
    LOCAL msg: dword
    LOCAL straddr: dword
    LOCAL buf[30]: byte
    invoke RegisterWindowMessage,addr msgtext
    mov msg,eax
    invoke SendMessageTimeout,hwnd,msg,0,0,SMTO_ABORTIFHUNG, 1000, addr lRes

    invoke ObjectFromLresult,lRes, addr IID_IHTMLDocument2, 0, addr ppv
    .if EAX != S_OK
    invoke wsprintf,addr buf,$CTA0("%d"),eax
    invoke MessageBox,0,addr buf,$CTA0("ERROR ObjectFromLresult"),0
    .endif



    mov ebx,ppv ;IHTMLDocument2
    mov ebx,[ebx]

    lea eax,ppv2
    push eax
    push ppv
    call dword ptr [ebx+36]
    .if EAX != S_OK
    invoke wsprintf,addr buf,$CTA0("%d"),ppv
    invoke MessageBox,0,addr buf,$CTA0("ppv"),0
    invoke wsprintf,addr buf,$CTA0("%d"),ppv2
    invoke MessageBox,0,addr buf,$CTA0("ppv2"),0
    .endif

    ; в ppv2 адрес IHTMLElement


    mov ebx,ppv2
    mov ebx,[ebx]

    lea eax,straddr ; Переменная в которую будет записан указатель на строку
    push eax
    push ppv2

    call dword ptr [ebx+0E8h]
    .if EAX != S_OK
    invoke MessageBox,0,addr buf,$CTA0("ERROR"),0
    .endif

    ret
    GetIEFromHWND endp

    В общем тут мы никакой строки не получем, хотя такие же строки в ppv(IHTMLDocument2) читаются нормально.
     
  2. temp666

    temp666 New Member

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

    2FED New Member

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

    Спасибо всем кто участвовал =)
     
  4. 2FED

    2FED New Member

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

    var pDoc: IHTMLDocument2;
    IE: IWebbrowser2;
    ....

    (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
     
  5. temp666

    temp666 New Member

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

    temp666 New Member

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

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    спасиб. а что делает функций PropGetVal? даж гугл по запросу ничо не нашел)
     
  8. temp666

    temp666 New Member

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

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    а как обойтись без макроса aigate2 wchar L(<http://wincmd.ru\0>) ?
    Он остальное отказывается принимать, например
    l_WASM dw 'h','t','t','p',':','/','/','w','a','s','m','.','r','u','/',0 не работает

    l_WASM db 'http://wasm.ru/',0
    gbuf db 100 dup(?)
    ...
    invoke MultiByteToWideChar,CP_ACP,MB_PRECOMPOSED,addr WASM,-1,addr gbuf,100

    тож не работает если передать gbuf, хотя invoke MessageBoxW,0,addr gbuf,0,0 работает нормально
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Блин уже под отладчиком смотрел, структуры строк одинаковые, и ещё если строка определена за макросом wchar L(<>) тогда всё нормально! как это объяснить? может выравнивание какоето? пробовал перед строкой ставить align 4 ( 2,4,8,16) и нифига =(
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    2FED
    В чем выражается "MultiByteToWideChar ... не работает"?
    + последний параметр MultiByteToWideChar - это количество символов, на которые рассчитан буфер, если зарезервировано 100 байт, то это 50 символов.
    + имя переменной с исходной строкой l_WASM или WASM?
     
  12. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Вот как это объяснить?

    .data ;Так НЕ работает!
    l_WASM word 'h','t','t','p',':','/','/','w','a','s','m','.','r','u',0

    .data ;Так РАБОТАЕТ!
    fff wchar L(<a\0>)
    l_WASM word 'h','t','t','p',':','/','/','w','a','s','m','.','r','u',0

    посмотрел в отладчике, команда wchar L(<a\0>) занимает 4 байта, тоесть все изменения это увелечение адреса l_WASM на 4

    Делаю так

    .data ; И опять ничего НЕ работает
    fff dword 0
    l_WASM word 'h','t','t','p',':','/','/','w','a','s','m','.','r','u',0

    в чём тут бок? немогу никак разобратся блин =(

    Это конечно выход ставить перед своей строкой fff wchar L(<a\0>) но это как то криво получается и через Ж..!
     
  13. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    q_q MultiByteToWideChar работает нормально. проблемма именно в методе Navigate2.
     
  14. 2FED

    2FED New Member

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

    .data
    byte 31,0,0
    l_WASM wchar 'h','t','t','p',':','/','/','w','a','s','m','.','r','u',0

    А так же работает если первый байт равен от 1..31, если больше или ноль не работает, если остальные два не ноль то не работает. может кто знает чо за косяк?
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    2FED
    Ты про COM.rar из #5?
     
  16. 2FED

    2FED New Member

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

    вот выдрал немного кода и сделал себе такую процедурку.

    и если передать в url просто указатель на юникоду строку то нифига почемуто не загружается =( а если перед строкой поставить db 1,0,0 то почемуто всё работает, непойму в чём прикол.


    IENavigate proc hwnd:dword,url:dword
    LOCAL ppIE : dword
    LOCAL ppSp : dword
    LOCAL pVarnt: VARIANT
    LOCAL pVarnt5: VARIANT
    invoke PropGetVal, hwnd, offset aLocationurl, addr pVarnt
    coinvoke pVarnt.bstrVal, IUnknown, QueryInterface, offset IID_IServiceprovider, addr ppSp
    coinvoke ppSp, IServiceProvider, QueryService, addr IID_IWebbrowserApp, addr IID_IWebBrowser2, addr ppIE
    mov pVarnt5.vt, VT_BSTR

    mov eax, url

    mov pVarnt5.bstrVal, eax
    invoke CallMetod, ppIE, offset aNavigate2, addr pVarnt5, 1, addr pVarnt
    ret
    IENavigate endp
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    2FED
    Что такое hwnd, url?
     
  18. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    hwnd адрес IHTMLDocument2
    url адрес UNICODE строки с урлом
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    2FED
    можно сказать что про COM.rar вот выдрал немного кода и сделал себе такую процедурку
    В оригинальной версии замена
    Код (Text):
    1. ...
    2. ;; aigate2  wchar         L(<http://wincmd.ru\0>)
    3.  aigate2  dw 'h', 't', 't', 'p', ':', '/', '/', 'w', 'a', 's', 'm', '.', 'r', 'u', 0
    4. ...
    не влияет на ее работоспособность. Покажи уже _весь_ свой код.
     
  20. temp666

    temp666 New Member

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