76

Re: w32 - Вызов WinAPI функций из Lua

Сделал сборку для QUIK 8.5 (Lua 5.3).
Ссылки в первом сообщении.


toxa пишет:

и, чтобы два раза не вставать, добавьте GetCurrentProcessId()

GetCurrentProcessId() добавлена.

77

Re: w32 - Вызов WinAPI функций из Lua

Для QUIK версий 6.x и 7.x берём файл из каталога x32
Для QUIK версий 8.0..8.4 берём файл из каталога x64-Lua51
Для QUIK версий 8.5 и последующих берём файл из каталога x64-Lua53

Здравствуйте.
В каталоге по ссылке в первом сообщении увидел только х32 и х64.
Видимо осталась старая ссылка.

78

Re: w32 - Вызов WinAPI функций из Lua

Специально только что скачал файл по ссылке с данного сайта (из первого сообщения).
Файл называется w32.dll.zip, от 19.05.2020, размер 436 846 байт.
В этом архиве 3 папки:
x32
x64-Lua51
x64-Lua53

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

79

Re: w32 - Вызов WinAPI функций из Lua

Да, действительно. С другого браузера все скачалось.

Спасибо.

80

Re: w32 - Вызов WinAPI функций из Lua

Здравствуйте.
Подскажите, как правильно использовать 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. Как его получить?
Может я думаю не в том направлении?
Подскажите пожалуста.

81

Re: w32 - Вызов WinAPI функций из Lua

Вопрос закрыт.

82

Re: w32 - Вызов WinAPI функций из Lua

fin, было бы очень здорово, если бы вы поделились результатами и описанием того, как вы решили проблему.

83

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

fin, было бы очень здорово, если бы вы поделились результатами и описанием того, как вы решили проблему.

Путь необходимо было прописать в двух местах
pp=getScriptPath().."\\Myfile.exe";
ppp=getScriptPath();
rez = w32.CreateProcess(pp,"","","",1,0,"",ppp,"", ProcessInfo);
Надеюсь кому-то поможет.
Все работает, но хотелось бы что бы в обратную сторону rez был ввиде таблицы (сейчас rez=1.0) с информацией от ProcessInfo, которая необходима и для CloseHandle и для TerminateProcess, может и для других функций. Причем, это не мои желания, это стандартный функционал самой ф-ции CreateProcess.

84

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

GetCurrentProcessId() добавлена.

А как её использовать, например для автологина? Чтобы вводить пароль в правильном экземпляре Квик.

85

Re: w32 - Вызов WinAPI функций из Lua

Сравнивать с GetWindowThreadProcessId()

86 (2020-05-24 21:41:01 отредактировано swerg)

Re: w32 - Вызов WinAPI функций из Lua

fin пишет:

но хотелось бы что бы в обратную сторону rez был ввиде таблицы (сейчас rez=1.0) с информацией от ProcessInfo

Эта функция возвращает несколько параметров:

res, hProcess, hThread, dwProcessId, dwThreadId = w32.CreateProcess(...)

res равно либо 1 либо 0,
Если res == 1, то остальные параметры заполняются как раз значениями из lpProcessInformation.
Если res == 0, то остальные параметры заполняются nil.

87

Re: w32 - Вызов WinAPI функций из Lua

res, hProcess, hThread, dwProcessId, dwThreadId = w32.CreateProcess(...)

Спасибо.

88

Re: w32 - Вызов WinAPI функций из Lua

toxa пишет:

Сравнивать с GetWindowThreadProcessId()

GetWindowThreadProcessId возвращает не PID процесса info.exe

89

Re: w32 - Вызов WinAPI функций из Lua

Возвращает pid процесса, которому принадлежит окно. Вы же не ожидаете, что билл гейтс лично запрограммирует специальную функцию для обнаружения окна логина какого-то там  говнософта из новосибирска? wink

90

Re: w32 - Вызов WinAPI функций из Lua

Вы же сами написали:

toxa пишет:

Сравнивать с GetWindowThreadProcessId()

Сравнивал с

w32.GetWindowThreadProcessId(w32.FindWindow("InfoClass", ""))

Если не правильно, напишите, что с чем сравнивать.

91 (2020-06-01 22:17:35 отредактировано swerg)

Re: w32 - Вызов WinAPI функций из Lua

w32.GetWindowThreadProcessId оказывается тоже 2 параметра возвращает:

threadId, processId = w32.GetWindowThreadProcessId(handleWondow)

CyberTrader, вам нужно брать второе возвращаемое значение.

За одно обновил сборку win32 на сайте, w32.GetWindowThreadProcessId() теперь возвращает целочисленные значения, для удобства в Lua5.3

92 (2020-06-03 01:08:17 отредактировано CyberTrader)

Re: w32 - Вызов WinAPI функций из Lua

swerg, спасибо.

Поскольку были жалобы, на всякий сделал проверку, то ли окно мы нашли:

  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

В чужом окне уже не должен вводить пароль.

93

Re: w32 - Вызов WinAPI функций из Lua

Есть ли в библиотеке функции работы с системным буфером обмена? Если нет, планируете ли добавить?

94

Re: w32 - Вызов WinAPI функций из Lua

wmit пишет:

Есть ли в библиотеке функции работы с системным буфером обмена? Если нет, планируете ли добавить?

А какие конкретно функции требуются? Напишите, да и добавим, если нужно.

95

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

А какие конкретно функции требуются? Напишите, да и добавим, если нужно.

Удобно копировать значение из таблиц quik и вставлять в свои таблицы.
В доске опционов делаем Ctrl+c на ячейке с кодом опциона, в программируемой таблице выделяем нужную ячейку и жмем Ctrl+v, а в SetTableNotificationCallback обрабатываем событие Ctrl+v и вызываем соответствующую функцию w32, например:
res = w32.Ctrl_V()
SetCell(id, r, c, res)

96

Re: w32 - Вызов WinAPI функций из Lua

s_mike пишет:

библиотечные функции должны выглядеть так, чтобы оно работало:

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 все эти параметры. Постепенно буду переделывать а библиотеке.

97

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:
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);
}

98 (2020-12-12 19:45:26 отредактировано swerg)

Re: w32 - Вызов WinAPI функций из Lua

alfa пишет:

функцию  получения времени последней модификации файла

Думаю, что правильнее будет воспользоваться предназначенной для этого библиотекой Lua File System
https://quik2dde.ru/viewtopic.php?id=332

99

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

Подобрал )

-- скрипт при запуске переключает режим для окна "поверх всех" (вкл/выкл)
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, проверить корректность указанного заголовка.

У меня точно работает этот скрипт.

Вот такую штуку надо только для главного окна квика

100

Re: w32 - Вызов WinAPI функций из Lua

Вопрос решен https://quik2dde.ru/viewtopic.php?id=333