Menu

Small SFX

gora2
2012-07-29
2012-12-07
  • gora2

    gora2 - 2012-07-29

    Здравствуйте, Игорь.

    Тестовый батник test_OS_Arch.bat:

    @Echo Off
    Set xOS=x86& If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64 
    Echo %xOS% 
    SET xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86 
    Echo %xOS%
    Pause
    

    Создаю .exe файл:

    @Echo Off
    Set file=n:\_My_ADDONs\SetTools\bat2exe\test_OS_Arch.bat
    For %%a In ("%file%") Do Set name=%%~na
    Del /F /Q "%name%.7z" "%file%.exe" setup.bat 2>Nul
    Copy "%file%" setup.bat >Nul
    7z a "%name%.7z" "setup.bat" >Nul
    Copy /b 7zS2_S.sfx + "%name%.7z" "%file%.exe" >Nul
    Del /F /Q "%name%.7z" setup.bat 2>Nul
    Pause
    

    После запуска .exe файла появляется консольное окно и курсор показывает "система занята" (крутится кольцо около стрелки курсора) в течении 5…7 секунд.
    1 Чем занята система, почему это происходит?
    2 Последняя версия маленьких SFX модулей с функцией скрытия окна консоли, которая у меня есть, - это версия 9.18. Где можно взять маленький SFX модуль с функцией скрытия окна консоли новой версии?

     
  • Igor Pavlov

    Igor Pavlov - 2012-07-29

    1. I don't want to think about such complex cases.
    Try some simple case.

    2. I don't update that code.

     
  • gora2

    gora2 - 2012-07-29

    Хорошо, вот более простой случай:

    @Echo Off
    Echo Pause >setup.bat
    7z a a.7z setup.bat
    Copy /b 7zS2.sfx + a.7z sfx.exe
    sfx.exe
    Pause
    

    sfx.exe запускается скриптом без "система занята", но если sfx.exe запустить двойным кликом, то курсор показывает "система занята".

     
  • Igor Pavlov

    Igor Pavlov - 2012-07-29

    it's difficult to say why.
    Maybe some option when 7zS2.sfx calls .bat file.
    Is it big problem?

     
  • gora2

    gora2 - 2012-07-29

    Is it big problem?

    1 Выглядит это неприятно.
    2 После завершения работы sfx.exe появляется такое окно: hxxp://gora.7zsfx.info/test/smallSFX.PNG

     
  • Igor Pavlov

    Igor Pavlov - 2012-07-29

    So write simple example to get that window.

     
  • adv-user

    adv-user - 2012-07-29

    такое окно:

    оно, как мне кажется, возникает когда программа (любая) работает малое время.
    Я уверен, что \"Эта программа установлена правильно\" и давно отключил эту гадость :)

    REGEDIT4
    [HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\AppCompat]
    \"DisablePCA\"=dword:00000001
    
     
  • Shell

    Shell - 2012-07-29

    После запуска .exe файла появляется консольное окно и курсор показывает "система занята" (крутится кольцо около стрелки курсора) в течении 5…7 секунд.

    Windows behaves that way when a GUI application does not create a window. What version of 7zS2.sfx do you have - 9.18? Please, check its subsystem. Is it console or GUI application? Perhaps, 7zS2 extracts the archive first, and Windows waits impatiently for CreateWindow() being called. In the case of BAT script, a window (that of cmd.exe) is already present.

     
  • Shell

    Shell - 2012-07-29

    Я уверен, что \"Эта программа установлена правильно\" и давно отключил эту гадость :)

    IMHO it is better to make 7zS2.sfx compatible with PCA - either return an expected value via ExitProcess() or do whatever Microsoft recommends.

     
  • gora2

    gora2 - 2012-07-29

    So write simple example to get that window.

    Система Win 7 x64, права администратора, UAC отключен, sfx.exe здесь: hxxp://gora.7zsfx.info/test/sfx.exe
    1 Положил sfx.exe в корень системного диска.
    2 Открыл корень системного диска в Проводнике и запустил sfx.exe двойным кликом.
    3 Появилось консольное окно. Закрыл его, нажатием любой клавиши, (или крестиком в правом верхнем углу окна)
    4 Консольное окно закрылось и через 0.5…1 сек появляется окно, показанное в пятом посте.

    What version of 7zS2.sfx do you have - 9.18? Is it console or GUI application?

    This is GUI module, version 9.22

     
  • Shell

    Shell - 2012-07-29

    As far as I understand, there should be an appropriate manifest in 7zS2.sfx to make it compatible with Win7 and Vista. Try creating a manifest as suggested in msdn.microsoft.com/en-us/Windows7TrainingCourse_Win7InstallerDetectionNative. Does that eliminate the window from the post #5?

     
  • gora2

    gora2 - 2012-08-02

    Здравствуйте, Игорь.
    Проблема с появлением окна после завершения работы модуля, о которой я писал в посте 5, решилась добавлением манифеста, как внешним файлом, так и добавлением манифеста в ресурсы модуля (мои благодарности за подсказку u_shell).
    Сам манифест, добавляемый в ресурсы:

    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
        <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
          <application> 
             
              <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"></supportedOS> 
          </application> 
        </compatibility>
      </assembly>
    

    По проблеме "система занята" обратился к Олегу Щербакову. В его модифицированных модулях тоже была раньше такая проблема и он ее решал. Вот что он мне написал:

    hxxp://svn.7zsfx.info/filedetails.php?repname=7zSfxMod&path=%2Fbranches%2F1.5.0-beta%2F7zSfxMod%2Fsources%2Fmain.cpp

    int APIENTRY WinMain2( HINSTANCE hInstance,
    #else
    int APIENTRY WinMain( HINSTANCE hInstance,
    #endif // _SFX_USE_CUSTOM_EXCEPTIONS
                         HINSTANCE hPrevInstance,
                         LPSTR lpCmdLine, int nCmdShow )
    {
        _set_new_handler( sfx_new_handler );
        CreateDummyWindow();

    вот это создает никому ненужное окно:
        CreateDummyWindow();

    сама функция в hxxp://svn.7zsfx.info/filedetails.php?repname=7zSfxMod&path=%2Fbranches%2F1.5.0-beta%2F7zSfxMod%2Fsources%2FHelpers.cpp

    void CreateDummyWindow()
    {
        HWND hwnd = CreateWindow( WC_STATIC, L"", 0,-10,-10,5,5, NULL, NULL, GetModuleHandle(NULL), NULL );
        if( hwnd )
        {
            SetTimer( hwnd, 1, 1, NULL );
            MSG msg;
            ::GetMessage(&msg,NULL,0,0);
            ::DispatchMessage( &msg );
            ::KillTimer( hwnd, 1 );
            ::DestroyWindow( hwnd );
        }
    }

    Сам я далек от программирования, но думаю, что для Вас не составит большого труда понять этот код.

    Олег скомпилировал для меня модули из Ваших исходников с учетом этих изменений и дополнительного манифеста и я их протестировал. Багов, упомянутых в ветке, в них не обнаружено.
    Исходников для варианта модулей с функцией скрытия окна консоли в открытом доступе нет и он не смог их для меня сделать. :(
    Не могли бы Вы:
    1 Включить эти изменения в Ваши модули и скомпилировать их в двух вариантах (с функцией скрытия окна консоли и без оной) ?
    2 Дать ссылку на исходники модулей с функцией скрытия окна консоли? Тогда я смогу обратится за помощью в компиляции к Олегу и не буду дергать Вас по мелочам.

    Спасибо.

     
  • Igor Pavlov

    Igor Pavlov - 2012-08-02

    2. As I remember you just need to uncomment some lines in sourece code:
          ei.fMask = SEE_MASK_NOCLOSEPROCESS
              #ifndef UNDER_CE
              | SEE_MASK_FLAG_DDEWAIT
              #endif
              /* | SEE_MASK_NO_CONSOLE */
              ;
          if (wcslen(cmdLineParams) != 0)
            ei.lpParameters = cmdLineParams;
          ei.nShow = SW_SHOWNORMAL; /* SW_HIDE; */

     
  • gora2

    gora2 - 2012-08-07

    Здравствуйте, Игорь.

    Столкнулся с неприятным моментом в работе модулей. Батник, запущенный из SFX, не видит расположенных рядом с ним файлов, т.к., рабочей папкой устанавливается C:\Windows\system32, а не папка распаковки, где и лежат все эти файлы вместе с батником. Получается, что батник перед упаковкой нужно переделывать, указывая полные пути, что вызывает дополнительные сложности.

    Можно ли сделать рабочей папкой, папку распаковки в будущих версиях?

     
  • Igor Pavlov

    Igor Pavlov - 2012-08-07

    Check it again and show some example.

     
  • gora2

    gora2 - 2012-08-07

    Извините, оказывается рабочей папкой устанавливается папка из которой был произведен запуск SFX, не место расположения SFX, а именно папка запуска.
    Батник для проверки:

    Echo @Echo Off ^& Echo %%CD%% ^& pause >start.bat
    Del a.7z
    7z a a.7z start.bat
    Copy /b 7zS2.sfx + a.7z sfx.exe
    MD C:\test
    Echo @Echo Off ^& Start "" "%CD%\sfx.exe" >C:\test\run.bat
    

    1 Сохраняем это батник в любом месте, например на диске D.
    2 Кладем рядом маленький модуль v9.22 и запускает батник.
    3 Затем переходим в C:\test и запускаем созданный в этой папке файл run.bat
    4 В окне консоли видим рабочую папку батника start.bat из SFX и она равна C:\test, а не временной папке распаковки модуля %TEMP%\7zNNNNNNNN

     
  • Igor Pavlov

    Igor Pavlov - 2012-08-07

    I don't know why I don't change current directory.
    Maybe I didn't test that code in all cases.
    I'll fix it in next version.
    Thanks!

     
  • Shell

    Shell - 2012-08-07

    gora2, you can use %0 until the problem with current directory is solved (this requires command-line extensions to be enabled, which is happily the default). For example,

    echo Current directory is %cd%
    echo This file is located in %~dp0
    

    But this won't probably work for UNC paths, so be careful with deletes.

     
  • gora2

    gora2 - 2012-08-08

    u_shell, thank you.
    I know about the variable %0. But it still requires rework a batch file. And the path %0 may contain special characters from the user, for example:
    C:\Documents and Settings\%My_Nick_Sl!der%\Local Settings\Temp
    The use of these paths lead to unpredictable results

     
  • Shell

    Shell - 2012-08-08

    Have you tried double quotes? I think they can deal with almost any characters that are allowed in paths at all. Here is a line from one of my sripts:

    for /d %%f in ("%~1\*") do call :walk "%%~f" "%~2\%%~nxf"
    

    It worked well on the paths I tried.

     
  • Oleg_Sch

    Oleg_Sch - 2012-08-09

    I've done all gora2's requests
    1. Hidden console windows through #define HIDE_CONSOLE
    2. Extraction folder as the current path for the file execution
    You can see difference at hxxp://oleg.7zsfx.info/tmp/7zSfxSmall.diff.txt
    I'll hope you will use this for feature release

     
  • Oleg_Sch

    Oleg_Sch - 2012-08-09

    Forgot
    3. Application is busy
    4. Manifest (not in diff-file)

     

Log in to post a comment.