在WIN7上使用提升的权限运行失败

时间:2013-08-12 17:24:18

标签: delphi windows-7

我正在使用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未注册。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

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

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

另外,正如您所发现的那样,您无法使用ShellExecuteEx的返回值来确定服务器注册是否成功。 ShellExecuteEx的返回值仅告诉您进程是否已启动。