Следующий код:
#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();
}
Должен показывать полный путь, где выполняется программа. Но в VS 2012 я получаю ошибку:
используется неинициализированная локальная переменная «буфер»
Что не так в коде?
Вы должны дать ему буфер, который может содержать несколько символов;
wchar_t buffer[MAX_PATH];
например.
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;
Не используйте wstring в качестве буфера напрямую: он не определен, чтобы иметь непрерывный буфер в каждой реализации (но обычно это так)