windows c++編程擷取當前路徑 向駭客邁進!!!

來源:互聯網
上載者:User

今天是第二次發文章了,難得啊,沒辦法,眼睛痛的要死,但是還是秉著“辛苦我一個,服務千萬家”的精神,我還是繼續寫我的文章吧。講座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編程的知識!(第二講完)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.