22 окт. 2009 г.

Ещё одна причина на запускать программы по имени в Windows

Чтобы найти исполняемый файл по имени, Windows каждый раз вынуждена просматривать следующие директории:
  • Текущую рабочую директорию
  • Системную директорию Windows (путь к ней можно получить функцией GetSystemDirectory())
  • Директорию Windows (путь к ней можно получить функцией GetWindowsDirectory())
  • Директории перечисленные в переменной окружения PATH
Этот список (далее я буду обращаться к нему как директории поиска) может дополняться другими директориями в более конкретных случаях.
Если имя не содержит расширения (например, notepad или attrib), Windows будет запрашивать список файлов удовлетворяющих шаблону "имя.*" в каждой директории поиска чтобы найти файл с расширением упомянутым в переменной окружения PATHEXT.

Всё в порядке, если необходимо просто запустить notepad или mspaint из командной строки. Но что, если программу необходимо запускать много раз подряд? Тогда обращаться к ней по имени, определённо, не самое удачное решение. Далее я постараюсь объяснить почему.

20 окт. 2009 г.

Опасное логирование

Сейчас я постараюсь вас напугать :)
Упрощённо, функции логирования обычно выглядят следующим образом:
#include <stdio.h>

#ifdef _MSC_VER // workaround for MS VC
#define snprintf(b, bsz, f, ...)                \
        _snprintf_s(b, bsz, _TRUNCATE, f, __VA_ARGS__)
#endif
#define LOG_LEVEL 2
#define LOG(lvl, ...) do {                       \
    if (LOG_LEVEL < lvl) break;                  \
    char b[1024];                                \
    snprintf(b, sizeof(b) - 1, __VA_ARGS__);     \
    b[sizeof(b) - 1] = 0;                        \
    printf("%i! %s\n", (int)(lvl), b);           \
} while(0 == __LINE__)

5 окт. 2009 г.

Это 32- или 64-битная версия исполняемого файла Windows?

Наиболее простой способ ответить на этот вопрос без использования дополнительных утилит следующий:
  1. Откройте этот исполняемый файл в любом текстовом редакторе (стандартного блоконота будет достаточно)
  2. Найдите первое соответствие строке "PE" (это где то в районе смещений 0xD0, 0xF0 или не далеко от них, после фразы "This program cannot be run in DOS mode")
  3. Пропустите два непечатаемых символа (оба '\0')
  4. Посмотрите на текущий символ:
    • 'L' - это исполняемый файл для i386 (x86)
    • 'd' - это исполняемый файл для amd64 (x64/x86-64)
    • '\0' (ноль) - это исполняемый файл для ia64
p.s. Вы можете использовать это способ для любых PE-файлов (таких как .exe, .dll и тому подобных)

3 окт. 2009 г.

Игры: статическая всячина

Даже самые простые вещи иногда заставляют задуматься. Обычно это случается из-за отсутствия достаточного опыта в конкретном вопросе. Как получить такой опыт? Ну конечно же, поиграть!

Я надеюсь, это не последний пост в этом блоге. Под рубрикой "Игры" я собираюсь размещать описания вещей которые вы давно хотели попробовать сами, но из-за лени или высокой занятости боялись это сделать. Итак, давайте играть!

Сегодня я хочу поиграть со статическими данными в С++.