Как вызвать скрипт из приложения?
От: Тимофей Чадов Россия RSDN.ru
Дата: 11.09.01 21:40
Оценка:
Статья:
Как вызвать скрипт из приложения?
Автор(ы): Тимофей Чадов
Дата: 7.09.2001


Авторы:
Тимофей Чадов

Аннотация:
При использовании WebBrowser Вы можете вызывать любые скрипты, расположенные в теле html-страницы. Обращение к скриптам производится через диспетчерский интерфейс, возвращаемый в свойстве Script интерфейса IHTMLDocument.
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Запуск скрипта из другого потока
От: Юра Украина  
Дата: 25.10.01 08:41
Оценка:
Я попытался сделать следующее: я запускал параллельный поток и пытался, имея указатель на View, запустить скрипт, от чего приложение вешалось. Как с єтим бороться?
Вызов скрипта из другого потока.
От: Юра Украина  
Дата: 25.10.01 08:38
Оценка:
Не работает с фреймами !?
От: Alexeich  
Дата: 05.10.01 10:56
Оценка:
Если загружаю(Navigate();) простой HTML документ(обычная страничка состоящая из одного .html файла), то все работает.
Если же составной документ(с фреймами, к примеру main.html , leftpart.html , rightpart.html и Navigate("main.html", ...); ), то где бы я ни определял script evaluate — не работает.
Когда прокручиваю в дебагере то
вылетает на втором if (отмечено --->)

DISPID dispid;

HRESULT hr = pScript->GetIDsOfNames(IID_NULL, &szMember, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);

---> if (SUCCEEDED(hr))

