Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: CD/DVD-Rom TrayManager v2.0 viết bằng C++

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

    Talking CD/DVD-Rom TrayManager v2.0 viết bằng C++

    Hôm qua có viết con tí hon.
    Hôm nay ngồi update lại một tí ^^

    Chương trình: Quản lý đóng mở CD/DVD v2.0
    Tác giả: Xcross87
    Project: 3 files
    [DiskTray.h - DiskTray.cpp - Program.cpp]


    Có cải tiến hơn đồ hôm qua một chút

    Đây là sơ đồ UML thiết kế tạm:



    Còn đây là source:

    1. DiskTray.h

    C++ Code:
    1. /*
    2.  * @author Xcross87
    3.  * @date 06-May-2009
    4.  * @file disktray.h
    5.  * @note    header for DiskTray class
    6.  */
    7.  
    8. #ifndef __DISKTRAY_H__
    9. #define __DISKTRAY_H__
    10.  
    11. /* prototype */
    12. #include <iostream>
    13. #include <string>
    14. #include <wtypes.h>
    15. #include <winioctl.h>
    16. #include <list>
    17.  
    18. #define MAX 256
    19.  
    20.  
    21. /*
    22.  * @class DiskTray
    23.  *      manipulate CD/DVD-Rom
    24.  */
    25. class DiskTray {
    26.     private:
    27.         std::string driveName;
    28.         int state;
    29.  
    30.         /*void SetState(DiskState& _state);
    31.         DiskState GetState() const;*/
    32.     public:
    33.         // const
    34.         enum DiskState { OPEN, CLOSE };    
    35.  
    36.         // constructor & destructor
    37.         DiskTray();
    38.         DiskTray(const std::string& _driveName);
    39.         ~DiskTray();
    40.  
    41.         // properties
    42.         void SetDriveName(const std::string& _driveName);
    43.         std::string GetDriveName() const;
    44.  
    45.         // methods
    46.         bool Open();
    47.         bool Close();
    48.        
    49.         // static
    50.         static bool Open(const std::string& _driveName);
    51.         static bool Close(const std::string& _driveName);
    52.         static std::list<DiskTray> GetAll();
    53.  
    54. };
    55.  
    56. #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. /* prototype */
    9. #include "DiskTray.h"
    10.  
    11. /* constructor */
    12. DiskTray::DiskTray() {
    13.     this->driveName = "UNKNOWN";
    14. }
    15.  
    16. DiskTray::DiskTray(const std::string &_driveName) : driveName(_driveName) {
    17.  
    18. }
    19.  
    20. /* destructor */
    21. DiskTray::~DiskTray() {
    22.  
    23. }
    24.  
    25.  
    26. /*
    27.  * @property DriveName
    28.  * @type std::string
    29.  */
    30. void
    31. DiskTray::SetDriveName(const std::string &_driveName) {
    32.     this->driveName = _driveName;
    33. }
    34.  
    35. std::string
    36. DiskTray::GetDriveName() const {
    37.     return this->driveName;
    38. }
    39.  
    40. /*
    41.  * @method  Open()
    42.  *      open drive
    43.  * @type bool
    44.  * @param
    45.  * @return
    46.  *      true    if being able to open
    47.  *      false   otherwise
    48.  */
    49. bool
    50. DiskTray::Open() {
    51.     // check state
    52.     if( this->state == OPEN ) {
    53.         return true;
    54.     }
    55.     const std::string Drive = std::string("\\\\.\\") + this->driveName + std::string(":");
    56.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    57.     // create file & att
    58.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    59.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    60.                          NULL, OPEN_EXISTING,
    61.                          FILE_ATTRIBUTE_NORMAL, NULL );
    62.     BOOL bRetVal = FALSE;
    63.     // state good
    64.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    65.         DWORD dwDm = 0;
    66.         // eject
    67.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_EJECT_MEDIA,
    68.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    69.     }
    70.     // reset state
    71.     this->state = OPEN;
    72.     // avoid warning
    73.     return (!!bRetVal);
    74. }
    75.  
    76. /*
    77.  * @method  Close()
    78.  *      close drive
    79.  * @type bool
    80.  * @param
    81.  * @return
    82.  *      true    if being able to close
    83.  *      false   otherwise
    84.  */
    85. bool
    86. DiskTray::Close() {
    87.     // check state
    88.     if( this->state == CLOSE ) {
    89.         return true;
    90.     }
    91.     const std::string Drive = std::string("\\\\.\\") + this->driveName + std::string(":");
    92.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    93.     // create file & att
    94.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    95.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    96.                          NULL, OPEN_EXISTING,
    97.                          FILE_ATTRIBUTE_NORMAL, NULL );
    98.     BOOL bRetVal = FALSE;
    99.     // state good
    100.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    101.         DWORD dwDm = 0;
    102.         // eject
    103.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_LOAD_MEDIA,
    104.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    105.     }
    106.     // reset state
    107.     this->state = CLOSE;
    108.     // avoid warning
    109.     return (!!bRetVal);
    110. }
    111.  
    112. /*
    113.  * @function Open()
    114.  *      open a specific drive
    115.  * @type static bool
    116.  * @param
    117.  * @return
    118.  *      true    if being able to open
    119.  *      false   otherwise
    120.  */
    121. bool
    122. DiskTray::Open(const std::string& _driveName) {
    123.     const std::string Drive = std::string("\\\\.\\") + _driveName + std::string(":");
    124.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    125.     // create file & att
    126.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    127.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    128.                          NULL, OPEN_EXISTING,
    129.                          FILE_ATTRIBUTE_NORMAL, NULL );
    130.     BOOL bRetVal = FALSE;
    131.     // state good
    132.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    133.         DWORD dwDm = 0;
    134.         // eject
    135.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_EJECT_MEDIA,
    136.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    137.     }  
    138.     // avoid warning
    139.     return (!!bRetVal);
    140. }
    141.  
    142. /*
    143.  * @function Close()
    144.  *      close a specific drive
    145.  * @type static bool
    146.  * @param
    147.  * @return
    148.  *      true    if being able to close
    149.  *      false   otherwise
    150.  */
    151. bool
    152. DiskTray::Close(const std::string& _driveName) {
    153.     const std::string Drive = std::string("\\\\.\\") + _driveName + std::string(":");
    154.     HANDLE hDrive = INVALID_HANDLE_VALUE; // handle
    155.     // create file & att
    156.     hDrive = CreateFile( Drive.c_str(), GENERIC_READ,
    157.                          FILE_SHARE_READ | FILE_SHARE_WRITE,
    158.                          NULL, OPEN_EXISTING,
    159.                          FILE_ATTRIBUTE_NORMAL, NULL );
    160.     BOOL bRetVal = FALSE;
    161.     // state good
    162.     if (( hDrive != INVALID_HANDLE_VALUE) && (NO_ERROR == GetLastError() )) {
    163.         DWORD dwDm = 0;
    164.         // eject
    165.         bRetVal = DeviceIoControl( hDrive, IOCTL_STORAGE_LOAD_MEDIA,
    166.                                    NULL, 0, NULL, 0, &dwDm, NULL );
    167.     }  
    168.     // avoid warning
    169.     return (!!bRetVal);
    170. }
    171.  
    172. /*
    173.  * @function GetAll()
    174.  *      retrieve list of CD/DVD-Roms
    175.  * @type static std::list<std:;string>
    176.  * @param
    177.  * @return
    178.  *      std::list<std::string>   
    179.  */
    180.  
    181. std::list<DiskTray>
    182. DiskTray::GetAll() {   
    183.     std::list<DiskTray> Drives;
    184.  
    185.     //int __drive_type = 99;
    186.     char __drive_found[MAX];
    187.     char *__pdrive = __drive_found;
    188.     // get all logicals
    189.     GetLogicalDriveStrings(MAX, __drive_found);
    190.     while( *__pdrive != NULL ) {
    191.         std::string __drive;
    192.         DiskTray disk;
    193.         // check type
    194.         switch( GetDriveType(__pdrive) ) {
    195.             case 5: // CD/DVD-ROM
    196.                 __drive = *__pdrive;
    197.                 disk.SetDriveName(__drive);
    198.                 Drives.push_back(disk); // push
    199.                 break;
    200.             default: // nothing
    201.                 break;
    202.         }
    203.         // next drive
    204.         __pdrive += lstrlen(__pdrive) + 1;
    205.     }  
    206.     // return list
    207.     return Drives;
    208. }

    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. #include <stdlib.h>
    11. #include <conio.h>
    12.  
    13. /*
    14.  * @class TrayManager
    15.  *      manage CD/DVD tray
    16.  */
    17.  
    18. class TrayManager {
    19.     private:
    20.         std::list<DiskTray> Drives;
    21.         //int CountDrives;
    22.  
    23.     public:
    24.         /* constructor */
    25.         TrayManager() {
    26.             Drives = DiskTray::GetAll(); // get drive list
    27.             //CountDrives = (int)Drives.size();
    28.         }
    29.         /* destructor */
    30.         ~TrayManager() {
    31.  
    32.         }
    33.         /*
    34.          * @function ShowMenu()
    35.          *      show program menu
    36.          * @type    void
    37.          * @param            
    38.          * @return
    39.          */
    40.         void ShowMenu() {
    41.             std::cout <<
    42.                 "CD/DVD Tray Manager v2.0 by Xcross87 \n"
    43.                 "==================================== \n";
    44.             std::list<DiskTray>::iterator it = Drives.begin();
    45.             std::list<DiskTray>::iterator end = Drives.end();
    46.             for( ; it != end; ++it ) {
    47.                 std::cout << "\t[ " << it->GetDriveName() << ": ] \n";
    48.             }
    49.             std::cout <<
    50.                 "==================================== \n";
    51.             std::cout <<
    52.                 "Pick a drive to open by name !\n"
    53.                 "Press X if you want to exit! \n";
    54.         }
    55.  
    56.         /*
    57.          * @function Run()
    58.          *      run tray manager
    59.          * @type    void
    60.          * @param            
    61.          * @return
    62.          */
    63.         void Run() {
    64.             ShowMenu();
    65.             char _input = _getch();
    66.  
    67.             while( toupper(_input) != 'X' ) {
    68.                 _input = toupper(_input);
    69.                 std::string _drive(1, _input);
    70.                
    71.                 if( _input == 'X' ) {
    72.                     exit(-1);
    73.                 } else if( isMatch(_drive) ) {
    74.                     DiskTray::Open(_drive);
    75.                 }              
    76.                 else {
    77.                     std::cout << "Drive not found...! \n";
    78.                     _getch();
    79.                 }
    80.                 _flushall();
    81.                 system("cls");
    82.                 ShowMenu();
    83.                 _input = _getch();
    84.             }
    85.         }
    86.        
    87.         /*
    88.          * @function isMatch()
    89.          *      match user input drive exists or not
    90.          * @type    bool
    91.          * @param   1
    92.          *      _drive      const std::string&
    93.          * @return
    94.          *      true    if match
    95.          *      false   otherwise
    96.          */
    97.         bool isMatch(const std::string& _drive) {
    98.             // iterate
    99.             std::list<DiskTray>::iterator it = Drives.begin();
    100.             std::list<DiskTray>::iterator end = Drives.end();
    101.             for( ; it != end; ++it ) {
    102.                 if( _drive == it->GetDriveName() ) // return if match
    103.                     return true;
    104.             }
    105.             // not found
    106.             return false;
    107.         }
    108. };
    109.  
    110.  
    111. /* entry point */
    112. int main(void)
    113. {
    114.     // create tray manager
    115.     TrayManager *manager = new TrayManager();
    116.     manager->Run();
    117.     // clean heap
    118.     delete manager;
    119.  
    120.     // return on success
    121.     return EXIT_SUCCESS;
    122. }

    Chúc vui vẻ ^^!
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 07-05-2009 lúc 12:56 AM.
    None!

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    X mà cũng MFC nữa sao ! Chán Linux rồi hả X ? !
    Anyways, good work
    C++ Code:
    1. - void ShowMenu()
    2. - bool isMatch( const string& )
    Hai thằng này cho nó const chắc cũng không sao nhỉ.

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

    vẫn xài Linux mà, hồi đó có viết mấy ver cả Windows và Linux mà
    check trong box C có bản cho Linux.

    * để const không sao cả

    code ở trên quên không đặt cái end là const_iterator
    None!

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cả it và end đều const_iterator được hết ! I didn't notice that too !

  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 rox_rook Xem bài viết
    Cả it và end đều const_iterator được hết ! I didn't notice that too !
    cái it là con trỏ tăng dần trong list, không const được..
    None!

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định CD/DVD-Rom TrayManager v2.0 viết bằng C++

    Are you sure ?
    C++ Code:
    1. #include <list>
    2. #include <iostream>
    3.  
    4. class CONST_TEST {
    5. private :
    6.     std::list< int > ll;
    7. public :
    8.     CONST_TEST( const int& SIZE = 10, const int& element_value = 1 )
    9.         :ll( SIZE, element_value ) {
    10.     }
    11.     void test_list() const {
    12.         for( std::list< int >::const_iterator b = ll.begin(), e = ll.end(); b != e; ++b ) {
    13.             std::cout << *b << "->";
    14.         }
    15.     }
    16. };
    17.  
    18. int main() {
    19.     CONST_TEST a;
    20.     a.test_list();
    21.     return 0;
    22. }

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

    sozi sozi

    lẫn lộn mấy khái niệm const
    None!

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

  1. Lập trình C hai cách viết trong bài viết này có gì khác không, nếu khác mọi người giải thích giúp với
    Gửi bởi letung94 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 02-01-2013, 07:29 AM
  2. muốn viết code cho 1 button nằm trong girdview thì viết ở đâu
    Gửi bởi thuan trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 14-09-2011, 01:08 PM
  3. Viết Giao Diện Phần Mềm bằng Flash, Core viết = C
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 5
    Bài viết cuối: 31-05-2011, 06:45 AM
  4. Algorithm Viết code thời khóa biểu viết trên Window Form C# như thế nào?
    Gửi bởi hocphp_1998 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 12-04-2011, 11:10 PM
  5. [visual basic]Viết lệnh trong sự kiện timer là viết ở đâu?
    Gửi bởi thuan trong diễn đàn Thắc mắc chung
    Trả lời: 2
    Bài viết cuối: 21-09-2010, 12:53 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