如何测试存在的MIDI驱动程序

时间:2012-02-27 20:47:46

标签: delphi midi midi-interface

我在Windows XP模式虚拟PC中测试了我的MIDI应用程序,它立即崩溃了。几台VirtualBox XP机器上的测试都没问题。当我远程调试应用程序时,它似乎在启动代码到达任何(可见)代码行之前崩溃。错误消息是没有MIDI驱动程序存在。这很奇怪,因为只有在应用的后期阶段才需要和测试任何MIDI系统的存在。

控制面板显示没有MIDI系统,但是作为集成功能之一,提到了音频。

问题:在我有机会测试他们的存在之前,如何防止我的应用程序崩溃,因为没有MIDI驱动程序?

提前感谢任何建议。

使用Delphi XE

更新好吧,我被远程调试器和Windows XP模式结合了。它通常不起作用。有一次我有点工作它给了我正确的答案(没有MIDI驱动程序存在)。 Rob和Warren是对的,在问这个问题之前我应该​​更深入地调试调试器,对不起。但是,问题基本上是一样的,我希望可以接受稍微修改一下这个问题。

略有修改的问题如何在Delphi中测试Windows XP模式下没有MIDI驱动程序?

如果在我的Windows XP模式虚拟PC中没有MIDI驱动程序,Delphi仍然会看到一个MIDI输出设备存在。一旦我尝试打开此设备,就会引发异常并且#34;您的系统上没有安装驱动程序"。那是对的,但为什么midiOutGetNumDevs在那种情况下会返回1而不是0?使用Dave Churchers midi components我写了一个小程序来重现错误。这段代码在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 个答案:

答案 0 :(得分:1)

这与Delphi或MIDI组件无关。 midiOutGetNumDevs是通过MMSystem.pas外部调用winmm.dll的 - 如果在虚拟化时返回的值不正确,那么你需要查看或询问Microsoft的原因。

顺便说一下,那些MIDI组件现在已经很老了,你见过这个吗? http://www.delphipraxis.net/151718-midi-i-o-komponenten-v7.html 这是基于Dave Churcher的相同内容,但更近些。它包括D2010包而不是Delphi 3(!)

你永远不知道,他们可能已经修复了没有设备存在时的崩溃。