4

こんにちは、私はCDにデータを書き込むことを考えていたCDリーダーを開閉するプログラムを作成しています。問題は、「Windowsを使用し、MMSystemを使用する」という問題の基礎ですが、問題はいつ両方を同時に使用すると、「uses Windows, MMSystem」でエラーが発生し、プログラムがコンパイルされません。Delphi 2010 を使用しています。奇妙なことに、Windows または MMSystem のいずれか一方のみを使用すると、正常に動作してコンパイルされます。

コンパイルしようとすると、「プログラムが見つかりませんでした」というエラーが表示されます

問題のコードは次のとおりです。

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

最初にお聞きしたいことが 2 つあります。それは、この 2 つ (Windows と MMSystem) を使用するときにエラーを回避する方法です。もう 1 つの質問は、MMSystem を使用せずに CD プレーヤーを開くことができるかどうか、Windows API を使用してボーンを使用できるかどうかですが、どこから始めればよいかはわかりません。

起源 :

プログラム Project1;

{$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に関する回答のDelphi翻訳は次のとおりです。

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 に答える