Re: w32 - Вызов WinAPI функций из Lua
Проигрывание звуковых файлов из Lua
перестало работать, требует первый аргумент integer, теперь так
B1 = math.floor( A1 * (poluton ^ 2) )
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Проигрывание звуковых файлов из Lua
перестало работать, требует первый аргумент integer, теперь так
B1 = math.floor( A1 * (poluton ^ 2) )
kalikazandr, можно полнее код? про какой именно речь.
Я действительно часть аргументов переделываю на integer, т.к. они теперь int64 и этого более чем достаточно. Но может какие-то примеры в самом деле отваливаются...
kalikazandr, можно полнее код? про какой именно речь.
Я действительно часть аргументов переделываю на integer, т.к. они теперь int64 и этого более чем достаточно. Но может какие-то примеры в самом деле отваливаются...
[url]https://quik2dde.ru/viewtopic.php?pid=461#p461[/url] "Аларм" встроенным динамиком
Посмотрел на реализацию w32.Beep()
Там изначально первым аргументом требовался int. Просто видимо в предыдущих версиях Lua в QUIK из-за того, что все числа были double на самом деле это не контролировалось (лишь предположение, проверять лень). В любом случае там изначально было checkinteger.
Теперь же в Lua5.3 у нас проявился честный int и честный контроль целочисленности аргумента.
Формально WinAPI функция Beep принимает целочисленные параметры.
Однако, вероятно, именно для win32.Beep есть смысл сделать тут "послабление" для первого параметра, коль скоро частоту в самом деле удобно вычислять в некоторых случаях, причем вычисления эти конечно же происходят в double.
Переделаю в след. версиях так, чтобы первым параметром можно было передавать и double.
UPD
Сборка поправлена, пример с w32.Beep() снова работает.
kalikazandr, спасибо за [url=https://github.com/swerg/qlua-w32/issues/2]баг-репорт[/url]!
admin: видимо хотелось бы добавить функции
WideCharToMultiByte/MultiByteToWideChar
WideCharToMultiByte/MultiByteToWideChar
Честно говоря не совсем понимаю как эти функции добавить и зачем.
Они ж про UTF-16 / UTF-8, если я верно понимаю.
Могли бы вы немного подробнее пояснить?
Добрый день! Подскажите, а где можно посмотреть описание функций библиотеки w32? Спасибо!
Добрый день! Подскажите, а где можно посмотреть описание функций библиотеки w32? Спасибо!
Не понятен вопрос.
Описание параметров?
Просто загугливаете по названию функции - и попадаете на документацию Microsoft, параметры всегда ровно те же.
Список функцией есть в первых сообщениях данной темы.
Ели с какой-то конкретной функцией что-то не понятно - пишите, будем разбираться.
Здравствуйте.
Есть ли возможность изменить ширину столбца таблицы Квик или вообще удалить столбец при помощи каких-то функций win api? Пробовал использовать ListView_SetColumnWidth, не срабатывает. В тоже время, функция для определения выбранной вкладки, например, работает - TabCtrl_GetCurSel.
Вопрос интересует в контексте управления столбцом с номерами строк таблицы.
Здравствуйте.
Для остановки процесса использую следующее
local status = pcall(function() --при ошибке
--останавливаем процесс
local rez = w32.TerminateProcess(MyhProcess, 0);
w32.CloseHandle(MyhProcess);
w32.CloseHandle(MyhThread);
end)
if not status then
return;
end;
Все работает даже если закрываемый процесс не запущен.
Но подумал, что будет лучше, если перед этим все таки проверить запущен ли процесс через w32.OpenProcess.
Делаю так
local rezhProcess;
local rezTerminate;
local status = pcall(function() --при ошибке
message("1");
rezhProcess = w32.OpenProcess(PROCESS_TERMINATE, false, MydwProcessId);--получили hProcess процесса
message("rezhProcess="..tostring(rezhProcess));
if rezhProcess then
--останавливаем процесс
rezTerminate = w32.TerminateProcess(rezhProcess, 0);
w32.CloseHandle(MyhProcess);
w32.CloseHandle(MyhThread);
end;
end)
if not status then
return;
end;
До второго message("rezhProcess="..tostring(rezhProcess)); не доходит.
Видимо не правильно использую w32.OpenProcess.
В чем моя ошибка? MydwProcessId пробовал и как number и как string. False менял на True.
Спасибо
Через w32.GetExitCodeProcess получается.
local status = pcall(function() --при ошибке
local ThisStatus = 0;
local RezStatus = 0;
local RezGetExitCodeProcess, RezStatus = w32.GetExitCodeProcess(MyhProcess, ThisStatus);
if (RezGetExitCodeProcess ~= 0) then
RezStatus = RezStatus - RezStatus%1;
if (RezStatus == 259) then
--останавливаем процесс
local rez = w32.TerminateProcess(MyhProcess, 0);
if (rez ~= 0) then
w32.CloseHandle(MyhProcess);
w32.CloseHandle(MyhThread);
end;
end;
end;
end)
if not status then
return;
end;
Но вопрос с w32.OpenProcess все же остался.
И есть ли смысл проверки перед использованием TerminateProcess?
Спасибо
В библиотеке win32 ожидается такой синтаксис для OpenProcess:
res = w32.OpenProcess(NUMBER dwDesiredAccess, BOOL bInheritHandle, NUMBER dwProcessId)
Возвращает:
NUMBER - если успешно
nil - при ошибке
rezhProcess = w32.OpenProcess(PROCESS_TERMINATE, false, MydwProcessId);--получили hProcess процесса
PROCESS_TERMINATE - эта константа у вас определена?
Но вопрос с w32.OpenProcess все же остался.
И есть ли смысл проверки перед использованием TerminateProcess?
Я тут не очень специалист, но судя по справке иначе и никак, вы ж где-то должны взять hProcess.
Тут есть простой лаконичный пример [url]https://stackoverflow.com/questions/2443738/c-terminateprocess-function/2445047[/url]
(пример на С, но это ж не важно, да?)
BOOL TerminateProcessEx(DWORD dwProcessId, UINT uExitCode)
{
DWORD dwDesiredAccess = PROCESS_TERMINATE;
BOOL bInheritHandle = FALSE;
HANDLE hProcess = OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
if (hProcess == NULL)
return FALSE;
BOOL result = TerminateProcess(hProcess, uExitCode);
CloseHandle(hProcess);
return result;
}
fin пишет:rezhProcess = w32.OpenProcess(PROCESS_TERMINATE, false, MydwProcessId);--получили hProcess процесса
PROCESS_TERMINATE - эта константа у вас определена?
Эта константа сама по себе определена в таблице прав доступа и используется в OpenProcess.
В Вашем примере она и используется.
Остановлюсь на w32.GetExitCodeProcess.
Спасибо
Эта константа сама по себе определена в таблице прав доступа и используется в OpenProcess.
В вашем скрипте Lua - она откуда определена? ниоткуда, фактически nil передаётся первым параметром.
Но w32.OpenProcess первым параметром требует число, при этом передается nil.
На этом и валится скрипт, однако вы этого не видите, т.к. маскировали ошибку из-за pcall(). Уберите pcall() хотя бы временно - и увидите ошибку (описание ошибки).
Теперь понятно, почему
До второго message("rezhProcess="..tostring(rezhProcess)); не доходит.
- валится на вызове w32.OpenProcess, некорректный первый параметр, но вы этого не видите, т.к. ошибка проглотилась pcall(), и скрипт продолжает работать дальше, на коде после pcall().
Вот описание первого параметра ф-ции OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
dwDesiredAccess
Уровень доступа. Может иметь различные комбинации
PROCESS_ALL_ACCESS = &H1F0FFF Полный доступ
PROCESS_CREATE_PROCESS Право на создание процесса
PROCESS_CREATE_THREAD = &H2 Право на создание нити
PROCESS_DUP_HANDLE = &H40 Enables using the process handle as either the source or target process in the DuplicateHandle function to duplicate a handle.
PROCESS_QUERY_INFORMATION = &H400 Enables using the process handle in the GetExitCodeProcess and GetPriorityClass functions to read information from the process object.
PROCESS_SET_QUOTA Enables using the process handle in the AssignProcessToJobObject and SetProcessWorkingSetSize functions to set memory limits.
PROCESS_SET_INFORMATION = &H200 Enables using the process handle in the SetPriorityClass function to set the priority class of the process.
PROCESS_TERMINATE = &H1 Enables using the process handle in the TerminateProcess function to terminate the process.
PROCESS_VM_OPERATION = &H8 Enables using the process handle in the VirtualProtectEx and WriteProcessMemory functions to modify the virtual memory of the process.
PROCESS_VM_READ = &H10 Enables using the process handle in the ReadProcessMemory function to read from the virtual memory of the process.
PROCESS_VM_WRITE = &H20 Enables using the process handle in the WriteProcessMemory function to write to the virtual memory of the process.
SYNCHRONIZE = &H100000 Windows NT/2000 or later: Enables using the process handle in any of the wait functions to wait for the process to terminate.
Убрал pcall. Да указывает ошибку на первый аргумент.
Заменил на 0х0001 (&H1) Попробовал. Теперь дает ошибку на второй аргумент. Пишет number expected, got boolean.
Хотя там false.
Вот описание первого параметра ф-ции OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
dwDesiredAccess
Уровень доступа. Может иметь различные комбинации
Про описание понятно, но вопрос-то в другом: в коде Lua откуда возьмутся константы с такими наименованиями у вас?
Неоткуда им взяться, если вы сами их не определите.
Так что подставили просто числовое значение нужной константы - и правильно.
Убрал pcall. Да указывает ошибку на первый аргумент.
Заменил на 0х0001 (&H1) Попробовал. Теперь дает ошибку на второй аргумент. Пишет number expected, got boolean.
Хотя там false.
Да, извиняюсь, невнимательно посмотрел.
Вторым параметром надо передавать тоже число: 0 (если false) или 1 (если true).
Потом [url=https://github.com/swerg/qlua-w32/issues/5]как-нибудь поправлю[/url].
Есть ли возможность изменить ширину столбца таблицы Квик или вообще удалить столбец при помощи каких-то функций win api?
Про такую возможность неизвестно.
fin пишет:Вот описание первого параметра ф-ции OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)
dwDesiredAccess
Уровень доступа. Может иметь различные комбинацииПро описание понятно, но вопрос-то в другом: в коде Lua откуда возьмутся константы с такими наименованиями у вас?
Неоткуда им взяться, если вы сами их не определите.
Так что подставили просто числовое значение нужной константы - и правильно.fin пишет:Убрал pcall. Да указывает ошибку на первый аргумент.
Заменил на 0х0001 (&H1) Попробовал. Теперь дает ошибку на второй аргумент. Пишет number expected, got boolean.
Хотя там false.Да, извиняюсь, невнимательно посмотрел.
Вторым параметром надо передавать тоже число: 0 (если false) или 1 (если true).
Потом [url=https://github.com/swerg/qlua-w32/issues/5]как-нибудь поправлю[/url].
Вторым параметром передал число(0). Все работает.
Спасибо за разъяснения.
Про такую возможность неизвестно.
можно: [url]https://quik2dde.ru/viewtopic.php?pid=2484#p2484[/url]
swerg пишет:Про такую возможность неизвестно.
можно: [url]https://quik2dde.ru/viewtopic.php?pid=2484#p2484[/url]
Я не вижу в вашей библиотеке возможность изменить ширину столбца, либо удалить его. Она позволяет только определить количество строк/столбцов, а это можно сделать и средствами qlua.
ну, нужно немного допилить. копайте в сторону ML_UpdateColumnWidth
ну, нужно немного допилить. копайте в сторону ML_UpdateColumnWidth
ML_UpdateColumnWidth - это внутренняя константа вашей библиотеки. Если бы вы написали несколько строчек функции, было бы более понятно.
ну, нужно немного допилить. копайте в сторону ML_UpdateColumnWidth
Спасибо, разобрался, для w32 функция так вот будет выглядеть:
static int global_SetColumnWidth(lua_State *L)
{
const HWND hwnd = (HWND)(int)luaL_checknumber(L, 1);
SendMessage(hwnd, 2047, luaL_checknumber(L, 2), luaL_checknumber(L, 3));
return(1);
}
где 2047 - это ваша константа ML_SetColumnWidth = $7FF в десятиричной системе.
Правда, не могу нигде найти полный список сообщений с кодами для функции SendMessage.
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Форум работает на PunBB, при поддержке Informer Technologies, Inc