Разбирая старые завалы неожиданно поняла, что некоторые библиотеки, которые у меня, вроде как, актуальны, я написала в 2005 году. Например, библиотека для субклассинга окон, которую я использую то тут, то там, была скомпилирована 10.10.2005 и с тех пор не менялась.
Тег программизм в блоге Linda-chan
В Windows можно выбрать локаль для пользователя, и от неё будет форматироваться всякое вроде чисел и дат. А чтобы форматировать оные числа и даты, есть ряд функций вроде GetNumberFormat() и GetDateFormat(). Они позволяют отформатировать что-то, используя собственную маску, используя системную маску или то, чем системную маску переопределил пользователь в региональных настройках. Конкретно дата-время форматируются двумя разными функциями, которые выполняют свою работу хорошо, но всё же один нюанс остаётся за кадром: порядок следования. Ну, тоесть, я с детства знаю, что сначала идёт дата, а потом время: возможно, в школе так научили. Но вот есть программы вроде Notepad2, которые сначала вставляют время, а потом – дату. И в локали нет ничего на эту тему, только отдельный формат даты и отдельный формат времени. И как быть? Вообще, есть какие-то правила на сей счёт?
Два часа билась над алгоритмом перевода химетриков в пиксели через миллиметры и дюймы. Пришлось даже писать для себя мини-гайд о сути операции деления. Совсем плохо стало у меня с математикой. Последствия коронки?
Фан фэкт: авторка отборного NTR по «Ragnarok Online» какое-то время была VB разработчицей. Возможно, это как-то связано.
Стряхнула пыль с подзабытого искусства писать апплеты панели управления Windows.
А! Чего я занялась сертификатами?
Я тут пытаюсь писать новую библиотеку для HTTP запросов, поскольку старая, использующая православный WinInet, начала не справляться с современными интернетами даже в современных виндах. Хотела заюзать WinHTTP, но и он тоже где-то позади прогресса.
Забавно, что сначала MS придумала одну библиотеку для интернетов, потом другую, потом внедрила их в другие библиотеки и технологии, а потом просто забила. Сейчас, если что-то и существует, то где-то в дотнете и не понятно, в каком состоянии.
Ну в итоге я и решила делать костыль с запуском wget на фоне, хоть это и не мой метод. С ним пока всё нормально, так что...
Ну и где-то во время тестов обнаружилось, что wget ругается на мои сайты, говоря, что у меня неправильный сертификат. Разработку пришлось отложить в сторону и заняться сертификатами.
Не люблю такие вложенные дела =_=
В поисках одного кода нашла модуль, который писала ещё на первой работе. Там проверялось имя компьютера на соответствие имени компьютера, за которым я работала. Ностальгия...
Зачем-то написала библиотеку, совместимую с RunDLL32.
Культура «пет-проектов» должна умереть.
Я за утилитарный подход: нужна тебе какая-то программа, чтобы делать то, что другие не могут или могут, но не так, как тебе нужно – открываешь среду разработки (или текстовый редактор), пишешь код, а потом его используешь. Со временем у тебя таких программ набирается тонна, и ты все их используешь с той или иной периодичностью, выпиливая баги и модифицируя под новые условия. Можешь даже делиться с народом удачными или потенциально общественно полезными программами.
Ну, типа как, не нравится тебе как дверца в шкафу весит – берёшь, перевешиваешь её и пользуешься. Можешь даже кому-то ещё перевесить, если кто нуждается.
В культуре же «пет-проектов» оные проекты предстают в виде эдакого особого объекта, который необходимо выдавить из себя и упорно заниматься им хотя бы раз в день.
Одни вопрошают, каким бы «пет-проектом» заняться, ибо ничего придумать не могут, а надо. Другие рекомендуют придумать себе «пет-проект» и регулярно заниматься им, чтобы потенциальный хээр видел, что ты – серьёзный кандидат, «пет-проектом» занимаешься, а не объебос какой-то. Третьи жалуются, что десяток «пет-проектов» не оставляют времени работу работать и личной жизнью заниматься.
Ну, вы же не ломаете с утра до ночи голову над вопросом, какой бы гвоздь куда-нибудь вбить, а потом ежедневно гнуть его по-всякому, чтобы однажды кому-то его показать и доказать, что ты серьёзный чел, с гнутым гвоздём в стенке, а не объебос какой-то.
Написала тестовую программу, которая парсит заголовки Win16 и Win32 программ, показывая интересные данные вроде версии подсистемы, типа подсистемы, контрольной суммы, имени и описания модуля, ну и так далее. А теперь не знаю, что делать со всем этим кодом.
Помнится, в Windows 9x для удалённого запуска компонентов требовалась специальна программа на сервере. Одна постоянно висела в панели задач, но работала надёжнее, в вторая как-то фоном, но с ней вечно какие-то проблемы были. И ещё была утилита, которая позволяла прямо в реестре указать, что какой-то компонент должен выполняться на удалённой машине. Только это было реально двадцать лет назад, и я даже названий не помню этих программ, только иконку первой и её окошко. Ну и то, что вторая называлась dcomcnfg.exe, и нынче она вызывает MMC с оснасткой управления DCOM'ом.
Неожиданно удалось запустить ActiveX компонент удалённо. Тоесть, на одной машине зарегистрирован сервер ActiveX EXE, написанный на VB6, а на другой его объект пытается создать клиент, написанный тоже на VB6. При чём, раньше у меня всё время были какие-то проблемы, а в этот раз просто накидала тестовый проект, зарегистрировала, а на другой машине просто сделала «CreateObject(ProgID, ComputerName)», и всё. Клиент рулит объектом у себя, а код исполняется на другой машине. Единственное что, пришлось файрволл поковырять.
If you start off on Python before learning more beginner-friendly languages like JavaScript or Ruby [...]
https://medium.com/codex/le...-choice-5c8af5cb45a8
Кстати.
All things considered, why not start off on a watered-down version of Python rather than dive right in?
Заметила странность с DLL, собранными FreeBasic, в Windows 95. Допустим, у нас есть библиотека на FB, есть программа на VB6, которая её использует. Запускаем программу, она грузит библиотеку, всё хорошо. Теперь делаем ActiveX DLL на VB6, которая использует библиотеку, регистрируем через RegSvr32 в Windows 95. RegSvr32 грузит библиотеку, та грузит свои зависимости, в том числе FB библиотеку, а потом RegSvr32 получает от LoadLibraryEx() ошибку 0x45a. Даже если просто сказать RegSvr32 регистрировать FB библиотеку, то будет та же ошибка. Не понимаю, что происходит. В Windows 98 работает без проблем.
Короче, есть библиотека на FreeBasic, которую я использую в программах на VB6. Все объявления функций – в TLB файле. Добавила пару функций для кое-каких манипуляций с датой. Функция принимает один параметр типа Date (Double), производит манипуляции и возвращает дату в другой параметр того же типа. Возвращаемое значение Boolean (VARIANT_BOOL) сообщает, получилось произвести манипуляции или нет. Внутрях в том числе используются функции вроде VariantTimeToSystemTime() для конвертации в SYSTEMTIME. Вооот. Начались вылеты тестовой программы. Сначала выполнялась функция, а в конце случалось исключение. При чём WinDbg говорил, что беда случается в функциях категории SysStringLen(), которые работают с BSTR. Учитывая, что проблемный код не оперирует никакими BSTR, зато в тестовой программе функции вызывались прямо при конструировании строки с «отчётом» о проверке, выглядело всё так, словно где-то в библиотеке портится память, а потом всё ломается в программе. Ибо в программе не использовалось ничего особенного кроме для манипуляций со строками. Я долго вдумчиво смотрела в код, думала, какие-то проблемы с указателями, что-то не так передаётся во второй параметр, который указатель, либо не так вызываются функции конвертации даты из Date в SYSTEMTIME. Но там всё выглядело нормально. Кроме того, меня как-то настораживало сообщение: «Инструкция по адресу "0x77159d90" обратилась к памяти по адресу "0x0000fffb"». И второй адрес-то был всегда один и тот же. Откуда же он такой интересный? В общем, я посмотрела ещё раз исходник TLB и обнаружила, что по причине, связанной с ночным копипастингом, у меня возвращаемое значение (на самом деле – последний параметр функции) объявлено не как VARIANT_BOOL, а как BSTR. Я сваяла объявления в самом начале и больше даже не заглядывала туда. И вот что происходило. VARIANT_BOOL – это двухбайтовое целое со знаком (потому что совместимость с OLE в Win16), которое принимает значения 0 или -1 (кстати, частый вопрос, почему именно -1, а не 1), а BSTR – это четырёхбайтовый указатель на массив двухбайтных символов. Функция, возвращая True, записывала -1 в параметр, а код на VB6 получал указатель 0x0000FFFF. «FFFF» – потому что -1, а нули, полагаю, из-за выравнивания. Так как рантайм думал, что получает BSTR, а VB код возвращаемое значение прямо к строке присобачивал, полагаясь на автоматическую конвертацию, то рантайм вызывал BSTR функцию. Функция, чтобы получить реальный адрес строки, вычитала четыре байта (перед массивом у BSTR идёт длина строки), получала 0x0000FFFB, обращалась к этому адресу и благополучно вылетала. Вот такая история невнимательности.
«COM, DCOM, OLE. Всё это разные лица одного ануса. Тоесть Януса».
Не прошло и трёх лет, а у меня, наконец, дошли руки до ActiveX компонентов, вызываемых без регистрации. Оказалось, что сложного там ничего нет, нужно будет автоматизировать генерацию манифестов. Единственное что, в NT4 и Win9x не работает (хотя, в Windows 98 зачатки какие-то были).
UNIX время – это число с плавающей точкой, в UTC (нулевой часовой пояс), без дополнительных секунд. Всё верно? Запуталась уже =_=
Ранее я писала, как Win16 выдавала мне страшное сообщение об ошибке при попытке вызвать функцию из не найденной DLL в VB3. Я подумала и нашла источник проблемы. Есть в Windows такая функция SetErrorMode(), которая устанавливает глобально для задачи (процесса в Win32), как будут обрабатываться некоторые ошибки. Например, можно сказать, чтобы при возникновении необработанного исключения программа просто схлопывалась и не выдавала никаких «Память не может быть read». Есть там флаг SEM_NOOPENFILEERRORBOX, который именно на это и отвечает. Если установить его для задачи, то выдача страшных сообщений прекратится, пользователь не будет знать, что программа чего-то не нашла, а программа сама будет действовать альтернативно. Собственно, после установки этого флага, сообщения прекратились. А в Win32 он вроде как установлен по умолчанию (хотя, документация говорит обратное), но, как мне показалось, даже если его сбросить, никаких сообщений не появится.
There is a horrible non-obvious quirk of the AdjustTokenPrivileges 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.