Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何测试现有的MIDI驱动程序_Delphi_Midi_Midi Interface - Fatal编程技术网

Delphi 如何测试现有的MIDI驱动程序

Delphi 如何测试现有的MIDI驱动程序,delphi,midi,midi-interface,Delphi,Midi,Midi Interface,我在WindowsXP模式的虚拟PC上测试了我的MIDI应用程序,它立即崩溃了。在几个VirtualBox XP机器上的测试都正常。当我远程调试应用程序时,它在到达任何一行(可见)代码之前在启动代码中出现崩溃。错误消息是没有MIDI驱动程序。这很奇怪,因为只有在应用程序的后期阶段,才需要并测试任何MIDI系统 控制面板上没有显示MIDI系统,尽管提到了音频作为集成功能之一 问题:在我有机会测试MIDI驱动程序是否存在之前,如何防止我的应用程序因为没有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输出设备。当我试图打开此设备时,出现一个异常“您的系统上没有安装驱动程序”。没错,但是为什么在这种情况下,
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-我不知道这个产品。对于这些类型的错误似乎非常有用,谢谢您的提醒!谢谢,我不知道这些组件。我要看看。