【发布时间】:2012-06-13 22:27:51
【问题描述】:
我在 Windows XP 模式的虚拟 PC 中测试了我的 MIDI 应用程序,它立即崩溃了。在几台 VirtualBox XP 机器上的测试是好的。当我远程调试应用程序时,它似乎在启动代码到达任何(可见)代码行之前就崩溃了。错误消息是不存在 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),则与加载时动态链接相比,您可以更好地控制故障。
-
你为什么不调试代码并找到它崩溃的地方。可能就像检查一些代码返回的有效句柄一样简单,这些代码不是以稳健的风格编写的:
if Handle=0 then exit(false);程序不会因为不存在驱动程序而崩溃。取消引用 nil 指针的代码崩溃。想想,伙计,想想。学习使用调试模式。 Rob 可能是对的,在这种情况下它不是驱动程序,它可能是 DLL、Active X OCX 或任何东西。 -
崩溃发生在主窗体打开之前,因此我无法测试为零的句柄或取消引用 nil 指针。我可以复制缺少 MIDI 驱动程序和崩溃。这很奇怪,因为稍后会使用 MIDI。我没有明确地链接到 DLL,也许是系统的。没有初始化部分。谢谢你们的建议。我会检查 DLL 以确定。这是我从未想过的。
-
@Kobik - 不知道这个产品。似乎对这些类型的错误非常有用,谢谢提及!
标签: delphi midi midi-interface