2

Windows XP モードの仮想 PC で MIDI アプリをテストしたところ、すぐにクラッシュしました。いくつかの VirtualBox XP マシンでのテストは問題ありませんでした。アプリケーションをリモート デバッグすると、(表示されている) コード行に到達する前にスタートアップ コードでクラッシュするように見えます。エラー メッセージは、MIDI ドライバが存在しないというものでした。アプリケーションのかなり後の段階でのみ、MIDI システムの存在が必要とされ、テストされるため、これは奇妙です。

コントロール パネルには MIDI システムが表示されませんが、統合機能の 1 つとしてオーディオが言及されています。

質問: MIDI ドライバーが存在しないためにアプリケーションがクラッシュするのを防ぐにはどうすればよいですか?

ご提案いただきありがとうございます。

Delphi XE の使用

更新さて、Windows XP モードと組み合わせたリモート デバッガーにだまされました。通常は機能しません。ある程度機能するようになったとき、正しい答えが得られました(MIDIドライバーは存在しません)。Rob と Warren は正しかったです。質問をする前に、デバッガーについて深く掘り下げるべきでした。申し訳ありません。ただし、問題は本質的に同じままです。質問を少し変更することが受け入れられることを願っています。

少し変更された質問Windows XP モードに MIDI ドライバが存在しないことを Delphi でテストするにはどうすればよいですか?

Windows XP モードの仮想 PC に MIDI ドライバが存在しない場合でも、Delphi は 1 つの MIDI 出力デバイスが存在することを認識します。このデバイスを開こうとするとすぐに、「システムにドライバーがインストールされていません」という例外が発生します。その通りですが、なぜmidiOutGetNumDevsそのような状況で 0 ではなく 1 を返すのでしょうか? 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 による同じ内容に基づいていますが、より最近では、Delphi 3 ではなく D2010 パッケージが含まれています(!)

デバイスが存在しない場合のクラッシュが修正されている可能性があります。

于 2012-06-13T14:27:51.510 に答える