1
9
执行一些合理的策略来增加缓冲区,比如从max_path开始,然后使每个连续的大小比前一个大1.5倍(或者对于较少的迭代大2倍)。迭代直到函数成功。 |
2
10
通常的方法是调用它,将大小设置为零,并保证失败并提供分配足够缓冲区所需的大小。分配一个缓冲区(不要忘记nul终止的空间)并再次调用它。
在很多情况下
不要忘记最终从提供缓冲区的分配器返回缓冲区。
编辑:
弗朗西斯在评论中指出
不适用于
我不知道那个API的作者在想什么,只是当它被引入时,
哦,是的,不要忘记自1995年以来的路径名允许使用Unicode字符。因为unicode占用了更多的空间,任何路径名都可以被
在标题为 File Names, Paths, and Namespaces :
所以一个简单的答案是分配一个大小为的缓冲区
溢流
对于开始的网络名称的路径长度限制也可能存在一些混淆。”
|
3
2
虽然API是糟糕设计的证明,但解决方案实际上非常简单。很简单,但也很遗憾,必须这样做,因为它可能需要多个内存分配,这在某种程度上是一种性能消耗。以下是解决方案的一些关键点:
这意味着,如果返回值正好等于缓冲区大小,您仍然不知道它是否成功。可能还有更多的数据。或者没有。最后,只有当缓冲区长度实际大于所需长度时,才能确定是否成功。悲哀地。。。 所以,解决方案是从一个小的缓冲区开始。然后,我们调用getmodulefilename,传递精确的缓冲区长度(在tchars中),并将返回结果与它进行比较。如果返回结果小于缓冲区长度,则返回成功。如果返回结果大于或等于缓冲区长度,则必须使用较大的缓冲区重试。冲洗并重复,直到完成。完成后,我们对缓冲区进行字符串复制(strdup/wcsdup/tcsdup),清理并返回字符串副本。这个字符串将具有正确的分配大小,而不是来自临时缓冲区的可能开销。请注意,调用方负责释放返回的字符串(strdup/wcsdup/tcsdup mallocs memory)。 请参阅下面的实现和使用代码示例。我已经使用这个代码十多年了,包括在企业文档管理软件中,在那里有很多很长的路要走。当然,可以通过各种方式优化代码,例如,首先将返回的字符串加载到本地缓冲区(tchar buf[256])。如果缓冲区太小,则可以启动动态分配循环。其他的优化是可能的,但这超出了这里的范围。 实施和使用示例:
说了这么多之后,我想指出您需要非常了解getmodulefilename(ex)的各种其他注意事项。32/64位/wow64之间存在不同的问题。另外,输出不一定是完整的、长的路径,但很可能是短文件名,或者受路径别名的影响。我希望当您使用这样一个函数时,目标是为调用者提供一个可用的、可靠的完整的、长路径,因此我建议确实要确保返回一个可用的、可靠的、完整的、长绝对路径,这样它就可以在各种Windows版本和体系结构之间移植(同样是32/64位/wow64)。如何有效地做到这一点超出了这里的范围。 虽然这是现存的最糟糕的win32 API之一,但我还是希望您能享受编码的乐趣。 |
4
1
使用
可能奏效。 从getmodulefilename的文档中:
但是,如果我读到关于pgmtpr的文章:
谁知道如何初始化pgmptr?如果有后续问题的支持,我会将此问题作为后续问题发布。 |
5
0
Windows无法正确处理超过260个字符的路径,因此只需使用max_path。 不能运行路径长于max_path的程序。 |
6
0
我的例子是“如果一开始你不成功,将缓冲区的长度增加一倍”方法的具体实现。它使用字符串(实际上是
|
7
-2
我的方法是使用argv,假设您只想获取正在运行的程序的文件名。当您尝试从不同的模块获取文件名时,唯一安全的方法是在不使用任何其他技巧的情况下完成此操作,这里可以找到一个实现。
我还没有发现argv不包含文件路径(win32和win32控制台应用程序)的情况。但为了防止出现上述解决方案的倒退。在我看来有点难看,但还是能完成任务。 |
Community wiki · 需要改变的用户界面模式? 1 年前 |
LITzman · 使用状态处理颜色主题更改 1 年前 |
Community wiki · 进程。退出(0):输出消失? 1 年前 |
arsaces · 将文本添加到特定文件的末尾 2 年前 |
YGranja · 库<图形。h> MinGW-W64缺少 2 年前 |
Felipe Palermo · Ctrl键仍被按下,按键事件() 2 年前 |
HCJ · win cmd中的批处理脚本循环 2 年前 |