安全地获取在Windows API中运行可执行文件的路径

问题描述:

嘿, 我试图获取位于与我的exe文件相同的文件夹中的dll路径。要走的道路似乎是使用QueryFullProcessImageName()GetModuleFileName()之一来获取正在运行的可执行文件的路径,然后使用字符串操作将其作为所需库的路径。安全地获取在Windows API中运行可执行文件的路径

不幸的是,这两个函数都没有提供一种方法来提前找出所需的大小缓冲区。我试过为nSize参数传递零,但这并没有达到预期的效果。

这样做的最佳做法是什么?

+0

的[我如何计算GetModuleFileName完整的缓冲区大小?(可能重复http://*.com/questions/805814/how-can-i-calculate-the - 完成缓冲区大小为getmodulefilename) – 2011-01-30 06:47:12

+0

我看到了,但我打开使用除GetModuleFileName以外的API(尝试`QueryFullProcessName`和`GetProcessImageFileName`) – 2011-01-30 06:50:06

+0

所有这些API(除了检索模块文件名)最终涉及调用`NtQueryInformationProcess`甚至`NtQuerySystemInformation`(`SystemProcessIdInformation`)。如果Win32 API不够好,请直接调用`NtQueryInformationProcess`。但是,内核到用户的APIs不会为你分配缓冲区。 – wj32 2011-01-30 06:52:27

在实践中,您可以使用Windows API MAX_PATH作为您的缓冲区大小,可能为了额外的安全性而添加1。

理论上 Windows路径可以大得多。正如我记得MAX_PATH就像270或大约那样,而在NTFS文件系统中,路径可以高达大约(大约)32767个字符。但是,对于那么大的尺寸,它必须作为Unicode进行处理,而且重要的是,Windows资源管理器不支持这样的大路径,所以在实践中这不是问题。在实践中,如果你应该遇到如此大的路径,显然是不可能删除的,那么你可以使用Unicode命名(有一个特殊的前缀用于长路径)和/或等效的短名称(DOS 8.3名称),和/或定义逻辑驱动器以缩短路径,以便目录/文件可以被删除。

干杯&心连心,

GetModuleFilename返回复制到缓冲区的字符数。如果它小于缓冲区的大小,那就没问题。如果它等于缓冲区的大小,请分配一个更大的缓冲区并重试。