Windows 98/Me

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Глюк с кодировкой подтверждаю. Как по дровам, так и по папкам
и не только Рабстол, я вам скажу)
А с чем ещё такой глюк происходит?
Shaos wrote:нотепад использует виндоус кодировку, а не досовскую - которую требует батник
Вот я и отследил, что это связано с некорректной работой Венды с кодировками
в ДОС окне. Java - это тоже ДОС-приложение...
Мелкомягкие ничего не говорили - я следил.
Shaos wrote:может уменя правильная русская версия была
У меня самогО лицензионная версия с голограммами номерами и книжкой.
"правильная" - что есть критерий её "правильности"?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Есть у меня ещё одно подозрение, что весь гимор с кодировками происходит
"на лету". В частности, у меня не работал appletviewer.exe от Java - путался
с путями типа:

C:\\WORK\\J2SDK1_4\\BIN\\appletviewer.exe
C:\WORK\J2SDK1_4\BIN\appletviewer.exe

вот эти двойные слэши появлялись "на лету" и это приводило к тому, что путь
не находился. Пришлось написать виндавозную затычку, меняющую пути "по пути",
назвать её applet.exe и ассоциировать с ней все системные вызовы appletviewer.exe
по умолчаниям. applet.exe далее сама вызывает appletviewer.exe с параметрами:

Code: Select all

// здесь много лишнего за комментами - отслеживал что происходит в отладке...

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
        MSG msg;
//---------------------- Запускаем appletviewer.EXE --------------------------------------
        Buf[0]=0x22; // ->"<-
if(strlen(lpCmdLine)!=0)
        {
//        ClsBuff[256];
//        result=GetCurrentDirectory(256,ClsBuff);
//        strcpy(ClsName, "");//--- смотрим имя CurrentDirectory --
//        strncat(ClsName, ClsBuff, result);
//        MessageBox(0,ClsName," CurrentDirectory:",MB_ICONWARNING);

//        MessageBox(0, lpCmdLine, "  CommandLine:", MB_ICONWARNING);
        strcpy(pat, "");
        strcpy(pat, "appletviewer ");
        // C:\\WORK\\J2SDK1_4\\BIN\\appletviewer.exe
        // C:\WORK\J2SDK1_4\BIN\appletviewer.exe
        strcpy(mes,"");
        strcpy(tmp,"");
// выделяем только имя файла этими манипуляциями
        strcpy(mes,strrchr(lpCmdLine,0x5c));  // ищем
        strrev(mes);
        strncat(tmp,mes,strlen(mes)-1);
        strrev(tmp);
//        MessageBox(0, tmp, "  Command:", MB_ICONWARNING);
//        strcpy(mes,"");
                           // иначе добавляем кавычки
            strcat(pat, Buf);       // в начале и
            strcat(pat, tmp);
            strcat(pat, Buf);       // в конце

//        MessageBox(0, pat, "  Command:", MB_ICONWARNING);
//        SetCurrentDirectoryA
        result=WinExec(pat,SW_MINIMIZE); //MINIMIZED or  SW_SHOW
        }
Также пришлось порешать аналогичную проблему для Professional Notepad.

Мне думается, если точно бы отследить момент, где происходит трабла с кодировкой
у сабжа с "Рабочим столом", это вполне можно было бы отследить и скорректировать
"на лету", но я никак не отслежу причину и повторяемость траблы, а в этом случае
утилиты - "следилки" выкидывают объём информации, который трудно анализировать.
Last edited by Lavr on 07 May 2011 17:41, edited 1 time in total.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

CMD/BAT - Проблема с кодировками в cmd

Post by Lavr »

Ага, фактически я угадал, что "на лету" это происходит, т.к. в реестре символов
¦рсю¢шщ ёªюы нет. Только непонятно в какой момент портится всё...

Вот тут люди также мучаются с похожей проблемой:
CMD/BAT - Проблема с кодировками в cmd. http://forum.oszone.net/thread-57327.html
Если стоит русская винда, то возникает проблема с кодировками, переменная %DESKTOP%
выглядит как "¦рсю¢шщ ёªюы". Пробовал chcp 1251, не помогает.

И судя по всему это трабла не только Вынь'98.

http://www.sql.ru/forum/actualthread.as ... tid=770114
Вся гуя в русской (и даже в нерусской - не помню уже от чего зависит) винде работает в 1251, а консоль в 866. Можно в реестре нагло заменить 866 на 1251 , но имхо, если не стоит производственной необходимости - лучше не парится
мне в молодости помогало ... set nls_lang=russian_cis.ru8pc866 выполнить
но это решает только в частном случае...
Кажется даже Microsoft не знает где собака зарыта.
http://forum.oszone.net/thread-66865.html :wink:
твик реестра насчет кодовой страницы сделан (=>1251)?

