#delphi #path
#дельфи #путь
Вопрос:
Чтобы определить свой путь к исполняемому файлу, я не знаю, какой код мне следует использовать. Пожалуйста, объясните мне, когда и почему мы должны использовать:
1. ExtractFilePath(ParamStr(0))
2. ExtractFilePath(Application.ExeName)
Потому что оба кода отображают один и тот же вывод.
C:UsersBiancaDocumentsRAD StudioProjectsExam1Win32Release C:UsersBiancaDocumentsRAD StudioProjectsExam1Win32Release
Комментарии:
1.
Application.ExeName
геттер внутренне звонитParamStr(0)
.2. Итак, вариант 2 всегда предпочтительнее ?
3. Вот чего никто не может сказать. Если вы не хотите полагаться на
Application
объект (который должен включатьForms
единицу измерения и требует, чтобы ваше приложение было приложением форм VCL), используйтеParamStr(0)
. Если у вас есть приложение для форм VCL, и вы не возражаете включитьForms
модуль, вы можете использовать более читаемыйApplication.ExeName
. Я предпочитаюParamStr(0)
.4. Спасибо @TLama, теперь мне все ясно. 😉
5. Я думаю, что ParamStr(0) плохо работает, если приложение находится в общей сетевой папке.
Ответ №1:
Они оба дают вам один и тот же результат, но есть тонкие различия.
Приложение.ExeName ссылается на объект приложения VCL. Для использования этого свойства требуется использовать модуль Vcl.Forms. Внутренне это вызывает функцию ParamStr(0).
Обратите внимание, что класс TApplication FireMonkey не обладает этим свойством (начиная с XE5). Таким образом, вы не можете вызвать приложение.ExeName, если вы используете FireMonkey. И если вы когда-нибудь перенесете проект VCL в FireMonkey, вам придется это переписать.
Функция ParamStr OTOH является системным блоком и является мультиплатформенной (Win, Mac, iOS и Android, в зависимости от используемой версии Delphi). В Windows ParamStr(0) вызывает функцию GetModuleFileName, в то время как на других платформах она анализирует командную строку, возвращающую первый токен, который должен быть полным путем и именем запущенного исполняемого файла. (Спасибо Робу Кеннеди за это исправление)
Так… Я бы посоветовал вам использовать ParamStr(0) напрямую.
Комментарии:
1. Спасибо @frazz, очень четкое объяснение. Очень ценю это 😉
2.
ParamStr(0)
не возвращает «первый параметр команды выполнения». Вы думаете об массиве Unix и Cargv
, где ОС и среда выполнения просто пересылают любое произвольное значение , в которое было переданоexecv
, в надежде, что это имя программы. В Delphi функция специально обрабатывает 0 и вызываетGetModuleFileName
прямую выборку имени EXE-файла (во всяком случае, в Windows; я не знаю ее реализации для других платформ).3. Спасибо, что указали на это, я проверил код и обновил ответ.
Ответ №2:
Они функционально идентичны. Вы бы использовали ParamStr(0)
, если бы вам не нужны были накладные расходы на Forms
устройство и весь его багаж.