Саморегистрирующиеся плагины..
От: landerhigh Пират  
Дата: 04.10.05 10:19
Оценка:
Добрый день!

Наступил тут на грабли и не могу понять, как их обойти:
1. Есть интерфейс
class iComponent{
virtual void SomeMethod()=0;
...
}

2. Есть реализации
[code]
class RealComponent: public iComponent
{
virtual void SomeMethod()
{
doSomething();
}
}
[/ccode]
Реализации запханы в DLL.
3. Есть хост-аппликуха.
class Core: public iCore
{
     void RegisterComponent(iComponent* pWhat)
     {
         // Сохраняем указатель в map или еще куда
     }
     iComponent* GetComponent(std::string& Name)
     {
         // Делаем map.find и возвращаем указатель
     }

Планируется что-то вроде COMa:
Аппликуха грузит dll из указанной директории.
Ищет в них единственную экспортированную функцию initDll(iCore* pCore) и дергает ее.
Эта функция создает экземпляр реализации (RealComponent) и вызывает RegisterComponent
void initDll(iCore* pCore)
{
   RealComponent* pComp = new RealComponent();
   pCore->RegisterComponent(pComp);
}


Вот до этого момента все нормально.
Но при попытка дерунть doSomething(), используя указатель, хранящийся в мапе:
    iComponent* pComp= CoreApp->GetComponent("SomeComponent");
    pComp->doSomething();   // Booom :(

приводит к "Pure virtual function call". Указатель сам по себе правильный, но, похоже,
таблица виртуальных функций того..

Может подскажет кто, где именно у меня в ДНК ошибка?
Да, VC6.0
www.blinnov.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.