Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: CD/DVD Tray Manager | Chương trình Quản Lý Đóng Mở CD/DVD

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Thumbs down CD/DVD Tray Manager | Chương trình Quản Lý Đóng Mở CD/DVD

    Gọi là chương trình cho nó oai
    Hôm nay ngày nghỉ lễ quốc gia, rảnh viết cái này chơi

    Ai thích thì sử dụng, nhưng để lại cái credit giùm nha
    Không để lại là không tốt

    Tên chương trình: CD/DVD Tray Manager
    Source: VC++
    By: Xcross87
    Project: 3 files
    [DiskTray.h - DiskTray.cpp - Program.cpp]

    1. DiskTray.h

    C++ Code:
    1. /*
    2.  * @author Xcross87
    3.  * @date 05-May-2009
    4.  * @file disktray.h
    5.  * @note    header for DiskTray class
    6.  */
    7.  
    8.  
    9. #ifndef __DISKTRAY_H__
    10. #define __DISKTRAY_H__
    11.  
    12. /* prototype */
    13. #include <iostream>
    14. #include <string>
    15. #include <wtypes.h>
    16. #include <winioctl.h>
    17. #include <conio.h>
    18.  
    19. using namespace std;
    20.  
    21.  
    22. /*
    23.  * @class: DiskTray
    24.  *        manipulate open/close CD/DVD tray
    25.  */
    26. class DiskTray {
    27.     public:
    28.         static void PrintMenu();
    29.         static void Run            (const string&);
    30.         static bool OpenTray    (const string&);
    31.         static bool CloseTray    (const string&);
    32. };
    33.  
    34. #endif // __DISKTRAY_H__

    2. DiskTray.cpp
    C++ Code:
    1. /*
    2.  * @author Xcross87
    3.  * @date 05-May-2009
    4.  * @file disktray.cpp
    5.  * @note    definition for DiskTray class
    6.  */
    7.  
    8.  
    9. /* prototype */
    10. #include "DiskTray.h"
    11.  
    12. /*
    13.  * @function DiskTray::PrintMenu()
    14.  * @type    bool
    15.  * @param    
    16.  *        _DriveName        const std::string&        name of the drive
    17.  * @action    open CD/DVD tray
    18.  */
    19. bool DiskTray::OpenTray(const std::string &_DriveName) {
    20.     // drive path
    21.     const string Drive = string("\\\\.\\") + _DriveName + string(":");
    22.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    23.     // create file & att
    24.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    25.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    26.                          NULL, OPEN_EXISTING,
    27.                          FILE_ATTRIBUTE_NORMAL, NULL );
    28.     BOOL bRetVal = FALSE;
    29.     // state good
    30.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    31.         DWORD dwDm = 0;
    32.         // eject
    33.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_EJECT_MEDIA,
    34.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    35.     }
    36.     // avoid warning
    37.     return (!!bRetVal);
    38. }
    39.  
    40. /*
    41.  * @function DiskTray::PrintMenu()
    42.  * @type    bool
    43.  * @param    
    44.  *        _DriveName        const std::string&        name of the drive
    45.  * @action    close CD/DVD tray
    46.  */
    47. bool DiskTray::CloseTray(const std::string &_DriveName) {
    48.     // drive path
    49.     const string Drive = string("\\\\.\\") + _DriveName + string(":");
    50.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    51.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    52.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    53.                          NULL, OPEN_EXISTING,
    54.                          FILE_ATTRIBUTE_NORMAL, NULL );
    55.     BOOL bRetVal = FALSE;
    56.     // state good
    57.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    58.         DWORD dwDm = 0;
    59.         // load
    60.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_LOAD_MEDIA,
    61.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    62.     }
    63.     // avoid warning
    64.     return (!!bRetVal);
    65. }
    66.  
    67. /*
    68.  * @function DiskTray::PrintMenu()
    69.  * @type    void
    70.  * @param    none
    71.  * @action    show program menu
    72.  */
    73. void DiskTray::PrintMenu() {
    74.     std::cout <<
    75.         "==================================\n"
    76.         "     CD/DVD Tray Manager          \n"
    77.         " [by Xcross87 @CDCV]               \n"
    78.         "==================================\n"
    79.         " . (O)pen Tray                    \n"
    80.         " . (C)lose Tray                   \n"
    81.         " .  E(x)it Program                \n"
    82.         "==================================\n"
    83.         "[yOur OptiOn]: (O-C-X)  ";
    84. }
    85.  
    86. /*
    87.  * @function DiskTray::Run()
    88.  * @type    void
    89.  * @param
    90.  *        _DriveName        const std::string&        name of the drive
    91.  * @action    run the main program
    92.  */
    93.  
    94. void DiskTray::Run(const std::string &_DriveName) {
    95.     // show menu()
    96.     DiskTray::PrintMenu();
    97.     // get first input
    98.     char _input = _getch();
    99.     std::cout << "\n";
    100.     // check input
    101.     while( toupper(_input) != 'X' ) {
    102.         switch ( toupper(_input) ) {
    103.             case 'O': // open
    104.                 DiskTray::OpenTray(_DriveName);
    105.                 break;
    106.             case 'C': // close
    107.                 DiskTray::CloseTray(_DriveName);
    108.                 break;
    109.             case 'X': // exit
    110.                 std::cout << "\n";
    111.                 exit(0);
    112.             default:
    113.                 std::cout << "\nWrong option...\n";
    114.                 _getch();
    115.                 break;
    116.         }        
    117.         // clean stream
    118.         flushall();
    119.         // clear screen
    120.         system("cls");
    121.         // menu again and input
    122.         DiskTray::PrintMenu();
    123.         _input = _getch();
    124.  
    125.     }
    126. }

    3. Program.cpp

    C++ Code:
    1. /*
    2.  * @author Xcross87
    3.  * @date 05-May-2009
    4.  * @file program.cpp
    5.  * @note
    6.  */
    7.  
    8. /* prototype */
    9. #include "DiskTray.h"
    10.  
    11. /* entry point */
    12. int main()
    13. {
    14.     // run program
    15.     DiskTray::Run("D");
    16.     // return on success
    17.     return EXIT_SUCCESS;
    18. }

    ENJOY!
    None!

  2. #2
    Ngày gia nhập
    12 2008
    Bài viết
    198

    Nếu viết trên Linux thì còn tý "oai" chứ viết trên windows lại còn console thì hơi củ chuối

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi Cpro Xem bài viết
    Nếu viết trên Linux thì còn tý "oai" chứ viết trên windows lại còn console thì hơi củ chuối
    Thế thì viết đi
    None!

  4. #4
    Ngày gia nhập
    12 2008
    Bài viết
    198

    hàm mciSendStringA là xong

  5. #5
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi Cpro Xem bài viết
    hàm mciSendStringA là xong
    thế biết MCI để làm gì không?

    Trích dẫn Nguyên bản được gửi bởi Cpro Xem bài viết
    Nếu viết trên Linux thì còn tý "oai" chứ viết trên windows lại còn console thì hơi củ chuối
    thế bạn viết một chương trình tương tự trong Linux demo cho tui đi.
    None!

  6. #6
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Mặc định CD/DVD Tray Manager | Chương trình Quản Lý Đóng Mở CD/DVD

    MCI xài cho Windows thôi.
    lò mò google thấy có open cdrom cho linux
    http://www.leapster.org/linux/cdrom/
    tiếc là máy ko cài linux nên ko thử được :P
    code ra gió bão

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Khá thú vị

    @Cpro: Việc lần trước với tom_codon vẫn chưa đủ ?

  8. #8
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi 6220119 Xem bài viết
    MCI xài cho Windows thôi.
    lò mò google thấy có open cdrom cho linux
    http://www.leapster.org/linux/cdrom/
    tiếc là máy ko cài linux nên ko thử được :P
    chính nó đó.
    . Trong Linux Kernel các device được khai báo trong /dev/
    Ví dụ như ở đây: /dev/cdrom
    . Các API được lưu trữ trong /usr/include/

    Nói thêm một chút về device trong Linux:
    . các thành phần điều khiển đều là file. /dev/cdrom là 1 file
    . các device luôn luôn có state và block , vì thế luôn luôn phải kiểm tra xem block hay state có hợp lệ hay không trước khi sử dụng
    . device lưu trữ dưới hình thức module và kích hoạt daemon
    . device cũng chỉ là các file IO.

    Cái ví dụ mở khay CD

    C Code:
    1. /* eject.c
    2. ** Copyright Paul Dwerryhouse, 1997-2004
    3. */
    4. #include <sys/types.h>
    5. #include <sys/ioctl.h>
    6. #include <fcntl.h>
    7. #include <linux/cdrom.h>
    8.  
    9. #define CDDEVICE "/dev/cdrom"           /* CDROM device */
    10.  
    11. int main(int argc,char **argv)
    12. {
    13.    int cdrom;                           /* CDROM device file descriptor */
    14.  
    15.    /* Open the CDROM device. The linux/cdrom.h header file specifies that
    16.    ** it must be given the O_NONBLOCK flag when opening. My tests showed
    17.    ** that if this isn't done, this program will not work.
    18.    */
    19.    if ((cdrom = open(CDDEVICE,O_RDONLY | O_NONBLOCK)) < 0) {
    20.         perror("open");
    21.         exit(1);
    22.    }
    23.  
    24.    /* Use ioctl to send the CDROMEJECT command to the device
    25.    */
    26.    if (ioctl(cdrom,CDROMEJECT,0)<0) {
    27.         perror("ioctl");
    28.         exit(1);
    29.    }
    30.  
    31.    close(cdrom);
    32. }

    - Chương trình chỉ thỏa mãn khi file descriptor được đặt cờ O_NONBLOCK (tức là không bị chặn bởi các process tại thời điểm hiện tại)
    - Điều khiển thiết bị IO trong Linux qua API ioctl(). Trong Windows tương đương với: DeviceIoControl() mà tớ sử dụng ở chương trình trên.

    Nhưng phải công nhận một điều rõ ràng, API trong Linux dễ xài hơn Windows vì nó đơn giản.
    None!

  9. #9
    Ngày gia nhập
    04 2009
    Nơi ở
    một căn hộ nhỏ trên trái đất
    Bài viết
    372

    Chương trình khá thú vị, nhưng sẽ tiện hơn nếu có thể nhận dạng được ổ nào là ổ quang thay vì phải sửa mã bằng tay để lấy đúng ổ quang

  10. #10
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Trích dẫn Nguyên bản được gửi bởi icttrack Xem bài viết
    Chương trình khá thú vị, nhưng sẽ tiện hơn nếu có thể nhận dạng được ổ nào là ổ quang thay vì phải sửa mã bằng tay để lấy đúng ổ quang
    Tớ viết cho vui thôi.
    Đang thử kiểm tra Device IO trong Windows với STORAGE_MEDIA, thấy có option cho CD/DVD nên thử tí, chứ dự án gì đâu
    Mà ổ quang là ổ gì thế nhỉ?
    None!

Các đề tài tương tự

  1. [Excel - C#] Đóng file Excel nhưng trong Task Manager vẫn còn?
    Gửi bởi nth4 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 18-05-2013, 05:15 PM
  2. Tạo System Tray Cho Ứng Dụng Qt
    Gửi bởi AlexF trong diễn đàn Thủ thuật, Tutorials và Mã nguồn
    Trả lời: 0
    Bài viết cuối: 28-04-2011, 03:40 PM
  3. Mẫu 1 Tài Liệu Quản Lý Dự Án Của Project manager ?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 17-11-2010, 02:19 AM
  4. Services Manager 1.0 - Quản lý các dịch vụ của Windows
    Gửi bởi Yin Yang trong diễn đàn Sản phẩm phần mềm của bạn
    Trả lời: 4
    Bài viết cuối: 20-06-2009, 08:23 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn