_qwe8013, вчерашний день убил, чтобы вывести юникод-строку с кириллицей из консольного приложения на экран. SetConsoleCP и SetConsoleOutputCP, WideCharToMultiByte и MultiByteToWideChar не помогли. IMHO ― проще всего использовать в консоли MessageBoxW дешево и сердито! Код (ASM): .code lea rdx,MsgBoxText invoke MessageBoxW,NULL,,0,MB_OK .data MsgBoxText dw 423h,43Ah,430h,437h,0
Спасибо за помощь с форума masm32. Вывод юникода в консоль выглядит вот так Код (ASM): include win64a.inc includelib msvcrt.lib include msvcrt.inc BLACK equ 0 BLUE equ 1 GREEN equ 2 CYAN equ 3 RED equ 4 PURPLE equ 5 YELLOW equ 6 SYSTEM equ 7 GREY equ 8 BRIGHTBLUE equ 9 BRIGHTGREEN equ 10 BRIGHTCYAN equ 11 BRIGHTRED equ 12 BRIGHTPURPLE equ 13 BRIGHTYELLOW equ 14 WHITE equ 15 MAXSCREENX = 80 MAXSCREENY = 25 buffersize = 200 SMALL_RECT STRUCT Left WORD ? Top WORD ? Right WORD ? Bottom WORD ? SMALL_RECT ENDS COORD STRUCT X WORD ? Y WORD ? COORD ends CONSOLE_FONT_INFOEX struct cbSize dword 0 nFont dword 0 dwFontSize COORD <> FontFamily dword 0 FontWeight dword 0 FaceName word 32 dup (0) CONSOLE_FONT_INFOEX ends .data STR1 dw 266Ah,266Bh,20h,41Fh,440h,43Eh,449h,430h,439h,20h,263Ah,0Dh,0Ah STR2 db 'Console',0 STR3 dw 423h,43Ah,430h,437h,430h,43Dh,20h,43Ah,43Eh,434h,20h,443h,441h,442h,440h,\ 43Eh,439h,441h,442h,432h,430h,2Ch,20h,43Dh,435h,20h,438h,441h,43Fh,43Eh,43Bh,44Ch;'Указан код устройства, не используемого в системе' fontname1: du <Lucida Console> fontname2: du <Consolas> SetCurrentConsoleFontEx dq ? LibName db 'kernel32.dll',0 FunctionName db 'SetCurrentConsoleFontEx',0 .code WinMain Proc local hOut:qword ;local fontuni [64]:byte local charsWritten : dword local ConsoleWindow:SMALL_RECT local myFont : CONSOLE_FONT_INFOEX mov ecx,offset LibName invoke LoadLibrary mov edx,offset FunctionName invoke GetProcAddress,eax mov SetCurrentConsoleFontEx,rax invoke FreeConsole;release the existing console invoke AllocConsole;form the console invoke GetStdHandle, STD_OUTPUT_HANDLE mov hOut,rax invoke GetLargestConsoleWindowSize, hOut mov ConsoleWindow.Left,0 mov ConsoleWindow.Top,0 sub ax, MAXSCREENX sbb edx, edx and ax, dx add ax, MAXSCREENX-1 mov ConsoleWindow.Right,ax shr eax, 16 sub eax, MAXSCREENY sbb edx, edx and eax, edx add eax, MAXSCREENY-1 mov ConsoleWindow.Bottom,ax invoke SetConsoleWindowInfo, hOut, TRUE, &ConsoleWindow invoke SetConsoleScreenBufferSize, hOut, MAXSCREENY*10000h+MAXSCREENX invoke SetConsoleTitle,&STR2 invoke SetConsoleCursorPosition, hOut, 0A0000h invoke SetConsoleTextAttribute, hOut, BRIGHTGREEN mov myFont.cbSize, sizeof CONSOLE_FONT_INFOEX mov myFont.nFont, 0 mov myFont.dwFontSize.X, 0h mov myFont.dwFontSize.Y, 24 mov myFont.FontFamily, 0 mov myFont.FontWeight, 400 invoke wcscpy,&myFont.FaceName, &fontname1 invoke SetCurrentConsoleFontEx, hOut, FALSE, &myFont invoke WriteConsoleW, hOut, &STR1, lengthof STR1, &charsWritten, 0 mov myFont.cbSize, sizeof CONSOLE_FONT_INFOEX mov myFont.nFont, 0 mov myFont.dwFontSize.X, 0h mov myFont.dwFontSize.Y, 24 mov myFont.FontFamily, 0 mov myFont.FontWeight, 400 invoke wcscpy, &myFont.FaceName, &fontname2 invoke SetCurrentConsoleFontEx, hOut, FALSE, &myFont invoke WriteConsoleW,hOut,&STR3,lengthof STR3,&charsWritten,0 invoke getchar invoke FreeConsole invoke ExitProcess, 0 WinMain endp end
_qwe8013, всю переписку не читал, но если нужно имя устройства WAVE_MAPPER, то устройство по умолчанию - то же, что и самое первое (нулевое) устройство. waveOutGetDevCaps, 0, ... - это и будет устройство по умолчанию (т.е. WAVE_MAPPER).
Вообще, моя идея работы с полным именем через MME такова: получаем список устройств через DirectSound (или MME, если DirectSound нет в системе). Выводим в ComboBox (для выбора устройства пользователем) этот список, а подтверждения делаем так: Проходим по всему списку MME-устройств и сравниваем имя этих устройств с первыми символами (не более 31) из выбранного списка. Т.е. если было выбрано "Динамики (Realtek High Definition Audio)", то ищем "Динамики (Realtek High Definiti" в списке MME-устройств. Если находим, использует его ID (порядковый номер). Если не находим, говорим "пардон" и обновляем список. А не найти мы можем в случае, если пока человек выбирал, устройство отключилось. И проверку даже при отсутствии DirectSound лучше делать, т.к. пока человек выбирал, поменялось устройство по умолчанию и порядковый номер выбранного устройства. Но тут есть вопрос: список устройств DirectSound и MME всегда одинаковый? И заодно интересно (хотя для данного случая неактуально, ибо проверяем имена, но всё же): если да, то обязательно ли он будет в том же порядке идти?
Кстати, совсем забыл: с waveOut всё понятно, а как быть с waveIn? Ведь для него DirectSound не подойдёт... У меня, к примеру, Adobe Audition выводит полные имена устройств записи MME (да, да, я именно про MME сейчас говорю). Где он их берёт? В реестре их нет! Разве что в разделе HKEY_CURRENT_USER\Software\Microsoft\Speech\AudioInput\TokenEnums\MMAudioIn, но сдаётся мне, что это явно не то место, где их нужно искать (там даже уже удалённые устройства есть)... WASAPI выдаёт немного другие имена, чем MME/DirectSound, включая устройства вывода.