2012-02-27 17 views
2

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

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

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

ご意見ありがとうございます。デルファイXE

更新まあの使い方

は、私は、Windows XPモードとの組み合わせで、リモートデバッガにだまされました。それは通常動作しません。私はそれを幾分働かせて私に正しい答えを与えました(MIDIドライバはありません)。 Robとウォーレンは正しかった。私は質問をする前に、デバッガの中でもっと深く掘り下げて、すみませんでした。しかし、問題は本質的に同じですが、問題をわずかに修正することが認められれば幸いです。

微妙に変更された質問 Windows XPモードでは、MIDIドライバがないとDelphiでどのようにテストできますか?

Windows XPモードの仮想PCにMIDIドライバが存在しない場合でも、デルファイは引き続き1つのMIDI出力デバイスが存在するとみなします。このデバイスを開こうとすると、「システムにドライバがインストールされていません」という例外が発生します。それは正しいですが、なぜその状況でmidiOutGetNumDevsが0ではなく1を返しますか? 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

必要なドライバがないとプログラムがクラッシュする方法についての詳細が必要です。プログラムのその部分を特定したら、そのコードを遅らせるか、独自のコードを最初に実行するかのどちらかに取り組むことができます。たとえば、DLLとリンクしている場合や、実行時にDLLをロードした場合(LoadLibrary)、ロード時の動的リンクよりも障害をより詳細に制御できます。 –

+0

コードをデバッグしてクラッシュする場所を見つけてみませんか?おそらく、頑丈なスタイルで書かれていないコードのいくつかから返された有効なハンドルのチェックと同じくらい簡単です: 'Handle = 0ならexit(false);' DRIVERSが存在しないのでプログラムはCRASHだけではありません。 nilポインタを逆参照するコードがクラッシュします。考えてみてください。あなたのデバッグモードの使い方を学んでください。おそらく、Robの場合はそうだ.DLLやActive X OCXなどのドライバではない。 –

+0

メインフォームが開かれる前にクラッシュが発生します。そのため、ゼロまたは参照なしのポインタであるハンドルをテストできません。私は、MIDIドライバとクラッシュの不在を複製することができます。 MIDIが後で使用されるので、それは奇妙です。私はDLLの、おそらくシステムのものにconsicouslyリンクしていません。初期化セクションはありません。両方お寄せいただきありがとうございます。私は確かにDLLを確認します。それは私が決して考えなかったものです。 – Arnold

答えて

1

これは、DelphiやMIDIコンポーネントとは関係ありません。 midiOutGetNumDevsは、MMSystem.pas経由のwinmm.dllへの外部呼び出しです。仮想化時に誤った値が返された場合は、その理由をMicrosoftに問い合わせる必要があります。

ところで、これらのMIDIコンポーネントはかなり古いものですが、これは見たことがありますか? http://www.delphipraxis.net/151718-midi-i-o-komponenten-v7.html それはデイブChurcherで同じものに基づいていますが、より多くのrecent.ie、それはD2010パッケージではなく、デルファイ3を備えている(!)

あなたが知っていることはありません何のデバイスが存在しないとき、彼らはクラッシュを修正したことがあり。

+0

ありがとう、私はこれらのコンポーネントを認識していませんでした。私はそれらを見ます。 – Arnold

関連する問題