101 (2021-01-22 13:06:59 отредактировано kalikazandr)

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

swerg пишет:

Проигрывание звуковых файлов из Lua

перестало работать, требует первый аргумент  integer, теперь так
B1 = math.floor( A1 * (poluton ^ 2) )

102 (2021-01-22 21:48:45 отредактировано swerg)

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

kalikazandr, можно полнее код? про какой именно речь.
Я действительно часть аргументов переделываю на integer, т.к. они теперь int64 и этого более чем достаточно. Но может какие-то примеры в самом деле отваливаются...

103

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

swerg пишет:

kalikazandr, можно полнее код? про какой именно речь.
Я действительно часть аргументов переделываю на integer, т.к. они теперь int64 и этого более чем достаточно. Но может какие-то примеры в самом деле отваливаются...

https://quik2dde.ru/viewtopic.php?pid=461#p461 "Аларм" встроенным динамиком

104 (2021-01-24 21:59:45 отредактировано swerg)

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

Посмотрел на реализацию w32.Beep()
Там изначально первым аргументом требовался int. Просто видимо в предыдущих версиях Lua в QUIK из-за того, что все числа были double на самом деле это не контролировалось (лишь предположение, проверять лень). В любом случае там изначально было checkinteger.
Теперь же в Lua5.3 у нас проявился честный int и честный контроль целочисленности аргумента.

Формально WinAPI функция Beep принимает целочисленные параметры.
Однако, вероятно, именно для win32.Beep есть смысл сделать тут "послабление" для первого параметра, коль скоро частоту в самом деле удобно вычислять в некоторых случаях, причем вычисления эти конечно же происходят в double.

Переделаю в след. версиях так, чтобы первым параметром можно было передавать и double.

UPD
Сборка поправлена, пример с w32.Beep() снова работает.
kalikazandr, спасибо за баг-репорт!

105

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

admin: видимо хотелось бы добавить функции

WideCharToMultiByte/MultiByteToWideChar

106 (2021-04-06 09:24:37 отредактировано swerg)

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

toxa пишет:

WideCharToMultiByte/MultiByteToWideChar

Честно говоря не совсем понимаю как эти функции добавить и зачем.
Они ж про UTF-16 / UTF-8, если я верно понимаю.
Могли бы вы немного подробнее пояснить?

107

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

Добрый день! Подскажите, а где можно посмотреть описание функций библиотеки w32? Спасибо!

108

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

zas300379 пишет:

Добрый день! Подскажите, а где можно посмотреть описание функций библиотеки w32? Спасибо!

Не понятен вопрос.
Описание параметров?
Просто загугливаете по названию функции - и попадаете на документацию Microsoft, параметры всегда ровно те же.
Список функцией есть в первых сообщениях данной темы.

Ели с какой-то конкретной функцией что-то не понятно - пишите, будем разбираться.

109 (2021-05-08 17:19:03 отредактировано nero333)

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

Здравствуйте.

Есть ли возможность изменить ширину столбца таблицы Квик или вообще удалить столбец при помощи каких-то функций win api? Пробовал использовать ListView_SetColumnWidth, не срабатывает. В тоже время, функция для определения выбранной вкладки, например, работает - TabCtrl_GetCurSel.

Вопрос интересует в контексте управления столбцом с номерами строк таблицы.

110

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

Здравствуйте.
Для остановки процесса использую следующее
    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.

Спасибо

111

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

Через 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?

Спасибо

112

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

В библиотеке win32 ожидается такой синтаксис для OpenProcess:

res = w32.OpenProcess(NUMBER dwDesiredAccess, BOOL bInheritHandle, NUMBER dwProcessId)

Возвращает:

  • NUMBER - если успешно

  • nil - при ошибке

113

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

fin пишет:

        rezhProcess = w32.OpenProcess(PROCESS_TERMINATE, false, MydwProcessId);--получили hProcess процесса

PROCESS_TERMINATE - эта константа у вас определена?

114 (2021-05-21 12:56:33 отредактировано swerg)

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

fin пишет:

Но вопрос с w32.OpenProcess все же остался.
И есть ли смысл проверки перед использованием TerminateProcess?

Я тут не очень специалист, но судя по справке иначе и никак, вы ж где-то должны взять hProcess.
Тут есть простой лаконичный пример https://stackoverflow.com/questions/244 … on/2445047

