← All posts tagged Windows

Linda-chan
Windows программизм Заметила странность с DLL, собранными FreeBasic, в Windows 95. Допустим, у нас есть библиотека на FB, есть программа на VB6, которая её использует. Запускаем программу, она грузит библиотеку, всё хорошо. Теперь делаем ActiveX DLL на VB6, которая использует библиотеку, регистрируем через RegSvr32 в Windows 95. RegSvr32 грузит библиотеку, та грузит свои зависимости, в том числе FB библиотеку, а потом RegSvr32 получает от LoadLibraryEx() ошибку 0x45a. Даже если просто сказать RegSvr32 регистрировать FB библиотеку, то будет та же ошибка. Не понимаю, что происходит. В Windows 98 работает без проблем.
Linda-chan
Windows программизм Ранее я писала, как Win16 выдавала мне страшное сообщение об ошибке при попытке вызвать функцию из не найденной DLL в VB3. Я подумала и нашла источник проблемы. Есть в Windows такая функция SetErrorMode(), которая устанавливает глобально для задачи (процесса в Win32), как будут обрабатываться некоторые ошибки. Например, можно сказать, чтобы при возникновении необработанного исключения программа просто схлопывалась и не выдавала никаких «Память не может быть read». Есть там флаг SEM_NOOPENFILEERRORBOX, который именно на это и отвечает. Если установить его для задачи, то выдача страшных сообщений прекратится, пользователь не будет знать, что программа чего-то не нашла, а программа сама будет действовать альтернативно. Собственно, после установки этого флага, сообщения прекратились. А в Win32 он вроде как установлен по умолчанию (хотя, документация говорит обратное), но, как мне показалось, даже если его сбросить, никаких сообщений не появится.
Linda-chan
Windows программизм There is a horrible non-obvious quirk of the Adjust­Token­Privileges function that is tripping us up: The function returns success even though it may have failed to do what you asked.
The function “succeeded” in the sense that it successfully attempted to adjust the privileges you requested, and it successfully reported the result of the adjustment attempt. But that doesn’t mean that the attempt actually accomplished what you asked it to do.
devblogs.microsoft.com
Linda-chan
Windows программизм В Windows 3.xx, если VB3 программа пытается вызвать функцию из отсутствующей DLL, появляется то самое системно-модальное окно сообщения, поясняющее, что данной библиотеки не найдено. После этого (если не установить обработчик ошибок) уже VB рантайм вываливает ошибку «File not found» и схлопывается. В принципе, это происходит и при запуске такой программы в NT и 9x. А вот в VB6 такой фигни нет.
pics.lindachan.net
pics.lindachan.net
Linda-chan
Windows программы программизм У MessageBox() есть ещё один прикольный флаг – MB_SYSTEMMODAL. В Win32 он ничего заметного не делает (документация говорит, что окно сообщения появляется поверх всех окон, что эквивалентно MB_TOPMOST), зато в Win16 показывает окно сообщения, которое блокирует всю систему пока не нажмёшь на кнопку. При этом, если не указать флаг иконки или указать MB_ICONSTOP, то показывается простейшее окно фиксированного размера, без заголовка (текст заголовка пишется отдельной строкой), с текстом шрифтом System и кнопкой. Такое окно рассчитано на ситуации, когда системные ресурсы закончились, система не может даже окно нормально нарисовать, но сообщение показать всё равно нужно, и делается это минимальными средствами. Если же указать другую иконку, то показывается обычное окно сообщения, только с одинарным бордюрчиком и без возможности окно это перетаскивать. Система при этом всё равно блокируется. Ещё одна интересная особенность заключается в том, что в Win9x приложения Win16 могут показывать такое окно с полной блокировкой системы, а Win32 приложения – нет. В NT даже Win16 приложения не могут заблокировать систему.
Linda-chan
Windows программы программизм В Windows есть функция MessageBox() сотоварищи, которая выводит окно с сообщением, иконкой и набором кнопок для реакции пользователя. Для выбора иконки есть следующие флаги:
• MB_ICONHAND – выводит красную фигню с крестиком, типа, сообщение об ошибке.
• MB_ICONQUESTION – выводит фигню с вопросительным знаком.
• MB_ICONEXCLAMATION – выводит фигню с восклицательным знаком, типа, предупреждение.
• MB_ICONASTERISK – выводит фигню с буквой «i», информация.
В глаза бросается некое несоответствие названия констант тому, что они показывают. Более того, у MB_ICONHAND есть вносящий ясность псевдоним – MB_ICONSTOP. Что такое? Почему так? Дело в том, что названия констант говорят о том, что показывало окно сообщения в самой первой версии Windows. Тогда вместо креста при ошибке показывалась поднятая рука, а вместо буквы «i» – «*». В Windows 3.x руку посчитали неинтересной и стали показывать знак «Движение без остановки запрещено», и у константы появился «псевдоним», отразивший новые реалии. Та же фигня и со звёздочкой: появилась буква «i», и константа начала называться MB_ICONINFORMATION. В Windows 9x и NT4 иконки снова обновили, вместо знака появился крест, и авторы решили перейти от формы к содержанию, добавив псевдонимы MB_ICONERROR и MB_ICONWARNING. Получилась занятная капсула времени.
Linda-chan
Windows программы Ахаха, сама себя обманула. NT4 знает о подписи, просто я забыла, что смотрю свойства билда без подписи (идёт работа, так сказать). Для других файлов Проводник показывает подпись.
Linda-chan
Windows программизм Есть такая функция FindFirstFile(), которой передаём имя файла или путь с масками. В ответ получаем набор найденных файлов, точнее, данные о первом найденном файле и манипулятор, которым можно перечислить остальные элементы набора. Забавное случается, если попытаться передать функции имя каталога с слэшем на конце. Функция прекрасно что-то находит, возвращает манипулятор и данные, только вот в данных – пустота, всё по нулям. Что именно она там находит, я так и не выяснила. GetLastError() возвращает ERROR_FILE_NOT_FOUND, FindNextFile() говорит, что файлов не осталось.
Linda-chan
Windows ненависть программы Берём винт с NTFS, витиеватой структурой каталогов, симлинками, владельцем файлов с другой системы, правами на доступ только для него и местами ещё с кое-какими правами. Пытаемся привести всё это к какой-то единой системе с владельцем – локальным пользователем и правами для него и ещё пары учёток. Фрустрируем несколько дней.
Linda-chan
Windows программизм Есть такие функции как GetOpenFileName() и GetSaveFileName(), которые выводят диалоги открытия и сохранения файла. Они могут показывать диалог в новом стиле и диалог в старом стиле (как в Windows 3.xx). При чём флаг OFN_EXPLORER прямо не влияет на выбор вида диалога, и в обычных ситуациях всегда показывается новый диалог независимо от этого флага. Чтобы показать старый диалог, нужно не только не указать этот флаг, но и подкинуть функции хук, который будет всегда возвращать FALSE (тоесть сигнализировать, что сообщение должна обработать библиотека, а не код хука). Это присказка. Сказка в том, что в Windows 2000 и Windows XP новым был диалог с панелькой неких предопределённых папок слева (которые правились через TweakUI). В Windows Vista диалог переделали, и в левую часть впилили дерево каталогов, а сверху убрали раскрывающийся список с деревом каталогов, впилив вместо него хитрый текстбокс с путём к текущему каталогу. И все нормально написанные программы в новой системе тут же начали показывать новый диалог, если, конечно не использовали хитрые шаблоны. Но я заметила, что были программы, которые выводили диалог, выглядящий как в Windows XP. Экспериментируя, я выяснила, что флаг OFN_EX_NOPLACESBAR, который в предыдущих версиях системы отрубал сайдбар слева и превращал диалог в такой, какой был в Windows 9x или NT4. В Windows Vista и выше оно работает примерно так же, и диалог даже начинает выглядеть примерно так же. Но это всё равно не то. Оказалось, что для того чтобы получить диалог как в XP. нужно провернуть тот же трюк, как со старым диалогом: указываем флаг OFN_EXPLORER и подкидываем такой же хук (что характерно, прототип у старого и нового хука одинаковый, но оба задокументированы отдельно друг от друга). И получаем немного ностальгии.
Linda-chan
Windows программы Если создать пустой BAT файл и попытаться его запустить, системный загрузчик скажет, что оный файл не является приложением Win32. Как-то раньше не приходило в голову создавать пустые BAT файлы и запускать их.