Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
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ông cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã đượ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
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    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