(пример на С, но это ж не важно, да?)

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;
}

115

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

swerg пишет:
fin пишет:

        rezhProcess = w32.OpenProcess(PROCESS_TERMINATE, false, MydwProcessId);--получили hProcess процесса

PROCESS_TERMINATE - эта константа у вас определена?

Эта константа сама по себе определена в таблице прав доступа и используется в OpenProcess.
В Вашем примере она и используется.

Остановлюсь на w32.GetExitCodeProcess.

Спасибо

116

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

fin пишет:

Эта константа сама по себе определена в таблице прав доступа и используется в OpenProcess.

В вашем скрипте Lua - она откуда определена? ниоткуда, фактически nil передаётся первым параметром.
Но w32.OpenProcess первым параметром требует число, при этом передается nil.
На этом и валится скрипт, однако вы этого не видите, т.к. маскировали ошибку из-за pcall(). Уберите pcall() хотя бы временно - и увидите ошибку (описание ошибки).

Теперь понятно, почему

fin пишет:

До второго message("rezhProcess="..tostring(rezhProcess)); не доходит.

- валится на вызове w32.OpenProcess, некорректный первый параметр, но вы этого не видите, т.к. ошибка проглотилась pcall(), и скрипт продолжает работать дальше, на коде после pcall().

117

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

Вот описание первого параметра ф-ции 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.

118

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

fin пишет:

Вот описание первого параметра ф-ции OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)

dwDesiredAccess
Уровень доступа. Может иметь различные комбинации

Про описание понятно, но вопрос-то в другом: в коде Lua откуда возьмутся константы с такими наименованиями у вас?
Неоткуда им взяться, если вы сами их не определите.
Так что подставили просто числовое значение нужной константы - и правильно.

fin пишет:

Убрал pcall. Да указывает ошибку на первый аргумент.
Заменил на 0х0001 (&H1) Попробовал. Теперь дает ошибку на второй аргумент. Пишет number expected, got boolean.
Хотя там false.

Да, извиняюсь, невнимательно посмотрел.
Вторым параметром надо передавать тоже число: 0 (если false) или 1 (если true).
Потом как-нибудь поправлю.

119

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

nero333 пишет:

Есть ли возможность изменить ширину столбца таблицы Квик или вообще удалить столбец при помощи каких-то функций win api?

Про такую возможность неизвестно.

120

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

swerg пишет:
fin пишет:

Вот описание первого параметра ф-ции OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId)

dwDesiredAccess
Уровень доступа. Может иметь различные комбинации

Про описание понятно, но вопрос-то в другом: в коде Lua откуда возьмутся константы с такими наименованиями у вас?
Неоткуда им взяться, если вы сами их не определите.
Так что подставили просто числовое значение нужной константы - и правильно.

fin пишет:

Убрал pcall. Да указывает ошибку на первый аргумент.
Заменил на 0х0001 (&H1) Попробовал. Теперь дает ошибку на второй аргумент. Пишет number expected, got boolean.
Хотя там false.

Да, извиняюсь, невнимательно посмотрел.
Вторым параметром надо передавать тоже число: 0 (если false) или 1 (если true).
Потом как-нибудь поправлю.

Вторым параметром передал число(0). Все работает.

Спасибо за разъяснения.

121

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

swerg пишет:

Про такую возможность неизвестно.

можно: https://quik2dde.ru/viewtopic.php?pid=2484#p2484

122

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

toxa пишет:
swerg пишет:

Про такую возможность неизвестно.

можно: https://quik2dde.ru/viewtopic.php?pid=2484#p2484

Я не вижу в вашей библиотеке возможность изменить ширину столбца, либо удалить его. Она позволяет только определить количество строк/столбцов, а это можно сделать и средствами qlua.

123

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

ну, нужно немного допилить. копайте в сторону ML_UpdateColumnWidth

124

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

toxa пишет:

ну, нужно немного допилить. копайте в сторону ML_UpdateColumnWidth

ML_UpdateColumnWidth - это внутренняя константа вашей библиотеки. Если бы вы написали несколько строчек функции, было бы более понятно.

125

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

toxa пишет:

ну, нужно немного допилить. копайте в сторону 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.