今天我又研究了下怎样获取系统的盘符。首先我到互联网上搜索相关的方法,但是令我失望的是,这些方法都有些麻烦,我的水平低,而这些东西是用MFC框架实现的,如果使用不同操作系统,那么将无法进行移植,所以效果不好。
在这里,我有一个方法,这种方法可以利用c++来获取盘符。首先大家想想,如果一个分区装有xp系统,它将有什么样的特征?我想大家应该很容易回答出来:有WINDOWS文件夹啊,有Program Files啊,有Documents and Settings啊,等等。但是这是文件夹啊,我暂时无法使用技术检测文件夹,那么大家可以考虑是否可以检测系统的某些文件?没错!我们可以利用检测是否有某些文件来获取该文件所在系统的盘符。检测文件很难吗?不,很容易很容易,如果你对c++对文件的操作稍有入门的话,这项工作很容易就能达到。
如果你们还是不了解检测某个文件,那么请看这个图
这个就是我们常常使用的任务管理器。在这个图中我们看到这个程序:svchost.exe。这个程序是常驻在我们的内存中的,电脑失去了这个文件,我们甚至无法进入windows系统。因此我们可以对这个文件进行检测。其它的诸如explorer.exe、winlogon.exe、notepad.exe都可以作为我们检测的文件。懂得了这个道理,那么我们可以运行这样的一个程序:
- #include<iostream>
- #include<fstream>
- usingnamespacestd;
- intmain(intargc,char**argv)
- {
- charstr[]="c://WINDOWS//system32//svchost.exe";
- ifstreamread;
- while(1)
- {
- read.open(str,ios::in);
- if(read.is_open())
- {cout<<"找到了操作系统的盘为"<<str[0]<<'/n';break;}
- if(str[0]>'z')
- {cout<<"找不到系统盘符/n";break;}
- read.close();
- str[0]++;
- }
- read.close();
- return0;
- }
- 示例1
这个程序用来循环检查是否在分区中有这个文件。我们将字符串str的第一个字符循环,就可以得到了不同盘符的路径。这里使用了is_open()成员函数。这是因为open()成员函数是void类型的,因此无法检测是否已经打开文件。在这种情况下,只好使用is_open()成员函数了。为什么没有找到系统盘符要到“z”才结束呢?因为系统分配盘符的时候是按照“cdef...xyz”这样的顺序来的,所以到了“z”的时候必须结束才行。程序的截图如下图所示。
这样的程序可以解决一些问题,但是有些人的电脑是安装了双系统甚至是三系统的,那么怎样才能分辨出是否是当前操作系统的分区呢?而且有的电脑是安装了windows7系统的,那么如何分辨xp系统和windows7的分区呢。这对于我来说比较难啊,但是我想了很久,找到了区分windows7和windows XP系统的方法。大家有没有听说过华生医生?这个程序在windows XP是有的,你在运行处输入drwtsn32,它就会跳出来。但是在windows7中就没有。因为华生医生它的反响很不好,它简直就是一个垃圾程序。但是凡是windows XP系统都有这个。所以我可以用这个特性来区分windows XP分区还是windows7分区。把上面的程序的这一句“char str[] = "c://WINDOWS//system32//svchost.exe";”改为“char str[] = "c://WINDOWS//system32//drwtsn32.exe";”就行了。但是这个程序在windows7下运行的话,就不行了。所以对于多系统的话,这个方法是在是不管用。
那么该用什么方法呢?那就必须使用我们的WIN32 API函数了。在这里我向大家介绍一个函数“GetSystemDirectory()”,它的原型是:
#define GetSystemDirectory GetSystemDirectoryW
#define GetSystemDirectory GetSystemDirectoryA
WINBASEAPI
UINT
WINAPI
GetSystemDirectoryA(
__out_ecount_part_opt(uSize, return + 1) LPSTR lpBuffer,
__in UINT uSize
);
WINBASEAPI
UINT
WINAPI
GetSystemDirectoryW(
__out_ecount_part_opt(uSize, return + 1) LPWSTR lpBuffer,
__in UINT uSize
);
我们通过这个函数将会得到系统的目录。如c:/WINDOWS/system32。那么我们只需要把前面的c截取就能得到当前操作系统的盘符了,这个方法相比前面的方法又简单了一步。但是这个是依赖windows.h这个头文件的。所以我想,要是哪个程序能够不依赖WIN32 API 就好了。请看下面的程序:
- #include<windows.h>
- #defineMAX_BUFFER_SIZE255
- intWINAPIWinMain(HINSTANCEhInst,HINSTANCEph,LPSTRcmd,ints)
- {
- charstr[MAX_BUFFER_SIZE];
- charoutstr[]="系统的盘符是";
- GetSystemDirectory(str,MAX_BUFFER_SIZE);
- outstr[12]=str[0];
- MessageBox(NULL,outstr,"系统消息",MB_OK);
- return0;
- }
- 示例2
程序的运行如图所示
接下来我就要介绍怎样对系统进行调用了,其实也是非常的简单,如果大家觉得对自己有帮助的话,就支持我吧。(第三讲完)