当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何用编程获取CD-ROM的驱动器盘符?

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 如何用编程获取CD-ROM的驱动器盘符?


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 91 ::
收藏到网摘: n/a

如何用编程获取CD-ROM的驱动器盘符?



作者:赵湘宁

下载源代码


[提出问题]
    最近我正在开发一个程序,任务是从CD-ROM上读取文件,如视频和音频文件。因为每一台机器上的情况都不一样。如何知道CD-ROM驱动器呢?


[解答]
    首先,一台机器可能有不止一个CD-ROM驱动器。现在CD-ROM已经是PC机的标准配置,此外再装个可擦写的光盘驱动,甚至是DVD都是很常见的事情。不管一台机器上装多少个不同的驱动器,如何找到它们呢?
    有关驱动器的函数有GetLogicalDrives,GetLogicalDriveStrings和GetDriveType。前两个用来获取逻辑驱动器盘符,GetLogicalDriveStrings返回路径名字符串,如:

      "A:\<null>C:\<null>F:\<null><null>"

    这里每一个路径名都由NULL(空或者零)字符分隔,最后结尾是两个空字符--这是标准的C风格处理方法。对于喜欢操作位和字节的汇编语言使用者来说,GetLogicalDrives是个很好用的API函数。它以位掩码的形式返回逻辑驱动器。即在一个DWORD类型的返回值中,位0(最小的一位)表示驱动器A,位1表示驱动器B,以此类推。每一个位的状态如果是on,则表示对应的逻辑驱动器存在;否则状态为off,表示对应的逻辑驱动器不存在。大家知道DWORD是一个32位的值,足以包括所有的英文字母,也就是说最多可有26个盘符。
    为了确定某个逻辑驱动器的类型,必须调用GetDriveType函数。它以路径名作为参数(如C:\),返回DRIVE_FIXED,DRIVE_REMOVABLE,或DRIVE_UNKNOWN。下面列出了所有可能返回的值:这些值在winbase.h定义

#define DRIVE_UNKNOWN 0 // 无效路径名#define DRIVE_NO_ROOT_DIR 1 // 无效路经,如无法找到的卷标#define DRIVE_REMOVABLE 2 // 可移动驱动器(如磁盘驱动器,光驱等)#define DRIVE_FIXED 3 // 固定的驱动器 (如 通常的硬盘)#define DRIVE_REMOTE 4 // 网络驱动器#define DRIVE_CDROM 5 // CD-ROM#define DRIVE_RAMDISK 6 // 随机存取(RAM) 磁盘 
为了更容易说明问题,我写了一个小程序--ListDrives,它可以列出某台机器上所有的逻辑驱动器。其实现代码如下:
ListDrives.cpp #include "stdafx.h"#include "resource.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifusing namespace std; // for string class// 下面是一个GetDriveType返回码与人可读字符串的迷你对照表//struct { UINT type; // GetDriveType返回码类型 LPCSTR name; // ascii 名称} DriveTypeFlags [] = { { DRIVE_UNKNOWN, "未知" }, { DRIVE_NO_ROOT_DIR, "无效路经" }, { DRIVE_REMOVABLE, "可移动" }, { DRIVE_FIXED, "固定" }, { DRIVE_REMOTE, "网络驱动器" }, { DRIVE_CDROM, "CD-ROM" }, { DRIVE_RAMDISK, "随机存取磁盘" }, { 0, NULL},};int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){ if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { cerr << _T("Fatal Error: MFC initialization failed") << endl; return -1; } // 获取逻辑驱动器字符串- a:\b:\c:\... 等. // 还可以用GetLogicalDrives 以位图形式代替字符串形式获取信息 TCHAR buf[100]; DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf); // 显示每个驱动器的信息 // string msg = "Logical Drives:\n"; // STL string for (TCHAR* s=buf; *s; s+=_tcslen(s)+1) { LPCTSTR sDrivePath = s; msg += sDrivePath; msg += " "; // GetDriveType 获取枚举值,如DRIVE_UNKNOWN等. // UINT uDriveType = GetDriveType(sDrivePath);// 查找驱动器类型。在此我用了表(结构数组)来进行查找处理,过于繁琐了一些,// 但既然uDriveType 的值是连续的。// 我可以用DriveTypeFlags[uDriveType]来代替线性查找。在实际的编程中通常可以这么做:// if (uDriveType & DEVICE_CDROM) { ……// } // for (int i=0; DriveTypeFlags[i].name; i++) { if (uDriveType == DriveTypeFlags[i].type) { msg += DriveTypeFlags[i].name; break; } } msg += '''''''''''