Inno Setup怎样创建一个自动申请管理员身份运行的快捷

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Inno Setup怎样创建一个自动申请管理员身份运行的快捷相关的知识,希望对你有一定的参考价值。

如果你使用的是 Unicode 版本的 Inno Setup,那么以下是更为专业的解决方法。
这是 mlaan 提及的再一种方法。


QUOTE( CodeAutomation3.iss)


; -- CodeAutomation2.iss --
;
; This script shows how to use IUnknown based COM Automation objects.
;
; REQUIRES UNICODE INNO SETUP!
;
; Note: some unneeded interface functions which had special types have been replaced
; by dummies to avoid having to define those types. Do not remove these dummies as
; that would change the function indices which is bad. Also, not all function
; protoypes have been tested, only those used by this example.

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
CreateAppDir=no
DisableProgramGroupPage=yes
DefaultGroupName=My Program
UninstallDisplayIcon={app}\\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Code]

{--- IShellLink ---}

const
CLSID_ShellLink = \'{00021401-0000-0000-C000-000000000046}\';
SLDF_RUNAS_USER = $2000;

type
IShellLinkW = interface(IUnknown)
\'{000214F9-0000-0000-C000-000000000046}\'
procedure Dummy;
procedure Dummy2;
procedure Dummy3;
function GetDescription(pszName: String; cchMaxName: Integer): HResult;
function SetDescription(pszName: String): HResult;
function GetWorkingDirectory(pszDir: String; cchMaxPath: Integer): HResult;
function SetWorkingDirectory(pszDir: String): HResult;
function GetArguments(pszArgs: String; cchMaxPath: Integer): HResult;
function SetArguments(pszArgs: String): HResult;
function GetHotkey(var pwHotkey: Word): HResult;
function SetHotkey(wHotkey: Word): HResult;
function GetShowCmd(out piShowCmd: Integer): HResult;
function SetShowCmd(iShowCmd: Integer): HResult;
function GetIconLocation(pszIconPath: String; cchIconPath: Integer;
out piIcon: Integer): HResult;
function SetIconLocation(pszIconPath: String; iIcon: Integer): HResult;
function SetRelativePath(pszPathRel: String; dwReserved: DWORD): HResult;
function Resolve(Wnd: HWND; fFlags: DWORD): HResult;
function SetPath(pszFile: String): HResult;
end;

IPersist = interface(IUnknown)
\'{0000010C-0000-0000-C000-000000000046}\'
function GetClassID(var classID: TGUID): HResult;
end;

IPersistFile = interface(IPersist)
\'{0000010B-0000-0000-C000-000000000046}\'
function IsDirty: HResult;
function Load(pszFileName: String; dwMode: Longint): HResult;
function Save(pszFileName: String; fRemember: BOOL): HResult;
function SaveCompleted(pszFileName: String): HResult;
function GetCurFile(out pszFileName: String): HResult;
function GetFlags(out Flags: DWORD): HResult;
function SetFlags(Flags: DWORD): HResult;
end;

IShellLinkDataList = interface(IUnknown)
\'{45E2B4AE-B1C3-11D0-B92F-00A0C90312E1}\'
function AddDataBlock(pDataBlock : DWORD) : HResult;
function CopyDataBlock(dwSig : DWORD; var ppDataBlock : DWORD) : HResult;
function RemoveDataBlock(dwSig : DWORD) : HResult;
function GetFlags(var pdwFlags : DWORD) : HResult;
function SetFlags(dwFlags : DWORD) : HResult;
end;

procedure IShellLinkButtonOnClick(Sender: TObject);
var
Obj: IUnknown;
SL: IShellLinkW;
PF: IPersistFile;
SDL: IShellLinkDataList;
Flags: DWord;
begin
{ Create the main ShellLink COM Automation object }
Obj := CreateComObject(StringToGuid(CLSID_ShellLink));

{ Set the shortcut properties }
SL := IShellLinkW(Obj);
OleCheck(SL.SetPath(ExpandConstant(\'{srcexe}\')));
OleCheck(SL.SetArguments(\'\'));
OleCheck(SL.SetShowCmd(SW_SHOWNORMAL));

// 设置 以其他用户身份运行
Flags := 0;
SDL := IShellLinkDataList(Obj);
OleCheck(SDL.GetFlags(Flags));
OleCheck(SDL.SetFlags(Flags or SLDF_RUNAS_USER));

{ Save the shortcut }
PF := IPersistFile(Obj);
OleCheck(PF.Save(ExpandConstant(\'{commondesktop}\\CodeAutomation2 Test.lnk\'), True));

MsgBox(\'Saved a shortcut named \'\'CodeAutomation2 Test\'\' on the common desktop.\', mbInformation, mb_Ok);
end;

{---}

procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);
begin
with TButton.Create(WizardForm) do begin
Left := ALeft;
Top := ATop;
Width := (WizardForm.CancelButton.Width*3)/2;
Height := WizardForm.CancelButton.Height;
Caption := ACaption;
OnClick := ANotifyEvent;
Parent := WizardForm.WelcomePage;
end;
end;

procedure InitializeWizard();
var
Left, LeftInc, Top, TopInc: Integer;
begin
Left := WizardForm.WelcomeLabel2.Left;
LeftInc := (WizardForm.CancelButton.Width*3)/2 + ScaleX(8);
TopInc := WizardForm.CancelButton.Height + ScaleY(8);
Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;

CreateButton(Left, Top, \'&IShellLink...\', @IShellLinkButtonOnClick);
end;

 

http://www.cnblogs.com/key-ok/p/4104819.html

以上是关于Inno Setup怎样创建一个自动申请管理员身份运行的快捷的主要内容,如果未能解决你的问题,请参考以下文章

inno setup打包工具的使用问题?

inno setup 打包使用超级管理员权限

inno setup 怎样检测程序已安装

一个Inno Setup创建安装包的例子

Inno Setup CreateProcess 失败:代码 740(Inno Setup打包的程序提升为管理员权限)

如何在 Inno Setup 中制作停止和暂停/恢复/播放音乐按钮