2012-02-27 71 views
2

我在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. 
+1

您需要更多關於在沒有所需驅動程序的情況下程序崩潰的信息。一旦你確定了程序的這一部分,你就可以延遲這段代碼,直到後來,或者讓你自己的一些代碼先運行。例如,也許你正在鏈接一個DLL,並且如果你在運行時加載了DLL(LoadLibrary),你可以比加載時動態鏈接更能控制失敗。 – 2012-02-27 23:46:41

+0

爲什麼不調試代碼並找到崩潰的位置。可能就像檢查從一些代碼返回的有效句柄一樣簡單,你沒有用強大的風格寫出:'如果Handle = 0,則退出(false);'程序不僅僅是CRASH,因爲DRIVERS不存在。取消引用零指針的代碼崩潰。想想,男人,想想。學習使用您的調試模式。 Rob可能是對的,在這種情況下它不是驅動程序,它可能是一個DLL,一個Active X OCX或其他任何東西。 – 2012-02-28 15:33:04

+0

崩潰發生在主窗體打開之前,因此我無法測試爲零的句柄或解除引用nil指針。我可以複製沒有MIDI驅動程序和崩潰。這很奇怪,因爲以後會使用MIDI。我並沒有將這些問題與DLL的問題聯繫起來,或許是系統問題。沒有初始化部分。謝謝你的建議。我會檢查DLL的確定。這是我從未想過的事情。 – Arnold 2012-02-28 20:48:34

回答

1

這與Delphi或MIDI組件無關。 midiOutGetNumDevs是通過MMSystem.pas的外部調用winmm.dll - 如果虛擬化時返回的值不正確,那麼您需要查看或詢問Microsoft的原因。

BTW,那些MIDI組件現在很老了,你見過這個嗎? http://www.delphipraxis.net/151718-midi-i-o-komponenten-v7.html 它是基於由Dave Churcher但更recent.ie同樣的東西,它包括一個D2010包,而不是德爾福3(!)

你永遠不知道,他們可能有固定的碰撞時,沒有設備存在。

+0

謝謝,我不知道這些組件。我會看看他們。 – Arnold 2012-06-14 16:14:58

相關問題