• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Открыть файл из Delphi

  • Автор темы DenProx
  • Дата начала
D

DenProx

Длброго времени суток. У меня такой вопрос: есть программка которая позваляет запускать программы, например открывается видео. Вопрос в том, возможно ли открыть файл с параметрами, типа - Открыть с помощью?

Пример реализации: нужно запустить два видео файла с разными плеерами.
 
V

vital

Нихрена не понял.

Добавлено: а, короче
uses
shellapi;
======
ShellExecute(0, 'open', 'путькекзе', 'параметры', nil, SW_SHOWNORMAL);
Пс.
или меняйте занятие, или учитесь задавать вопросы..
 
D

DenProx

Да, извините, действительно сейчас прочитал, сам не понял что)))) утомленность сказывается....

думаю на примере будет понятней:
вот два способа которыми я пытаюсь открыть файл:
1.
Код:
procedure TfmOpen.btnOpenClick(Sender: TObject);
var
str: string;
i: integer;
begin
str:=FileListBox.FileName;
ShellExecute(0,'open',PChar(str),'','',SW_SHOW);
fmProgress.ShowModal;
Close;
end;

этот просто открывате файл, программой которая стоит по умолчанию в Винде. Например открываем видео файл, он открывается Media Player Classic.

2.
Код:
procedure TfmOpen.Button1Click(Sender: TObject);
{$define WIDE} // если Unicode
var
cmdLine, fName: {$ifdef WIDE}WideString{$else}string{$endif};
si: TStartupInfo;
pi: TProcessInformation;
begin
cmdLine := '"C:\Program Files\Light Alloy\LA.exe" /Play ';
fName  := '"'+ FileListBox.FileName +'"';
// WinExec(PChar(cmdLine + fName), SW_SHOW); // только для string

FillChar(si, SizeOf(si), #0);
with si do begin
cb := SizeOf(si);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;

if {$ifdef WIDE}CreateProcessW{$else}CreateProcessA{$endif}(
nil,					// lpApplicationName,
{$ifdef WIDE}pWideChar{$else}pChar{$endif}(cmdLine + fName), // lpCommandLine,
nil,					// lpProcessAttributes,
nil,					// lpThreadAttributes,
True,				  // bInheritHandles,
0,					 // dwCreationFlags
nil,					// lpEnvironment,
nil,					// lpCurrentDirectory,
si,					 // lpStartupInfo,
pi) then begin					// lpProcessInformation
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
end;
end;

этот способ открывает с помощью нужной программы, которую укажем... но он не может открыть файл по ярлыку....

вот вопрос, в том как сделать открытие файла на подобии второго способа, но чтобы он ярлык тоже мог открывать...

на данный момент, если открыть ярлык, от тогоже видео, то программа в итоге пытается открыть ярлык, как отдельный файл, естественно выходит ошибка...

вот, как то так...
 
V

vital

ну так вы посмотрите свой первый вариант. ВЫ там передаете не то и не так. В моем посте я же написал вам..
 
D

DenProx

почему не так... почти ни какой разници по моему...
 
D

DenProx

ну вот ваш:

ShellExecute(0, 'open', 'путькекзе', 'параметры', nil, SW_SHOWNORMAL);

вот мой:

ShellExecute(0,'open',PChar(str),'','',SW_SHOW);


у меня PChar(str) - это путь к *.ехе, параметры пустые, nil - отсутствует и SW_SHOWNORMAL от SW_SHOW не многим отличается, что в общем то на результат хоть как не влияет...

где здесь указывать, с каким приложением нужно открыть?
 
V

vital

ShellExecute(0, 'open', 'путь_к_программе_которой_открывать_файл', 'файл_который_этой_программой_надо_открыть', nil, SW_SHOWNORMAL);
Так понятнее?
 
D

DenProx

Понятнее, но всеравно не работает...

вот что я пишу:
Код:
ShellExecute(0,'open','C:\Program Files\Light Alloy\LA.exe',PChar(str),nil,SW_SHOWNORMAL);

открывается LA, но файл найти не может. Попробывал проверить путь "str", вывел в сообщение, путь нормальный, полный...

что можете посоветовать?
 
D

DenProx

да помогло, но... теперь ошибка такая же как и при использовании CreateProcess (мой второй пример), а именно, LA ярлык открывает как отдельный файл...
 
V

vital

if fileext(str)='lnk' then
begin
ShellExecute(0,'open','ВАШ_ЯРЛЫК','','',SW_SHOW);
end
else
было выше
 
V

vital

Ну а самостоятельно посмотреть функцию никак? Очевидно же, что она делает!
ExtractFileExt() там.
 
D

DenProx

как же я могу знать... если я только учусь...?

темболее, мы вернулись к тому, что было у меня в первом прмере...


ShellExecute(0,'open','ВАШ_ЯРЛЫК','','',SW_SHOW);

открывает, но со стандартным плеером... как у меня и работало, до того как я создал эту тему...
 
E

EdgarWine

Хм... Поясните что ваша программа конкретно должна делать? Мне вот почему-то показалось что вы хотите чтоб файлы (например avi) открывались вашей программой по умолчанию...
Тогда при запуске нужно открывать файл имя которого в ParamStr(1)...
 
D

DenProx

Вопрос уже решен, т.е. не освсем, но смысл в том что, так как мне нужно нельзя сделать на сегодняшни день....
 
D

DenProx

ни чего и не нужно говорить, просто ярлык из подмоей прораммы нужно открыть не простой, а измененный программой UltraMon...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!