Code: Select all

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"
"1253"="c_1251.nls"
Last edited by Lavr on 07 May 2011 18:03, edited 1 time in total.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

http://www.sql.ru/forum/actualthread.as ... tid=770114
твик реестра насчет кодовой страницы сделан (=>1251)?

Code: Select all

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage] 
"1250"="c_1251.nls" 
"1251"="c_1251.nls" 
"1252"="c_1251.nls" 
"1253"="c_1251.nls"
У меня лично эта ветка реестра выглядит так:

Code: Select all

[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Nls\Codepage]
"1250"="cp_1250.nls"
"1251"="cp_1251.nls"
"1252"="cp_1252.nls"
"1253"="cp_1253.nls"
"1254"="cp_1254.nls"
"1257"="cp_1257.nls"
"437"="cp_437.nls"
"850"="cp_850.nls"
"737"="cp_737.nls"
"775"="cp_775.nls"
"852"="cp_852.nls"
"857"="cp_857.nls"
"855"="cp_855.nls"
"866"="cp_866.nls"
"869"="cp_869.nls"
"28597"="cp_28597.nls"
"20866"="cp_20866.nls"
"28595"="cp_28595.nls"
"28592"="cp_28592.nls"
"28591"="cp_28591.nls"
"ACP"="1251"
"OEMCP"="866"
Поменять можно, попробую, как из Инета выйду. Вопрос как проверить -
наобум запускать указанные пакеты компиляторов и JAVA....
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Так, похоже, сдвиги есть. В файлах JAVA обращения к %DESKTOP% имеются...

Code: Select all

 Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders    Desktop %
