Выполнить tregsvr.exe через Delphi с параметрами - PullRequest
0 голосов
/ 11 февраля 2020

Я использую программу tregsvr.exe, которая поставляется с Delphi для регистрации OCX.

Причина использования этой программы вместо regsrv32.exe заключается в том, что можно передать параметр -c, который разрешит регистрацию только для текущего пользователя.

Я запускаю программу с помощью функции ExecAndWait(), скопированной ниже. Он использует ShellExecuteEx() (вместо CreateProcess()) именно потому, что (пока мне не удается передать параметр для текущего пользователя), я должен запросить повышение прав, и это делается путем передачи логического значения Adm, которое исправляет 'runas' (я читал об альтернативном способе использования манифеста приложения, но мне не удалось заставить его работать, возможно, это связано с другим вопросом).

function ExecAndWait(const ExecuteFile, ParamString : string; Adm: boolean): boolean;
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    lpParameters := PChar(ParamString);
    If Adm then lpVerb:='runas';
    nShow := SW_HIDE;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode = STILL_ACTIVE) or Application.Terminated;
    Result:=True;
  end
  else Result:=False;
end;

В этом примере использования переменная Path - это полный путь к tregsvr.exe, а Server - это полный путь к OCX. Это работает хорошо (это делает работу регистрации):

ExecandWait(Path,Chr(9)+Server+Chr(9), True);

Но моя проблема возникает, когда я пытаюсь передать -c или другие параметры, как в любой из этих попыток, где функция неуспешна:

ExecandWait(Path,'-c '+Chr(9)+Server+Chr(9), True);
ExecandWait(Path,'\c '+Chr(9)+Server+Chr(9), True);

1 Ответ

1 голос
/ 16 февраля 2020

Ваш Chr(9)+Server+Chr(9) почти наверняка неверен, в второстепенном и главном смысле:

  • Незначительная проблема: Chr (9) - это табуляция. Хотя это вполне допустимый символ пробела, довольно редко можно встретить его как часть командной строки, и в результате я не удивлюсь, если приложение, которое вы пытаетесь запустить, не сможет правильно его обработать.
  • Основная проблема: если Server содержит пробелы, вы фактически передадите несколько аргументов командной строки в tregsvr.exe, а не в один аргумент, и неудивительно, что tregsrv.exe не сможет их понять.

Решение: Поместите аргумент в кавычки, чтобы указать, что это фактически один аргумент, а не много: AnsiQuotedStr(Server, '"').

...