Показаны сообщения с ярлыком ты можешь это сделать. Показать все сообщения
Показаны сообщения с ярлыком ты можешь это сделать. Показать все сообщения

вторник, 21 февраля 2023 г.

Случай с загадочной ошибкой "out of bounds" из CreateUri и memmove

Это перевод The case of the mysterious "out of bounds" error from CreateUri and memmove. Автор: Реймонд Чен.

Один клиент пытался понять, почему его программа вылетала с ошибкой E_BOUNDS ("out of bounds"), возбуждаемой из вызова метода CreateUri:
combase!RoOriginateErrorW+0x50
wincorlib!Platform::Details::ReCreateFromException+0x40
contoso!`__abi_translateCurrentException'::`1'::catch$0+0x10
contoso!memmove+0x217f4
contoso!Windows::Foundation::IUriRuntimeClassFactory::CreateUri+0x44
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::Update_ViewModel_Layout_Groups+0x50
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::Update_ViewModel_Layout+0xe4
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::PropertyChanged+0x1134
contoso!XamlBindingInfo::XamlBindingTrackingBase::PropertyChanged+0x30
Судя по стеку, процедура копирования памяти memmove вызывала высокоуровневое исключение RTL C++/CX E_BOUNDS — что не имеет никакого смысла. Ещё более загадочно то, что memmove была вызвана из метода CreateUri интерфейса IUriRuntimeClassFactory, но код клиента DashboardView вообще не работает с URI. Похоже, что этот стек вызовов - это просто какая-то чепуха.

Что ж, попробуем раскрутить эту чушь.

пятница, 5 апреля 2019 г.

Почему попытка остановить мою службу возвращает ERROR_BROKEN_PIPE?

Это перевод What does it mean when my attempt to stop a Windows NT service fails with ERROR_BROKEN_PIPE? Автор: Реймонд Чен.

Один клиент сообщил, что иногда у них возникает проблема: в состав их программного продукта входит служба Windows NT, и когда их клиентская программа пытается остановить службу, то иногда происходит сбой с ошибкой ERROR_BROKEN_PIPE. Их клиентская программа написана на C#, поэтому для остановки службы используется метод ServiceController.Stop, а об ошибке сообщается в форме исключения. В Win32 же это эквивалентно вызову функции ControlService с кодом SERVICE_CONTROL_STOP.

При каких условиях попытка остановить службу может привести к ошибке ERROR_BROKEN_PIPE?

вторник, 13 января 2015 г.

суббота, 4 июня 2011 г.

Как бы вы решили эту проблему совместимости: сетевые возможности взаимодействия

Это перевод How would you solve this compatibility problem: Network interoperability. Автор: Реймонд Чен.

Итак, товарищи, вот ваш шанс решить реальную проблему по обеспечению обратной совместимости. У этой задачи пока нет готового ответа; я хочу посмотреть, как вы попытаетесь её решить. Это задача - реальный баг в коде Windows Vista.

среда, 9 марта 2011 г.

Отладка телепатией: загрузка процессора на 50%

Это перевод Psychic debugging: Why your CPU usage is hovering at 50%. Автор: Реймонд Чен.

Иногда секрет телепатических способностей заключается просто в способности увидеть лес за деревьями.

среда, 3 ноября 2010 г.

Понимание хэш-кодов

Это перевод Understanding hash codes. Автор: Реймонд Чен.

Чаще, чем просто один раз, я вижу вопросы вроде таких:
У меня есть процедура, которая создаёт строки динамически. И мне нужна формула, которая берёт строку и делает небольшой уникальный идентификатор для этой строки (хэш-код), так что две одинаковые строки имели бы одинаковый идентификатор, а две различные строки - различный. Я пытался использовать String.GetHashCode, но у неё есть случайные совпадения. Какой есть способ, чтобы создать уникальный хэш?

четверг, 8 июля 2010 г.

Простая задачка на безопасность и синхронизацию

Это перевод A quick puzzle about security and synchronization. Автор: Реймонд Чен.

Эта головоломка всплыла в одной из наших внутренних групп обсуждения.

среда, 16 июня 2010 г.

Когда видимое окно невидимо?

Это перевод When is a window visible yet not visible? Автор: Реймонд Чен.

Сегодня - небольшая головоломка.

Посмотрите на такой код:
ShowWindow(hwnd, SW_SHOWNORMAL);
Assert(IsWindowVisible(hwnd));
Мы только что показали окно - конечно же оно должно быть видимо, да? Хотя проверка может выбросить исключение (даже в отсутствие многопоточности). Почему?

