Чем отличается запуск исполняемого файла из командной строки Windows от проводника Windows? - PullRequest
1 голос
/ 29 июня 2011

РЕДАКТИРОВАТЬ: Это из-за глупости.Это проблема с несколькими мониторами.Просто из cmd.exe мы всегда открывались на основном мониторе, а из проводника мы всегда открывались на вторичном мониторе.Спасибо всем за помощь!

Недавно мы обнаружили странную ошибку.У нас есть приложение Qt + osg, которое ведет себя по-разному, если мы запускаем его из проводника, а не из командной строки.Запуск из проводника непригоден, тогда как запуск из командной строки (или при запуске из проводника простой пакетный файл, который вызывает .exe) работает должным образом.

Мы подозреваем переменные среды, потому что это все, что мы можем думать,Но тот факт, что он работает нормально с однострочным пакетным файлом, кажется, опровергает это.Я недостаточно знаком с окнами, чтобы знать о каких-либо тонких различиях в том, как он загружает исполняемые файлы, и где искать, чтобы выяснить.

Есть ли другие различия, которые могли бы объяснить это?Загружает ли Windows разные наборы переменных среды пользователя в каждом случае?ОС Windows XP с пакетом обновления 3.

Поведение при запуске из проводника (двойной щелчок program.exe) соответствует проблеме с драйвером или неправильной настройке сцены OSG: артефакты изображения, мигающие и странные цвета.

Поведение, возникающее при запуске того же исполняемого файла из cmd.exe (или двойным щелчком по файлу .bat рядом с .exe, содержащим только строку для запуска .exe), является правильным ожидаемым поведением: сценаправильно, не мигает и т. д.

Ответы [ 4 ]

1 голос
/ 29 июня 2011

Чтобы исключить потенциальные проблемы с путями загрузки библиотеки, попробуйте использовать локальное перенаправление DLL.

Для этого создайте (пустой) файл в том же каталоге, что и исполняемый файл, и присвойте ему то же имя, что иВаш бинарный файл, кроме .local.То есть, если ваш двоичный файл называется yourbinary.exe, назовите этот файл yourbinary.exe.local.Это заставит загрузчик PE сначала посмотреть в этом каталоге, чтобы разрешить вызовы LoadLibrary (и это включает в себя DLL, загруженные косвенно через системные DLL или через COM, независимо от того, сколько уровней косвенности задействовано). Поместите столько вспомогательных DLL (включая библиотеки Qt)в этом каталоге.Если вы используете плагины Qt, также поместите туда каталог plugins (или используйте пользовательский trolltech.conf.)

Более подробную информацию о локальном перенаправлении точек здесь, например .

0 голосов
/ 29 июня 2011

Вы не предоставили достаточно подробностей, поэтому я дам вам общий ответ.Чтобы использовать QT и его инструменты, вам нужны 2 переменные окружения.* QTDIR и PATH * Убедитесь, что у вас есть эти инструкции по установке переменных, приведенные ниже.Я взял их с этого сайта.См. Также эту ссылку для развертывания в windows.

Установите переменную среды QTDIR.

1) Создайте новую системную переменную с именем: QTDIR a.Щелкните правой кнопкой мыши на Мой компьютер -> Свойства -> вкладка «Дополнительно» -> «Переменные среды» b.Найти Системные переменные -> Создать -> Введите «QTDIR» 2) Установите значение в: C: \ your \ Qt \ directory (ВНИМАНИЕ: без завершающего символа '\' !!!)

Теперь добавьтеQTDIR в вашей переменной PATH.

1) Отредактируйте вашу переменную PATH, добавьте в конце ее ';'если он еще не в конце.2) Теперь добавьте:% QTDIR% \ bin;

Пример:

До PATH =% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;После этого PATH =% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% QTDIR% \ bin;

Это будет гарантировать, что наши приложения Qt смогут найтиDLL-файлы Qt при запуске.

Надеюсь, это поможет.

0 голосов
/ 29 июня 2011

Возможно, есть разница, связанная с тем, что Explorer запускает исполняемый файл и напрямую запускает его из консоли. Я думаю, что Explorer использует ShellExecute или ShellExecuteEx , и я сомневаюсь, что выполнение приложения из консоли или командного файла делает то же самое.

Я бы создал тестовое приложение, которое пробует некоторые варианты ShellExecute и использовал другие параметры, чтобы посмотреть, можно ли воспроизвести поведение Explorer, чтобы попытаться определить, какие параметры, переданные в ShellExecute, могут вызывать проблему.

На странице ShellExecuteEx есть интересное примечание сообщества, которое может или не может быть применимо: ShellExecuteEx ignores the current input desktop. It always uses winsta0\default. Instead use ShellExecute or CreateProcess.

Я бы также выяснил, влияет ли AppCompatFlags на приложения, запускаемые консолью (или посмотреть, установлены ли для вашего приложения какие-либо AppCompatFlags).

0 голосов
/ 29 июня 2011

Эта ветка выглядит так, как будто может иметь ответ на ваш вопрос:

http://forum.soft32.com/windows/Start-Run-Command-Prompt-ftopict353085.html

Короче говоря, я думаю, что он может искать ваш исполняемый файл в разных местах, в зависимости от того, какой метод вы пытаетесь использовать для его запуска. Возможно, у вас есть 2 разные версии, которые скрываются где-то, что исследователь использует вместо той, которую вы хотите?

...