boost :: bind, инкапсулирующий HANDLE, возвращаемый интерфейсом COM - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть проект Visual Studio 2008 c ++, который использует COM-объект, подобный этому:

ISomeComInterface* foo;
HANDLE file = foo->CreateFile();
// file operations...
foo->CloseHandle( file );

Я хотел бы использовать boost::shared_ptr<> для инкапсуляции управления временем жизни возвращенного объекта HANDLE.например:

ISomeComInterface* foo;
boost::shared_ptr< void > file( foo->CreateFile(),
    boost::bind( &ISomeComInterface::CloseHandle, foo, _1 ) );
// file operations...

К сожалению, это не компилируется:

1>Compiling...
1>Audit Tool.cpp
1>boost\bind\bind.hpp(69) : error C2825: 'F': must be a class or namespace when followed by '::'
1>        boost\bind\bind_template.hpp(15) : see reference to class template instantiation 'boost::_bi::result_traits<R,F>' being compiled
1>        with
1>        [
1>            R=boost::_bi::unspecified,
1>            F=int (__stdcall ISomeComInterface::* )(HANDLE)
1>        ]
1>        Myapp.hpp(78) : see reference to class template instantiation 'boost::_bi::bind_t<R,F,L>' being compiled
1>        with
1>        [
1>            R=boost::_bi::unspecified,
1>            F=BOOL (__stdcall ISomeComInterface::* )(HANDLE),
1>            L=boost::_bi::list2<boost::_bi::value<ISomeComInterface *>,boost::arg<1>>
1>        ]
1>boost\bind\bind.hpp(69) : error C2039: 'result_type' : is not a member of '`global namespace''
1>boost\bind\bind.hpp(69) : error C2146: syntax error : missing ';' before identifier 'type'
1>boost\bind\bind.hpp(69) : error C2208: 'boost::_bi::type' : no members defined using this type
1>boost\bind\bind.hpp(69) : fatal error C1903: unable to recover from previous error(s); stopping compilation

Что я могу сделать, чтобы получить нужную мне функциональность?

Спасибо,PaulH

1 Ответ

0 голосов
/ 27 января 2011

Эрик ответил на вопрос

#define BOOST_MEM_FN_ENABLE_STDCALL

htttp: //www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#Q_com

...