@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 модуль с функцией скрытия окна консоли новой версии?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
оно, как мне кажется, возникает когда программа (любая) работает малое время.
Я уверен, что \"Эта программа установлена правильно\" и давно отключил эту гадость :)
После запуска .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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Система 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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Здравствуйте, Игорь.
Проблема с появлением окна после завершения работы модуля, о которой я писал в посте 5, решилась добавлением манифеста, как внешним файлом, так и добавлением манифеста в ресурсы модуля (мои благодарности за подсказку u_shell).
Сам манифест, добавляемый в ресурсы:
По проблеме "система занята" обратился к Олегу Щербакову. В его модифицированных модулях тоже была раньше такая проблема и он ее решал. Вот что он мне написал:
Сам я далек от программирования, но думаю, что для Вас не составит большого труда понять этот код.
Олег скомпилировал для меня модули из Ваших исходников с учетом этих изменений и дополнительного манифеста и я их протестировал. Багов, упомянутых в ветке, в них не обнаружено.
Исходников для варианта модулей с функцией скрытия окна консоли в открытом доступе нет и он не смог их для меня сделать. :(
Не могли бы Вы:
1 Включить эти изменения в Ваши модули и скомпилировать их в двух вариантах (с функцией скрытия окна консоли и без оной) ?
2 Дать ссылку на исходники модулей с функцией скрытия окна консоли? Тогда я смогу обратится за помощью в компиляции к Олегу и не буду дергать Вас по мелочам.
Спасибо.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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; */
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Столкнулся с неприятным моментом в работе модулей. Батник, запущенный из SFX, не видит расположенных рядом с ним файлов, т.к., рабочей папкой устанавливается C:\Windows\system32, а не папка распаковки, где и лежат все эти файлы вместе с батником. Получается, что батник перед упаковкой нужно переделывать, указывая полные пути, что вызывает дополнительные сложности.
Можно ли сделать рабочей папкой, папку распаковки в будущих версиях?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Извините, оказывается рабочей папкой устанавливается папка из которой был произведен запуск 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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Здравствуйте, Игорь.
Тестовый батник test_OS_Arch.bat:
Создаю .exe файл:
После запуска .exe файла появляется консольное окно и курсор показывает "система занята" (крутится кольцо около стрелки курсора) в течении 5…7 секунд.
1 Чем занята система, почему это происходит?
2 Последняя версия маленьких SFX модулей с функцией скрытия окна консоли, которая у меня есть, - это версия 9.18. Где можно взять маленький SFX модуль с функцией скрытия окна консоли новой версии?
1. I don't want to think about such complex cases.
Try some simple case.
2. I don't update that code.
Хорошо, вот более простой случай:
sfx.exe запускается скриптом без "система занята", но если sfx.exe запустить двойным кликом, то курсор показывает "система занята".
it's difficult to say why.
Maybe some option when 7zS2.sfx calls .bat file.
Is it big problem?
1 Выглядит это неприятно.
2 После завершения работы sfx.exe появляется такое окно: hxxp://gora.7zsfx.info/test/smallSFX.PNG
So write simple example to get that window.
оно, как мне кажется, возникает когда программа (любая) работает малое время.
Я уверен, что \"Эта программа установлена правильно\" и давно отключил эту гадость :)
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.
IMHO it is better to make 7zS2.sfx compatible with PCA - either return an expected value via ExitProcess() or do whatever Microsoft recommends.
Система Win 7 x64, права администратора, UAC отключен, sfx.exe здесь: hxxp://gora.7zsfx.info/test/sfx.exe
1 Положил sfx.exe в корень системного диска.
2 Открыл корень системного диска в Проводнике и запустил sfx.exe двойным кликом.
3 Появилось консольное окно. Закрыл его, нажатием любой клавиши, (или крестиком в правом верхнем углу окна)
4 Консольное окно закрылось и через 0.5…1 сек появляется окно, показанное в пятом посте.
This is GUI module, version 9.22
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?
Здравствуйте, Игорь.
Проблема с появлением окна после завершения работы модуля, о которой я писал в посте 5, решилась добавлением манифеста, как внешним файлом, так и добавлением манифеста в ресурсы модуля (мои благодарности за подсказку u_shell).
Сам манифест, добавляемый в ресурсы:
По проблеме "система занята" обратился к Олегу Щербакову. В его модифицированных модулях тоже была раньше такая проблема и он ее решал. Вот что он мне написал:
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 Дать ссылку на исходники модулей с функцией скрытия окна консоли? Тогда я смогу обратится за помощью в компиляции к Олегу и не буду дергать Вас по мелочам.
Спасибо.
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; */
Здравствуйте, Игорь.
Столкнулся с неприятным моментом в работе модулей. Батник, запущенный из SFX, не видит расположенных рядом с ним файлов, т.к., рабочей папкой устанавливается C:\Windows\system32, а не папка распаковки, где и лежат все эти файлы вместе с батником. Получается, что батник перед упаковкой нужно переделывать, указывая полные пути, что вызывает дополнительные сложности.
Можно ли сделать рабочей папкой, папку распаковки в будущих версиях?
Check it again and show some example.
Извините, оказывается рабочей папкой устанавливается папка из которой был произведен запуск SFX, не место расположения SFX, а именно папка запуска.
Батник для проверки:
1 Сохраняем это батник в любом месте, например на диске D.
2 Кладем рядом маленький модуль v9.22 и запускает батник.
3 Затем переходим в C:\test и запускаем созданный в этой папке файл run.bat
4 В окне консоли видим рабочую папку батника start.bat из SFX и она равна C:\test, а не временной папке распаковки модуля %TEMP%\7zNNNNNNNN
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!
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,
But this won't probably work for UNC paths, so be careful with deletes.
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
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:
It worked well on the paths I tried.
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
Forgot
3. Application is busy
4. Manifest (not in diff-file)