0

我正在使用tregsvr.exeDelphi 附带的程序来注册 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是 OCX 的完整路径,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);
4

1 回答 1

1

Chr(9)+Server+Chr(9)几乎可以肯定是不正确的,在次要和主要方面:

  • 小问题: Chr(9) 是一个选项卡。虽然这是一个完全合法的空白字符,但在命令行中遇到它是相当罕见的,因此,如果您尝试运行的应用程序无法正确处理它,我不会感到惊讶。
  • 主要问题:如果Server包含空格,您实际上会向tregsvr.exe 传递多个命令行参数而不是一个参数,并且不出所料tregsrv.exe 将无法理解它们。

解决方案:将参数放在引号中以表明它实际上是一个参数,而不是多个:AnsiQuotedStr(Server, '"')

于 2020-02-16T05:14:14.293 回答