Выложил первый снапшот Named Folders 3.0. Основные изменения: рефакторинг и чистка кода, перевод плагина на FAR API 2.0 и юникод, выпуск 64-битной версии.
вторник, 19 октября 2010 г.
воскресенье, 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-битных приложений обрабатывает неправильно.
Расследование показало, что возникла проблема с запуском 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-контейнер. С его помощью перебор файлов реализуется так:
Не беда. Функциональность BOOST_FOREACH предусматривает возможность расширения на случай использования нестандартных коллекций.
Так что можно заставить BOOST_FOREACH использовать "const_iterator" вместо "iterator":
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 заработает как надо.
Подписаться на:
Сообщения (Atom)