ReleaseDC ¤ GetDC [SetWindowPos  Ё GetClientRect _ GetDesktopWindow  + EndPaint   BeginPaint  рPostQuitMessage Д DefWindowProcA
Возможно, тут глюк и проходит при передаче параметра %DESKTOP% в окно ДОС.
Надо посмотреть...

Самое смешное, что отчасти эта дурная папка полезна.
C:\WINDOWS\All Users\¦рсю¢шщ ёªюы
Будучи созданной, она существует в этом виде и принимает все дурные
обращения к себе --> более ни разу не создаётся.
А непосредственно момент её создания на десктопе можно и не увидеть,
так как десктоп загорожен окнами или окном.
Поэтому Шаос и многие другие могли этого не видеть никогда.
C:\WINDOWS\All Users\ - не самое популярное место что-то искать.
Но вот когда на эту папку натыкается сам виндовоз - он сильно недоволен,
но тоже не факт, что это критично.
Непреодолимо это, если делать Виндовский Дефраг. Но Дефраг многие делают
сторонними утилитами - я, например, от Симантека. Где-то читал байку, что
Виндовский Дефраг содержит ошибку.

Похоже, функции работы с реестром не совсем корректно выполняются консольными приложениями WINDOWS.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:
HardWareMan wrote:Глюк с кодировкой подтверждаю. Как по дровам, так и по папкам
и не только Рабстол, я вам скажу)
А с чем ещё такой глюк происходит?
Нортона 98/2К/2К1 все помнят? Если похерить строчку "COUNTRY=007,866,C:\WINDOWS\COMMAND\COUNTRY.SYS" в CONFIG.SYS, то он сносит все русские имена, заменяя их на вопросы. Так что BEWARE! Кстати, может здесь можно и 1251 задать сразу?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Похоже, функции работы с реестром не совсем корректно выполняются
консольными приложениями WINDOWS.
Да вывод, похоже, правильный, но дело, собственно, и не столько в нём.
Для проверки даже не пришлось писАть консольных приложений
Венды, чего я с горяча было надумал...
Опыт очень простой: скопированное название папки Рабочий стол в редакторе
транспонировано в ДОС кодировку и снова скопировано в буфер обмена.
В консольном приложении Венды создаётся папка с кривым именем:
(вверху - Folder Manager - консольное приложение, внизу - окно Проводника.

Image

Дальше баг успешно создаётся и ведёт себя в точности как здесь ранее описано:
папка не может быть удалена, папки не существует.
Сама Венда средствами Проводника такой папки создать не даёт!!!

Image

Венде в названии папки не нравится всего лишь первый символ.
Если скопировать название папки так, как показывает его Венда, то такую папку
запросто можно создать и всё будет корректно.

Но поскольку в консольных приложения словосочетания Рабочий стол ни в какой
кодировке нет (я специально искал - проверял), они получают его через обращение
к ключу Desktop ветви Реестра
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
вот тут-то, на мой взгляд, и возникает глюк с кодировкой в названии папки.

Значицца причина понятна, вопрос - как её корректно забороть...

PS. За годы работы с Вендой создал специальную папку - Боремся с WIN... :wink:

PPS. Получается что-ли, что консольные приложения Венды, коими являются
и JAVA, и, собственно, сам CMD, работают в 1251, а когда что-то досовское
им подсовывается, то "сжирают" некорректно?
Last edited by Lavr on 08 May 2011 06:07, edited 6 times in total.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:Нортона 98/2К/2К1 все помнят?
Не то, чтобы не помню, а даже ни разу не сталкивался и не знаю кто такой... Серьёзно.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:
HardWareMan wrote:Нортона 98/2К/2К1 все помнят?
Не то, чтобы не помню, а даже ни разу не сталкивался и не знаю кто такой... Серьёзно.
А говоришь юзаешь дефраг от симантека. Я имел в виду Norton Utilities от Symantek.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:А говоришь юзаешь дефраг от симантека. Я имел в виду Norton Utilities от Symantek.
Тогда знаю. По названию согрешил было на NC и клоны, а я ими и вправду
не пользовался, т.к. юзал VC и FM. Сказал бы NU - я б сразу въехал. :wink:
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Нашел конкретно, условия появления бага. Он случается, когда из консольного
приложения Венды вызывается программа MS-DOS. Это совершенно чётко.
У меня из Folder Manager вызывал Borland C++ - bc.exe .
"Рабочими столами" запрудил весь десктоп. :lol:

Не знаю пока, от всех ли MS-DOS приложений такой эффект.
Если в пути C:\WINDOWS\All Users\¦рсю¢шщ ёªюы эту папку удалять,
она всякий раз появляется заново. Интересно, что только на десктопе.
В папке C:\WINDOWS\Рабочий стол этих клонов в этот же момент нет.

Предполагаю, что эффект вызван пользовательской политикой Венды.
Не приложение MS-DOS, а Венда лезет в пользовательскую папку
C:\WINDOWS\All Users\Рабочий стол
что-то там для себя посмотреть с кривым эффектом.
Что она там ищет - попробую выяснить вьюерами, раз уж точно знаю момент
возникновения бага.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:У меня из Folder Manager вызывал Borland C++ - bc.exe .
"Рабочими столами" запрудил весь десктоп.
Не знаю пока, от всех ли MS-DOS приложений такой эффект.
Справедливо действительно при вызове ЛЮБОГО .EXE-шника но только 1 раз.
То есть, если создалась папка C:\WINDOWS\All Users\¦рсю¢шщ ёªюы
после чего - её удалить из C:\WINDOWS\All Users\
повторного эффекта не будет.
Надо выйти из консольного приложения, после чего вызвать его снова и
запустить любой .EXE-шник, баг повторится.

Написал своё консольное приложение, где по нажатию кнопки запускаю BC.EXE:

Code: Select all

strcpy(pat, "C:\WORK\BC31\BIN\BC.EXE");
result=WinExec(pat,SW_NORMAL);
Никакого бага не происходит. :(
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Утилита REGMON.EXE (Монитор реестра) показывает, что, действительно, Folder Manager
получает из реестра ключ Common Desktop в кодировке ДОС:

Code: Select all

14  Manager  QueryValueEx  HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Common Desktop  NOTFOUND
15  Manager  CloseKey  HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders  SUCCESS
16  Manager  CreateKey  HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders  SUCCESS  hKey: 0xC29B9D60
17  Manager  SetValueEx  HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Desktop  SUCCESS  "C:\WINDOWS\All Users\¦рсю¢шщ ёªюы"
Может так и надо - Венда считает консольное приложение программой ДОС?

Посмотрю дальше, как этот ключ применяется...
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А если из фара запускать? ;)
Т.е. важно чтобы это было именно CMD?
Или оно из любого консольного приложения так чудит?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:А если из фара запускать? ;)
Т.е. важно чтобы это было именно CMD?
Или оно из любого консольного приложения так чудит?
Мне кажется - главное - это получение "кривого" значения ключа Common Desktop.

Code: Select all

Manager  SetValueEx  HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Desktop  SUCCESS  "C:\WINDOWS\All Users\¦рсю¢шщ ёªюы"
Дальше, мне кажется, этот момент на всё и влияет. Такой папки не будет,
значит придётся её создать, откуда и вылезет:
C:\WINDOWS\All Users\¦рсю¢шщ ёªюы

Сейчас проверю обращения к файловой системой через FILEMON.EXE и посмотрю,
как повлияет смена кодировок на "cp_1250.nls"