我在Windows XP模式虛擬PC中測試了我的MIDI應用程序,並立即崩潰。幾臺VirtualBox XP機器上的測試都沒問題。當我遠程調試應用程序時,它看起來在啓動代碼中崩潰,然後它到達任何(可見)代碼行。錯誤信息是沒有MIDI驅動程序。這很奇怪,因爲只有在應用程序的後期階段,才需要和測試任何MIDI系統。如何測試存在的MIDI驅動程序
控制面板顯示沒有MIDI系統存在,雖然作爲一個集成功能音頻被提及。
問題:在我有機會測試他們的存在之前,我該如何防止我的應用程序崩潰,因爲沒有MIDI驅動程序?
在此先感謝您的任何建議。
用Delphi XE
更新好吧,我被結合遠程調試器與Windows XP模式上當。它通常不起作用。有一次,我得到它有點工作,它給了我正確的答案(不存在MIDI驅動程序)。 Rob和Warren是對的,我應該在提問之前深入調試器,對此抱歉。然而,問題仍然基本相同,我希望稍微修改這個問題是可以接受的。
稍微修改的問題如何在Delphi中測試Windows XP模式下是否存在MIDI驅動程序?
如果在我的Windows XP模式虛擬PC中沒有MIDI驅動程序,Delphi仍然會看到有一個MIDI輸出設備存在。只要我嘗試打開此設備,就會引發異常「系統中沒有安裝驅動程序」。沒錯,但爲什麼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.
您需要更多關於在沒有所需驅動程序的情況下程序崩潰的信息。一旦你確定了程序的這一部分,你就可以延遲這段代碼,直到後來,或者讓你自己的一些代碼先運行。例如,也許你正在鏈接一個DLL,並且如果你在運行時加載了DLL(LoadLibrary),你可以比加載時動態鏈接更能控制失敗。 – 2012-02-27 23:46:41
爲什麼不調試代碼並找到崩潰的位置。可能就像檢查從一些代碼返回的有效句柄一樣簡單,你沒有用強大的風格寫出:'如果Handle = 0,則退出(false);'程序不僅僅是CRASH,因爲DRIVERS不存在。取消引用零指針的代碼崩潰。想想,男人,想想。學習使用您的調試模式。 Rob可能是對的,在這種情況下它不是驅動程序,它可能是一個DLL,一個Active X OCX或其他任何東西。 – 2012-02-28 15:33:04
崩潰發生在主窗體打開之前,因此我無法測試爲零的句柄或解除引用nil指針。我可以複製沒有MIDI驅動程序和崩潰。這很奇怪,因爲以後會使用MIDI。我並沒有將這些問題與DLL的問題聯繫起來,或許是系統問題。沒有初始化部分。謝謝你的建議。我會檢查DLL的確定。這是我從未想過的事情。 – Arnold 2012-02-28 20:48:34