Jump to content

Yaliang

Members
  • Posts

    18
  • Joined

  • Last visited

  • Days Won

    7

Posts posted by Yaliang

  1. On 2016/2/16 at 11:24 PM, f483755 said:

    Thanks for your solution.
    There are two problems

    1)
    EnumProcessModules can only access x86 processes if run in Wow3264

    2)
    Depending on OS some of the functions are either defined in psapi.dll or kernel32.dll

     

    Here is an enhancement snippset:

    // Kernel32.dll on Windows 7 and Windows Server 2008 R2;
    // Psapi.dll (if PSAPI_VERSION=1) on Windows 7 and Windows Server 2008 R2;
    // Psapi.dll on Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP
    function GetProcessImageFileNamePsapi(hProcess : HANDLE; lpFilename : LPTSTR; nSize : DWORD) : DWORD;
    external 'GetProcessImageFileNameA@psapi.dll stdcall delayload';

    function GetProcessImageFileNameKernel32(hProcess : HANDLE; lpFilename : LPTSTR; nSize : DWORD) : DWORD;
    external 'GetProcessImageFileNameA@kernel32.dll stdcall delayload';

    ...

                try
                    iLength := GetProcessImageFileNamePsapi(hProcess, lpFilename, Length(lpFilename));
                except
                    iLength := GetProcessImageFileNameKernel32(hProcess, lpFilename, Length(lpFilename));
                end;

    thank you. Your problems and solutions are very helpful. 

    When I write the code, I just on Win7_x86 OS.

  2. It is a very good change.

    Regards... ;-)

     

    Slightly improved code...
     

    Change this:

    function LoadLibrary(lpFilename : String) : LongInt;external 'LoadLibraryW@kernel32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadLibraryAfunction FreeLibrary(hModule : LongInt) : BOOL;external 'FreeLibrary@kernel32.dll stdcall delayload';function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;external 'LoadStringW@user32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadStringA

    to this:

    #ifdef UNICODE    #define A "W"#else    #define A "A"#endiffunction LoadLibrary(lpFilename : String) : LongInt;external 'LoadLibrary{#A}@kernel32.dll stdcall delayload'; function FreeLibrary(hModule : LongInt) : BOOL;external 'FreeLibrary@kernel32.dll stdcall delayload';function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;external 'LoadString{#A}@user32.dll stdcall delayload'; 

    to automatic Unicode/No Unicode library selection... not my code, I found searching in internet... (I don'tt know programming... X-D)

     

    Regards... ;-)

     

     

  3. Like the title says.

    Had someone done the samething.

    I need some help.

     I get a article:http://support.microsoft.com/kb/269190/en-us.

    but the way fail.

    I do not know how to usr win32 APIS:ldap_sslinit,

    and how to conncet to the AD server use SSl.

    In my place,Google do not work well  >_<.

    so if you have some advices or articles,please tell me.

    my email: 441926980@qq.com.

    ^_^

  4. There are some ways to do this. Such as using a external DLL.But I do not like this way.
    The Inno surport Pascal script. The Pascal script can call standard Win32 API functions inside standard Windows DLLs. So we can check the app is whether running.
    Here is a part of script in

     section:

    ; Any question, let me know.

    ;It work on 32 and 64 modules!

    [code]

    type HANDLE = LongInt;

    HMODULE = HANDLE;

    pHMODULE = Array[0..255] of HMODULE;

    LPDWORD = DWORD; PDWORD = Array[0..255] of DWORD;

    LPTSTR = String;

    const PROCESS_QUERY_INFORMATION = $400;

    PROCESS_VM_READ = $10;

    MAX_LENGTH = 255;

    function OpenProcess(dwDesiredAccess : DWORD; bInheritHandle : Boolean; dwProcessId : DWORD) : HANDLE;

    external 'OpenProcess@kernel32.dll stdcall delayload';

    function CloseHandle(hObject : HANDLE) : BOOL;

    external 'CloseHandle@kernel32.dll stdcall delayload';

    function EnumProcesses(var pProcessIds : PDWORD; cb : DWORD; var pBytesReturned : DWORD) : BOOL;

    external 'EnumProcesses@psapi.dll stdcall delayload';

    //notice:delayload EnumProcessModules and EnumProcessModulesEx functions

    //64-bit using EnumProcessModulesEx; 32-bite using EnumProcessModules

     

    function EnumProcessModulesEx(hProcess : HANDLE; var lphModule : pHMODULE; cb : DWORD; var lpcbNeeded : LPDWORD; dwFilterFlag : DWORD) : BOOL;

    external 'EnumProcessModulesEx@psapi.dll stdcall delayload';function EnumProcessModules(hProcess : HANDLE; var lphModule : pHMODULE; cb : DWORD; var lpcbNeeded : LPDWORD) : BOOL;

    external 'EnumProcessModules@psapi.dll stdcall delayload';

    function GetModuleFileNameExW(hProcess : HANDLE; hModule : HMODULE; lpFilename : LPTSTR; nSize : DWORD) : DWORD;

    external 'GetModuleFileNameExW@psapi.dll stdcall delayload';

    //here is the functionfunction

    zylIsAppRunning(procName : String; fullPath : Boolean) : Boolean;

    var found : Boolean;

    filenameEnd : Integer;

    filename : String;

    NA : DWORD;

    entry : DWORD;

    maxEntries : DWORD;

    processes : PDWORD;

    lpFilename : LPTSTR;

    hProcess : HANDLE;

    hMod : pHMODULE;

    isModuleShot: Boolean;

    begin

    SetLength(lpFilename, MAX_LENGTH);

    found := False;

    if (EnumProcesses(processes, SizeOf(processes), maxEntries)) then

    begin

    entry := 0;

    maxEntries := maxEntries / SizeOf(maxEntries);

    while ((not found) and (entry < maxEntries)) do begin

    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, processes[entry]);

    if (hProcess <> 0) then

    begin

    isModuleShot := False;

    if IsWin64 then

    begin //EnumProcessModulesEx @param $3,surport 32-bit modules and 64-bit modules the sametiem

    isModuleShot := EnumProcessModulesEx(hProcess, hMod, SizeOf(hMod), NA, $3);

    end else begin

    isModuleShot := EnumProcessModules(hProcess, hMod, SizeOf(hMod), NA);

    end;

    if (isModuleShot) then

    if (GetModuleFileNameExW(hProcess, hMod[0], lpFilename, Length(lpFilename)) > 0)

    then begin

    filenameEnd := Pos(#0, lpFilename);

    filename := Copy(Lowercase(lpFilename), 1, filenameEnd - 1);

    if (not fullpath) then

    filename := ExtractFileName(filename);

    if (AnsiLowercase(filename) = AnsiLowercase(procName)) then

    found := True;

    end;

    CloseHandle(hProcess);

    end;

    entry := entry + 1;

    end;

    end;

    Result := found;

    end;//function end

     

    How to use:

    I wish you have installed the Unicode Inno Setup (the 5.5.x version or more).(If not, you can download it from the home page http://www.jrsoftware.org)

    You can use it where you need just like:zylIsAppRunning('notdpad.exe', false);

    An example project for Unicode Inno Setup is provided as download.

    The attachment "CheckAppRunning.zip" is the script.
    Unzip the file CheckAppRunning.zip,
    you can get a file named "CheckAppRunning.iss".
    Please copy the *.iss files to the directory: ./Inno Setup 5/Examples
    Then build the program and run it.

    CheckAppRunning.zip

  5. As an example, say I want to put a shortcut in the taskbar for magnify.exe, which is included with windows in the system32 folder. Since the program magnify.exe already exists, can I make an inno installer to install the taskbar shortcut pointing to magnify.exe since I now have to do this manually after a clean install?

    use the function zylPinAppToTaskbar(), you just need two parameter,

    first, the dirctory of the *.exe;

    second, the real name of *.exe.

    maybe you must sure that *.exe is exist.

    then call the function where you need.

  6. I'm no Inno expert. In fact, this is my first time using it. So I'm lost here.

     

    If I have an existing program installed on my PC and I want to create an installer that automatically pins it to the taskbar. I'm trying to figure out which code to modify in shuangxiang2008 included "PinShortcutOntoTaskbar-task.iss" script.

     

    Must I do something more than modify the paths to: (ExpandConstant('{app}') and the entry under [Files] Source: 

     

    Thanks

    I think your program is repacked by Inno.

    If you want to automatically pins it onto the taskbar, maybe you just need to modify the function CurPageChanged() ,

    you can remove IsTaskSelected()function,and remove the [task] section.

    like following:

    procedure CurPageChanged(CurPageID: Integer);

    begin

      //When Finished page is shown, call the function

      //You can also call is when the "Finish" button clicked.

      if  CurPageID = wpFinished then  

      begin

      //if IsTaskSelected('pintaskbar') then  //if Selected the [task]

         zylPinAppToTaskbar(ExpandConstant('{app}'), 'MyProg.exe');

      end;

    end;

    Hope can help you.

    Regards... ;-)

  7.  

     

     

    Already has, I added it to my AIDA64 installer and its working perfectly (even removes it on uninstall)

    remove the shortcuts form taskbar, I think it need to delete the shorcuts form the special directory.

    C:\Users\Current User\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar.

    (The directory is hide.)

     

    Thanks again...!!!

    Regards... ;-)

     

     

    Already has, I added it to my AIDA64 installer and its working perfectly (even removes it on uninstall)

    How you delete shortcut at uninstall...? deleting the link...?

    Regards... ;-)

     

    Maybe U can see the [uninstallDelete] section in InnoSetup documentation.

    I am trying to find a way in

     section.but not finished.
    In theory, pin or unpin is the same way.
  8. Use COM methods and properties via the COM Automation objects support.

    So I translate a Delphi script to Inno Setup

     section.

    And it work! 

     

    Here is a part of script in [code] section:

    [code]

    http://www.jrsoftware.org)

    There are someway to pin taskbar depend on one's choice.

    We can add a [task] section in InnoSetup.

    if one do not want to see the "task selected page"(like me ),

    the second way is to create a new CheckBox in Inno [code] section.

    And in the second way one need to control the CheckBox show or hide inprocedure CurPageChanged().

    then call the function like:   zylPinAppToTaskbar('c:\window', 'notepad.exe'); 

     

    An example project for Unicode Inno Setup is provided as download.

    The attachment "pintaskbar.zip" is the script.

    Unzip the file pintaskbar.zip,you can get two files named "PinShortcutOntoTaskbar-task.iss"

    and "PinShortcutOntoTaskbar-checkbox.iss".

    Please copy the *.iss files to the directory:  ./Inno Setup 5/Examples

    Then build the program and run PinTaskbar.exe.

     

    References

    http://blog.csdn.net/ccrun/article/details/6906471

    http://gallery.technet.microsoft.com/ScriptCenter/b66434f1-4b3f-4a94-8dc3-e406eb30b750/

    http://www.codeproject.com/Tips/713824/Pin-a-shortcut-onto-the-Taskbar-or-Start-Menu 

     

    The following is the script of the second way, I think you can modify it to the first way.

    If the attachment was broken, copy the following script to a *.iss file.

     

    ; -- PinShortcutOntoTaskbar.iss --
    ; Pin a shortcut onto taskbar on Win7 & Win8.
    ; @author: Yaliang.Zhao <shuangxiang2008@google.com>
    ; @brief: I test is on 32-bit  Win7 & Win8, but
    ;         I thins it will work on X64 version.

    [setup]
    AppName=PinTaskbar
    AppVersion=1.0
    OutputBaseFilename=PinTaskbar
    DefaultDirName={pf}\PinTaskbar
    OutputDir=./
    DisableStartupPrompt=yes
    DisableReadyPage=yes

    [Files]
    Source: "MyProg.exe"; DestDir: "{app}"

    ;[Tasks]
    ;Name: pintaskbar; Description: "Pin shortcut onto taskbar"

    ;Following is how to use
    [Code]
    var
    PinTaskBarCheck : TNewCheckBox;
    //the function is work well on Unicode Inno Setup,
    //if Non Unicode Inno Setup, one need to modify,
    //and I think you can do it!
    //Inno use Win32 API
    function LoadLibrary(lpFilename : String) : LongInt;
    external 'LoadLibraryW@kernel32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadLibraryA
    function FreeLibrary(hModule : LongInt) : BOOL;
    external 'FreeLibrary@kernel32.dll stdcall delayload';
    function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
    external 'LoadStringW@user32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadStringA

    //here is the function
    //@param strPath The App's directory,
    //@param strApp The App's name
    //@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
    procedure zylPinAppToTaskbar(strPath, strApp: string); 
    var 
      vShell, vFolder, vFolderItem, vItemVerbs: Variant; 
      vPath, vApp: Variant; 
      i: Integer; 
      sItem: String;  
      h: LongInt;
      szPinName: String;
      filenameEnd : Integer;
      filename    : String;
      strEnd    : String;
    begin
      SetLength(szPinName, 255);
      h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll')); 
      LoadString(h, 5386, szPinName, 255); 
      FreeLibrary(h); 
      strEnd := #0;
      filenameEnd := Pos(strEnd, szPinName);
      filename := Copy(szPinName, 1, filenameEnd - 1);
      if (Length(filename) > 0) then  //WinXp or lower, no pin taskbar function
      begin
        vShell := CreateOleObject('Shell.Application'); 
        vPath := strPath; 
        vFolder := vShell.NameSpace(vPath); 
        vApp := strApp; 
        vFolderItem := vFolder.ParseName(vApp); 
        vItemVerbs := vFolderItem.Verbs; 
        
      for i := 1 to vItemVerbs.Count do 
      begin 
        sItem := vItemVerbs.Item(i).Name;

        if (sItem = filename) then
        begin
          // 63 63 72 75 6E 2E 63 6F 6D 
          vItemVerbs.Item(i).DoIt;
          break;
         end;
        end; 
      end;
    end; 

    //You can use zylPinAppToTaskbar like this
    procedure CurPageChanged(CurPageID: Integer);
    begin
      //When Finished page is shown, call the function
      //You can also call is when the "Finish" button clicked.
      if CurPageID <> wpWelcome then
        PinTaskBarCheck.hide
      else begin
        PinTaskBarCheck.show;
      end;
      if  CurPageID = wpFinished then 
      begin
      //if IsTaskSelected('pintaskbar') then  //if Selected the [task]
      //   zylPinAppToTaskbar(ExpandConstant('{app}'), 'MyProg.exe');
      if PinTaskBarCheck.Checked then
        zylPinAppToTaskbar(ExpandConstant('{app}'), 'MyProg.exe');
      end;
    end;

    procedure InitializeWizard;
    begin
      PinTaskBarCheck := TNewCheckBox.Create(WizardForm);
       with PinTaskBarCheck do begin
        Parent  := WizardForm;
        Caption := 'Pin it onto taskbar';
        Top     := 200;
        Left    := 200;
        Width   := ScaleY(200);
        Height  := ScaleY(15);
        State   := cbChecked;
        //Hide;
      end;
    end;

    pintaskbar.zip

×
×
  • Create New...