2

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

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

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

提前感谢您的任何建议。

使用德尔福 XE

更新好吧,我被远程调试器与 Windows XP 模式相结合所迷惑。它通常不起作用。有一次我让它有点工作它给了我正确的答案(没有 MIDI 驱动程序存在)。Rob 和 Warren 是对的,我应该在问这个问题之前深入了解调试器,对此感到抱歉。但是,问题基本相同,我希望稍微修改问题被接受。

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

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

1 回答 1

1

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

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

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

于 2012-06-13T14:27:51.510 回答