Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2009, 00:06   #11
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

ParamStr(0) всегда даёт нормальный путь. Из ParamStr:
Код:
 if Index = 0 then
    SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)))
Somebody вне форума Ответить с цитированием
Старый 12.02.2009, 12:48   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,863
По умолчанию

Ситуация прояснилась. Нормальный путь даёт Делфи, но подменить параметр 0 в самой системе возможно. Вот пример, выводим всю командную строку:
Код:
uses
  Dialogs;

const kernel = 'kernel32.dll';

function GetCommandLine: PChar; stdcall;
  external kernel name 'GetCommandLineA';

begin
  ShowMessage (GetCommandLine);
end.
Теперь, если вызвать эту программу так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  if OpenDialog1.Execute then
  begin
    FillChar (StartUpInfo, SizeOf (StartUpInfo), 0);
    StartUpInfo.cb := SizeOf (StartUpInfo);
    StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartUpInfo.wShowWindow := SW_SHOWNORMAL;
    CreateProcess (PChar (OpenDialog1.FileName), 'C:\WINDOWS\NOTEPAD.EXE the1st', nil, nil, False, 0,
      nil, 'C:\WINDOWS\', StartUpInfo, ProcessInfo);
  end; {if}
end;
То мы получим подменённый 0-й параметр, т.е. там будет "C:\WINDOWS\NOTEPAD.EXE".
Мягко говоря, реализация функции ParamStr противоречит тому, что описано в хэлпе.
Arigato вне форума Ответить с цитированием
Старый 12.02.2009, 13:28   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Arigato
Чет я не догнал, параметр 0 - это C:\WINDOWS\NOTEPAD.EXE
В чем же тут подмена, о которой ты говориш?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.02.2009, 13:39   #14
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,863
По умолчанию

Ну так я запуская свою программу, в которую передаётся 0-вой параметр в виде C:\WINDOWS\NOTEPAD.EXE, т.е. не путь к проге, а путь к блокноту
Arigato вне форума Ответить с цитированием
Старый 12.02.2009, 13:52   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Arigato
Опять не вьехал...
Ты запускаш свою прогу так:
Код:
project1.exe C:\WINDOWS\NOTEPAD.EXE
Но ParamStr(0) - как и сказанно правильно в хелпе - returns the command used to execute the program, without parameters
т.е. все правильно и законо и никакая подмена не пройдет.
И вернет оно тебе <путь>\Project1.exe
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.06.2012, 16:22   #16
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Хоть и поднимаю некротему, но всё равно на чём сошлись то?
Что всё таки точнее всего будет указывать путь к моему запускаемому файлу ParamStr(0) или Application.ExeName?
FaTaL вне форума Ответить с цитированием
Старый 14.06.2012, 16:44   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Хоть и поднимаю некротему, но всё равно на чём сошлись то?
Что всё таки точнее всего будет указывать путь к моему запускаемому файлу ParamStr(0) или Application.ExeName?
не знаю, на чём там сошлись, но, если речь идёт про Delphi, то это, строго говоря - ОДНО И ТО ЖЕ.

точнее, в модуле Forms
у application есть такое:
Код:
  TApplication = class(TComponent)
  private
...
    function GetExeName: string;
...
  public
...
    property ExeName: string read GetExeName;
...

function TApplication.GetExeName: string;
begin
  Result := ParamStr(0);
end;
какие-нибудь вопросы по поводу того, что лучше, ещё остались?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.06.2012, 17:29   #18
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Нет. Спасибо.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инфа по ВинАПИ mogul82 Win Api 6 28.10.2008 08:16
application.ProcessMessages; UROKSAN Общие вопросы Delphi 2 10.04.2008 13:32
Application.terminate GAGARIN-NEW Общие вопросы Delphi 11 09.03.2008 19:32
Application.ProcessMessages =LeonZone= Общие вопросы Delphi 11 27.01.2008 21:31
Application.ProcessMessages KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.08.2007 23:38