[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 }
复制代码
相关文章
|
3月前
|
缓存 API 网络架构
Nuxt Kit API :路径解析工具
【9月更文挑战第20天】在 Nuxt Kit API 中,路径解析工具如 `resolvePath()`、`joinPaths()` 和 `relativePath()` 帮助开发者高效处理应用路径,确保资源准确加载,并支持动态路由与组件导入。这些工具提升了应用的灵活性和可扩展性,同时需注意路径准确性、跨平台兼容性和性能优化,以提升用户体验。
39 12
|
4月前
|
前端开发 API 网络架构
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
【Azure 应用服务】能否通过 Authentication 模块配置 Azure AD 保护 API 应用?
|
4月前
|
API 网络架构 开发者
【Azure 环境】调用Azure RunCommand 的REST API 设置虚拟机的环境变量(SetEnvironmentVariable)
【Azure 环境】调用Azure RunCommand 的REST API 设置虚拟机的环境变量(SetEnvironmentVariable)
|
4月前
|
JSON Java API
【Azure API 管理】通过Java APIM SDK创建一个新的API,如何为Reqeust的Representation设置一个内容示例(Sample)?
【Azure API 管理】通过Java APIM SDK创建一个新的API,如何为Reqeust的Representation设置一个内容示例(Sample)?
|
4月前
|
存储 API 开发工具
【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容
【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容
|
4月前
|
API
【Azure API 管理】Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错
【Azure API 管理】Azure API Management在设置 Policy时,如何对URL进行解码呢? 使用 HttpUtility.UrlDecode 出错
|
4月前
|
API
【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
|
4月前
|
JSON 小程序 API
【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验
【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验
|
4月前
|
API 数据安全/隐私保护 网络架构
【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
【Azure Developer】使用Postman获取Azure AD中注册应用程序的授权Token,及为Azure REST API设置Authorization
|
4月前
|
前端开发 API
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)
【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)