4

嗨,我正在制作一个程序来打开和关闭我想将数据写入 CD 的 cd 阅读器,问题是问题的基础,它使用“使用 Windows '和'使用 MMSystem”,但问题是当我同时使用两者,“使用 Windows,MMSystem”给出错误并且程序无法编译,我使用的是 Delphi 2010,奇怪的是,当我只使用一个 Windows 或 MMSystem 时,可以正常工作并编译。

我尝试编译时的错误是:'找不到程序'

有问题的代码是这样的:

mciSendString ('Set cdaudio door open wait', nil, 0, handle);

我有两件事要问你首先是我如何避免在使用这两个(Windows 和 MMSystem)时出现错误,另一个问题是他是否可以在不使用 MMSystem 的情况下打开 CD 播放器,使用 Windows API 的骨骼,但不知道从哪里开始

来源 :

方案项目1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows,MMSystem;

procedure opencd;
begin
  mciSendString('Set cdaudio door open wait', nil, 0, 0);
end;

begin
  try
    Writeln('test');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

图片 :

测试

4

1 回答 1

4

将“mmsystem”与“windows”一起使用应该没有问题。事实上,他在问题的屏幕截图中的错误看起来不像是编译器错误。相反,IDE 无法找到可执行文件。可能是防病毒软件可能会删除可执行文件,或者我不知道..

在任何情况下,您都可以DeviceIoControl用作替代方案。这是关于SO的答案的德尔福翻译:

function CtlCode(DeviceType, _Function, Method, Access: Integer): DWORD;
begin
  Result := DeviceType shl 16 or Access shl 14 or _Function shl 2 or Method;
end;

procedure ejectDisk(driveLetter: Char);
const
  FILE_DEVICE_FILE_SYSTEM = $00000009;
  FILE_DEVICE_MASS_STORAGE = $0000002d;
  METHOD_BUFFERED = 0;
  FILE_ANY_ACCESS = 0;
  FILE_READ_ACCESS = $0001;
  IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
// bogus constants below, rather CTL_CODEs should be pre computed.
  FSCTL_LOCK_VOLUME = 6;
  FSCTL_DISMOUNT_VOLUME = 8;
  IOCTL_STORAGE_EJECT_MEDIA = $0202;
var
  tmp: string;
  handle: THandle;
  BytesReturned: DWORD;
begin
  tmp := Format('\\.\%s:', [driveLetter]);
  handle := CreateFile(PChar(tmp), GENERIC_READ, FILE_SHARE_WRITE, nil,
      OPEN_EXISTING, 0, 0);
  DeviceIoControl(handle,
      CtlCode(FILE_DEVICE_FILE_SYSTEM, FSCTL_LOCK_VOLUME, METHOD_BUFFERED,
      FILE_ANY_ACCESS), nil, 0, nil, 0, BytesReturned, nil);
  DeviceIoControl(handle,
      CtlCode(FILE_DEVICE_FILE_SYSTEM, FSCTL_DISMOUNT_VOLUME, METHOD_BUFFERED,
      FILE_ANY_ACCESS), nil, 0, nil, 0, BytesReturned, nil);
  DeviceIoControl(handle,
      CtlCode(IOCTL_STORAGE_BASE, IOCTL_STORAGE_EJECT_MEDIA, METHOD_BUFFERED,
      FILE_READ_ACCESS), nil, 0, nil, 0, BytesReturned, nil);
  CloseHandle(handle);
end;
于 2013-11-10T21:50:56.057 回答