我正在使用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未注册。
任何帮助都将不胜感激。
答案 0 :(得分:4)
最可能的解释是这是32位与64位问题。 DLL是64位,您正在运行32位regsvr32。或相反亦然。或者文件系统重定向器让你感到困惑。您将DLL放在system32中,但重定向器将其转换为SysWow64。
调试它的明显方法是删除静默开关,让regsvr32告诉你出了什么问题。
另外,正如您所发现的那样,您无法使用ShellExecuteEx的返回值来确定服务器注册是否成功。 ShellExecuteEx的返回值仅告诉您进程是否已启动。