#c #winapi #drive #cd-rom
#c #winapi #привод #cd-rom
Вопрос:
Я создал кнопку «Извлечь» в своем приложении Win32 C , которая при нажатии открывает лоток для компакт-дисков. Прямо сейчас я жестко запрограммировал его, зная, что общий диск на моем компьютере является дисководом CD Rom. Мой вопрос в том, если я не знал, на каком диске находится дисковод CD Rom, или на компьютере, где дисковод CD Rom не является общим дисководом, как я могу определить, какой диск на моем компьютере является дисководом CD Rom, и открыть лоток для компакт-дисков? Мой код показан ниже.
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
#include <stdio.h>
#define IDC_BUTTON 3456
static TCHAR szWindowClass[] = _T("CD_ROM_READER_APP");
static TCHAR szTitle[] = _T("CD Rom Reader App");
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR CSCI_NO[60];
HWND TextBox;
DWORD dwBytes;
HANDLE hCdRom = CreateFile(_T("\\.\D:"), //This is where I set it so that the D drive is the drive ejected
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR heading[] = _T("CD ROM READER");
TCHAR CSCI_No_Inst[] = _T("Please enter the CSCI No below:");
switch (message)
{
case WM_CREATE:
{
HWND hwndButton = CreateWindow(
L"BUTTON", L"EJECT",
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
150, 200, 100, 100,
hWnd, (HMENU)IDC_BUTTON, (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE), NULL);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDC_BUTTON:
//Open CD Rom Tray when the Eject button is pressed
if (hCdRom == INVALID_HANDLE_VALUE)
{
_tprintf(_T("Error: %x"), GetLastError());
return 1;
}
// Open the door:
DeviceIoControl(hCdRom, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, amp;dwBytes, NULL);
MessageBox(NULL, L"Please insert a CD ROM in the CD tray.", L"CD ROM Drive", 0);
break;
}
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
Комментарии:
1. используйте
CM_Get_Device_Interface_ListW
сGUID_DEVINTERFACE_CDROM
2. Что делать, если имеется более одного оптического привода?
3. В качестве альтернативы,
GetLogicalDrive/Strings()
иGetDriveType()
Ответ №1:
как я могу определить, на каком диске на моем компьютере установлен дисковод CD-Rom
Ниже приведен пример, основанный на комментарии @RemyLebeau, на который вы можете сослаться:
WCHAR buf[BUF_SIZE];
LPWSTR pBuf = buf;
DWORD chrCopied = GetLogicalDriveStrings(BUF_SIZE - 1, buf);
while (chrCopied)
{
if (DRIVE_CDROM == GetDriveType(pBuf))
{
MessageBox(NULL, pBuf, L"CD-ROM drive", 0);
}
size_t len = _tcslen(buf);
chrCopied -= len 1;
pBuf = len 1;
}
Результат, как показано ниже: