Re: w32 - Вызов WinAPI функций из Lua
Сделал сборку для QUIK 8.5 (Lua 5.3).
Ссылки в первом сообщении.
и, чтобы два раза не вставать, добавьте GetCurrentProcessId()
GetCurrentProcessId() добавлена.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Сделал сборку для QUIK 8.5 (Lua 5.3).
Ссылки в первом сообщении.
и, чтобы два раза не вставать, добавьте GetCurrentProcessId()
GetCurrentProcessId() добавлена.
Для QUIK версий 6.x и 7.x берём файл из каталога x32
Для QUIK версий 8.0..8.4 берём файл из каталога x64-Lua51
Для QUIK версий 8.5 и последующих берём файл из каталога x64-Lua53
Здравствуйте.
В каталоге по ссылке в первом сообщении увидел только х32 и х64.
Видимо осталась старая ссылка.
Специально только что скачал файл по ссылке с данного сайта (из первого сообщения).
Файл называется w32.dll.zip, от 19.05.2020, размер 436 846 байт.
В этом архиве 3 папки:
x32
x64-Lua51
x64-Lua53
Так что всё на месте.
Я думаю у вас браузер закешировал скачку и не скачивает заново. Попробуйте другим браузером скачать, или предварительно перед скачиванием удалите файл с указанным именем из того места, куда производится скачивание.
Да, действительно. С другого браузера все скачалось.
Спасибо.
Здравствуйте.
Подскажите, как правильно использовать CreateProcess.
Пытаюсь запустить exe файл, который в свою очередь открывает и закрывает txt файлы для записи и чтения.
pp=getScriptPath().."\\myfile.exe";
w32.CreateProcess(pp,nil,nil,nil,0,0,nil,StartUpInfo, ProcessInfo);
В таком виде все работает. Можно запускать и останавливать скрипт сколь угодно раз. Но если закрыть и открыть квик и запустить скрипт, то txt файлы оказываются заняты другим процессом. Если удалить и добавить скрипт - все опять работает.
Возможно, необходимо воспользоваться
CloseHandle(hThread); // закрываем дескриптор процесса
CloseHandle(hProcess); // закрываем дескриптор потока
hThread и hProcess находятся в ProcessInfo. Как его получить?
Может я думаю не в том направлении?
Подскажите пожалуста.
Вопрос закрыт.
fin, было бы очень здорово, если бы вы поделились результатами и описанием того, как вы решили проблему.
fin, было бы очень здорово, если бы вы поделились результатами и описанием того, как вы решили проблему.
Путь необходимо было прописать в двух местах
pp=getScriptPath().."\\Myfile.exe";
ppp=getScriptPath();
rez = w32.CreateProcess(pp,"","","",1,0,"",ppp,"", ProcessInfo);
Надеюсь кому-то поможет.
Все работает, но хотелось бы что бы в обратную сторону rez был ввиде таблицы (сейчас rez=1.0) с информацией от ProcessInfo, которая необходима и для CloseHandle и для TerminateProcess, может и для других функций. Причем, это не мои желания, это стандартный функционал самой ф-ции CreateProcess.
GetCurrentProcessId() добавлена.
А как её использовать, например для автологина? Чтобы вводить пароль в правильном экземпляре Квик.
Сравнивать с GetWindowThreadProcessId()
но хотелось бы что бы в обратную сторону rez был ввиде таблицы (сейчас rez=1.0) с информацией от ProcessInfo
Эта функция возвращает несколько параметров:
res, hProcess, hThread, dwProcessId, dwThreadId = w32.CreateProcess(...)
res равно либо 1 либо 0,
Если res == 1, то остальные параметры заполняются как раз значениями из lpProcessInformation.
Если res == 0, то остальные параметры заполняются nil.
res, hProcess, hThread, dwProcessId, dwThreadId = w32.CreateProcess(...)
Спасибо.
Сравнивать с GetWindowThreadProcessId()
GetWindowThreadProcessId возвращает не PID процесса info.exe
Возвращает pid процесса, которому принадлежит окно. Вы же не ожидаете, что билл гейтс лично запрограммирует специальную функцию для обнаружения окна логина какого-то там говнософта из новосибирска?
Вы же сами написали:
Сравнивать с GetWindowThreadProcessId()
Сравнивал с
w32.GetWindowThreadProcessId(w32.FindWindow("InfoClass", ""))
Если не правильно, напишите, что с чем сравнивать.
w32.GetWindowThreadProcessId оказывается тоже 2 параметра возвращает:
threadId, processId = w32.GetWindowThreadProcessId(handleWondow)
CyberTrader, вам нужно брать второе возвращаемое значение.
За одно обновил сборку win32 на сайте, w32.GetWindowThreadProcessId() теперь возвращает целочисленные значения, для удобства в Lua5.3
swerg, спасибо.
Поскольку были [url=https://forum.quik.ru/messages/forum1/message41055/topic4926/#message41055]жалобы[/url], на всякий сделал проверку, то ли окно мы нашли:
local PID = w32.GetCurrentProcessId()
while run do
hQUIK = w32.FindWindow('InfoClass', '')
if select(2, w32.GetWindowThreadProcessId(hQUIK)) == PID then
break
else sleep(50) end
end
В чужом окне уже не должен вводить пароль.
Есть ли в библиотеке функции работы с системным буфером обмена? Если нет, планируете ли добавить?
Есть ли в библиотеке функции работы с системным буфером обмена? Если нет, планируете ли добавить?
А какие конкретно функции требуются? Напишите, да и добавим, если нужно.
А какие конкретно функции требуются? Напишите, да и добавим, если нужно.
Удобно копировать значение из таблиц quik и вставлять в свои таблицы.
В доске опционов делаем Ctrl+c на ячейке с кодом опциона, в программируемой таблице выделяем нужную ячейку и жмем Ctrl+v, а в SetTableNotificationCallback обрабатываем событие Ctrl+v и вызываем соответствующую функцию w32, например:
res = w32.Ctrl_V()
SetCell(id, r, c, res)
библиотечные функции должны выглядеть так, чтобы оно работало:
static int b4s_FindWindowEx(lua_State *L)
{
....
lua_pushlightuserdata(L,FindWindowEx((HWND)lua_touserdata(L,1),
(HWND)lua_touserdata(L,2),static int b4s_PostMessage(lua_State *L)
{
HWND hwnd = (HWND)lua_touserdata(L,1);
UINT msg = (UINT)luaL_checknumber(L,2);
Только сейчас осознал про что и зачем. Хотя с проблемой такой не сталкивался, но верю что она может возникнуть.
Однако в связи с доступностью нам Lua5.3 есть теперь смысл наверное переделать на Int64 все эти параметры. Постепенно буду переделывать а библиотеке.
wmit пишет:Есть ли в библиотеке функции работы с системным буфером обмена? Если нет, планируете ли добавить?
А какие конкретно функции требуются? Напишите, да и добавим, если нужно.
Если не трудно добавьте функцию получения времени последней модификации файла
static int forLua_Get_File_Change_date(lua_State *L)
{
const char *file = luaL_checkstring(L, 1);
struct _stat st;
int ret = _stat(file, &st);
char mod[100];
if (ret == 0) {
ctime_s(mod, 100, &st.st_mtime);
}
lua_pushstring(L, mod);
return(1);
}
функцию получения времени последней модификации файла
Думаю, что правильнее будет воспользоваться предназначенной для этого библиотекой Lua File System
[url]https://quik2dde.ru/viewtopic.php?id=332[/url]
Подобрал )
-- скрипт при запуске переключает режим для окна "поверх всех" (вкл/выкл) local w32 = require ("w32") local WM_SYSCOMMAND = 0x0112 hWndQUIK = w32.FindWindowEx(0, 0, "InfoClass", "") hMdi = w32.FindWindowEx(hWndQUIK, 0, "MDIClient", "") hWndLua = w32.FindWindowEx(hMdi, 0, "", "Заголовок окна, созданного скриптом") w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Вместо строки "Заголовок окна, созданного скриптом" вписать верный заголовок окна, которое создаёт ваш скрипт, чтобы оно было найдено.
Убедиться, что окно найдено - проверить, что hWndLua не равно 0. Если равно 0 - смотреть, где ошибка, почему окно не определяется. Проверить предыдущие hWndQUIK и hMdi, проверить корректность указанного заголовка.У меня точно работает этот скрипт.
Вот такую штуку надо только для главного окна квика
Вопрос решен [url]https://quik2dde.ru/viewtopic.php?id=333[/url]
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Форум работает на PunBB, при поддержке Informer Technologies, Inc