{
Ну не хочет работать
От: Блудов Павел Россия  
Дата: 19.09.01 19:54
Оценка:
GetIDsOfNames возвращает исключительно DISP_E_MEMBERNOTFOUND.
У кого-нить этот код работает?
Еще вариант
От: DNS Россия  
Дата: 12.09.01 21:40
Оценка:
А у интерфейса IHTMLWindow2 есть такой метод execScript. IHTMLWindow2 можно получить у IHTMLDocument2 вызовом get_parentWindow.

MSDN:
/////////
HRESULT execScript(
BSTR code,
BSTR language,
VARIANT *pvarRet
);

code — String (BSTR) that specifies the script code to execute.

language — String (BSTR) that specifies the language in which the code is executed. The default is Microsoft® JScript® (compatible with ECMA 262 language specification).

pvarRet — Address of a VARIANT structure that receives the return value from the script code.

///////////
HRESULT get_parentWindow(
IHTMLWindow2 **p
);
Д.Н.С.
Re: Запуск скрипта из другого потока
От: VictorY  
Дата: 08.01.02 04:29
Оценка:
использовать не CoInitialize, а CoInitializeEx(COINIT_MULTITHREADED).
По умолчанию VC вставляет CoInitialize, а эта функция инициализирует COM только в одном потоке
Re: Не работает с фреймами !?
От: Tim Россия RSDN.ru
Дата: 06.10.01 03:19
Оценка:
Скрипт может находится в любом фрейме. При этом надо обращаться к
соответствующему документу. Каждому фрейму соответсвует свой документ.
Список фреймов текущего документа можно получить через вызов get_frames

// Получаем коллекцию фреймов
CComQIPtr<IHTMLFramesCollection2, &IID_IHTMLFramesCollection2> pFr;
pDoc->get_frames( &pFr); // pDoc — документ верхнего уровня

// Получаем например фрейм...
pFr->item( &v1, &v2);

Из полученного IDispatch запрашиваем IWindow, у него IHTMLDocument — и
только у этого документа ищем скрипт.

Успехов
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re: Ну не хочет работать
От: Tim Россия RSDN.ru
Дата: 19.09.01 21:43
Оценка:
Только что проверил на 3-х машинах.
Win98 IE 5.0,
Win2000, IE5.0.
Win2000, IE5.5.

Все работает как часы. Лови пример мылом.
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re: Запуск скрипта из другого потока
От: Tim Россия RSDN.ru
Дата: 08.01.02 08:04
Оценка:
COINIT_MULTITHREADED — здесь ни при чем. Этот флаг всего лишь позволит потоку создавать объекты в MTA. см. http://www.rsdn.ru/?article/?com/apartmnt.xml
Автор(ы): Jeff Prosise
Дата: 22.02.2001

В этой статье подробно рассматриваются подразделения (apartments) в модели
COM. Автор описывает различные виды подразделений, показывает, каким образом
подразделения назначаются потокам и объектам, а также даёт ряд полезных
советов, которые позволят вам избежать ошибок при работе с подразделениями.


Проблема в том, что во втором потоке через pView делаются вызовы через неотмаршаленный указатель на один из интерфейсов брайзера.

Решение: либо корректно маршалить указатели, либо вместо вызова методов отправлять в основной поток PostMessage.
--
Как мы живем государственная тайна, на что — коммерческая, с кем — личная.
Re: Еще вариант
От: SVV Беларусь  
Дата: 04.03.04 14:31
Оценка:
Здравствуйте, DNS, Вы писали:

DNS>А у интерфейса IHTMLWindow2 есть такой метод execScript. IHTMLWindow2 можно получить у IHTMLDocument2 вызовом get_parentWindow.


DNS>MSDN:

DNS>/////////
DNS>HRESULT execScript(
DNS> BSTR code,
DNS> BSTR language,
DNS> VARIANT *pvarRet
DNS>);

DNS>language — String (BSTR) that specifies the language in which the code is executed. The default is Microsoft® JScript® (compatible with ECMA 262 language specification).


Нужно вызвать JavaScript (скрипт в html странице), какую строку надо передать во 2-м параметре?
пока что имею в качестве HRESULT 0x80070057 (Invlid Parameter).
Re: Как вызвать скрипт из приложения?
От: User99  
Дата: 17.08.04 10:36
Оценка:
В первоначальном варианте у меня не заработало(как я понял и не только у меня).

...
 LPDISPATCH pScript;    
 LPDISPATCH pDisp;    

    pHtmlDoc->get_Script( &pDisp);
    pScript->AddRef();
    if (SUCCEEDED(hr))
    {
        // Получаем DISPID интересуемой функции
        OLECHAR* szMember = L"evaluate";
        DISPID dispid;

        pDisp->QueryInterface(IID_IDispatch, (void**)&pScript );
        HRESULT hr = pScript->GetIDsOfNames(IID_NULL, &szMember, 1,
            LOCALE_SYSTEM_DEFAULT, &dispid);


А в общем статья, конечно же помогла.
Re: Как вызвать скрипт из приложения?
От: Камнев Георгий Павлович Россия gocha.org
Дата: 02.04.05 17:07
Оценка:
Здравствуйте, Тимофей Чадов, Вы писали:

ТЧ>Статья:

ТЧ>Как вызвать скрипт из приложения?
Автор(ы): Тимофей Чадов
Дата: 7.09.2001


ТЧ>Авторы:

ТЧ> Тимофей Чадов

ТЧ>Аннотация:

ТЧ>При использовании WebBrowser Вы можете вызывать любые скрипты, расположенные в теле html-страницы. Обращение к скриптам производится через диспетчерский интерфейс, возвращаемый в свойстве Script интерфейса IHTMLDocument.

----------------------------------------
А вообще скрипт можно вызвать по средствам ActiveX контрола — Microsoft Script Control,
На С# делается минут в 10, на С++ не знаю, работать с ним достаточно леко, можно передовать
свои обьекты для работы с ними в скрипте.
Re: А как вообще отключить JavaScript и Cookies программно?
От: muradm Россия  
Дата: 08.09.05 07:09
Оценка:
А как вообще отключить JavaScript и Cookies программно?
Но только для одного экземпляра запущенного приложения.
Re: Как вызвать скрипт из приложения?
От: Left2 Украина  
Дата: 18.01.08 08:19
Оценка:
Хочу дополнить — есть вариант чуть (слегка) ускорить этот процесс если функция будет вызываться более одного раза.
Для этого после получения DISPID делаем сначала DISPATCH_GET — получаем в ответ VARIANT, в котором лежит IDispatch. Так вот, этот диспатч и будет "указателем на функцию в понимании JScript". А для вызова функции по указателю делаем опять же Invoke, которому в качестве DISPID передаём DISPID_VALUE.
... << RSDN@Home 1.2.0 alpha rev. 717>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.