Форум: "WinAPI";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
ВнизФункция ShellExecute Найти похожие ветки
← →
Grant (2006-04-11 12:27) [0]Всем привет. Возник такой вопрос: Если мне надо запустить какую-нибудь прогу с помощью ShellExecute, то как мне узнать что надо передавать в качестве значения её четвертого параметра?(с другими параметрами все ясно)
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory,
INT nShowCmd );
← →
Сергей М. © (2006-04-11 12:40) [1]Если ком.строка запуска "проги" подразумевает наличие неких параметров, то они как раз и могут быть переданы тобой 4-м параметром.
Например, пусть ком. строка может выглядеть как "MyProga /?"
Тогда 4-й параметр - это "/?"
Если ком строка не содержит ключей, то передавай либо nil либо ""
← →
Leonid Troyanovsky © (2006-04-11 13:07) [2]
> Сергей М. © (11.04.06 12:40) [1]
> либо ""
Только nil, бо LPCTSTR lpParameters.
--
Regards, LVT.
← →
Сергей М. © (2006-04-11 13:18) [3]
> Leonid Troyanovsky © (11.04.06 13:07) [2]
С чего бы вдруг ?
Вот, скажем, С-шный прототип другой ф-ции
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // 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()
В чем я ошибаюсь ?
← →
Игорь Шевченко © (2006-04-11 13:20) [4]
> Только nil, бо LPCTSTR lpParameters.
Все зависит от реализации функции. Некоторые по-разному интерпретируют nil и пустую строку.
← →
Leonid Troyanovsky © (2006-04-11 13:27) [5]
> Сергей М. © (11.04.06 13:18) [3]
> С чего бы вдруг ?
If lpFile specifies a document file, lpParameters should be NULL.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-04-11 13:28) [6]
> Игорь Шевченко © (11.04.06 13:20) [4]
> Все зависит от реализации функции. Некоторые по-разному
> интерпретируют nil и пустую строку.
А я про конкретный случай.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-04-11 13:43) [7]
> Leonid Troyanovsky © (11.04.06 13:27) [5]
> If lpFile specifies a document file, lpParameters should
> be NULL.
Чего-то меня перекосило :)
Ладно, пусть будет "".
--
Regards, LVT.
← →
Сергей М. © (2006-04-11 13:51) [8]
> Leonid Troyanovsky © (11.04.06 13:43) [7]
> Чего-то меня перекосило
Вот и мне так показалось.
Бо should be, как понимаешь, не есть то же самое, что и must be.
← →
fellix (2006-04-11 13:54) [9]
> Игорь Шевченко © (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:57) [10]
> fellix (11.04.06 13:54) [9]
> В данном случае это особенность компилятора Delphi
И в данном и не в данном - это "особенность" любого компилятора, не обладающего ИИ.
← →
fellix (2006-04-11 14:08) [11]
> Сергей М. © (11.04.06 13:57) [10]
Давай не будем говорить о любом.
В прототипе указан параметр LPCTSTR (PChar), поэтому "лобовая" реакция - сообщение о несоответствии типов, а подстановка адреса константы - уже элемент "разумного поведения".
← →
Anatoly Podgoretsky © (2006-04-11 14:17) [12]Сергей М. © (11.04.06 13:57) [10]
Давай не будем про любой компилятор!
Другой компилятор вполне может передать пустую строку, а не nil, а другой наоборот, а вот работа функции может сильно зависить от этого и в АПИ таких место много, где в случае nil один результат, а в случае пустой строки другой результат.
← →
Grant (2006-04-11 14:39) [13]Всем спасибо.
← →
Sour Smile (2006-04-20 13:06) [14]
> 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? Или ты это ручками набирал?
← →
fellix (2006-04-20 13:33) [15]
> Sour Smile (20.04.06 13:06) [14]
Поищи CpuWHelper (напр., на delphipages).
← →
Sour Smile (2006-04-20 13:55) [16]
> fellix (20.04.06 13:33) [15]
> Поищи CpuWHelper (напр., на delphipages).
Огромное спасибо! :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.365 c