2015-07-31 2 views
12

У меня есть приложение, основанное на встроенном Microsoft GS Wavetable Synth. Он работает безупречно в Windows XP, Vista, 7, 8 и 8.1. В то время как первый вызов midiOutOpen в Windows 10 работает, последующие вызовы приводят к коду ошибки 1, что означает «Unspecified error». Код прост:midiOutOpen в Windows 10 с использованием Microsoft GS Wavetable Synth не работает

result = midiOutOpen(&_midiOutHandle, midiOutputDevice, NULL, 0, CALLBACK_NULL); 

Любые идеи относительно того, как решить эту проблему, получили высокую оценку.

ответ

10

Я вижу. Прослеживая код машины, я вижу, что функция modMessage() не работает и возвращает MMSYSERR_ERROR. Именно поэтому мне непонятно, это похоже на недостающую проблему инициализации.

Что странно в этой неудаче, так это то, что об этом не так много, вы ожидаете, что многие другие программы тоже упадут. Или, если на то пошло, они будут протестированы перед отправкой Win10. Следующее, что я пробовал, - это добавление одной вещи, которая происходит в любом нетривиальном аудио приложении, которое я пропустил в своей тестовой программе. Частично вдохновлялось, увидев «ATL» еще в символах modMessage, хотя и не было нигде близко. Я добавил это как первую строку в main():

CoInitializeEx(NULL, COINIT_MULTITHREADED); 

Badaboom, не более ошибок. Используйте COINIT_APARTMENTTHREADED, если вы вызываете это в основном потоке потока пользовательского интерфейса. CoUninitialize() в конце для очистки.

Объяснение этого трудно, инициализация COM не требуется при использовании MIDI. С его помощью вызов midiOutOpen получает еще одну DLL-загрузку, clbcatq.dll. Это модуль поддержки COM +. Так что, похоже, что Win10 требует инициализации COM.

+0

Спасибо, что посмотрели на это - ваше обходное решение сработало для меня! – Cam

+0

Множество программ _do_ падают. Но у многих малобюджетных программистов не было дополнительной машины для тестирования Win10 до ее выхода ... и они ожидали, что M $ останется совместимой ............. VanBasco Караоке-плеер это тот, который падает ... если вы не нажмете? (help), который, по-видимому, использует/инициализирует COM. – Victoria

1

Я поставил MessageBox (ничего нечего сказать) непосредственно перед midiOutOpen, и IT WORKED! Я использую Visual Studio 2013 C++.

WASAPI больше не работает для меня в режиме совместного доступа, хотя я думаю, что смогу заставить его работать.

+0

Спасибо за ваш ответ, я очень ценю ваш вклад. Однако я не могу заставить своих пользователей закрывать пустое поле сообщения каждый раз, когда нажимает кнопку запуска. Есть ли у вас какие-либо идеи относительно того, почему это работает? – fhevol

1

Когда я пользуюсь CoInitializeEx(NULL, COINIT_MULTITHREADED), это помогает решить проблему с midi open, но имеет плохое влияние на использование mciSendString с открытием песни в формате MP3, результатом которой всегда является ошибка 266 в той же программе. Например .:

open "d:\\music\\Fernando.mp3" type MPEGVideo alias Fernando.mp3 wait 

(без CoInitializeEx этого открытых работ и mp3 песни играет в Windows 10).

На некоторых системах Windows 10 midi и mp3 открываются хорошо, не называя CoInitializeEx, а на других он не играет в midi. В MCI api не зарегистрировано, что он должен быть вызван и вызывает неопределенные проблемы. Для меня непонятно, когда и почему его нужно называть, и когда мне лучше не называть его. Несовместимость Windows 10, связанная с MCI Microsoft, невыносима. Все системы с XP совместимы с MCI, и только Windows 10 вызывает проблемы.