пятница, 27 июня 2008 г.

Знаете ли вы, что…

… среди блогов MSDN появился блог Сары Форд, переведенный на русский (за что огромное спасибо Виталию Зайко). Сара Форд (ее оригинальный блог здесь) работает в инженером по тестированию Visual Studio, а так же ведет блог по различным How-to и Did you know по использованию различных версий студии. Сара экстремально активный блогер, каждый день она как правило публикует по статье, так что скучать не придется :).

четверг, 19 июня 2008 г.

Shell Extension Handlers на .NET

Вчера разбирался с Shell Extension-ами нашего проекта. Мне предстояло сделать что-бы контекстное меню для определённой иконки на десктопе формировалось динамически. Решил погуглить на счет примера реализации системного интерфейса IContextMenu на .net и вот какую вешь обнаружил. Оказывается Майкрософт крайне не рекомендует реализовывать Shell Extension Handler-ы на .net, и особенно те которые могут загружаться в процессы (in-process shell extensions). Вот ссылка на на оригинальное сообщение Jesse Kaplan, (одного из CLR Program Manager), а ниже мой вольный перевод его слов:

К сожалению, единственный способ реализовать их – это неуправляемый С++ . Создание расширителей оболочки, которые загружаются в процесс (in-process shell extensions), это в действительности очень опасная вешь, поскольку таким образом вы можете внедрить управляемый код (и .NET Framework) в каждое приложение на машине, у которого есть стандартный Windows-диалог для открытия файлов.

Проблемы возникают из-за того что только одна версия .NET Framework может быть загружена в процесс (другие компоненты предназначенные для совместного использования как java и msxml имеют те же свойства и как следствие те же ограничения).

Если вы напишете ваш расширитель оболочки на .NET Framework 2.0 , а приложение написанное на .NET Framework 1.1 создаст стандартный диалог для открытия файлов ваш расширитель сгенерирует ошибку, так как не сможет работать на младшей версии. Все может стать еще даже хуже если ваш расширитель загрузится в процесс раньше другого приложения на .net. Наличие вашего расширителя может привести к тому что приложению придётся работать на версии рантайма, на которую оно не было рассчитано и оно упадёт. Из-за всех этих проблем мы настоятельно рекомендуем не использовать исполняющие среды и библиотеки, которые поддерживают загрузку только единственной версии в процесс (такие как .NET Framework, java, or msxml) для разработки расширителей оболочки.

Вот такие дела. Тем не менее, если все таки кому-то надо реализовывать расширители оболочки, то хороший пример находится совсем рядом: VS2003Dir\SDK\v1.1\Samples\Technologies\Interop\Applications\ShellCmd,

где VS2003Dir – это каталог, где установлена 2003 студия.

Как стать экспертом

На днях искал как поставить ударение над символом, при наборе текста в ворде. Попробовал метод научного тыка, но не нашел. Решил погулить и наткнулся на замечательный сайт полезных советов по ворду -- WordExpert.ru. Уверен, что у каждого время от времени возникают подобные вопросы, поэтому надеюсь, что ссылка окажется полезной.

понедельник, 16 июня 2008 г.

GUI Шпионы (информация к размышлению)

В этой статье я попытался сделать краткий обзор инструментов, которые помогают исследовать пользовательский интерфейс Windows-приложений, и с которыми мне в той или иной мере доводилось работать самому. Для иллюстрации работы инструментов я буду использовать простую форму с кнопкой и пустым (и по этому невидимым в рантайме) PictureBox. Вот как эта форма выглядит в дизайн-тайме (первый) и в рантайме (второй).


Итак, встречайте: Spy ++, The Customiser, Managed Spy и WfSpy. Первые два инструмента рассчитаны на работу с native Win32 приложениями, так как были созданы до появления технологии .NET, однако работу свою выполняют хорошо и с managed-приложениями. Естественно, всех свойств и событий для .NET контролов они не покажут, но наиболее важные, такие как: координаты, размеры, текст, доступность (enable/disable) - будут.

