Немного подправил пример, который видел на стр. https://quik2dde.ru/viewtopic.php?id=79 dll файл получился меньше 20 Кб. Искал примеры, чтобы не выскакивало окно консоли, смотрел примеры через виндовс скрипт хост (расширение файла .vbs). Если запускать в Проводнике, то окнА консоли нет, а если в Квике, то есть, не понял, почему...
Убрал проверку на ошибки. mci с MessageBeep микшируется, а mci с mci не смог смикшировать. И в том и моём примере mci устройство после завершения скрипта остаётся открытым. В OnStop или в OnClose надо бы закрыть, или ну его? Я пробовал вставить mciSendString("CLOSE QUIK_MP3", NULL, 0, NULL); в DllMain, когда приходит сообщение DLL_THREAD_DETACH, опять нарвался на зависание Квика...
#include <windows.h>
#include <mmsystem.h>
/*
// #include <stdbool.h>
#define bool _Bool
#define true 1
#define false 0
*/
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
/*
// Стандартная точка входа для DLL
bool APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{ return true;
}
*/
static int forLua_mciSendString(lua_State *L)
{ mciSendString("CLOSE QUIK_MP3", NULL, 0, NULL);
mciSendString(lua_tostring(L, 1), NULL, 0, NULL);
mciSendString("PLAY QUIK_MP3", NULL, 0, NULL);
return 0;
}
static int forLua_MessageBeep(lua_State *L)
{ MessageBeep(lua_tointeger(L, 1));
return 0;
}
// список реализованных в dll пользовательских функций
static struct luaL_Reg ls_lib[] =
{ {"mciSendString", forLua_mciSendString},
{"MessageBeep", forLua_MessageBeep},
{NULL, NULL}
};
// Имя dll должно быть playsnddll, как написано ниже!
__declspec(dllexport) int luaopen_playsnddll(lua_State *L)
{ luaL_newlib(L, ls_lib);
return 1;
}
Это playsnd.lua:
Скрытый текст
Код
-- Предполагается, что эта dll лежит в подпапке "скрипты" папки Quik
package.cpath = package.cpath .. ';' .. getWorkingFolder() .. '\\скрипты' .. '\\playsnddll.dll'
local playsnddll = require('playsnddll')
-- Эту функцию можно удалить и вызывать напрямую playsnddll.mciSendString
local function PlaySoundFile(file_name)
playsnddll.mciSendString('OPEN "' .. file_name .. '" TYPE MpegVideo ALIAS QUIK_MP3')
end
function main()
playsnddll.MessageBeep(0x10)
-- playsnddll.MessageBeep(0)
PlaySoundFile('C:\\Windows\\Media\\chord.wav')
playsnddll.mciSendString('OPEN "' .. 'C:\\Windows\\Media\\ringout.wav' .. '" TYPE MpegVideo ALIAS QUIK_MP3')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Hardware Fail.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Hardware Insert.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Error.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Message Nudge.wav')
end
paluke написал: Ну например, может оно как-то использует оконные сообщения.
Сомнительно: не видно логики для неработоспособности этой функции в консольных программах. И в документации на сайте МС нет такого предупреждения... Аналогично для более современной функции PlaySound. Как тогда МС вообще планирует использование звука в консольных программах??
paluke написал: Ну например, может оно как-то использует оконные сообщения.
Сомнительно: не видно логики для неработоспособности этой функции в консольных программах. И в документации на сайте МС нет такого предупреждения... Аналогично для более современной функции PlaySound. Как тогда МС вообще планирует использование звука в консольных программах??
Вроде все работает. Попробуйте сделать такую функцию в dll и добавьте sF в таблицу luaL_Reg В данном примере это luaL_Reg nks[]