Это может произойти, когда ваша программа порождается с помощью CreateProcess - посмотрите описание параметра lpCommandLine .По сути, это программа, вызывающая CreateProcess, чтобы заполнить этот первый параметр, поэтому может случиться так, что значение не будет заполнено обычным способом.
По ссылке:
"ЕслиlpApplicationName и lpCommandLine не равны NULL, строка с нулевым символом в конце, на которую указывает lpApplicationName, указывает модуль для выполнения, а строка с нулевым символом в конце, на которую указывает lpCommandLine, указывает командную строку. Новый процесс может использовать GetCommandLine для получения всей команды.Консольные процессы, написанные на C, могут использовать аргументы argc и argv для разбора командной строки. Поскольку argv [0] - это имя модуля, программисты на C обычно повторяют имя модуля в качестве первого токена в командной строке. "
Аналогично, это может произойти, если ваша программа запускается из другой программы с использованием семейства функций spawn .Там документация гласит:
"По крайней мере один аргумент, либо arg0, либо argv [0], должен быть передан дочернему процессу. По соглашению, этот аргумент является копией аргумента pathname. Однакодругое значение не приведет к ошибке. "