Я протестировал мое MIDI-приложение на виртуальном ПК в режиме Windows XP, и оно сразу сломалось. Тесты на нескольких машинах VirtualBox XP прошли нормально. Когда я удаленно отлаживаю приложение, в коде запуска происходит сбой, прежде чем оно достигает какой-либо строки (видимого) кода. Сообщение об ошибке состояло в том, что не было никаких драйверов MIDI. Это странно, потому что только на более поздней стадии приложения требуется наличие и проверка любой MIDI-системы.
Панель управления показывает отсутствие системы MIDI, хотя в качестве одной из функций интеграции упоминается звук.
Вопрос: как предотвратить сбой приложения из-за отсутствия драйверов MIDI, прежде чем я смогу проверить их наличие?
Заранее спасибо за любые предложения.
Использование Delphi XE
Обновление Что ж, меня обманул удаленный отладчик в сочетании с режимом Windows XP. Обычно это не работает. Однажды, когда я немного сработал, он дал мне правильный ответ (драйверов MIDI нет). Роб и Уоррен были правы, я должен был погрузиться глубже в отладчик, прежде чем задавать вопрос, извините за это. Тем не менее, проблема остается по сути той же, я надеюсь, что принято немного изменить вопрос.
Слегка измененный вопрос Как проверить в Delphi отсутствие драйверов MIDI в режиме Windows XP?
Если на моем виртуальном ПК в режиме Windows XP отсутствуют драйверы MIDI, Delphi по-прежнему видит, что присутствует одно устройство вывода MIDI. Как только я пытаюсь открыть это устройство, возникает исключение "В вашей системе не установлен драйвер". Правильно, но почему midiOutGetNumDevs
возвращает 1 вместо 0 в этой ситуации? Использование Midi-компонентов Dave Churchers Я написал небольшую программу для воспроизведения ошибки. Этот код работает нормально на VirtualBox.
unit MIDITest_Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MMSystem, MIDIOut;
type
TForm1 = class(TForm)
Button1: TButton;
List: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click (Sender: TObject);
begin
List.Items.Add (Format ('%d MIDI output devices', [midiOutGetNumDevs]));
end; // Button1Click //
procedure TForm1.Button2Click (Sender: TObject);
var Device: TMidiOutput;
ePort: Int32;
begin
for ePort := 0 to midiOutGetNumDevs - 1 do
begin
Device := TMidiOutput.Create (Self);
Device.DeviceID := ePort;
List.Items.Add (Format ('Trying to open device %d', [Device.DeviceID]));
Application.ProcessMessages;
// ShowMessage ('Open');
if Device.Open then
begin
List.Items.Add (Format ('Opened device %s', [Device.ProductName]));
Application.ProcessMessages;
end else
begin
List.Items.Add (Format ('Cannot open device %d', [Device.DeviceID]));
Application.ProcessMessages;
end; // if
end; // if
end; // Button2Click //
end.