Как проверить наличие драйверов MIDI

Я протестировал мое 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 в этой ситуации? Используя миди-компоненты 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.

1 ответ

Это не будет иметь ничего общего с Delphi или компонентами MIDI. midiOutGetNumDevs - это внешний вызов winmm.dll через MMSystem.pas - если при виртуализации он возвращает неверное значение, вам нужно посмотреть или спросить Microsoft о причине.

Кстати, эти MIDI-компоненты довольно старые, вы видели это? http://www.delphipraxis.net/151718-midi-i-o-komponenten-v7.html Он основан на том же материале, написанном Дейвом Черчером, но более свежим. Он включает в себя пакет D2010, а не Delphi 3(!)

Вы никогда не знаете, возможно, они исправили сбой, когда нет устройств.

Другие вопросы по тегам