我正在使用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
是 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);