Конференция "WinAPI" » Запуск msdt.exe из Delphi [D7]
 
  • WizardEye (19.12.12 15:45) [0]
    Добрый день.
    Возникла странная проблема:
    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 НЕ ВКЛЮЧАЕТСЯ!!!
    В чем может быть проблема?
    Спасибо.
  • DVM © (19.12.12 15:53) [1]

    > В чем может быть проблема?

    в передаче параметров?
  • WizardEye (20.12.12 19:45) [2]
    Каких параметров?
    Если неправильно передать параметры самому msdt, то он вообще не запустится. А тут нормально запускается, да и метода запуска программ из Delphi давно отлажена и работает.
  • Rouse_ © (20.12.12 21:26) [3]
    Дай-ка по памяти попробую на вскидку...
    Сделай так:
    CreateProcess(PAnsiChar(appName), nil, nil, nil, False, 0, nil, nil, SI, PI);

  • Германн © (21.12.12 01:44) [4]

    > да и метода запуска программ из Delphi давно отлажена и
    > работает.

    Зато первые два параметра CreateProcess до сих пор не совсем понятны.
    Но лично я бы предпочел с учётом
    > Запускаю вручную msdt.exe /id DeviceDiagnostic /skip true

    сделать так:
    CreateProcess('msdt.exe', '/id DeviceDiagnostic /skip true', nil, nil, False, 0, nil, nil, SI, PI);

  • WizardEye (21.12.12 17:20) [5]
    Появилась идея:
    Хотя само приложение запускается с правами администратора, приложение через CreateProcess запускается НЕ от имени администратора.
    Вопрос как быть? Как все-таки удостовериться, что запущенное приложение, будет запущено от имени администратора?
  • брат Птибурдукова (21.12.12 17:55) [6]
    shellexecute('runas', ...)?

    Вообще msdt при запуске повышения привилегий не требует. Или я "не от имени администратора" воспринимаю в неправильном контексте, или ты в неправильном направлении ведёшь поиск.
  • Dimka Maslov © (23.12.12 11:59) [7]
    Когда я пытался разобраться с CreateProcess то заметил большую странность - разные приложения по разному реагируют на то, как передаются параметры в CreateProcess - кому-то надо, чтобы путь и параметры шли первым аргументом, кому-то вторым, кому-то разнесены по разным аргументам функции. Понять причину я так и не смог, просто составил статистику и запускаю их по разному. При этом в подавляющем большинстве случаев нормальный запуск и передача параметров процессу происходит тогда, когда AppName равно нулю, а вся командная строка передаётся через параметры, при этом сам путь к запускаемому файлу заключён в кавычки....
  • WizardEye (24.12.12 11:19) [8]
    Народ!
    В общем перепробовал все методы CreateProcess, ShellExecute, runas.
    Ничего не помогает  :(
    Кто-нибудь может привести рабочий пример кода, запускающего msdt, чтобы msdt включил отключенный привод CD-ROM?
    Спасибо.
  • брат Птибурдукова (24.12.12 11:51) [9]
    Вечером дома посмотрю, если вспомню.
  • Rouse_ © (24.12.12 12:47) [10]

    > 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);

  • WizardEye (24.12.12 16:17) [11]
    Так тоже пробовал.
    Проблема НЕ в запуске msdt!!!
    Проблема в том, что msdt НЕ включает CD-ROM, а должен включать!
    Попробуй, получится?
    P.S. Кстати система Win7.
  • Rouse_ © (24.12.12 16:18) [12]

    > WizardEye   (24.12.12 16:17) [11]
    > Так тоже пробовал.

    Ну значит попробуй еще раз, именно с этим котом который я тебе дал. У меня все запускается и включается.
  • WizardEye (24.12.12 16:36) [13]
    Проверил твой код copy-paste.
    Запускается, но когда нажимаю "Применить это исправление", то выдает "Не исправлено".
    У тебя какая система?
  • Rouse_ © (24.12.12 16:44) [14]
  • WizardEye (24.12.12 16:55) [15]
    То же самое: "Не исправлено".
  • Rouse_ © (24.12.12 17:32) [16]

    > WizardEye   (24.12.12 16:55) [15]

    Значит проблема конкретно в твоей машине.
    У меня W7 Prof отрабатывает на отлично.
  • WizardEye (24.12.12 17:58) [17]
    Спасибо всем, кто ответил.
    Решение проблемы оказалось несколько в иной плоскости, нежели я искал первоначально!
    Тестирование кода скомпиленного как на Delphi, так и на VS, на различных системах показало одинаковое поведение:
    На 32-битных системах msdt отрабатывал правильно, на 64-битных - нет!
    Сделал я тестовое приложение под 64-битную платформу и на 64 битных системах все стало работать как надо.
    Честно говоря, физику процесса я не очень понимаю. Если б msdt не запустился, если б ругнулся, а так тупо не смог включить привод ...
 
Конференция "WinAPI" » Запуск msdt.exe из Delphi [D7]
Есть новые Нет новых   [134430   +2][b:0][p:0.001]