Тема: AHK: ComObjCreate WScript
https://www.script-coding.com/WSH/WScript.html
WScript := ComObjCreate("WScript")Так не работает.
Win10x64 AhkSpy, Hotkey, ClockGui
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
https://www.script-coding.com/WSH/WScript.html
WScript := ComObjCreate("WScript")Так не работает.
Я в Гугле в один клик нашёл.
Хорошо тебе, а я не нашёл.
Попробуй запрос объект WScript.
Попробовал.
Успешно? ![]()
Нет.
Неужели не выпало ни одного сайта, где используется конструкция CreateObject("WScript ...)?
ComObjCreate("WScript") такого нигде.
...)?
Что значат точки?
такого нигде
А какое есть?
Что значат точки?
Что там есть что-то ещё.
serzh82saratov, читай тут:
https://ericlippert.com/2003/10/08/why- … pt-object/
Да, WScript это внутренний объект WSH, но есть системный COM-класс, реализующий сходный функционал.
Хотя нет, я с WshShell перепутал.
serzh82saratov, читай тут:
https://ericlippert.com/2003/10/08/why- … pt-object/
Я из того понял что никак, или я ошибаюсь?
Да, никак.
serzh82saratov, а какой функционал тебе нужен?
AHK тут просто для примера, а нужен GetObject в JS и VBS для создания COM из DLL файла.
создания COM
Может и не COM, ну в общем для использования DLL в этих языках.
для использования DLL в этих языках.
Если без сторонних средств, то есть https://ru.wikipedia.org/wiki/Rundll32.exe. Но функция должна быть для этого предназначена.
Не знал, но я так понял что это только про запуск функций, хотелось бы нормальное взаимодействие.
События получать например. Да и просто запуск функции путём запуска ехе не самый быстрый способ, да и как получать результат выполнения.
Тогда остаются сторонние средства, вроде того, что у меня в подписи. Правда, конкретно его банят многие антивирусы, но можно написать аналог на другом языке.
Но он требует регистрации в системе, а я имею ввиду без регистрации. Как LoаdLibrary в анк.
Можно без регистрации, через манифесты. Ещё есть в системе какой-то предустановленный класс, который тоже позволяет другие без регистрации использовать. Только я забыл как он называется. Но пример видел именно с использованием DWX без регистрации.
Ещё есть в системе какой-то предустановленный класс
Не факт что его можно использовать во всех языках, ну и пример конечно интересно было бы посмотреть.
пример конечно интересно было бы посмотреть.
RegistrationFree DynamicWrapperX
Один манифест там всё-таки нужен. Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
Интересно, но выдаёт.
Требуемый класс отсутствует в ClassFactory
actCtx := ComObjCreate("Microsoft.Windows.ActCtx")
actCtx.Manifest := "D:\FFFFFFFFFFFF\AutoHotKey\dynwrapx\dynwrap.test.manifest"
DX := actCtx.CreateObject("DynamicWrapperX")
DX.Register("user32.dll", "MessageBoxW", "i=hwwu", "r=l")
res := DX.MessageBoxW(0, "Hello, world!", "Test", 4)
MsgBox % resПробовал обе битности, после того как подружил с антивирусом.
Я правильно понял что путь к DLL задан тут как относительный?
<file name="dynwrapx.dll">
DynamicWrapperX версии 2.2.0.0, может в примере манифест под другую версию?
Пример для версии 1, но там только clsid отличается. Не помню уже подробностей про эти манифесты, надо разбираться заново.
Пример для версии 1, но там только clsid отличается
А у новой версии какой clsid?
Не помню уже подробностей про эти манифесты, надо разбираться заново.
То есть для каждой DLL могут понадобится некие данные, и не факт что это только clsid и progid?
Проверил пример с первой версией, похоже Microsoft.Windows.ActCtx то что надо!
А у новой версии какой clsid?
Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
То есть для каждой DLL могут понадобится некие данные, и не факт что это только clsid и progid?
Это для COM-DLL. Через мою потом можно вызывать функции обычных DLL.
Ну и clsid в примере старый, сейчас {89565276-A714-4a43-912E-978B935EDCCC}.
Не заметил.) Да всё работает. Я бы такое в описание добавил, не всегда удобна регистрация.
Заметил что путь к Manifest в JS должен быть абсолютным, а в AUTOHOTKEY может быть относительным.
Это для COM-DLL. Через мою потом можно вызывать функции обычных DLL.
Прям библиотека библиотек, спасибо, вопрос снят.
Заметил что путь к Manifest в JS должен быть абсолютным, а в AUTOHOTKEY может быть относительным.
Так это, по идее, смотря где он лежит. Из любого языка этот путь передаётся всё равно в объект ActCtx. Либо абсолютный указывать, либо относительно текущего каталога процесса. Должно быть так.
относительно текущего каталога процесса
В JS процесс это C:\Windows\SysWOW64\wscript.exe, так что если DLL рядом со скриптом, то не работает. Но и у анк до процесса путь свой, но с ним относительный прокатывает. В JS неясное понятие рабочей папки, и как её изменить.
Так это, по идее, смотря где он лежит.
В той же папке что и скрипт.
В JS неясное понятие рабочей папки, и как её изменить.
Вроде там же, где скрипт. Проверил таким кодом:
dwx = new ActiveXObject("DynamicWrapperX");
dwx.Register("kernel32", "GetCurrentDirectoryW", "i=up");
bufsize = 500;
buf = dwx.MemAlloc(bufsize);
dwx.GetCurrentDirectoryW(bufsize / 2, buf);
WSH.Echo(dwx.StrGet(buf));
Изменить можно через SetCurrentDirectory.
В JS процесс это C:\Windows\SysWOW64\wscript.exe, так что если DLL рядом со скриптом, то не работает.
Она должна быть рядом с манифестом, насколько я понял. Т.е. отдельно к ней путь не надо указывать. По крайней мере, у меня так сработало.
GetCurrentDirectoryW может получать то что касается DynamicWrapperX, а не самого JS, или Microsoft.Windows.ActCtx в JS. Так у меня не работает.
var actCtx = new ActiveXObject("Microsoft.Windows.ActCtx");
actCtx.Manifest = "dynwrap.test.manifest";Не удается найти указанный файл.
GetCurrentDirectoryW может получать то что касается DynamicWrapperX, а не самого JS, или Microsoft.Windows.ActCtx в JS.
GetCurrentDirectory Function
Retrieves the current directory for the current process
DWX и ActCtx работают в процессе, который их создал. У процесса один текущий каталог.
Так у меня не работает.
Как именно? Где что в этот момент лежало?
Как именно? Где что в этот момент лежало?
Скрипт, манифест и DLL в одной папке. На строке actCtx.Manifest ошибка.
Скрипт, манифест и DLL в одной папке.
У меня при таком же раскладе работает.
И что интересно JS скрипт, не работает кликом из проводника.
Ошибка: 0x800700C1
Код: 800700C1
Источник: (null)
Запускается только командой Run.
serzh82saratov пишет:Скрипт, манифест и DLL в одной папке.
У меня при таком же раскладе работает.
Не знай как так. Кодировка файлов и переносы строк какие? У меня UTF-8 и Unix (LF).
Не знай как так.
Если через Run, то текущий каталог получается тот, где лежит wscript.exe. Поэтому у вас и не находит. А если двойным щелчком по файлу JS, то текущий — эта папка, поэтому находит. В Run же можно указать текущий каталог.
сли через Run, то текущий каталог получается тот, где лежит wscript.exe.
В Run wscript.exe не указан, только JS файл.
А если двойным щелчком по файлу JS, то текущий — эта папка, поэтому находит.
Так не работало.
Я понял, на JS я тестил первую версию. Она 32 бит, а из проводника запускалась 64 битным wscript, а Run я из под 32 анк запускал. Но в первой версии ошибка с путём всё же есть. Со второй версией норм, относительный путь работает.
В Run wscript.exe не указан, только JS файл.
Я так и делал. Просто проверил каталог через GetCurrentDirectory и получил C:\Windows\system32.
Но в первой версии ошибка с путём всё же есть.
Она есть при использовании Run. Версия ни при чём.
Она есть при использовании Run. Версия ни при чём.
С Run была ошибка с битностью, к пути Manifest она не имеет отношения.
проверил каталог через GetCurrentDirectory и получил C:\Windows\system32
Значит как я и предполагал к относительности пути до Manifest она не имеет отношения.
С Run была ошибка с битностью, к пути Manifest она не имеет отношения.
У меня не было ошибки с битностью при использовании Run. Проблема как раз с тем, что путь относительный, а каталог не тот.
Значит как я и предполагал к относительности пути до Manifest она не имеет отношения.
Относительный путь — относительно текущего каталога. Если каталог не тот, файл не будет найден.
Интересно, что если встроить манифест в библиотеку в виде ресурса, то в скрипте всё равно нужно указывать путь до dynwrapx.manifest, даже если такого файла нет. Если указать саму библиотеку, то вылезает ошибка
Строка: 2
Символ: 1
Ошибка: Указанный тип ресурса в файле образа отсутствует.
Если каталог не тот, файл не будет найден.
Текущий каталог, это папка скрипта, в ней и манифест и dll.
Интересно, что если встроить манифест в библиотеку в виде ресурса, то в скрипте всё равно нужно указывать путь до dynwrapx.manifest, даже если такого файла нет
То есть можно указать несуществующий файл, и это будет работать?

