1

我在 WinXP 系统上使用 Delphi 6 进行开发。

我一直在使用以下函数来运行具有提升权限的程序。

function LB_RunAsAdminWait(hWnd:       HWND;
                           filename:   string;
                           Parameters: string): Boolean;
   var   sei: TShellExecuteInfo;                // shell execute info
begin

   Result := False;                             // default to failure

   FillChar(sei, SizeOf(sei), 0);
   sei.cbSize := SizeOf(sei);
   sei.Wnd    := hWnd;
   sei.fMask  := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
   sei.lpVerb := 'runas';
   sei.lpFile := PChar(filename);
   sei.lpParameters := PChar(Parameters);
   sei.nShow  := SW_SHOWNORMAL;

   if ShellExecuteEx(@sei) then                 // if success
      Result := True;                           //    return sucess

   if sei.hProcess <> 0 then begin              // wait for process to finish
      while WaitForSingleObject(sei.hProcess, 50) = WAIT_TIMEOUT do
         Application.ProcessMessages;
      CloseHandle(sei.hProcess);
   end;

end;  // of function LB_RunAsAdminWait

我怎么称呼它:

if (LB_RunAsAdminWait(FPGM.Handle,'RegSvr32',FName+' /s') = False) then
   begin
     ShowMessage('WARNING: unable to register OCX');
     exit;
   end;

其中 FPGM.handle 是我的应用程序的句柄,而 Fname 是我要注册的 OCX。

当我在 WIN7 机器上运行它时,它返回 true(成功)但 OCX 未注册。

任何帮助,将不胜感激。

4

1 回答 1

4

最可能的解释是这是 32 位与 64 位的问题。DLL 是 64 位的,而您正在运行 32 位 regsvr32。或相反亦然。或者文件系统重定向器让您感到困惑。您将 DLL 放在 system32 中,但重定向器将其转换为 SysWow64。

调试它的明显方法是删除静默开关,让 regsvr32 告诉你出了什么问题。

顺便说一句,正如您所发现的,您不能使用 ShellExecuteEx 的返回值来确定服务器注册是否成功。ShellExecuteEx 的返回值仅告诉您进程是否启动。

于 2013-08-12T17:56:19.583 回答