今天我又研究了下怎样获取系统的盘符。首先我到互联网上搜索相关的方法,但是令我失望的是,这些方法都有些麻烦,我的水平低,而这些东西是用MFC框架实现的,如果使用不同操作系统,那么将无法进行移植,所以效果不好。
在这里,我有一个方法,这种方法可以利用c++来获取盘符。首先大家想想,如果一个分区装有xp系统,它将有什么样的特征?我想大家应该很容易回答出来:有WINDOWS文件夹啊,有Program Files啊,有Documents and Settings啊,等等。但是这是文件夹啊,我暂时无法使用技术检测文件夹,那么大家可以考虑是否可以检测系统的某些文件?没错!我们可以利用检测是否有某些文件来获取该文件所在系统的盘符。检测文件很难吗?不,很容易很容易,如果你对c++对文件的操作稍有入门的话,这项工作很容易就能达到。
如果你们还是不了解检测某个文件,那么请看这个图
这个就是我们常常使用的任务管理器。在这个图中我们看到这个程序:svchost.exe。这个程序是常驻在我们的内存中的,电脑失去了这个文件,我们甚至无法进入windows系统。因此我们可以对这个文件进行检测。其它的诸如explorer.exe、winlogon.exe、notepad.exe都可以作为我们检测的文件。懂得了这个道理,那么我们可以运行这样的一个程序:
- #include<iostream>
- #include<fstream>
- using namespace std;
- int main( int argc, char** argv )
- {
- char str[] = "c://WINDOWS//system32//svchost.exe";
- ifstream read;
- 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();
- return 0;
- }
- 示例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>
- #define MAX_BUFFER_SIZE 255
- int WINAPI WinMain(HINSTANCE hInst, HINSTANCE ph, LPSTR cmd, int s)
- {
- char str[MAX_BUFFER_SIZE];
- char outstr[] = "系统的盘符是 ";
- GetSystemDirectory(str, MAX_BUFFER_SIZE);
- outstr[12] = str[0];
- MessageBox( NULL, outstr, "系统消息", MB_OK);
- return 0;
- }
- 示例2
程序的运行如图所示
接下来我就要介绍怎样对系统进行调用了,其实也是非常的简单,如果大家觉得对自己有帮助的话,就支持我吧。(第三讲完)