Я так сделал, не получается без файла манифеста.
Текущий каталог, это папка скрипта, в ней и манифест и dll.
При использовании Run это не так. Если только в самом Run не указать явно.
То есть можно указать несуществующий файл, и это будет работать?
Такой странный алгоритм поиска манифеста.
Я так сделал, не получается без файла манифеста.
Не видно картинку, и по адресу не находится.
При использовании Run это не так. Если только в самом Run не указать явно.
Со второй версией работает, с первой проблема была.
Не видно картинку, и по адресу не находится.
https://imgur.com/6j7xG2w а так?
Такой странный алгоритм поиска манифеста.
У меня так выдаёт ошибку о несуществующем файле.
https://imgur.com/6j7xG2w
У меня так выдаёт ошибку о несуществующем файле.
Если actCtx.Manifest обернуть в try catch, то "Невозможно создание объекта сервером программирования объектов".
Со второй версией работает, с первой проблема была.
Первую я даже не пробовал. Версия DWX тут вообще ни при чём. Суть в том, что когда скрипт JS запускается через Run без явного указания рабочего каталога, то используется каталог, где лежит wscript.exe. Не имеет значения, что делает скрипт JS, а уж тем более какую версию чего-то там он использует.
https://imgur.com/6j7xG2w а так?
Там надо выбрать именно код для форума, это ниже расположено.
У меня так выдаёт ошибку о несуществующем файле.
Не пойму, как это работает. Лежит библиотека в одном месте — работает, а если в другом — нет, хотя в обоих случаях указан полный путь. Белиберда какая-то. Отдельного файла манифеста нет в обоих случаях.