191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9

Переписать код в Delphi-йского на C++ Builder (выполнение скриптов на HTML странице)

08.07.2017, 12:33. Показов 1721. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Нагуглился код на Delphi, который выполняет скрипты на HTML странице:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function ExecuteScript(doc: IHTMLDocument2; script: string; language: string): Boolean;
var
  win: IHTMLWindow2;
  Olelanguage: Olevariant;
begin
  if doc <> nil then
  begin
    try
      win := doc.parentWindow;
      if win <> nil then
      begin
        try
          Olelanguage := language;
          win.ExecScript(script, Olelanguage);
        finally
          win := nil;
        end;
      end;
    finally
      doc := nil;
    end;
  end;
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var
s:OleVariant;
IDoc1: IHTMLDocument2;
begin
Webbrowser1.Document.QueryInterface(IHTMLDocument2, iDoc1);
s:='javascript:сюда скрипт';
ExecuteScript(iDoc1,s,'JavaScript');
end;
Хочу его переписать на C++ Builder:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
bool ExecuteScript(TStringList* Script)
{
    IHTMLDocument2* HTMLDoc = NULL;
    IHTMLWindow2* win;
    OleVariant v;
    TWebBrowser *WebBrowser1;
    // no matching member function for call to 'QueryInterface'
    WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, HTMLDoc);
 
    try
    {
        win = HTMLDoc->parentWindow;
    }
    catch(...)
    {
        return false;
    }
    if(win == NULL)
    {
        return false;
    }
    try
    {
        v = L"JavaScript";
        // 100% неверно!
        win->execScript(Script->Text.c_str(), L"JavaScript", v);
    }
    catch(...)
    {
        return false;
    }
 
    return true;
};
Вот только не получается совсем.
Например, не понимаю, что передавать в
C++
1
WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, HTMLDoc);
И правильно ли я передал параметры тут:
C++
1
win->execScript(Script->Text.c_str(), L"JavaScript", v);
Буду признателен за Вашу помощь.
Или может у кого есть другой, работающий вариант кода, для выполнения этой задачи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2017, 12:33
Ответы с готовыми решениями:

Как закоментировать код в HTML- странице через C++Builder
Здравствуйте! Ребята столкнулся с такой проблемой. Как можно закоментировать строку в html-коде. // или * не прокатывает вот...

Нужно переписать код из Delphi в C++ Builder
Очень нужна ваша помощь и понимание... Задача: Разработать программу, которая читает файл, содержащий текст на русском языке,...

Переписать код с Delphi на С++ под Builder
Помогите переписать код Delphi на С++: function SecToNorm(data:string):string; var value,s,m,h:integer; begin ...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
08.07.2017, 14:39
Запускать скрипты со страницы можно вот так (в XE2/XE4 работало) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall ExecuteScript(TWebBrowser * Browser, const String &fmt, const TVarRec *args, int size)
{
    _di_IDispatch _di = Browser->ControlInterface->Document;
    DelphiInterface<IHTMLDocument2>doc = _di;
    DelphiInterface<IHTMLWindow2>wnd;
    doc->get_parentWindow(&wnd);
    String _script = String::Format(fmt, args, size);
    WideString script = _script;
    WideString lang = "JScript";
    OleVariant v;
    wnd->execScript(script.c_bstr(), lang.c_bstr(), v);
}
вызывать - так:
C++
1
2
    String params = "parameter_for_script";
    ExecuteScript(WebBrowser1, "scriptname(\"%s\");", ARRAYOFCONST((params)));
2
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
08.07.2017, 19:19  [ТС]
Спасибо за код.
Вот только у меня ошибка в строке
C++
1
doc->Get_parentWindow(&wnd);
[bcc64 Error] Unit1.cpp(33): non-const lvalue reference to type '_di_IHTMLWindow2' (aka 'DelphiInterface<Mshtml::IHTMLWindow2>') cannot bind to a temporary of type 'Mshtml::IHTMLWindow2 **'
И если заменить её на эту
C++
1
doc->Get_parentWindow(wnd);
То компиляция проходит, но во время работы получаю следующее
Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'
Версия XE8.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
08.07.2017, 19:25
С этим у Билдера постоянные ошибки. То на одной версии не заработает, то на другой.

Попробуй вот так:
C++
1
DelphiInterface<IHTMLWindow2> wnd = doc->parentWindow;
Мне проверять вообще негде, у меня Билдера теперь нет совсем, но в сети клянутся, что у них отработало.
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
08.07.2017, 20:05  [ТС]
Не помогло. Выводит тоже самое.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall ExecuteScript(TWebBrowser * Browser, const String &fmt, const TVarRec *args, int size)
{
    _di_IDispatch _di = Browser->ControlInterface->Document;
    DelphiInterface<IHTMLDocument2> doc = _di;
    DelphiInterface<IHTMLWindow2> wnd = doc->parentWindow;
    doc->Get_parentWindow(wnd);
    String _script = String::Format(fmt, args, size);
    WideString script = _script;
    WideString lang = "JScript";
    OleVariant v;
    wnd->execScript(script.c_bstr(), lang.c_bstr(), v);
}
0
191 / 52 / 19
Регистрация: 18.02.2013
Сообщений: 508
Записей в блоге: 9
10.07.2017, 16:18  [ТС]
В общем провел проверку : установил C++ Builder XE8 на другую машину(другой студии нет) и проверил всё тот же код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall ExecuteScript(TWebBrowser * Browser, const String &fmt, const TVarRec *args, int size)
{
    _di_IDispatch _di = Browser->ControlInterface->Document;
    DelphiInterface<IHTMLDocument2> doc = _di;
    DelphiInterface<IHTMLWindow2> wnd = doc->parentWindow;
    doc->Get_parentWindow(wnd);
    String _script = String::Format(fmt, args, size);
    WideString script = _script;
    WideString lang = "JScript";
    OleVariant v;
    wnd->execScript(script.c_bstr(), lang.c_bstr(), v);
}
Получаю всю туже ошибку:
Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'
А так же переписал код с Delphi(но это не точно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
bool ExecuteScript(TStringList* Script)
{
    IHTMLDocument2* HTMLDoc = NULL;
    IHTMLWindow2* win;
    OleVariant v;
    TWebBrowser *WebBrowser1;
    WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&HTMLDoc);
 
    try
    {
        win = HTMLDoc->parentWindow;
    }
    catch(...)
    {
        return false;
    }
    if(win == NULL)
    {
        return false;
    }
    try
    {
        v = L"JavaScript";
        // 100% неверно!
        win->execScript(Script->Text.c_str(), L"JavaScript", v);
    }
    catch(...)
    {
        return false;
    }
 
    return true;
};
Который вываливается на следующей строке:
C++
1
WebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (void**)&HTMLDoc);
Всё с той же ошибкой:
Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'
Что-то странное происходит. Почему-то XE8 никак не хочет выполнять код без ошибок. Может, кто-нибудь заюзает этот код на более ранних или более поздних версиях студии?
Или скинет файл mshtml.hpp с XE2 или XE4. Так как выше написали, что на этих версиях код работал нормально.
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2017, 16:18
Помогаю со студенческими работами здесь

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

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

Нужно написать код в html, без скриптов
Помогите!!!! Нужно написать код в html, чтобы получилось вот это

Как правильно переписать на C++Builder с Delphi
Как правильно переписать на C++Builder: procedure Process; var I, Min, MinPos:Integer; begin if InArr(VertArr,...

Определить, какой из скриптов генерирует заданный html код
В архиве 17 скриптов и html код, который один из них генерит. Помогите найти, пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru