In Выполнение элементов панели управления , MSDN говорит следующее:
Канонические имена Windows Vista
В Windows Vista и более поздних версиях предпочтительным способом запуска элемента панели управления из командной строки является использование канонического имени элемента панели управления.
Согласно веб-сайту Microsoft это должно работать:
В следующем примере показано, как приложение может запустить элемент панели управления Windows Update с WinExec.
WinExec("%systemroot%\system32\control.exe /name Microsoft.WindowsUpdate", SW_NORMAL);
Для Delphi 2010 я пробовал:
var
CaptionString: string;
Applet: string;
Result: integer;
ParamString: string;
CaptionString := ListviewApplets1.Items.Item[ ListviewApplets1.ItemIndex ].Caption;
if CaptionString = 'Folder Options' then
{ 6DFD7C5C-2451-11d3-A299-00C04F8EF6AF }
Applet := 'Microsoft.FolderOptions'
else if CaptionString = 'Fonts' then
{93412589-74D4-4E4E-AD0E-E0CB621440FD}
Applet := 'Microsoft.Fonts'
else if CaptionString = 'Windows Update' then
{ 93412589-74D4-4E4E-AD0E-E0CB621440FD }
Applet := 'Microsoft.WindowsUpdate'
else if CaptionString = 'Game Controllers' then
{ 259EF4B1-E6C9-4176-B574-481532C9BCE8 }
Applet := 'Microsoft.GameControllers'
else if CaptionString = 'Get Programs' then
{ 15eae92e-f17a-4431-9f28-805e482dafd4 }
Applet := 'Microsoft.GetPrograms'
//...
ParamString := ( SystemFolder + '\control.exe /name ' ) + Applet;
WinExec( ParamString, SW_NORMAL); <= This does not execute and when I trapped the error it returned ERROR_FILE_NOT_FOUND.
Я попробовал метод ExecAndWait (ParamString), и он отлично работает с той же ParamString, что и WinExec:
ParamString := ( SystemFolder + '\control.exe /name ' ) + Applet;
ExecAndWait( ParamString ); <= This executes and Runs perfectly
Метод ExecAndWait, который я использовал, вызывает Windows.CreateProcess:
if Windows.CreateProcess( nil, PChar( CommandLine ), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo ) then
begin
try
Требуется ли для WinExec другой ParamString или я делаю это неправильно с WinExec? Я не опубликовал полный метод ExecAndWait, но могу, если кто-то захочет его увидеть.