• 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

  • 相关阅读:
    Oracle的锁表与解锁
    plsql查询数据显示为乱码解决方法
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    javascript基础总结
    通过百度echarts实现数据图表展示功能
    表单中Readonly和Disabled的区别
    mybatis中的#和$的区别
    java持久层框架mybatis如何防止sql注入
    故事讲解:我是一个线程
    Python菜鸟之路:Django 中间件
  • 原文地址:https://www.cnblogs.com/findumars/p/6348065.html
Copyright © 2020-2023  润新知