четверг, 25 июня 2009 г.

7 (Seven)

Был сегодня в Microsoft'е. Из интересного — сертификация под Windows 7 теперь бесплатна. Как получить лого за один день(при должном упорстве) можно посмотреть тут.

Еще выдали интересные книжки «Обеспечение совместимости приложений с Windows 7 — пособие для разработчиков» (PDF версия) и «Обеспечение совместимости приложений в Microsoft Windows Vista и Windows 7 — Руководство для IT-специалистов» (PDF версия).

По мелочам: VS2010 Beta 2 выйдет до конца года, а Windows 7 уже проходит сертификацию в силовых ведомствах.

среда, 24 июня 2009 г.

Немного ссылок

Не все программисты умеют рисовать. Для них существует www.iconfinder.net. Большинство иконок там используют лицензии GPL, LGPL, CC или Free. Можно задать поиск по ключевым словам и размерам.

Ещё можно искать картинки похожие на те, что где-то увидели. На сайте tineye.com можно загрузить свою картинку и найти похожие с лучшим качеством. Похоже, что поиск работает.

суббота, 20 июня 2009 г.

Семинар Microsoft

Microsoft проводит последний(до выхода Windows 7) однодневный семинар посвященный обсуждению вопросов обеспечения совместимости приложений. Семинар пройдет в Москве 25-го июня. По ссылке можно ещё успеть зарегистрироваться.

x or X and stackoverflow.com

Некоторое время назад я писал о том как можно проверить наличие той или иной переменной в структуре или классе. Оказалось, что оба описанных метода некорректны с точки зрения стандарта. Решение было получено на страницах сайта stackoverflow.com, который был организован Джоелом Спольски(Joel Spolsky) и Джефом Атвудом(Jeff Atwood). Само решение можно посмотреть тут.

Рекомендую обращаться к страницам указанного сайта тем, кто этого ещё не делает. Там бывают интересные вопросы и ответы.

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

Хозяйке на заметку

Следующий метод отладки имеет весьма узкое применение и в большинстве случаев может оказатся неподходящим. Описанное решение пришло в результате поиска проблемы в чужом коде, написанном в ужасном стиле (смесь С++ и С). Речь пойдет о защите памяти с помощью функции VirtualProtect. Эта функция позволяет изменить режим доступа к страницам памяти: только чтение, копирование по записи, полное отсутсвие доступа и далее. Полный список флагов можно найти в документации.

Для целей отладки интересен флаг PAGE_NOACCESS. Он позволяет ловить запись или, что более важно, чтение за пределами некоторой валидной области памяти. Для удобного применения VirtualProtect был создан следующий класс:
struct protect_mem_t {
    protect_mem_t(void* addr, size_t size) : addr(addr), size(size), is_protected(FALSE) {
        protect();
    }
    ~protect_mem_t() { release(); }
    BOOL protect() {
        if (!is_protected) {
            is_protected = VirtualProtect(addr, size, PAGE_NOACCESS, &old_protect);
        }
        return is_protected;
    }
    BOOL release() {
        if (is_protected)
            is_protected = !VirtualProtect(addr, size, old_protect, &old_protect);
        return !is_protected;
    }

protected:
    void*   addr;
    size_t  size;
    BOOL    is_protected;
    DWORD   old_protect;
};

Применять его можно следующим образом:
const size_t PAGE_SIZE = 4096;

int main()
{
    const size_t var_size = 1024 * 96; // 1024*96 - некоторый размер. Конкретное значение здесь только в качестве примера.
    const size_t guard_size = PAGE_SIZE * 2 - var_size%PAGE_SIZE;
    __declspec(align(4096)) char some_var[var_size + guard_size];
    protect_mem_t guard(&some_var[var_size], PAGE_SIZE);

    some_var[5] = 20;   // that's ok
    char x = some_var[5];   // that's ok

    char y = some_var[1024 * 96 + 1024]; // access violation

    return 0;
}

В приведенном примере, как и в реальной программе, была добавлена защитная область памяти прямо на стеке. Удачной отладки.