Конференция "WinAPI" » CreateProcessW не работает почему-то на Win7 64bit иногда
 
  • EgorovAlex © (05.03.12 12:41) [0]
    Здравствуйте!

    Вот функция:


    function Exec(const Cmd: WideString; ShowWindow: Cardinal{SW_HIDE, SW_SHOWNORMAL}): Boolean;
    var
     SI: STARTUPINFOW;
     PI: PROCESS_INFORMATION;
    begin
     ZeroMemory(@SI, SizeOf(SI));
     SI.cb := SizeOf(SI);
     SI.dwFlags := STARTF_USESHOWWINDOW;
     SI.wShowWindow := ShowWindow;
    MessageBoxW(0, PWideChar(Cmd), '', MB_OK);
     Result := CreateProcessW(nil, PWideChar(Cmd), nil, nil, False, 0, nil, nil, SI, PI);
     if Result then begin
       CloseHandle(PI.hProcess);
       CloseHandle(PI.hThread);
     end;
    end;



    Вызываю её так:
    Exec('rundll32.exe printui.dll,PrintUIEntry /il /c\\' + Computer, SW_SHOWNORMAL);

    Этот код работал всегда, а на Win7 64bit отказывается с ошибкой "Не удалось открыть мастер добавления принтеров. Невозможно завершить операцию (ошибка 0x0000007e)" - это ошибка "ERROR_MOD_NOT_FOUND 126 (0x7E) The specified module could not be found."

    Причём запуск из командной строки:
    rundll32.exe printui.dll,PrintUIEntry /il /c\\Alex - работает!

    Но такой вызов работает:
    Exec('rundll32.exe printui.dll,PrintUIEntry /ge /c"\\' + Computer + '"', SW_SHOWNORMAL);

    Т.е. все пути нормальные и модули присутствуют. В чём может быть дело?
  • Dimka Maslov © (05.03.12 13:32) [1]
    rundll32.exe - в путь к исполняемому файлу, всё остальное - в параметры запуска.
  • EgorovAlex © (05.03.12 17:03) [2]
    Result := CreateProcessW('rundll32.exe', PWideChar(' printui.dll,PrintUIEntry /il /c"' + Computer + '"'), nil, nil, False, 0, nil, nil, SI, PI);

    Не работает нигде, если rundll32.exe указывать с полным путём к нему (что не удобно), то работает везде, но не на Win7 64 бит - та же ошибка выскакивает :(
  • EgorovAlex © (05.03.12 17:17) [3]
    Вот сходная проблема у товарища:

    http://www.techtalkz.com/windows-help/68640-printer-driver-install-windows-7-x64.html
  • Dimka Maslov © (05.03.12 17:19) [4]
    Неудобно спать на потолке, одеяло всё время сваливается. А уже коли оно работать не хочет, для полного пути к rundll32.exe надо воспользоваться функцией SearchPath. И что-то мне подсказывает, для 64 бит способ в принипе должен быть другим.
  • EgorovAlex © (05.03.12 17:28) [5]
    Я же в первом посте писал - вручную из командной строки работает, для других параметров этой длл тоже работает...
  • Cobalt © (05.03.12 17:47) [6]
    А программа у тебя 64 бит или 32?
  • EgorovAlex © (05.03.12 18:19) [7]
    32 бит
  • EgorovAlex © (06.03.12 08:04) [8]
    Ситуация проясняется, на самом деле из-за того, что прога 32 бит, то вызываются такие пути:

    C:\Windows\System32\rundll32.exe C:\Windows\SysWOW64\printui.dll,PrintUIEntry /il /c\\alex

    И я получаю ту-же самую ошибку даже из командной строки.
    Вопрос - возможно ли это обойти не создавая 64 битный обходной екзешник для запуска? Да и поможет ли его создание, если я из него буду вызывать мою команду, а он будет вызван из 32 бит программы?
  • Cobalt © (06.03.12 09:23) [9]
    может лучше понять, почему вызывается 64-битная длл-ка?
    может указывать тогда что-то типа
    rundll32.exe
    %SYSTEMROOT%/system32/printui.dll,PrintUIEntry /il /c\\alex
  • EgorovAlex © (06.03.12 10:36) [10]
    Указал жёстко путь, без системной переменной - то же ерунда :(
  • EgorovAlex © (06.03.12 11:42) [11]
    В общем как оказалось это был баг винды для режима WOW64, после загрузки всех обновлений винды всё заработало без исправлений, а почти день потрачен :(
  • Dimka Maslov © (06.03.12 11:42) [12]
    А может сначала дождаться заершения процесса,а потом делать ему CloseHandle?
  • EgorovAlex © (06.03.12 12:47) [13]
    Не, в этом плане всё нормально, я же не процесс закрываю а хендл, т.к. он мне больше не нужен, вот если модально, то согласен, другая функция у меня так и делает
  • Dimka Maslov © (06.03.12 17:43) [14]
    Редкостный случай, что ошибка именно в венде. Такого в своей практике не встречал, максимум что было - это глюки дельфи, лечившиеся переписыванием кусков дефектного кода.
  • EgorovAlex © (06.03.12 21:28) [15]
    Да, согласен, редко так бывает, поэтому и голову ломал
 
Конференция "WinAPI" » CreateProcessW не работает почему-то на Win7 64bit иногда
Есть новые Нет новых   [134430   +4][b:0][p:0.001]