-
Здравствуйте! Вот функция:
function Exec(const Cmd: WideString; ShowWindow: Cardinal): 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); Т.е. все пути нормальные и модули присутствуют. В чём может быть дело?
-
rundll32.exe - в путь к исполняемому файлу, всё остальное - в параметры запуска.
-
Result := CreateProcessW('rundll32.exe', PWideChar(' printui.dll,PrintUIEntry /il /c"' + Computer + '"'), nil, nil, False, 0, nil, nil, SI, PI);
Не работает нигде, если rundll32.exe указывать с полным путём к нему (что не удобно), то работает везде, но не на Win7 64 бит - та же ошибка выскакивает :(
-
-
Неудобно спать на потолке, одеяло всё время сваливается. А уже коли оно работать не хочет, для полного пути к rundll32.exe надо воспользоваться функцией SearchPath. И что-то мне подсказывает, для 64 бит способ в принипе должен быть другим.
-
Я же в первом посте писал - вручную из командной строки работает, для других параметров этой длл тоже работает...
-
А программа у тебя 64 бит или 32?
-
32 бит
-
Ситуация проясняется, на самом деле из-за того, что прога 32 бит, то вызываются такие пути:
C:\Windows\System32\rundll32.exe C:\Windows\SysWOW64\printui.dll,PrintUIEntry /il /c\\alex
И я получаю ту-же самую ошибку даже из командной строки. Вопрос - возможно ли это обойти не создавая 64 битный обходной екзешник для запуска? Да и поможет ли его создание, если я из него буду вызывать мою команду, а он будет вызван из 32 бит программы?
-
может лучше понять, почему вызывается 64-битная длл-ка? может указывать тогда что-то типа rundll32.exe %SYSTEMROOT%/system32/printui.dll,PrintUIEntry /il /c\\alex
-
Указал жёстко путь, без системной переменной - то же ерунда :(
-
В общем как оказалось это был баг винды для режима WOW64, после загрузки всех обновлений винды всё заработало без исправлений, а почти день потрачен :(
-
А может сначала дождаться заершения процесса,а потом делать ему CloseHandle?
-
Не, в этом плане всё нормально, я же не процесс закрываю а хендл, т.к. он мне больше не нужен, вот если модально, то согласен, другая функция у меня так и делает
-
Редкостный случай, что ошибка именно в венде. Такого в своей практике не встречал, максимум что было - это глюки дельфи, лечившиеся переписыванием кусков дефектного кода.
-
Да, согласен, редко так бывает, поэтому и голову ломал
|