天天看點

關于程式工作路徑問問題setcurrentdirectory

DWORD GetCurrentDirectory(
   DWORD nBufferLength, // size of directory buffer
   LPTSTR lpBuffer      // directory buffer
   );
   函數功能:
   找到目前程序的目前目錄(.dsw所在檔案夾)
   參數說明:
   參數 類型及說明 
   nBufferLength 緩沖區的長度 
   lpBuffer 指定一個預定義字串,用于裝載目前目錄 
   傳回值 
   調用成功 傳回裝載到lpBuffer的位元組數。
   如nBufferLength的長度不夠,不足以容納目錄,則傳回值是必要的緩沖區長度(要求至少這個長度),其中包括空中          止字元。零表示失敗。使用GetLastError函數可獲得錯誤資訊  
BOOL SetCurrentDirectory(
   LPCTSTR lpPathName
 );
 函數是設定目前路徑,函數的傳回值如果是0,表示設定失敗,如果不是0,表示設定成功; 

 
GetModuleFileName函數原型
 DWORD GetModuleFileName(
    HMODULE hModule,     // handle to module。将要得到的子產品的句柄。如果是目前子產品,NULL
    LPTSTR lpFilename,      // path buffer   得到的檔案名。
    DWORD nSize              // size of buffer   一般MAX_PATH就可以了
 ); 

 

 
 
 
舉個簡單的例子:
 GetCurrentDirectory(BUFSIZE, Buffer);  
 GetModuleFileName(NULL, szPath, sizeof(szPath));    //NULL是目前子產品檢視Buffer 是:"C:\Documents and Settings\All Users\桌面\test"
 檢視szPath 是:"C:\Documents and Settings\All Users\桌面\test\Debug\test.exe"    獲得的是子產品的完整路徑名; 

 

 

 
程式例子:
 
#include "StdAfx.h"
 #include <Windows.h> 
#define BUFSIZE MAX_PATH
 

 
int main()
 
{
 
TCHAR Buffer[BUFSIZE];
 
 DWORD dwRet; 
dwRet = GetCurrentDirectory(BUFSIZE, Buffer);
 
if( dwRet == 0 )    //傳回零表示得到檔案的目前路徑失敗,所謂目前路徑就是.dsw所在的檔案夾
   {
    printf("GetCurrentDirectory failed (%d)",GetLastError());
    return 0;
   }
   if(dwRet > BUFSIZE) //如果超過了最大字元數,則提示越界,MAX_PATH 是260 
 printf("GetCurrentDirectory failed (buffer too small,need %d chars)\n"), dwRet);
     return 0;
   }  
SetCurrentDirectory("C:\\");//是指把程序的目前路徑換成:C:\       
 
//如果:SetCurrentDirectory("..")    就是設定目錄為目前目錄的上級目錄;
 

 

 
return 1;
   
 
 
 
}
 
 

 
 

 
 
VC中使用GetModuleFileName擷取應用程式路徑:(這裡的路徑是絕對路徑)
 
 

 
 
.\\與API函數GetModuleFileName擷取應用程式目錄有何不一樣? 
 
 

 
 
 
  
--------------------------------------------------------------------------------
 .\\是得到應用程式的目前目錄,但目前目錄不一定等于應用程式執行檔案的所在目錄,一個應用程式被啟動時,目前目錄是可以被任意設定的。
 GetModuleFileName()得到子產品的完整路徑名,例如,你載入c:\windows\system32\a.dll,得到子產品句柄h,則你可以用GetModuleFileName()得到h子產品的完整路徑名。 
 --------------------------------------------------------------------------------
 .\\一般用在包含頭檔案的語句中。
 另一個是程式編譯後起作用的,例如,打開自定義的配置檔案等。 
 --------------------------------------------------------------------------------
 如何去取得這個Hanlde? 
 --------------------------------------------------------------------------------
 如果你直接用LoadLibrary()或AfxLoadLibrary()載入dll,該函數傳回值就是handle;
 如果你隐式載入dll, 用GetModuleHandle("dll檔案名")也可以得到handle; 
 MFC程式得到本身路徑在開發工程中,往往需要知道目前程式本身所在目錄。
 一種方法是在程式安裝的時候利用安裝程式把檔案路徑寫入系統資料庫。在較大的程式中,這種方法比較常用
 另一種,就是在程式得到路徑。這樣,程式随便移動到哪裡,都可以得到正确的路徑。      

繼續閱讀