-
Добрый день. Возникла странная проблема: 1. Отключаю в диспетчере устройств привод CDROM 2. Запускаю вручную msdt.exe /id DeviceDiagnostic /skip true — модуль устранения неполадок запускается, находит отключенный CDROM, предлагает его включить, я говорю "включить", CDROM включается 3. Делаю то же самой через CreateProcess самым обычным образом:
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(SI), 0);
with SI do begin
cb := SizeOf(SI);
dwFlags:=STARTF_USESHOWWINDOW;
wShowWindow:=SW_SHOWNORMAL;
end;
Result := CreateProcess(nil, PAnsiChar(appName), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);
if Result then WaitforSingleObject(pi.hProcess,INFINITE);
Результат: модуль устранения неисправностей запускается, находит отключенный CDROM, предлагает его включить, я говорю "включить", CDROM НЕ ВКЛЮЧАЕТСЯ!!! В чем может быть проблема? Спасибо.
-
> В чем может быть проблема?
в передаче параметров?
-
Каких параметров? Если неправильно передать параметры самому msdt, то он вообще не запустится. А тут нормально запускается, да и метода запуска программ из Delphi давно отлажена и работает.
-
Дай-ка по памяти попробую на вскидку... Сделай так: CreateProcess(PAnsiChar(appName), nil, nil, nil, False, 0, nil, nil, SI, PI);
-
> да и метода запуска программ из Delphi давно отлажена и > работает.
Зато первые два параметра CreateProcess до сих пор не совсем понятны. Но лично я бы предпочел с учётом > Запускаю вручную msdt.exe /id DeviceDiagnostic /skip true
сделать так: CreateProcess('msdt.exe', '/id DeviceDiagnostic /skip true', nil, nil, False, 0, nil, nil, SI, PI);
-
Появилась идея: Хотя само приложение запускается с правами администратора, приложение через CreateProcess запускается НЕ от имени администратора. Вопрос как быть? Как все-таки удостовериться, что запущенное приложение, будет запущено от имени администратора?
-
shellexecute('runas', ...)?
Вообще msdt при запуске повышения привилегий не требует. Или я "не от имени администратора" воспринимаю в неправильном контексте, или ты в неправильном направлении ведёшь поиск.
-
Когда я пытался разобраться с CreateProcess то заметил большую странность - разные приложения по разному реагируют на то, как передаются параметры в CreateProcess - кому-то надо, чтобы путь и параметры шли первым аргументом, кому-то вторым, кому-то разнесены по разным аргументам функции. Понять причину я так и не смог, просто составил статистику и запускаю их по разному. При этом в подавляющем большинстве случаев нормальный запуск и передача параметров процессу происходит тогда, когда AppName равно нулю, а вся командная строка передаётся через параметры, при этом сам путь к запускаемому файлу заключён в кавычки....
-
Народ! В общем перепробовал все методы CreateProcess, ShellExecute, runas. Ничего не помогает :( Кто-нибудь может привести рабочий пример кода, запускающего msdt, чтобы msdt включил отключенный привод CD-ROM? Спасибо.
-
Вечером дома посмотрю, если вспомню.
-
> WizardEye (24.12.12 11:19) [8] > Народ! > В общем перепробовал все методы CreateProcess, ShellExecute, > runas. > Ничего не помогает :(
Как ты так пробовал-то? Все ж в справке описано. Result := CreateProcess('c:\windows\system32\msdt.exe',
'c:\windows\system32\msdt.exe /id DeviceDiagnostic /skip true', nil, nil,
False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, SI, PI);
-
Так тоже пробовал. Проблема НЕ в запуске msdt!!! Проблема в том, что msdt НЕ включает CD-ROM, а должен включать! Попробуй, получится? P.S. Кстати система Win7.
-
> WizardEye (24.12.12 16:17) [11] > Так тоже пробовал.
Ну значит попробуй еще раз, именно с этим котом который я тебе дал. У меня все запускается и включается.
-
Проверил твой код copy-paste. Запускается, но когда нажимаю "Применить это исправление", то выдает "Не исправлено". У тебя какая система?
-
-
То же самое: "Не исправлено".
-
> WizardEye (24.12.12 16:55) [15]
Значит проблема конкретно в твоей машине. У меня W7 Prof отрабатывает на отлично.
-
Спасибо всем, кто ответил. Решение проблемы оказалось несколько в иной плоскости, нежели я искал первоначально! Тестирование кода скомпиленного как на Delphi, так и на VS, на различных системах показало одинаковое поведение: На 32-битных системах msdt отрабатывал правильно, на 64-битных - нет! Сделал я тестовое приложение под 64-битную платформу и на 64 битных системах все стало работать как надо. Честно говоря, физику процесса я не очень понимаю. Если б msdt не запустился, если б ругнулся, а так тупо не смог включить привод ...
|