Я использую программу 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);