如何正确使用GetModuleFileName?

Sun*_*ise 19 c++ getmodulefilename

以下代码:

#include <iostream>
#include <Windows.h>

using namespace std;

int main ()
{   LPWSTR buffer; //or wchar_t * buffer;
    GetModuleFileName(NULL, buffer, MAX_PATH) ;
    cout<<buffer;
    cin.get();
    cin.get();

}
Run Code Online (Sandbox Code Playgroud)

应该显示程序执行的完整路径.但是在VS 2012中我得到了错误:

使用未初始化的局部变量'缓冲区'

代码有什么问题?

Mat*_*son 28

你需要给它一个可以容纳一些字符的缓冲区;

 wchar_t buffer[MAX_PATH]; 
Run Code Online (Sandbox Code Playgroud)

例如.

  • 关于OP,我认为这是正确的.可能有些情况下这是不够的,并且会出错,但在大多数情况下,"MAX_PATH"就足够了.请注意,OP只使用未初始化的指针,这确实是错误的. (4认同)
  • 这是不正确的,`GetModuleFileName`可以为长路径返回`ERROR_INSUFFICIENT_BUFFER`. (2认同)

小智 7

VS正确指出您正在使用未初始化的缓冲区 - 缓冲区 var是指向WSTR的指针,但它没有使用静态缓冲区初始化,也没有分配.另外你应该记住,MAX_PATH通常是不够的,特别是在具有长路径名的现代系统上.

由于您使用的是C++,因此使用它的功能是一种很好的做法.我可以假设以下代码:

vector<wchar_t> pathBuf; 
DWORD copied = 0;
do {
    pathBuf.resize(pathBuf.size()+MAX_PATH);
    copied = GetModuleFileName(0, &pathBuf.at(0), pathBuf.size());
} while( copied >= pathBuf.size() );

pathBuf.resize(copied);

wstring path(pathBuf.begin(),pathBuf.end());

cout << path;
Run Code Online (Sandbox Code Playgroud)

不要直接使用wstring作为缓冲区:它没有被定义为在每个实现中都有一个连续的缓冲区(但通常是)

  • 这个答案/sf/answers/1961737781/表示该标准明确要求basic_string对象的内部缓冲区是连续的.这包括`wstring`,它是一个basic_string对象. (8认同)
  • 您可以使用“pathBuf.data()”而不是“&amp;pathBuf.at(0)”来获取指向底层数据数组的指针。https://en.cppreference.com/w/cpp/container/vector/data (4认同)