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)
例如.
小智 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作为缓冲区:它没有被定义为在每个实现中都有一个连续的缓冲区(但通常是)