Имя: Пароль:
1C
1С v8
DynamicWrapper на сервере х64
0 alf2006x
 
24.07.19
01:42
Всем доброго дня.

Появилась необходимость использовать библиотеку dynwrap.dll
Сложность оказалась в том, что на сервере стоит Win Server 2008 R2 (х64)
Чтобы проверить работу библиотеки открыл пустой текстовый файл "test.vbs" написал в нём следующее:


Dim dteWait

Const WM_KEYDOWN  = 256
Const WM_KEYUP    = 257
Const VK_RETURN   = 13

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate("https://www.yandex.ru";)

' пауза 5 секунд, чтобы прогрузилась страница
dteWait = DateAdd("s", 5, Now())
Do Until (Now() > dteWait)
Loop

Set TextField = IE.document.getElementById("text")
TextField.Value = "ума турман"

IE.Document.ParentWindow.Focus()
TextField.Focus()

Set Wrap = CreateObject("DynamicWrapper")
res = Wrap.Register("USER32.DLL", "PostMessage", "i=huhh")
res = Wrap.Register("USER32.DLL", "FindWindowEx", "i=llsl", "f=s", "r=l")

hWnd = Wrap.FindWindowEx(IE.hWnd, 0, "Frame Tab", 0)
hWnd = Wrap.FindWindowEx(hWnd, 0, "TabWindowClass", 0)
hWnd = Wrap.FindWindowEx(hWnd, 0, "Shell DocObject View", 0)
hWnd = Wrap.FindWindowEx(hWnd, 0, "Internet Explorer_Server", 0)

res = Wrap.PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 1)
res = Wrap.PostMessage(hwnd, WM_KEYUP, VK_RETURN, 1)

IE.Visible = true

MsgBox hwnd


Суть скрипта в том, чтобы запустить IE, перейти на страницу http://www.yandex.ru, в поле поиска
набрать текст ("ума турман"), сфокусироваться на этом поле, найти вложенное окно класса
Internet Explorer_Server и нажать туда Enter.
По истечении времени выполнения запроса получить результат поиска.

Сразу оговорюсь, что клик на кнопку "Найти" мне не нужен. Для моей задачи нужен
именно Enter в дочернее окно IE. Просто такая особенность задачи.
Яндекс здесь исключительно для примера.

Попытка запустить этот скрипт непосредственно двойным кликом по файлу приводит к сообщению об ошибке:
Строка: 22
Символ: 1
Ошибка: НЕвозможно создание объекта контейнером ActiveX: 'DynamicWrapper'
Код: 800A01AD

При этом, всё выполняется абсолютно корректно (от начала и до конца), если запускать файл со скриптом
из cmd следующим образом:
C:\Windows\SysWOW64>wscript C:\Users\1c\Desktop\test.vbs

Аналогичный код в 1С соответственно также не выполняется по причине появления такой ошибки:
{ВнешняяОбработка.Amadeus.Форма.Форма.Форма(108)}: Ошибка при вызове конструктора (COMОбъект)
    Wrap = Новый COMОбъект("DynamicWrapper");
по причине:
-2147221164(0x80040154): Класс не зарегистрирован

Я конечно могу в 1С собирать текст нужного мне скрипта, записывать его в файл и запускать на выполнение
с ожиданием окончания. Но как-то это не по человечьи. Отлаживать очень неудобно и т.п.

Подскажите, как заставить работать библиотеку (явно х32) на сервере х64?
1 МихаилМ
 
24.07.19
01:54
2 Лефмихалыч
 
24.07.19
07:32
(0) WScript.Sleep 5000 - вот это "подождать 5 секунд", а не то, что у тебя там.

а чем это сотонинство выгодно отличается от обычного http-запроса и разбора ответа?
3 alf2006x
 
24.07.19
09:42
(2) Целевой ресурс (НЕ Яндекс) зело заколдован. Поэтому такой бубен.
HTTP запрос пробовал и был жестоко забанен.
4 alf2006x
 
24.07.19
10:47
(1) Я даже больше скажу. Пробовал сделать бубен отсюда: http://catalog.mista.ru/public/195820/
В результате в 1С Новый COMОбъект создается, методы отправляются на выполнение, но результат в ответ не приходит.
Каждый hWnd возвращается с нулём.
Это наверное объяснимо, так как при регистрации приложения COM+ (из уже зарегистрированной библиотеки) она меня предупреждала, что нет гарантий, что методы и свойства будут работать. А способ регистрации непосредственно самой dll почему-то не срабатывает. Выбираю ДЛЛ, а кнопка Далее остаётся серой (без объяснения причин).
5 oleg_km
 
24.07.19
17:01
(3) Ну надо просто более тщательно прикинуться браузером, посмотреть в трассировке нужные заголовки и последовательность запросов