Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

WinExec не везде выполняется, что неправильно?   Найти похожие ветки 

 
lipskiy   (2004-01-27 22:31) [0]

Недавно задавал вопрос насчет экспорта ветки реестра в файл. Остановился на варианте выполнения regedit с ключом.
На моем компе работает.
Юзеры пишут - не работает, винда та же.

Вот строчка:
WinExec(PChar("regedit /e "+FileName+" HKEY_CURRENT_USER\Software\MyKey"),SW_HIDE);
Что может быть неверно? Почему не везде работает?

И есть ли разница, если выполнить так:
ShellExecute(Handle,"","regedit",PChar("/e "+FileName+" HKEY_CURRENT_USER\Software\MyKey"),"",SW_HIDE);


 
Islander   (2004-01-27 22:33) [1]

А ты знаешь разницу между WinExec и Shellexecute?


 
хз   (2004-01-27 22:54) [2]

> И есть ли разница

Надо немного подумать и ответ приходит в голову сам собой. Если бы эти две функции были бы одинаковыми, то оставили бы только одну, правильно? Лучше используй ShellExecute.


 
Islander   (2004-01-27 23:05) [3]

ShellExecute может открывать документы, папки и прочее, а WinExec запускает приложения


 
lipskiy   (2004-01-27 23:20) [4]

Не знаю разницы, поэтому и спрашиваю.
И все равно ее не вижу.
Чем отличаются понятия "открыть документ" и "запустить приложение"? и то и другое это "выполнить команду", какая разница? И то и другое выполняется из Пуск-выполнить. Можно подумать открытие документа или папки это не есть запуск приложения??? А кто тогда открывает документ? Не приложение?


 
Palladin   (2004-01-27 23:48) [5]

А разницу между word.exe и document1.doc знаешь?


 
Юрий Федоров   (2004-01-27 23:59) [6]

Выполнение команды через Пуск-выполнить и через Пуск-программы-командная строка - это разные вещи, работают они по разному

Не работать может в случае, если FileName содержит пробелы


 
lipskiy   (2004-01-28 00:09) [7]


> Не работать может в случае, если FileName содержит пробелы

А как быть с пробелами тогда?


> А разницу между word.exe и document1.doc знаешь?

Лучше бы объяснили, что имеется ввиду, а не язвили.
Или уже document1.doc можно открыть без word.exe?
То есть можно запустить программу word.exe, а можно открыть документ document1.doc и это будут совершенно несвязанные действия? Как интересно!
Что вы тут все крутите вокруг да около, если знаете - скажите, что вы понимаете под разницой в открытии документа и запуска приложения. Я разницы не вижу. Если вы имеете ввиду запуск ворда с параметром имени документа чтоб его открыть сразу, то в этом разницы нет никакой, по любому запускается приложение. Документ без приложения запустить нельзя, не парьте.


 
lipskiy   (2004-01-28 00:28) [8]

Специально для Islander, хз и Palladin.
Думаю, авторитет Анатолия Подгорецкого не вызывает у вас сомнений?
Вот цитата из его FAQ:
http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N38


WinExec() или ShellExecute. Первая оставлена для совместимости с Win 3.1, у второй к тому же больше возможностей.


Ну что? Велика разница? Приложения и документы конечно же тут явно разные вещи!


 
Islander   (2004-01-28 00:32) [9]

2lipskiy. Смотри код, котором я исползую эти две функции. Если бы я использовал только одну, код как минимум был бы больше. И оставлена ли WinExec только для совместимости, дело не меняет.

If AnsiSameText(CurrentTypesList [index], "Command Line") then
begin
If DirectoryExists(CurrentFieldsList [index]) then
begin
Res:=ShellExecute (Application.Handle, "Open" ,
PChar (CurrentFieldsList [index]), nil, nil, SW_SHOWNORMAL);

If Res<=32 then
ShowErrorMsg(TranslateMsg("msgErrorExploreFolder") )

end
else
begin
Res:= WinExec(PChar (CurrentFieldsList [index]), SW_SHOWNORMAL);
If Res<=31 then
begin
Res:=ShellExecute (Application.Handle, "Open" ,
PChar (CurrentFieldsList [index]), nil, nil, SW_SHOWNORMAL);

If Res<=32 then
ShowErrorMsg(TranslateMsg("msgErrorExecutingFile") )
end;
end;
exit;
end;

Т.е. здесь можно указать папку, файл документа или исполняемый файл или вообще что то вида ping www.ru и это все автоопределится и выполнится так как надо.


 
Islander   (2004-01-28 00:34) [10]

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


 
lipskiy   (2004-01-28 00:56) [11]

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


 
Islander   (2004-01-28 01:05) [12]

Нет, не одно и то же! Ты понял, зачем я пример привел?!

1) Сначала проверяется, является ли указнный путь CurrentFieldsList [index] папкой. Если является, то я запускаю ShellExecute с параметром open, чтобы открыть папку. Замечу, что с WinExec ты этого не сделаешь

2) Если это не папка, то я пытаюсь выполнить это WinExec. Здесь выполнятся команды типа: "calc", "C:\Windows\Notepad.exe", "ping www.ru" и прочие...

3) Если эта функция вернет код ошибки, то я предполагаю с 70% вероятностью, что это документ типа c:\Doc1.doc и пробую его открыть ShellExecute как документ. Если и это не проходит, то в командной строке был передан полный бред и я вывожу сообщение об ошибке.


 
Islander   (2004-01-28 01:05) [13]

Понял отличия?


 
VID   (2004-01-28 01:13) [14]

to lipskiy:

Function RunFile(FileName, Params:String):Integer;
begin
Result := ShellExecute(0,nil,pchar(filename),pchar(params),pchar(extractfilepath(filename)),sw_normal{sw_hide});
end

