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