如果需要在运行时提示uac提升,或者我必须启动第二个提升的过程做’脏工作’吗?
解决方法 我会重新启动自己作为提升,通过命令行参数指示什么高架的事你想做。然后,您可以直接跳到相应的表单,或只保存您的HKLM的东西。function RunAsadmin(hWnd: HWND; filename: string; Parameters: string): Boolean;{ See Step 3: Redesign for UAC Compatibility (UAC) http://msdn.microsoft.com/en-us/library/bb756922.aspx This code is released into the public domain. No attribution required.}var sei: TShellExecuteInfo;begin ZeroMemory(@sei,SizeOf(sei)); sei.cbSize := SizeOf(TShellExecuteInfo); sei.Wnd := hwnd; sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI; sei.lpVerb := PChar('runas'); sei.lpfile := PChar(filename); // PAnsiChar; if parameters <> '' then sei.lpParameters := PChar(parameters); // PAnsiChar; sei.nShow := SW_SHOWnorMAL; //Integer; Result := ShellExecuteEx(@sei);end;
另一个Microsoft建议的解决方案是创建一个COM对象的进程(使用特别创建的CoCreateInstanceAsadmin函数)。我不喜欢这个想法,因为你必须写和注册一个COM对象。
注意:没有“CoCreateInstanceAsadmin”API调用。它只是一些浮动的代码。这里是Dephi版本我偶然发现。它显然是基于前缀一个类guID字符串与“Elevation:administrator!new:”前缀的技巧,当正常隐藏代码内部调用CoGetobject:
function CoGetobject(pszname: PWIDeChar; pBindOptions: PBindOpts3; const iID: TIID; ppv: PPointer): HResult; stdcall; external 'ole32.dll';procedure CoCreateInstanceAsadmin(const Handle: HWND; const ClassID,IID: TGuID; PInterface: PPointer);var BindOpts: TBindOpts3; Monikername: WIDeString; Res: HRESulT;begin //This code is released into the public domain. No attribution required. ZeroMemory(@BindOpts,Sizeof(TBindOpts3)); BindOpts.cbStruct := Sizeof(TBindOpts3); BindOpts.hwnd := Handle; BindOpts.DWClassContext := CLSCTX_LOCAL_SERVER; Monikername := 'Elevation:administrator!new:' + GUIDToString(ClassID); Res := CoGetobject(PWIDeChar(Monikername),@BindOpts,IID,PInterface); if Failed(Res) then raise Exception.Create(SysErrorMessage(Res));end;
另一个问题:如何处理在windows XP中作为标准用户运行的人员?
总结以上是内存溢出为你收集整理的Delphi:需要时提示UAC提升全部内容,希望文章能够帮你解决Delphi:需要时提示UAC提升所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)