Здравствуйте, Amor, Вы писали:
A>A>main()
A>{
A> try
A> {
A> RunProgram();
A> }
A> catch( std::exception& e )
A> {
A> std::cout << "Exception occured: " << e.what() << std::endl;
A> }
A>}
A>
A>Я говорю, что этот код понятия не имеет о том, кто какой компонент там грузит, и далее — какие библиотеки грузит компонент, которого загрузили, и т.д. и т.п.
Этот — не имеет. Другой, может, будет иметь. Какая разница?
Например, есть вызов e.what(). Из этого кода не следует, что это не my_exception::what(). Т.е. данный код имеет реальный шанс вызвать код my_exception, не имея об этом никакого понятия. С точки зрения ООП/Си++ никто его ругать за это права не имеет. А вот с точки зрения организации процесса, если мы перед этим выгрузим код функции my_exception::what — всё накроется. Хотя объект my_exception будет ещё жив, и его VTBL в порядке.
A>А ты, так понимаю предлагаешь примерно следующее
A>A>main()
A>{
A> ScopedLoadLibrary lib1( "component1.dll" );
A> ScopedLoadLibrary lib2( "component2.dll" );
A> ScopedLoadLibrary lib3( "component3.dll" );
A> try
A> {
A> RunProgram();
A> }
A> catch( std::exception& e )
A> {
A> std::cout << "Exception occured: " << e.what() << std::endl;
A> }
A>}
A>
Ну, если по простому, то да.
По жизни это может быть кучерявее.
Типа так:
ScopedLoadLibrary* plib = new ScopedLoadLibrary( "component1.dll" );
SomeFunc()
{
bool f_plib_condemn = false;
try
{
RunProgram();
}
catch( std::exception& e )
{
std::cout << "Exception occured: " << e.what() << std::endl;
f_plib_condemn = true;
}
if(f_plib_condemn)
{
delete plib;
}
}
потому что это может быть не main (программа может работать дальше), и условие может быть более сложным (например, можно ещё дождаться завершения каких-нибудь тредов и т.п.