![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция ShellExecute
Grant © (2006-04-11 12:27:00)Всем привет. Возник такой вопрос: Если мне надо запустить какую-нибудь прогу с помощью ShellExecute, то как мне узнать что надо передавать в качестве значения её четвертого параметра?(с другими параметрами все ясно)
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory,
INT nShowCmd );
Sour Smile (2006-04-20 13:55:00) [1]
> fellix (20.04.06 13:33) [15]
> Поищи CpuWHelper (напр., на delphipages).
Огромное спасибо! :)
fellix (2006-04-20 13:33:00) [2]
> Sour Smile (20.04.06 13:06) [14]
Поищи CpuWHelper (напр., на delphipages).
Sour Smile (2006-04-20 13:06:00) [3]
> fellix (11.04.06 13:54) [9]
>
> test.dpr.6: ShellExecute(0, '', 'cmd', '', '', SW_SHOWNORMAL);
>
> 00403B20 6A01 push $01
> 00403B22 68443B4000 push $00403b44
> 00403B27 68443B4000 push $00403b44
> 00403B2C 68483B4000 push $00403b48
> 00403B31 68443B4000 push $00403b44
> 00403B36 6A00 push $00
> 00403B38 E83BFFFFFF call ShellExecute
> test.dpr.7: end.
> 00403B3D E806F1FFFF call @Halt0
> 00403B42 0000
> 00403B44 0000
> 00403B46 0000
Извините, что вмешиваюсь не совсем по теме, но как это тебе удалось скопировать код из окна CPU? Или ты это ручками набирал?
Grant (2006-04-11 14:39:00) [4]Всем спасибо.
Anatoly Podgoretsky (2006-04-11 14:17:00) [5]Сергей М. © (11.04.06 13:57) [10]
Давай не будем про любой компилятор!
Другой компилятор вполне может передать пустую строку, а не nil, а другой наоборот, а вот работа функции может сильно зависить от этого и в АПИ таких место много, где в случае nil один результат, а в случае пустой строки другой результат.
fellix (2006-04-11 14:08:00) [6]
> Сергей М. © (11.04.06 13:57) [10]
Давай не будем говорить о любом.
В прототипе указан параметр LPCTSTR (PChar), поэтому "лобовая" реакция - сообщение о несоответствии типов, а подстановка адреса константы - уже элемент "разумного поведения".
Сергей М. (2006-04-11 13:57:00) [7]
> fellix (11.04.06 13:54) [9]
> В данном случае это особенность компилятора Delphi
И в данном и не в данном - это "особенность" любогокомпилятора, не обладающего ИИ.
fellix (2006-04-11 13:54:00) [8]
> Игорь Шевченко © (11.04.06 13:20) [4]
В данном случае это особенность компилятора Delphi: создается константа - пустая null-terminated string, а как параметр передается ссылка на нее.
program test;
uses Windows, ShellApi;
begin
ShellExecute(0, '', 'cmd', '', '', SW_SHOWNORMAL);
end.
------------------------------------------------------------
test.dpr.6: ShellExecute(0, '', 'cmd', '', '', SW_SHOWNORMAL);
00403B20 6A01 push $01
00403B22 68443B4000 push $00403b44
00403B27 68443B4000 push $00403b44
00403B2C 68483B4000 push $00403b48
00403B31 68443B4000 push $00403b44
00403B36 6A00 push $00
00403B38 E83BFFFFFF call ShellExecute
test.dpr.7: end.
00403B3D E806F1FFFF call @Halt0
00403B42 0000
00403B44 0000
00403B46 0000
Сергей М. (2006-04-11 13:51:00) [9]
> Leonid Troyanovsky © (11.04.06 13:43) [7]
> Чего-то меня перекосило
Вот и мне так показалось.
Бо should be, как понимаешь, не есть то же самое, что и must be.
Leonid Troyanovsky (2006-04-11 13:43:00) [10]
> Leonid Troyanovsky © (11.04.06 13:27) [5]
> If lpFile specifies a document file, lpParameters should
> be NULL.
Чего-то меня перекосило :)
Ладно, пусть будет ''.
--
Regards, LVT.
Leonid Troyanovsky (2006-04-11 13:28:00) [11]
> Игорь Шевченко © (11.04.06 13:20) [4]
> Все зависит от реализации функции. Некоторые по-разному
> интерпретируют nil и пустую строку.
А я про конкретный случай.
--
Regards, LVT.
Leonid Troyanovsky (2006-04-11 13:27:00) [12]
> Сергей М. © (11.04.06 13:18) [3]
> С чего бы вдруг ?
If lpFile specifies a document file, lpParameters should be NULL.
--
Regards, LVT.
Игорь Шевченко (2006-04-11 13:20:00) [13]
> Только nil, бо LPCTSTR lpParameters.
Все зависит от реализации функции. Некоторые по-разному интерпретируют nil и пустую строку.
Сергей М. (2006-04-11 13:18:00) [14]
> Leonid Troyanovsky © (11.04.06 13:07) [2]
С чего бы вдруг ?
Вот, скажем, С-шный прототип другой ф-ции
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTRlpText, // address of text in message box
LPCTSTRlpCaption, // address of title of message box
UINT uType // style of message box
);
А вот соотв. дельфийский прототип
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
Что же мне мешает сделать такой вызов:
MessageBox(..., '', '', ...)
Ничто.
Так чем же ShellExecute() в этом плане отличается от MessageBox, если в ее дельфийском прототипе точно так же LPCTSTR-типу соответствует PChar-тип ?
Параметром '' я передаю "пустую" строку (содержащую единственный символ нуль-терминатора), и это допустимо и с т.з. компилятора и с т.з. внутренней логики ShellExecute()
В чем я ошибаюсь ?
Leonid Troyanovsky (2006-04-11 13:07:00) [15]
> Сергей М. © (11.04.06 12:40) [1]
> либо ''
Только nil, бо LPCTSTR lpParameters.
--
Regards, LVT.
Сергей М. (2006-04-11 12:40:00) [16]Если ком.строка запуска "проги" подразумевает наличие неких параметров, то они как раз и могут быть переданы тобой 4-м параметром.
Например, пусть ком. строка может выглядеть как 'MyProga /?'
Тогда 4-й параметр - это '/?'
Если ком строка не содержит ключей, то передавай либо nil либо ''