Ответ - ниже. Не читайте, если вы хотите попробовать решить загадку самостоятельно.

воскресенье, 16 мая 2010 г.

Не спускайте глаз с кодовой страницы - практический экзамен

Это перевод Keep your eye on the code page, practical exam. Автор: Реймонд Чен.

Инструкция, которая прилагалась к моему монитору, написана на нескольких языках. Один из них - польский, ну или, хотя бы, он должен быть польским, если бы... ну, смотрите сами.
UWAGA: Szczegó³owe informacje dla u¿ytkownika znajduj¹ siê na do³¹czonej p³ycie CD.
Это тарабарщина. На самом деле, они хотели написать:
UWAGA: Szczegółowe informacje dla użytkownika znajdują się na dołączonej płycie CD.
(что означает: "Примечание: подробная информация для пользователя включена на CD")

Что же пошло не так? Почему все символы со штрихами, кроме одного, оказались испорченными?

пятница, 19 февраля 2010 г.

Ширина иногда лучше чем глубина

Это перевод Breadth is sometimes better than depth. Автор: Эрик Липперт.

Совсем недавно Scripting Guys писали об использовании рекурсии для поиска всех файлов в папке и всех её под-папках. Вы можете заметить, что в этом очень стандартном подходе к этому вопросу используется принцип "сначала в глубину".

вторник, 16 февраля 2010 г.

Почему описатели ядра всегда кратны четырём?

Это перевод Why are kernel HANDLEs always a multiple of four?. Автор: Реймонд Чен.

Не слишком хорошо известно, что два младших бита любого описателя ядра (также: дескриптора или HANDLE) всегда равны нулю; другими словами, их численное представление всегда кратно четырём. Заметьте, что это применимо только к описателям объектов ядра; это не так для псевдо-описателей (типа GetCurrentProcess) или описателей других типов (описатели USER или GDI, мультимедийные дескрипторы...). Описателями ядра являются те вещи, которые вы можете передать в функцию CloseHandle.

Доступность младших двух битов кроется в заголовочном файле ntdef.h:
//
// Low order two bits of a handle are ignored by the system and available
// for use by application code as tag bits. The remaining bits are opaque
// and used to store a serial number and table index.
//

#define OBJ_HANDLE_TAGBITS 0x00000003L
То, что как минимум один младший бита всегда равен нулю, также неявно указывается функцией GetQueuedCompletionStatus, описание которой говорит, что вы можете установить младший бит описателя события для подавления уведомления порта. Чтобы это работало, необходимо, чтобы младший бит произвольного описателя изначально всегда был равен нулю.

Эта информация бесполезна для большинства программистов, которые должны трактовать описатели как непрозрачные значения. Но эта информация может заинтересовать людей, которые реализуют низкоуровневые библиотеки классов и оборачивают объекты ядра для использования в такой библиотеке.

понедельник, 8 февраля 2010 г.

Подсказки области уведомления не штрафуют вас за отсутствие у клавиатуры

Это перевод Taskbar notification balloon tips don't penalize you for being away from the keyboard. Автор: Реймонд Чен.

Функция Shell_NotifyIcon используется для различных вещей. Среди них - показ пользователю balloon-сообщений. Как обсуждается в документации записи NOTIFYICONDATA, поле uTimeout указывает, как долго должена показываться подсказка.

Но что если пользователь не у компьютера, когда вы её показываете? После 30 секунд подсказка исчезнет, а пользователь упустит ваше важное сообщение!

Не бойтесь. Панель задач отслеживает активность пользователя (с помощью функции GetLastInputInfo) и не запускает таймер, если ей кажется, что пользователя за машиной нет. А вы получите свои 30 секунд "с глазу на глаз".

Но что если вы хотите учитывать даже то время, когда пользователь отошёл?

Ну у вас есть вся информация для решения этой задачи по ссылкам выше. Посмотрим, сможете ли вы собрать кусочки вместе и создать лучшее решение, чем эмуляция щелчка по подсказке (подсказка: внимательно посмотрите, что значит, что вы устанавливаете подсказку в пустую строку).

Но что если вы хотите показывать ваше сообщение дольше 30 секунд?

Вы не можете сделать это. Область уведомлений форсированно вводит ограничение в 30 секунд для любой подсказки. Потому что если пользователь ничего не сделал с вашей подсказкой за 30 секунд - скорее всего, она ему вообще не интересна. Если же ваше сообщение так важно, что его нельзя игнорировать, то подсказка в области уведомлений - неподходящий для этого инструмент. Подсказки в области уведомлений предназначены для некритичных временных сообщений пользователю.