Spy ++ (Microsoft, Win32)
Пожалуй, самый известный в своем роде. Этим инструментом я пользуюсь постоянно и по сей день, поскольку это самый надежный инструмент из перечисленных. Не так давно у него появился младший брат Remote Spy – ориентированный на работу с приложениями, написанными для мобильных устройств.Но это уже совсем другая история. Spy++ уже много лет входит в состав Visual Studio. Однако через меню кнопки Пуск (Start) вы его, скорее всего, не найдете и поэтому рекомендую самостоятельно поискать в каталоге установки студии через обычный файловый поиск spyxx.exe. У меня он находится здесь VSDir\Common7\Tools (VSDir – каталог, где установлена студия). На рисунке ниже представлено главное окно Spy++, как оно выглядит сразу же после старта.
Инструмент умеет показывать информацию о запущенных процессах, созданных окнах, потоках. Но работает только в режиме readonly – показывает различные свойства перечисленных объектов системы, но менять не дает, в отличие от The Customiser или Managed Spy. Позволяет так же отслеживать события, которые приходят к интересующему окну. Чтобы начать исследовать какую-нибудь сложную форму или контрол, вызовите команду Find Window из меню Spy.

В появившемся диалоге наведите курсор на иконку окна с прицелом и перетащите ее на интересующее окно или контрол.
Затем нажмите OK. В результате появится диалог со свойствами выбранного объекта. Пример такого окна ниже.
С этого диалога на закладке Windows можно быстро перейти к родительскому окну, на закладке Process можно быстро перейти к родительскому процессу или потоку исследуемого окна. Если нажать кнопку Synchronize, выбранный объект будет найден в дереве окон, которое отображается в центральной части главного окна.
Закроем окно свойств и перейдем к дереву окон. В контекстном меню узла дерева есть несколько команд, но расскажу только о Highlight. Эта команда позволяет подсветить мерцающей рамкой контрол или окно, соответствующее узлу дерева. Разумеется, чтобы ее увидеть, надо чтобы окно, в котором находится выбранный контрол, находилось в области видимости.
Ну, вот вкратце и все. У инструмента еще много возможностей и кого он заинтересует, найдет их самостоятельно. Дополнительное описание Spy++ можно найти на его страничке в MSDN.

The Customiser (Wanga International, Win32)
Это первый инструмент такого рода, с которым я познакомился. Настоящая игрушка для программистов (и не только). В изучении пользовательского интерфейса приложений намного удобней и интуитивней Spy++ или Managed Spy. Скачать его можно здесь. Позволяет во время работы приложения менять свойства его контролов – размеры, положение, надписи, видимость, доступность (enable/disable) и еще много чего. Посылать различные сообщения контролам и окнам. Например, любую кнопку, которая находится в состоянии disable можно сделать enable, потом нажать и посмотреть что произойдет :). Вообще The Customiser умеет много чего, всего и не перечесть. Весьма прикольно при помощи The Customiser модифицировать панель задач и кнопу Пуск/Start. На рисунке ниже показан результат работы над кнопкой Start и панелью задач.
После запуска The Customiser появится небольшое окошко с бегающим вправо-влево шариком. Кстати, после инсталляции The Customiser надо искать в корне меню All Programs, никаких папок с именем компании или приложения он не создает.
Нажмите кнопку Edit Window и появится основное окно для работы. Далее, надо нажать на кнопку On (после чего курсор поменяет свой вид на большой и желтый) и затем можно выбрать интересующее окно или контол.
После выбора компонента для исследования в диалоге появятся дополнительные закладки, на которых сгруппированы информация и действия по изменению компонента.
Коротко опишу назначение каждой закладки.
  • Size and Position – просмотр и изменение положения и размеров компонента.
  • Text – позволяет изменять текст компонента, например, заголовок окна или надпись на кнопке.
  • Misc. – закладка предназначена для изменения таких свойств компонента как enable, visibility. Также содержатся команды для посылки событий типа maximize, minimize.
  • API Message – закладка предназначена для послылки компоненту всевозможных событий.
