【问题标题】:_get_pgmptr vs GetModuleFileName_get_pgmptr 与 GetModuleFileName
【发布时间】:2015-03-24 19:53:01
【问题描述】:

这两者之间有什么区别(如果有的话)? MSDN 很不清楚。

听起来它们是等价的: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197%28v=vs.85%29.aspx

但在这里听起来 _pgmptr 可能并不总是给我一个完整的路径,但它并没有真正解释在什么情况下。 https://msdn.microsoft.com/en-us/library/tza1y5f7.aspx

_pgmptr 对我来说似乎更有吸引力,因为我不必用它玩缓冲区大小的猜谜游戏。

【问题讨论】:

  • _pgmptr, _wpgmptr: "当程序不是从命令行运行时,_pgmptr 可能会被初始化为程序名称(文件的基本名称没有文件扩展名)或文件名、相对路径或完整路径。” 这不是明确命名情况吗?
  • 不,它没有。 “可能”实际上并不明确。
  • 就文档而言,没有比这更明确的了:当程序不是从命令行运行时,_wpgmptr 可能不包含完整路径。如果您不关心合同,而是希望针对特定实现进行开发,则可以直接阅读 CRT 源代码。
  • @BigSandwich MSDN 文档通常是矛盾的 :)
  • @BigSandwich:请注意,您不需要缓冲区即可使用_get_pgmptr,因此这应该是您的首选方法。 (它不会将字符串复制到您提供的缓冲区中,而是将指向字符串的指针复制到您提供的指针中。)

标签: c++ c windows winapi


【解决方案1】:

_pgmptr 在内部使用 GetModuleFileName 进行初始化,所以答案是没有区别 - 它们将返回相同的字符串。

【讨论】:

  • 另外,_get_pgmptr 确实返回了 _pgmptr 的值。
【解决方案2】:

至少有一个区别:_get_pgmptr() 在应用程序初始化的早期不可用,而GetModuleFileName() 可用。因为这个,我刚刚被Static Initialization Order Fiasco 咬了:(

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多