воскресенье, 18 октября 2009 г.

Почему папка "Мои рисунки" возвращается, после того, как я её удалил?

Это перевод Why do folders like "My Pictures" come back after I delete them? Автор: Реймонд Чен.

Некоторых людей возмущает, что когда они удаляют некоторые специальные папки вроде "Мои рисунки" и "Моя музыка", то потом они снова заходят в Мои документы и видят, что эти папки пересоздались. Что происходит?

Сама Windows спокойно относится к вашим удалениям этих папок. Некоторые корпорации, например, удаляют эти папки с машин своих сотрудников, потому что они не хотят, чтобы сотрудники смотрели картинки и слушали музыку на работе (вот тебе на). И если папка удаляется, то Windows не пытается её создать заново.

Однако, любая программа может запросить пересоздание этих папок. Например, если программа передаёт флаг CSIDL_FLAG_CREATE в функцию SHGetFolderPath, то Windows создаст требуемую папку, если она не существует. Аналогично происходит при передаче fCreate = TRUE в функцию SHGetSpecialFolderPath.

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

Прим.пер.: в Windows есть и пересоздаваемые папки.

воскресенье, 4 октября 2009 г.

В чём разница между LocalAlloc и GlobalAlloc?

Это перевод What was the difference between LocalAlloc and GlobalAlloc? Автор: Реймонд Чен.

Когда-то во времена 16-ти битных Windows разница была огромной.

среда, 5 августа 2009 г.

Программирование означает, что иногда вам нужно сложить вместе несколько частей

Это перевод Programming means that sometimes you have to snap two blocks together. Автор: Реймонд Чен.

Часть сложности программирования (а для некоторых людей - и причина, почему программирование так интересно) заключается в изучении данных нам строительных блоков и решении, как бы их сложить вместе, чтобы получить что-то новое. В конце концов, если бы всё, что вы хотели бы запрограммировать, было уже готовым, это не называлось бы программированием. Это называлось бы ходить по магазинам (shopping).

Есть ли какой-то API или быстрый способ узнать, в каком окне находится мышь?

Я ответил: "LEGO Group не делает кубики для всех возможных объектов. Иногда вам просто надо взять две детали LEGO и сложить их вместе. Вот несколько интересных кусочков: GetCursorPos, WindowFromPoint."

Спасибо за ответ. Но WindowFromPoint даёт мне окно объекта по точке. Но мне нужно окно верхнего уровня, содержащее в себе курсор.

Отлично, тогда просто возьмите другой кусочек.

Я иногда задумываюсь, как вообще этим людям удаётся писать программы. Они создают впечатление, что они пишут код, спрашивая миллионы мелких вопросов и просто копируют код из ответов в программу.

Нет, постойте, копирование кода в программу означает сложение блоков кода вместе. Наверное они в конце просто просят готовую программу.

воскресенье, 28 июня 2009 г.

Одновременность относительна даже в компьютерах

Это перевод Even in computing, simultaneity is relative. Автор: Реймонд Чен.

Эйнштейн обнаружил, что одновременность относительна. Это также применимо и к компьютерам.

Люди часто спрашивают: "Нормально ли делать X в одном потоке и Y в другом одновременно?". Вот несколько примеров:
X = "закрыть дескриптор" и Y = "использовать дескриптор".
X = "вызвать UnregisterWaitForSingleObject для дескриптора", Y = "вызвать UnregisterWaitForSingleObject на него же".

Вы можете ответить сами на этот вопрос, даже ничего не зная о внутреннем поведении указанных операций. Всё, что вам нужно знать - это немного физики, и ответить на гораздо более простые вопросы о допустимости последовательного кода.

вторник, 2 июня 2009 г.

Запрашиваем информацию из окна Проводника

Это перевод Querying information from an Explorer window. Автор: Реймонд Чен.

Иногда разработчики программ начинают изобретать велосипед. Но часто достаточно просто сложить вместе несколько кусков головоломки. Сегодняшний пост - это один из последних случаев.

воскресенье, 10 мая 2009 г.

Позиционный и не-позиционный виды в ListView

Это перевод Positioned vs. non-positioned listview views. Автор: Реймонд Чен.

Иногда мне попадаются вопросы, возникающие из-за непонимания разницы между позиционными (positioned) и не-позиционными (non-positioned) видами ListView. Вопрос обычно содержит строки наподобие: "Я вставляю новый элемент с помощью LVM_INSERTITEM, но он появляется в конце списка, а не в той позиции, что я указал".