2013-09-13 2 views
14

следующий код:Как правильно использовать 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 я получаю ошибку:

uninitialized local variable 'buffer' used

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

ответ

21

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

wchar_t buffer[MAX_PATH]; 

например.

+2

Это неправильно, 'GetModuleFileName' может возвращать 'ERROR_INSUFFICIENT_BUFFER' для длинного пути. – KindDragon

+3

Что касается OP, я думаю, что это правильно. Может быть, есть обстоятельства, когда этого недостаточно, и возникает ошибка, но для большинства случаев достаточно «MAX_PATH». Обратите внимание, что OP просто использует неинициализированный указатель, и это НЕКОТОРЫЕ ошибки. –

5

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

+7

Этот ответ https://stackoverflow.com/a/28024825/ гласит, что стандарт явно требует, чтобы внутренний буфер объектов basic_string был смежным. Это включает в себя 'wstring', который является объектом basic_string. – GetFree

 Смежные вопросы

  • Нет связанных вопросов^_^