вторник, 19 октября 2010 г.

Named Folders 3.0. Первый снапшот

Выложил первый снапшот Named Folders 3.0. Основные изменения: рефакторинг и чистка кода, перевод плагина на FAR API 2.0 и юникод, выпуск 64-битной версии.

воскресенье, 17 октября 2010 г.

Перевод плагина на FAR 2.X

В FAR API 2.X был внесен ряд серьезных изменений, по сравнению с FAR API 1.X. Все подробности изложены в Encyclopedia for Developers. Я же хочу рассказать о тех изменениях, с которыми я столкнулся при переводе плагина Named Folders на FAR API 2.X.

суббота, 16 октября 2010 г.

Как запустить ярлык 64-битного приложения из 32-битного через ShellExecute.

В плагине FAR Named Folders (NF) есть полезная функция - запуск приложения из меню "Пуск". Набираете в командной строке команду "cs:a" и вам показывается список приложений, названия которых соответствуют маске "*a*". В Win7 меню "Пуск" было модернизировано, в нем появился подобный фильтр, но лично мне через Far программы запускать по-прежнему гораздо быстрее. К сожалению, после перехода на 64-битную версию Win7, я обнаружил, что некоторые приложения запускаться через NF перестали.

Расследование показало, что возникла проблема с запуском 64-битных приложений из 32-битного FAR. В NF запуск приложений реализован через функцию ShellExecute - через нее запускается ярлык (LNK-файл) приложения, хранящийся в меню "Пуск". Выяснилось, что ShellExecute, вызванная из 32-битного приложения, ярлыки 64-битных приложений обрабатывает неправильно.

четверг, 14 октября 2010 г.

Программирование под Android. С чего начать.

Появилась необходимость написать проект под Android. Засел за гугл и пару дней шерстил интернет на предмет полезной информации. Вот результаты.

среда, 13 октября 2010 г.

Как подружить BOOST_FOREACH с контейнером без "iterator"

В библиотеке stlsoft есть полезный класс
winstl::findfile_sequence_w, который оборачивает вызовы системных функций FindFirstFileW, FindNextFileW в STL-контейнер. С его помощью перебор файлов реализуется так:
#include <winstl/filesystem/findfile_sequence.hpp>
using namespace stlsoft;
using namespace winstl;

findfile_sequence_w seq(L"c:\", L"*.*", findfile_sequence_w::files); 
findfile_sequence_w::const_iterator p = seq.begin();
while (p != seq.end()) {
   std::wstring filename = (*p).get_filename();
   ++p;
}
Чтобы сделать код более компактным, можно применить BOOST_FOREACH:
findfile_sequence_w seq(L"c:\", L"*.*", findfile_sequence_w::files); 
BOOST_FOREACH(findfile_sequence_w::value_type const& t, f) {
   std::wstring filename = t.get_filename();
}
Но здесь ожидает неприятный сюрприз: BOOST_FOREACH требует наличие двух типов итераторов: iterator и const_iterator. В findfile_sequence_w является псевдо-STL-контейнером - типа "iterator" в нем нет.

Не беда. Функциональность BOOST_FOREACH предусматривает возможность расширения на случай использования нестандартных коллекций.
Так что можно заставить BOOST_FOREACH использовать "const_iterator" вместо "iterator":
#include <boost/foreach.hpp>
namespace boost { 
/*possibility to use BOOST_FOREACH with findfile_sequence_w;
findfile_sequence_w doesn't contain "iterator", it contains only "const_iterator"*/
  template<>
  struct range_mutable_iterator {
      typedef winstl::findfile_sequence_w::const_iterator type;
  };
}
...
BOOST_FOREACH(findfile_sequence_w::value_type const& t, f){}
//or, with same result:
BOOST_FOREACH(findfile_sequence_w::value_type & t, f){}
Поскольку в findfile_sequence_w все функции константные, вреда от такой подмены не будет, а BOOST_FOREACH заработает как надо.