windows c++编程获取当前路径 向黑客迈进!!!

今天是第二次发文章了,难得啊,没办法,眼睛痛的要死,但是还是秉着“辛苦我一个,服务千万家”的精神,我还是继续写我的文章吧。讲座ing...

//--------------------------------------------------------------------//

上一次我写到了使用标准的c++来实现显示程序的当前路径,但是如果是windows应用程序呢?这个完全不必担心,因为windows程序有很多很多的函数给我们利用呢。
 首先我们使用的是GetCommandLine()函数。选择这个函数是因为这个函数很简单,不用带参数。这个函数的声明是:
#define GetCommandLine  GetCommandLineA
WINBASEAPI __out LPSTR WINAPI GetCommandLineA( VOID );
这里编辑一个小程序,我们可以看到,只需要调用这个函数,我们就可以看到当前程序所在的路径了。
 

Code:
  1. #include<windows.h>   
  2. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)   
  3. {   
  4.  MessageBox( NULL, GetCommandLine(), "程序消息", MB_OK);   
  5.  return 0;   
  6. }   
  7. 示例1  


 运行的结果如图:


 但是这里还有一个问题。调用这个函数有一些问题,就是除了包含当前程序的名字以外,这个函数还有一对双引号,这该怎么办呢?在第一讲中我们已经写出可以进行截取路径来对名字除去,那么双引号怎么除去呢?很简单。我们知道,后面的双引号在截取的时候已经不在了,我们只需要对前面的双引号进行处理就行了。如果只是对路径进行显示的话,可以这样写。
 

Code:
  1. #include<windows.h>   
  2. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)   
  3. {   
  4.  char *p1,*p2;   
  5.  int i;   
  6.  p1 = p2 = (char*)GetCommandLine()+1;//从去掉双引号处开始   
  7.  for ( ; *p2 != 0; p2++ )   
  8.   if ( *p2 == '//' )   
  9.    i = p2 - p1;//标记最后一个“/”号   
  10.  p1[i] = 0;//将原来是“/”的地方置0   
  11.  MessageBox( NULL, p1, "程序消息", MB_OK);   
  12.  return 0;   
  13. }   
  14. 示例2   

 运行结果如图:

 怎么样,容易吧。其实这种方法的效率是最高的,甚至不用什么strlen()、strcpy()、strcat()就可以解决。

 

 

 接下来我要介绍另外一个函数GetCurrentDirectory(),这个函数有两个参数,它的原型为:
#define GetCurrentDirectory GetCurrentDirectoryW
WINBASEAPI DWORD WINAPI GetCurrentDirectoryW( __in DWORD nBufferLength, __out_ecount_part_opt(nBufferLength, return + 1) LPWSTR lpBuffer );
 这个函数有两个参数,第一个参数是缓冲区的长度,第二个参数是装在当前路径的字符串。这样的函数需要用一个字符串来存储,所以比起上一个稍有麻烦。但是它不带双引号,也算是简单的。请看下面这个程序:
 

Code:
  1. #include<windows.h>   
  2. #define MAX_BUFFER_SIZE 255   
  3. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)   
  4. {   
  5.  char str[MAX_BUFFER_SIZE];   
  6.  GetCurrentDirectory(MAX_BUFFER_SIZE, str);   
  7.  MessageBox( NULL, str,"程序消息", MB_OK);   
  8.  return 0;   
  9. }   
  10. 示例3   

它的运行结果如图


 要除去程序的名字,可以对已经赋值的str进行截取处理,修改后的程序如下:
 

Code:
  1. #include<windows.h>   
  2. #define MAX_BUFFER_SIZE 255   
  3. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)   
  4. {   
  5.  char str[MAX_BUFFER_SIZE];   
  6.  char* p = str;   
  7.  int i;   
  8.  GetCurrentDirectory(MAX_BUFFER_SIZE, str);   
  9.  for ( ; *p != 0; p++ )   
  10.   if ( *p == '//' )   
  11.    i = p - str;   
  12.  str[i] = 0;   
  13.  MessageBox( NULL, str,"程序消息", MB_OK);   
  14.  return 0;   
  15. 示例4  


它的运行结果如下图


 怎样,也很简单吧。但是此方法需要注意,必须将MAX_BUFFER_SIZE定义得足够大,如果MAX_BUFFER_SIZE过小,那么就会出现路径显示不完整和其它意想不到的问题。

 

 


 然后我们就要介绍的函数是GetModuleFileName(),这个函数带有三个参数,它的原型如下:
#define GetModuleFileName GetModuleFileNameW
WINBASEAPI DWORD WINAPI GetModuleFileNameW( __in_opt HMODULE hModule, __out_ecount_part(nSize, return + 1) LPWCH lpFilename, __in DWORD nSize );
 第一个参数表示的是装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。第二个参数表示的是存放返回的名字的内存块的指针,是一个输出参数,第三个参数是缓冲区的最大值,和GetCurrentDirectory()函数一样,如果缓冲区过小,也会出现显示不完整和其它的问题。
 下面请看这个程序:
 

Code:
  1. #include<windows.h>      
  2. #define MAX_BUFFER_SIZE 255      
  3. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)      
  4. {      
  5.  char str[MAX_BUFFER_SIZE];      
  6.  GetModuleFileName( NULL, str, MAX_BUFFER_SIZE );      
  7.  MessageBox( NULL, str, "程序消息", MB_OK );      
  8.  return 0;      
  9. }      
  10. 示例5  

程序的结果如图


 同样的,使用截取也可以将当前路径显示出来,请看下面的程序:
 

Code:
  1. #include<windows.h>   
  2. #define MAX_BUFFER_SIZE 255   
  3. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmd, int show)   
  4. {   
  5.  char str[MAX_BUFFER_SIZE];   
  6.  GetModuleFileName( NULL, str, MAX_BUFFER_SIZE);   
  7.  char* p = str;   
  8.  int i;   
  9.  GetCurrentDirectory(MAX_BUFFER_SIZE, str);   
  10.  for ( ; *p != 0; p++ )   
  11.   if ( *p == '//' )   
  12.    i = p - str;   
  13.  str[i] = 0;   
  14.  MessageBox( NULL, str,"程序消息", MB_OK);   
  15.  return 0;   
  16. }   
  17. 示例6   

 程序的结果如图


 这里我还想说一点,如果将上述程序第五行的GetModuleFileName( NULL, str, MAX_BUFFER_SIZE);改为GetModuleFileName( hInst, str, MAX_BUFFER_SIZE);这样也会得出同样的结果,那是否意味着两者等同呢?不。如果在WinMain()函数中进行多线程的操作,那么每一个线程都会有一个实例句柄,这样的话如果使用GetModuleFileName()函数,它就会得到实例句柄的路径。这样对于获知线程的来源和删除某些木马程序是有帮助的。

温馨提醒:如果出现诸如“error C2664: “MessageBoxW”: 不能将参数 2 从“char [255]”转换为“LPCWSTR””之类的错误(通常是vs系列),请点击菜单->项目-><项目名称> 属性(P),再在弹出的对话框中左边的树状图中选择配置属性->常规,然后在右边的字符集中选择“使用多字节字符集”,这样做就是使类型转换能够顺利地进行,于是就不会报错了。

//---------------------/
好了,获取当前路径到这里就要告一段落了,欢迎大家评论,我们共同切磋windows编程的知识!(第二讲完)

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值