получаю доступ к 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) читаются нормально.
Блин оказалось всё работает, я просто строку для поиска окна не ту передавал(она указывала совсем на другое окно где скорее всего был пустой IE элемент) Спасибо всем кто участвовал =)
вот ещё непонятно как реализовать такой код var pDoc: IHTMLDocument2; IE: IWebbrowser2; .... (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE);
а как обойтись без макроса 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 работает нормально
Блин уже под отладчиком смотрел, структуры строк одинаковые, и ещё если строка определена за макросом wchar L(<>) тогда всё нормально! как это объяснить? может выравнивание какоето? пробовал перед строкой ставить align 4 ( 2,4,8,16) и нифига =(
2FED В чем выражается "MultiByteToWideChar ... не работает"? + последний параметр MultiByteToWideChar - это количество символов, на которые рассчитан буфер, если зарезервировано 100 байт, то это 50 символов. + имя переменной с исходной строкой l_WASM или WASM?
Вот как это объяснить? .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>) но это как то криво получается и через Ж..!
ещё вот так работает .data byte 31,0,0 l_WASM wchar 'h','t','t','p',':','/','/','w','a','s','m','.','r','u',0 А так же работает если первый байт равен от 1..31, если больше или ноль не работает, если остальные два не ноль то не работает. может кто знает чо за косяк?
ну да можно сказать что про 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
2FED можно сказать что про COM.rar вот выдрал немного кода и сделал себе такую процедурку В оригинальной версии замена Код (Text): ... ;; aigate2 wchar L(<http://wincmd.ru\0>) aigate2 dw 'h', 't', 't', 'p', ':', '/', '/', 'w', 'a', 's', 'm', '.', 'r', 'u', 0 ... не влияет на ее работоспособность. Покажи уже _весь_ свой код.