Delphi 如何测试现有的MIDI驱动程序
我在WindowsXP模式的虚拟PC上测试了我的MIDI应用程序,它立即崩溃了。在几个VirtualBox XP机器上的测试都正常。当我远程调试应用程序时,它在到达任何一行(可见)代码之前在启动代码中出现崩溃。错误消息是没有MIDI驱动程序。这很奇怪,因为只有在应用程序的后期阶段,才需要并测试任何MIDI系统 控制面板上没有显示MIDI系统,尽管提到了音频作为集成功能之一 问题:在我有机会测试MIDI驱动程序是否存在之前,如何防止我的应用程序因为没有MIDI驱动程序而崩溃 提前谢谢你的建议 使用delphixe 更新好吧,我被远程调试器与Windows XP模式相结合所愚弄。它通常不起作用。有一次我让它有点工作,它给了我正确的答案(没有MIDI驱动程序在场)。Rob和Warren是对的,我应该在问问题之前深入研究调试器,对此表示抱歉。不过,问题基本上是一样的,我希望可以稍作修改 稍微修改的问题如何在Delphi中测试Windows XP模式下没有MIDI驱动程序 如果在我的Windows XP模式虚拟PC中没有MIDI驱动程序,Delphi仍然会看到有一个MIDI输出设备。当我试图打开此设备时,出现一个异常“您的系统上没有安装驱动程序”。没错,但是为什么在这种情况下,Delphi 如何测试现有的MIDI驱动程序,delphi,midi,midi-interface,Delphi,Midi,Midi Interface,我在WindowsXP模式的虚拟PC上测试了我的MIDI应用程序,它立即崩溃了。在几个VirtualBox XP机器上的测试都正常。当我远程调试应用程序时,它在到达任何一行(可见)代码之前在启动代码中出现崩溃。错误消息是没有MIDI驱动程序。这很奇怪,因为只有在应用程序的后期阶段,才需要并测试任何MIDI系统 控制面板上没有显示MIDI系统,尽管提到了音频作为集成功能之一 问题:在我有机会测试MIDI驱动程序是否存在之前,如何防止我的应用程序因为没有MIDI驱动程序而崩溃 提前谢谢你的建议 使用
midiOutGetNumDevs
会返回1而不是0?用我自己写的一个小程序来重现这个错误。此代码在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.
这与Delphi或MIDI组件无关。 midiOutGetNumDevs是通过MMSystem.pas对winmm.dll的外部调用-如果在虚拟化时返回不正确的值,则需要查看或询问Microsoft的原因 顺便说一句,那些MIDI组件现在已经很旧了,你看到这个了吗? 它基于Dave Churcher的相同内容,但更为近期。也就是说,它包含一个D2010包,而不是Delphi 3(!)
您永远不知道,他们可能已经修复了没有设备时的崩溃。您需要更多关于在缺少所需驱动程序的情况下程序如何崩溃的信息。一旦确定了程序的这一部分,就可以将代码延迟到以后,或者让自己的一些代码先运行。例如,您可能正在使用DLL进行链接,如果您在运行时(LoadLibrary)加载DLL,您可以比使用加载时动态链接更好地控制故障。为什么不调试代码并找到崩溃的地方呢。很可能只需检查从未以健壮样式编写的代码中返回的有效句柄:
如果handle=0,则退出(false)代码>程序不会因为驱动程序不存在而崩溃。取消引用零指针的代码崩溃。想一想,伙计,想一想。学习使用调试模式。Rob可能是对的,在这种情况下,它不是一个驱动程序,它可能是一个DLL,一个活动的X OCX,或者其他任何东西。崩溃发生在主窗体打开之前,因此我无法测试零句柄或取消引用零指针的句柄。我可以复制没有MIDI驱动程序和崩溃的情况。这很奇怪,因为MIDI后来才被使用。我不一致的链接到DLL的,可能是系统的。没有初始化部分。谢谢你们两位的建议。我会检查DLL的只是为了确定。这是我从未想过的。试试@Kobik-我不知道这个产品。对于这些类型的错误似乎非常有用,谢谢您的提醒!谢谢,我不知道这些组件。我要看看。