Здравствуйте! Насколько правильна данная функция по получению имени пользователя с точки зрения выделения и чистки памяти? Нужно ли чистить память и могут ли быть какие то проблемы с данным кодом? Необходимо использовать чистый winapi, так что, std::string не вариант.
bool getCU(LPTSTR* usrBuf) {
DWORD usrLen = (sizeof(usrBuf)/sizeof(*usrBuf))+1;
if (GetUserName((LPTSTR)usrBuf, &usrLen)) return true; else return false;
}
LPTSTR User[UNLEN+1];
if (getCU(User)) MessageBox(0, (LPCTSTR)User, L"", 0);
Я правильно понимаю, что я передаю функции getCU указатель на LPTSTR массив который хранится в не самой функции? Это правильный подход?
Функция совершенно бессмысленная.
Применять прием sizeof(usrBuf)/sizeof(*usrBuf) к указателю никакого смысла нет. Этот прием работает только с массивами, а не с указателями.
Почему передается LPTSTR* usrBuf? Указатель на указатель? При чем здесь указатель на указатель?
Переданный указатель на указатель LPTSTR* usrBuf силой приводится к типу LPTSTR? Это бессмысленно.
LPTSTR User[UNLEN+1] - это массив указателей. Что вы хотели этим сказать? Зачем вам понадобился массив указателей? И какой смысл передавать этот массив указателей в MessageBox, силой приведя его к LPTSTR?
Если вы пишете ваш код в терминах T-типов-"первертышей" (LPTSTR), то тогда уж придерживайтесь этого правила везде. Т.е. не L"", а _T("").
В общем код бессмыслен. В некоей изначальной форме он, очевидно, порождал простыню сообщений об ошибках от компилятора. Эти сообщения были "задушены" расстановкой явных приведений типа. Код от этого стал еще более бессмысленным.
bool getCU(LPTSTR usrBuf, DWORD usrLen)
{
return GetUserName(usrBuf, &usrLen);
}
...
TCHAR User[UNLEN+1];
if (getCU(User, sizeof User / sizeof *User))
MessageBox(0, User, _T(""), 0);
Но в чем вообще заключается идея? Зачем писать некую функцию-оболочку getCU, которая фактически ничего не делает, кроме вызова GetUserName?
typedef std::basic_string<TCHAR> tstring;
tstring getCU()
{
TCHAR usrBuf[UNLEN+1];
DWORD usrLen = sizeof usrBuf / sizeof *usrBuf;
if (!GetUserName(usrBuf, &usrLen))
usrBuf[0] = 0;
return tstring(usrBuf);
}
...
tstring User = getCU();
if (!User.empty())
MessageBox(0, User.c_str(), _T(""), 0);
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости