2015-07-31 21 views
12

Tôi có một ứng dụng dựa trên Microsoft GS Wavetable Synth. Nó đã hoạt động hoàn hảo trên Windows XP, Vista, 7, 8 và 8.1. Trong khi cuộc gọi đầu tiên tới midiOutOpen trên Windows 10 hoạt động, các cuộc gọi tiếp theo dẫn đến mã lỗi 1, có nghĩa là 'Lỗi không xác định'. Mã đơn giản:midiOutOpen trên Windows 10 bằng cách sử dụng Microsoft GS Wavetable Synth không thành công

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

Bất kỳ ý tưởng nào về cách giải quyết được đánh giá cao này.

Trả lời

10

Tôi hiểu điều đó. Truy tìm thông qua mã máy, tôi thấy chức năng modMessage() không thành công và trả về MMSYSERR_ERROR. Chính xác tại sao không rõ ràng với tôi, nó trông giống như một vấn đề khởi tạo bị thiếu.

Điều kỳ lạ về rủi ro này là không có nhiều khiếu nại về điều đó, bạn mong đợi nhiều chương trình khác cũng sẽ bị xóa. Hoặc cho rằng vấn đề cho họ để được kiểm tra trước khi Win10 vận chuyển. Điều tiếp theo tôi đã thử là thêm một điều xảy ra trong bất kỳ ứng dụng âm thanh không tầm thường nào mà tôi bỏ qua trong chương trình thử nghiệm của mình. Một phần cảm hứng bằng cách nhìn thấy "ATL" trở lại trong các biểu tượng của modMessage, mặc dù nó không phải là bất cứ nơi nào gần gũi. Tôi đã thêm dòng này làm dòng đầu tiên trong dòng chính():

CoInitializeEx(NULL, COINIT_MULTITHREADED); 

Badaboom, không còn lỗi nữa. Sử dụng COINIT_APARTMENTTHREADED nếu bạn gọi nó trên luồng chính của một chuỗi giao diện người dùng. CoUninitialize() ở cuối để làm sạch.

Giải thích điều này là khó khăn, việc khởi tạo COM không cần thiết khi bạn sử dụng MIDI. Với nó tại chỗ, gọi midiOutOpen được thêm một DLL nạp, clbcatq.dll. Đó là mô-đun hỗ trợ COM +. Vì vậy, chắc chắn có vẻ như Win10 yêu cầu COM được khởi tạo.

+0

Cảm ơn bạn đã xem xét điều này - cách giải quyết của bạn đã hiệu quả đối với tôi! – Cam

+0

Rất nhiều chương trình bị xóa. Nhưng rất nhiều lập trình viên ngân sách thấp không có thêm một máy tính để sử dụng cho thử nghiệm Win10 trước khi nó được phát hành ... và họ dự kiến ​​M $ sẽ vẫn tương thích ............. Trình chơi nhạc VanBasco Karaoke là một trong đó rơi qua ... trừ khi bạn nhấp vào? (trợ giúp) biểu tượng mà dường như sử dụng/khởi tạo COM. – Victoria

1

Tôi đặt một MessageBox (không có gì quan trọng để nói) ngay trước midiOutOpen và CNTT ĐÃ LÀM VIỆC! Tôi đang sử dụng Visual Studio 2013 C++.

WASAPI không hoạt động cho tôi nữa trong chế độ chia sẻ, mặc dù tôi nghĩ tôi có thể làm cho nó hoạt động.

+0

Cảm ơn bạn đã trả lời, tôi thực sự đánh giá cao ý kiến ​​của bạn. Tuy nhiên, tôi không thể buộc người dùng đóng hộp thư trống mỗi khi họ nhấn nút bắt đầu. Bạn có bất kỳ ý tưởng là tại sao điều này hoạt động? – fhevol

1

Khi tôi sử dụng CoInitializeEx(NULL, COINIT_MULTITHREADED), điều này giúp cho vấn đề mở midi nhưng có ảnh hưởng xấu khi sử dụng mciSendString khi mở một bài hát MP3, kết quả luôn luôn lỗi 266 trong cùng một chương trình. Ví dụ:

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

(không có bài hát mở và bài hát mp3 trong Windows 10).

Trên một số hệ thống Windows 10, midi và mp3 mở tốt mà không cần gọi số CoInitializeEx, trên các thiết bị khác không phát midi. Nó không phải là tài liệu trong api MCI rằng nó phải được gọi và gây ra các vấn đề không xác định. Đối với tôi, không rõ khi nào hoặc tại sao nó phải được gọi và khi tôi nên không gọi nó là tốt hơn. Windows 10 không tương thích liên quan đến MCI của Microsoft là không thể chấp nhận. Tất cả các hệ thống kể từ XP đều tương thích với MCI và chỉ Windows 10 gây ra sự cố.

Các vấn đề liên quan