Несмотря на богатые возможности и простоту работы с инструментом иногда отказывается работать и повисает. Порой еще и винду вешает.

Managed Spy (Microsoft, .NET 2.0)
Это бесплатный инструмент, написанный Benjamin Wulfe, участвовавшим в разработке Visual Studio, дизайнера Windows Forms, и ряда классов для Framework и Compact Framework. Скачать ManagedSpy можно здесь. Сразу после старта в левой части окна отображаются процессы с managed кодом, а справа – свойства выбранного процесса или его дочернего элемента.
В панели свойств отображаются свойства выбранного контрола, где их можно не только просматривать, но и менять (в отличие от Spy++). На рисунке ниже показан результат изменения свойства BackColor для невидного в рантайме PictureBox.
Есть функция, позволяющая на исследуемом окне подсветить исследуемый контрол (аналогично команде Highlight из Spy++). Для этого в меню View вызовите команду Show Window. В общем-то, простой и удобный использовании инструмент, но, к сожалению, не на всех окнах ManagedSpy работает. На простых все ОК, а вот на сложных иногда дает сбои. По крайней мере, у себя в проекте я им воспользоваться не смог. Более подробное описание ManagedSpy можно найти в статье в MSDN Magazine.

WfSpy (.NET 1.0, .NET 1.1)
Инструмент написан Rama Krishna Vavilala. Распространяется бесплатно и исходниками, которые прилагаются к его статье на CodeProject. Статья доступна вот здесь. К ней прилагается вариант, скомпилированный для .net 1.0. но для работы под .net 1.1 достаточно его просто перекомпилировать в VS 2003. В целом по внешнему виду очень похож на ManagedSpy. Сразу после старта в центральной части окна отображаются процессы с managed кодом. Чтобы посмотреть свойства заинтересовавшего компонента надо нажать кнопку Details. После чего откроется окно со списком свойств выбранного компонента, где можно как просматривать, так и изменять свойства компонента.
Заключение
Как видно из этого небольшого обзора, большинство инструментов достаточно просты и работа с ними интуитивно понятна. Самый сложный в использовании – это Spy++, однако, он, пожалуй, и самый функциональный. В статье приведены четыре инструмента, с другими мне сталкиваться не приходилось, так что если вы знакомы с каким-либо еще подобным инструментом - пожалуйста, напишите об этом в комментариях.

пятница, 6 июня 2008 г.

Скромный пожиратель ресурсов

В состав Visual Studio входит небольшая утилитка командной строки consume.exe, которая предназначена для загрузки ресурсов системы при нагрузочном тестировании. Найти ее можно по следующему пути: VSInstallDir\Common7\Tools\Bin. VSInstallDir – это путь где у Вас установлена студия. Основная задача этой утилиты – на определенное время основательно занаять какой-либо ценный ресурс системы (например, оперативную память, процессорное время, дисковое пространство и т.д). Формат работы утилиты следующий:

consume RESOURCE [-time SECONDS]

RESOURCE – как можно догадаться по имени параметра, это ресурс системы который надо занять. Он может принимать одно из следующих значений:
  • -physical-memory
  • -page-file
  • -disk-space
  • -cpu-time
  • -kernel-pool

SECONDS – а это время в секундах на которое надо занять ресурс.

воскресенье, 1 июня 2008 г.

Как быстро закрыть 23 Internet Explorer’а

Не знаю, кто как, а я для подобных целей использую утилиту Windows taskkill вот с такими параметрами:

taskkill /f /im iexplore.exe

Чтобы не ошибиться с набором имени процесса, можно вывести список всех процессов в консоль утилитой tasklist и потом воспользоваться командами Mark/Paste.

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

1. В System Tray найти иконку приложения.
2. Открыть у него контекстное меню.
3. В меню выбрать команду Exit.
4. И наконец, подтвердить, закрытие приложение.

И когда приходится по 20 раз на день запускать/закрывать клиента, я всегда держу открытым консольное окно с командой для запуска и закрытия приложения.