Не получается подать команду на cmd


Пост_Апокалипсис

Пользователь
Форумчанин
Регистрация
18.10.2018
Сообщения
3
Код:
ShellExecute(0, 'runas', 'cmd.exe', pchar('/k "vssadmin.exe Delete Shadows /All /quiet"'), nil, SW_SHOWNORMAL) ;

консоль выдает ошибку

1486eb66f926a23d95362ebe58ced633-full.png


такое происходит при запуске x86 билда на window x64
x86 +x86, как и x64+x64 отрабатывает отлично
Гугл говорит, что нужно как-то перенаправлять команду на cmd нужной битности

Кто с таким сталкивался ?
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228

Пост_Апокалипсис

Пользователь
Форумчанин
Регистрация
18.10.2018
Сообщения
3
Попробуй, в скрипт вписать, перед ShellExecute ***:
Код:
@echo off
set "SystemPath=%SystemRoot%\System32"
if not "%ProgramFiles(x86)%"=="" set "SystemPath=%SystemRoot%\Sysnative"
да нет, все равно не отрабатывает
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
да нет, все равно не отрабатывает
Странно.

Что-бы запустить x64 нужно запустить консоль в x64, если в x86, то в x86...

64-bit cmd.exe - расположен в %WinDir%\System32\cmd.exe
32-bit cmd.exe - расположен в %WinDir%\SysWOW64\cmd.exe

Можно проверить, в диспетчере задач, cmd.exe будет без пометки *32, для x64 и с пометкой *32 для x86...
 

HMCoba

Активный пользователь
Активный
Регистрация
22.04.2023
Сообщения
123
Репутация
86
Cоветую вместо функции ( ShellExecute ), использовать функцию ( ShellExecuteEx ) !
Если всё же использовать функцию ( ShellExecute ), то только через специальную обёртку:

Процедура обёртки :
--------------------------------------------------------------------------------

implementation

{$R *.dfm}

procedure ShellExecute(const AWnd: HWND; const AOperation, AFileName:
string; const AParameters: string = ''; const ADirectory: string = '';
const AShowCmd: Integer = SW_SHOWNORMAL);
var
ExecInfo: TShellExecuteInfo;
NeedUnitialize: Boolean;
begin
//Assert(AFileName <> '');
NeedUnitialize := Succeeded(CoInitializeEx(nil, COINIT_APARTMENTTHREADED or
COINIT_DISABLE_OLE1DDE));
try
FillChar(ExecInfo, SizeOf(ExecInfo), 0);
ExecInfo.cbSize := SizeOf(ExecInfo);

ExecInfo.Wnd := AWnd;
ExecInfo.lpVerb := Pointer(AOperation);
ExecInfo.lpFile := PChar(AFileName);
ExecInfo.lpParameters := Pointer(AParameters);
ExecInfo.lpDirectory := Pointer(ADirectory);
ExecInfo.nShow := AShowCmd;
ExecInfo.fMask := SEE_MASK_FLAG_NO_UI;
{$IFDEF UNICODE}
ExecInfo.fMask := ExecInfo.fMask or SEE_MASK_UNICODE;
{$ENDIF}

{$WARN SYMBOL_PLATFORM OFF}
Win32Check(ShellExecuteEx(@ExecInfo));
{$WARN SYMBOL_PLATFORM ON}
finally
if NeedUnitialize then
CoUninitialize;
end;
Exit;
end;

--------------------------------------------------------------------------------

Использование:

ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', '', '', SW_SHOWNORMAL);
ShellExecute(Handle, 'open', 'c:\windows\notepad.exe', 'c:\text.txt', '', '', SW_SHOWNORMAL);
ShellExecute(Form1.Handle, '', Site, '', '', SW_SHOW);
ShellExecute(Form1.Handle, '', 'mailto:semen@krovatka.net?subject=delphi', '', '', SW_RESTORE);

Обратите внимание, что с указанными обёртками описатель окна (первый параметр ShellExecute) можно не указывать - эта не будет Ирландия для показа сообщений об ошибках, поскольку мы использовали флаг SEE_MASK_FLAG_NO_UI. И хотя флагSEE_MASK_FLAG_NO_UIне вызывает "Открыть с помощью диалога" (см. ниже), но описатель окна не используется при отображении этого диалога. Поэтому вы можете вернуться туда 0.

PS Если вы обнаружили ShellExecuteExс появлением " runas" для запуска процесса с элевацией, то вам необходимо передать корректный описатель окна ( HWND): он будет открыто для идентификации вашего процесса как приложения первого плана. Если же вы его не считаете, то приложение будет считаться фоновым приложением. В этом случае запрос UAC на повышение прав не появится на экране сразу, а появится в свёрнутом (и мигающем) виде на панели задач.
Кроме того, с указанными обёртками необязательно указаны все параметры - ведь они реализуются опциональными.


Итого, при получении код может быть упрощён до:

ShellExecute(0, 'open', 'c:\Windows\notepad.exe');
ShellExecute(0, 'open', 'c:\windows\notepad.exe', 'c:\text.txt');
ShellExecute(0, '', Site);
ShellExecute(0, '', 'mailto:semen@krovatka.net?subject=delphi');

PS Обратите внимание, что этот код правил и корректируется только при наличии функций-обёрток выше по тексту - ведь именно там сосредоточена обработка ошибок, COM и асинхронных операций. Без функции-обёртки этот код не будет верным.

Подробно всё тут:
 
Последнее редактирование:
Верх Низ