GetModuleFileNameA, в чем проблема?

Есть класс, в нем функция string ResponseRequest::Path_folder(). При сборке проекта в MVS 2015 в debug все хорошо и она возвращает верный путь к .exe. Но когда переключаюсь на release она неверно путь вычисляет, отдает просто букву диска и все. В чем может быть дело?

string ResponseRequest::Path_folder()
{
	TCHAR szPath[MAX_PATH];

	size_t sz = 0;

	sz = strlen(szPath);

	GetModuleFileNameA(NULL, szPath, MAX_PATH);

	for (size_t i = sz - 1;; i--)
	{
		if (szPath[i] == '\\')
		{
			szPath[i] = '\0';
			break;
		}
	}

	return szPath;
}
  • Вопрос задан
  • 1259 просмотров
Решения вопроса 1
string ResponseRequest::Path_folder()
{
  char szPath[MAX_PATH] = {}; // тут все ясно
  GetModuleFileNameA(NULL, szPath, MAX_PATH); // получаем путь
  char *lstChr = strrchr(szPath, '\\'); // указатель на последнее вхождение "\"
  *lstChr = '\0'; // заменяем на ноль (обрезаем строку)
  return szPath;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
sz = strlen(szPath);
Ну чему, блин, равняется sz?


Return value

If the function succeeds, the return value is the length of the string that is copied to the buffer, in characters, not including the terminating null character. If the buffer is too small to hold the module name, the string is truncated to nSize characters including the terminating null character, the function returns nSize, and the function sets the last error to ERROR_INSUFFICIENT_BUFFER.

Вот оттуда надо брать длину. А не из strlen неинициализированной памяти.

И идеалом было бы заложиться на пути длиннее MAX_PATH.
Ответ написан
Комментировать
15432
@15432
Системный программист ^_^
GetModuleFileNameA это ASCII версия функции. В свойствах Release у вас может быть указано использование Unicode, там требуется GetModuleFileNameW версия функции. А вообще GetModuleFileName без A или W используйте.

И да, strlen нужно использовать после вызова GetModuleFileName. И опять же, нужно TCHAR версию _tcslen использовать для совместимости с юникодом
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы