[WinAPI] API 12 [獲取程序所在的目錄、程序模塊路徑,獲取和設置當前目錄]


 

 

Windows系統提供一組API實現對程序運行時相關目錄的獲取和設置。用戶可以使用GetCurrentDirectorySetCurrentDirectory獲取程序的當前目錄,獲取模塊的路徑使用
GetModuleFileName,如果以NULL參數調用GetModuleFileName,將會返回當前模塊的路徑。如果在程序主模塊(exe)中獲取當前模塊路徑,便可以從當前模塊的路徑中提取出程序運行時所在的路徑

 

(1)GetCurrentDirectory。
獲取進程的當前目錄

◇參數
nBufferLength:輸入參數,存儲路徑字符串緩沖區的大小,一般調用MAX PATH。
lpBuffer:輸出參數,指向獲取的路徑字符串。
◇返回值
返回DWORD值,如果為0,表示執行失敗,可以使用GetLastError獲取錯誤信息;如果為非0,則獲取的路徑字符串長度,函數執行成功。

 

(2)SetCurrentDirectory。
設置進程的當前目錄

◇參數
lpPathName:輸入參數,所要設置的路徑值。
◇返回值
返回DWORD值,如果為0,表示執行失敗,可以使用GetLastError獲取錯誤信息;如果為非0,則執行成功。

 

(3)GetModuleFileName。
獲取模塊文件名,當第一個參數為NULL時獲取當前模塊路徑

◇參數
hModule:輸入參數,所要獲取模塊路徑的模塊句柄。
lpFilename:輸出參數,模塊的全路徑。
nSize:輸入參數,lpFilename所指向的緩沖區的大小。
◇返回值
返回DWORD值,如果為0,表示執行失敗;如果為非O,則執行成功,表示獲取的路徑的字符串長度。
◇使用說明
可以使用GetLastError獲取錯誤信息,如果返回值為nSize指明的大小,那么很有能是因為緩沖區太小,這時使用GetLastError,會得到ERROR_INSUFFICIENT_- BUFFER。

 

>>>本實例首先獲取並打印出程序的當前路徑,如果程序的當前路徑沒有經過設置,默認情況下將是程序運行時所在的目錄。然后將當前目錄設置為“D:\”,設置完成后,使用相對路徑創建的目錄,目的是驗證相對路徑是相對於進程的當前路徑的,而不是可執行文件所在的路徑。然后使用GetModuleFileName獲取了本模塊和kerne132.exe的路徑。

>>>通過本實例讀者需了解的注意事項如下。
◇在進程中使用相對路徑,則相對路徑的起始點是程序的當前路徑而不是可執行文件所在的路徑。
◇進程的當前路徑在默認情況下是應用程序可執行文件所在的路徑。

◇模塊路徑與程序的當前路徑是兩個概念,進程的主程序和進程中所加載的所有DLL都是進程的模塊。

 

 

 1 #include <Windows.h>
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     //用於存儲當前路徑
 7     CHAR szCurrentDirectory[MAX_PATH];
 8     //用於存儲模塊路徑
 9     CHAR szMoudlePath[MAX_PATH];
10     //Kernel32文件名與句柄
11     LPSTR szKernel32="kernel32.dll";
12     HMODULE hKernel32;
13     //當前路徑長度,也用於判斷是否獲取成功
14     DWORD dwCurDirPathLen;
15     //獲取進程當前目錄
16     dwCurDirPathLen=
17         GetCurrentDirectoryA(MAX_PATH,szCurrentDirectory);
18     if(dwCurDirPathLen==0)
19     {
20         printf("獲取當前目錄錯誤。\n");
21         return 0;
22     }
23     printf("進程當前目錄為 %s \n",szCurrentDirectory);
24 
25     //將進程當前目錄設為"D:\"
26     lstrcpyA(szCurrentDirectory,"D:\\");
27     if(!SetCurrentDirectoryA(szCurrentDirectory))
28     {
29         printf("獲取當前目錄錯誤。\n");
30         return 0;
31     }
32     printf("已設置當前目錄為 %s \n",szCurrentDirectory);
33 
34     //在當前目錄下創建子目錄"current_dir"
35     //運行完后D:盤下將出現"current_dir"文件夾
36     CreateDirectoryA("current_dir",NULL);
37 
38     //再次獲取系統當前目錄
39     dwCurDirPathLen=
40         GetCurrentDirectoryA(MAX_PATH,szCurrentDirectory);
41     if(dwCurDirPathLen==0)
42     {
43         printf("獲取當前目錄錯誤。\n");
44         return 0;
45     }
46     printf("GetCurrentDirectoryA獲取當前目錄為 %s \n",szCurrentDirectory);
47 
48     //使用NULL參數,獲取本模塊路徑
49     if(!GetModuleFileNameA(NULL,szMoudlePath,MAX_PATH))
50     {
51         printf("獲取模塊路徑錯誤。\n");
52         return 0;
53     }
54     printf("本模塊路徑 %s \n",szMoudlePath);
55 
56     //獲取Kernel32.dll的模塊句柄
57     hKernel32=LoadLibraryA(szKernel32);
58 
59     //使用Kernel32.dll的句柄模塊,獲取其路徑
60     if(!GetModuleFileNameA(hKernel32,szMoudlePath,MAX_PATH))
61     {
62         printf("獲取模塊路徑錯誤。\n");
63         return 0;
64     }
65     printf("kernel32模塊路徑 %s \n",szMoudlePath);
66 
67     return 0;
68 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM