Visual C++ 2010: argv[0] — это полный путь в режиме отладки, но только имя .exe в режиме выпуска

В Visual Studio 2010 С++ я читаю argv[0], чтобы получить рабочий каталог.

В режиме отладки он определенно показывает полный путь к каталогу и имя самого исполняемого файла (как и ожидалось)

В режиме выпуска он имеет ТОЛЬКО имя программы .exe, а не полный рабочий путь.

  1. Зачем?
  2. Как получить рабочий каталог?

person pete    schedule 19.03.2012    source источник
comment
Вероятно, мне следует использовать функцию GetCurrentDirectory для Windows.   -  person pete    schedule 19.03.2012
comment
По какой-то причине и GetCurrentDirectory, и GetModuleFileName вызывают нарушения прав доступа.   -  person pete    schedule 19.03.2012
comment
LPWSTR что угодно = (LPWSTR); int bytes = GetModuleFileName (NULL, что угодно, 4096); нарушение доступа   -  person pete    schedule 19.03.2012
comment
@Peter, whatever указывает на строковый литерал длины 0 вместо стека или выделенного в куче буфера длиной не менее 4096. Следовательно, то, что происходит, когда GetModuleFileName() пытается записать в буфер, некрасиво.   -  person Frédéric Hamidi    schedule 19.03.2012
comment
Вы должны выделить достаточно места во всем, чтобы можно было вставить туда результирующую строку. Вы сообщаете API, что имеется 4096 байтов пространства, но выделяете 1 символ (пустая строка, которая включает завершающий NULL). Я бы также опубликовал ваш исходный код argv (в вашем вопросе через редактирование), так как это довольно фундаментальное недоразумение, возможно, там было что-то подобное.   -  person Steve Townsend    schedule 19.03.2012


Ответы (1)


MSVC поместит команду, используемую для запуска исполняемого файла, в argv[0] — это не имеет ничего общего с текущим рабочим каталогом.

Например, если для запуска foo.exe используется следующая команда:

  • foo, а исполняемый файл, который я нашел путем поиска по пути, argv[0] будет foo
  • c:\foos-dir\foo, (путь не ищется) argv[0] будет c:\foos-dir\foo
  • foo.exe, argv[0] будет foo.exe

и Т. Д.

Возможно, вам следует получить текущий рабочий каталог с помощью API Win32 GetCurrentDirectory() или функция _getcwd() выполнения.

Вот краткий пример использования GetCurrentDirectory():

TCHAR buffer[128];           
DWORD const buffer_chars = sizeof(buffer)/sizeof(buffer[0]);

DWORD result = GetCurrentDirectory( buffer_chars, buffer);

if ((result == 0) || (result >= buffer_chars)) {
    puts("problem getting the working directory");        
    exit(1);
}

printf( "Current working directory: %s\n", buffer);
person Michael Burr    schedule 19.03.2012
comment
Спасибо. Я попытался использовать GetCurrentDirectory и потерпел неудачу. Когда я делаю следующее, это дает мне нарушение прав доступа: LPWSTR what = (LPWSTR); int ret = GetCurrentDirectory(4096, что угодно); - person pete; 19.03.2012
comment
Ваш указатель whatever указывает на буфер, который нельзя изменить (это строковый литерал), тем более не имеющий ничего общего с размером 4096. Я обновлю ответ коротким примером использования GetCurrentDirectory(). - person Michael Burr; 19.03.2012
comment
Вероятно, вам следует использовать MAX_PATH вместо жестко заданного 128. Кроме того, Visual C++ определяет _countof() для определения размера статических массивов. (Сохраняет синтаксис buffer/buffer[0].) - person Joseph Willcoxson; 20.03.2012