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.
必要なドライバがないとプログラムがクラッシュする方法についての詳細が必要です。プログラムのその部分を特定したら、そのコードを遅らせるか、独自のコードを最初に実行するかのどちらかに取り組むことができます。たとえば、DLLとリンクしている場合や、実行時にDLLをロードした場合(LoadLibrary)、ロード時の動的リンクよりも障害をより詳細に制御できます。 –
コードをデバッグしてクラッシュする場所を見つけてみませんか?おそらく、頑丈なスタイルで書かれていないコードのいくつかから返された有効なハンドルのチェックと同じくらい簡単です: 'Handle = 0ならexit(false);' DRIVERSが存在しないのでプログラムはCRASHだけではありません。 nilポインタを逆参照するコードがクラッシュします。考えてみてください。あなたのデバッグモードの使い方を学んでください。おそらく、Robの場合はそうだ.DLLやActive X OCXなどのドライバではない。 –
メインフォームが開かれる前にクラッシュが発生します。そのため、ゼロまたは参照なしのポインタであるハンドルをテストできません。私は、MIDIドライバとクラッシュの不在を複製することができます。 MIDIが後で使用されるので、それは奇妙です。私はDLLの、おそらくシステムのものにconsicouslyリンクしていません。初期化セクションはありません。両方お寄せいただきありがとうございます。私は確かにDLLを確認します。それは私が決して考えなかったものです。 – Arnold