在Delphi中使用Windows和MMSystem

在Delphi中使用Windows和MMSystem,delphi,Delphi,您好,我正在制作一个程序来打开和关闭cd读卡器,我曾想在其中向cd写入数据,这个问题是问题的基础,它使用 “使用Windows”和“使用彩信系统”,但问题是,当我同时使用两者时,“使用Windows,彩信系统”出现错误且程序无法编译,我使用的是Delphi 2010,奇怪的是,当我只使用一个Windows或彩信系统时,两者都可以正常工作并编译 尝试编译时出现的错误是:“找不到程序” 有关守则如下: mciSendString ('Set cdaudio door open wait', nil,

您好,我正在制作一个程序来打开和关闭cd读卡器,我曾想在其中向cd写入数据,这个问题是问题的基础,它使用 “使用Windows”和“使用彩信系统”,但问题是,当我同时使用两者时,“使用Windows,彩信系统”出现错误且程序无法编译,我使用的是Delphi 2010,奇怪的是,当我只使用一个Windows或彩信系统时,两者都可以正常工作并编译

尝试编译时出现的错误是:“找不到程序”

有关守则如下:

mciSendString ('Set cdaudio door open wait', nil, 0, handle);
我有两件事要问你:首先,我如何避免在使用这两个系统(Windows和彩信系统)时出现错误;另一个问题是,他是否可以在不使用彩信系统的情况下打开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.
图片:


将“彩信系统”与“windows”一起使用应该不会有问题。事实上,问题屏幕截图中的错误看起来不像是编译器错误。更确切地说,IDE无法找到可执行文件。可能是杀毒软件,可能是删除了可执行文件,或者我不知道

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


请展示一个完整、简短的程序来演示问题。在错误消息中包含逐字记录。请参阅SSCCE。“找不到程序”不是Delphi编译器消息。请张贴您收到的确切错误消息;它包括文件名、行号、错误代码和错误消息。你需要将它们全部发布。你是真的尝试编译,还是只是点击F9(运行)?如果由于某种原因,可执行文件实际上不存在,请按Ctrl+F9或Shift+F9。但它不会给我错误,因为两者都不会生成exe文件。添加一个我如何得到错误的图像是你的病毒扫描程序在编译器创建可执行文件后立即删除它吗?不,avast antivirus是问题所在,禁用屏蔽10分钟,代码正确,我请求您向我解释如何避免此错误,或者是否可以使用windows打开cd读取器api@Jose-看到答案了吗?@David-哪一个?请求SSCCE的人,还是关于AV软件的人?很抱歉,代码不知道,因为代码不理解一个问题,就像关闭cd读取器一样,代码我只是尝试告诉我这个错误:[DCC错误]Project1.dpr(29):E2003未声明的标识符:'CtlCode'@Jose-使用
IOCTL_STORAGE_LOAD_MEDIA
($0203)而不是
IOCTL\u STORAGE\u EJECT\u MEDIA
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;