Как правильно использовать 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();

}

Должен показывать полный путь, где выполняется программа. Но в VS 2012 я получаю ошибку:

используется неинициализированная локальная переменная «буфер»

Что не так в коде?

15

Решение

Вы должны дать ему буфер, который может содержать несколько символов;

 wchar_t buffer[MAX_PATH];

например.

23

Другие решения

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 в качестве буфера напрямую: он не определен, чтобы иметь непрерывный буфер в каждой реализации (но обычно это так)

6

По вопросам рекламы [email protected]