простая оболочка для ShellExecute - есть и имя файла и его параметры.
в твоём случае это

RunFile("regedit.exe", "/e "+FileName+" HKEY_CURRENT_USER\Software\MyKey");


 
lipskiy   (2004-01-28 01:25) [15]


> Если является, то я запускаю ShellExecute с параметром open,
> чтобы открыть папку. Замечу, что с WinExec ты этого не сделаешь

Честно говоря, думал что можно. Правда не открывается. Дело в параметрах.


> Понял отличия?

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

Ладно, закроем тему. Спасибо за разъяснения, сразу бы так и сказали. Не пользовал я их никогда, поэтому не знал.


> VID © (28.01.04 01:13) [14]

Да, это ясно, но проблема по ходу действительно с пробелами в пути была.


 
Islander   (2004-01-28 02:06) [16]

2lipskiy ты опять неправ.
>Я понял, что ShellExecute полностью перекрывает возможности WinExec и имеет дополнительные.

С ShellExecute ты никогда не выплнишь команду "ping www.ru"

попробуй


 
lipskiy   (2004-01-28 22:16) [17]

Ок, согласен.


 
Юрий Федоров   (2004-01-28 22:25) [18]

>>Islander (28.01.04 02:06) [16]
Выполнишь.
"CMD ..."


 
nikkie   (2004-01-29 01:44) [19]

я убит наповал...
почему надо искать факи и ссылаться на авторитет АП вместо того, чтобы просто прочитать хелп?

The WinExec function runs the specified application.

Note This function is provided only for compatibility with 16-bit Windows. Win32-based applications should use the CreateProcess function.


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

>> А разницу между word.exe и document1.doc знаешь?

>Лучше бы объяснили, что имеется ввиду, а не язвили.
>Или уже document1.doc можно открыть без word.exe?

да.

То есть можно запустить программу word.exe, а можно открыть документ document1.doc и это будут совершенно несвязанные действия? Как интересно!
да. по-твоему, если у пользователя нет программы word.exe, то он уже .doc открывать не может? сразу после установки .doc открывается с помощью wordpad. потом существуют и другие офисные пакеты кроме MSOffice. в конце концов что мешает юзеру ассоциировать расширение .doc с notepad-ом?

И есть ли разница, если выполнить так:
ShellExecute(Handle,"","regedit",PChar("/e "+FileName+" HKEY_CURRENT_USER\Software\MyKey"),"",SW_HIDE);

я бы не стал. что, если в текущей папке окажется под-папка regedit?

Вот строчка:
WinExec(PChar("regedit /e "+FileName+" HKEY_CURRENT_USER\Software\MyKey"),SW_HIDE);
Что может быть неверно? Почему не везде работает?

надо ошибки обрабатывать прежде всего.
If the function succeeds, the return value is greater than 31.
If the function fails, the return value is one of the following error values: ...


 
Anatoly Podgoretsky   (2004-01-29 09:07) [20]

lipskiy © (28.01.04 00:28) [8]
Разница огромная,

WinExec редназначен для запуска конкретного приложения, о чем ранее сказали и пожтому рекомендуется заменять ее на CreateProcess.

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

В общем случае ShellExecute удобнее, чем CreateProcess, но имеет меньше возможностей, но больше чем WinExec.

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

Рекомендации производителя надо воспринимать как приказы, подлежащие к неукоснительному исполнению!


 
Anatoly Podgoretsky   (2004-01-29 09:14) [21]

По другому

WinExec - это просто выполнить (запустить исполнимый файл)
ShellExecute - выполнить шелл, а что он будет делать это его дело

Плюс у ShellExecute более богатый набор параметров


 
lipskiy   (2004-01-29 22:13) [22]

Ну вот, г-н Подгорецкий как всегда все расставил по местам.
Неужели всем остальным сложно было сразу сказать простую вещь:

> ShellExecute предназначен для вызова шела, как и следует
> из названия, это разновидность запуска по расширению, поэтому
> он может запускать другие приложения не напрямую, а через
> ассоциацию с расширением.

А то развели, приложения.., документы...
И не парьте меня, нельзя открыть документ без приложения!
Какая разница какого, ворда или блокнота, все равно приложения, документы сами не открываются.
Если уж помогаете разобраться, так будьте точны в терминах и определениях.

А в общем, спасибо всем за внимание и помощь.


 
Rouse_   (2004-01-29 22:28) [23]

> [16] Islander (28.01.04 02:06)
И чтож это ты такое сказал?

ShellExecute(handle, "open", "ping", "www.ru", nil, SW_NORMAL);

Пробуй и удивись...


 
nikkie   (2004-01-30 01:50) [24]

>Неужели всем остальным сложно было сразу сказать простую вещь:
>> ShellExecute предназначен для вызова шела, как и следует
>> из названия, это разновидность запуска по расширению, поэтому
>> он может запускать другие приложения не напрямую, а через
>> ассоциацию с расширением.


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

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

короче, не самый удачный пример ты привел как демонстрацию точности терминов и определений. :)
и вообще, точность лучше не в форуме искать, а в документации.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.007 c
14-29559
Agent13
2004-01-20 15:39
2004.02.10
Delphi 7 Trial


1-29365
lipskiy
2004-01-31 01:33
2004.02.10
Странное поведение TWebBrowser при изменении бордюра формы


8-29484
dzmitry_
2003-10-07 12:33
2004.02.10
векторный редактор


4-29659
Pohil
2003-12-05 10:34
2004.02.10
Как скрыть процесс под NT


1-29363
MakNik
2004-01-29 11:55
2004.02.10
dxDBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский