pSHM Гость
|
Добавлено: Пн Сен 01 2003 12:05 Заголовок сообщения: Наследование + DLL. |
|
|
Интересная вещь получается: перегруженные методы класса потомка живут в загруженной библиотеке и с ее освобождением падают . Можно ли скопировать эти методы и юзать после освобождения ddlя? Где можно про это хорошо почитать? // ------------------------ uBaseClass.h class tBaseClass{//Базовый класс – используют и программа, и библиотека. public: virtual AnsiString Display() const = 0; };
// ------------------------ uDll.cpp class tDerived : public tBaseClass{//Наследование класса … public: AnsiString Display() const{// … и реализация виртуального метода return "tDerived Display()"; }; };
extern "C" __declspec(dllexport) _stdcall void CreateObject(tBaseClass** Instance){ (*Instance) = new tDerived; // создание в библиотеке экземпляра класса потомка return; };
// ------------------------ uMain.cpp void __fastcall TfMain::bOneClick(TObject *Sender){ HMODULE LibraryHandle = LoadLibrary("dll.dll");//Загрузка dll if (LibraryHandle == 0) return; pCreateObject CreateObject = (pCreateObject) GetProcAddress(LibraryHandle, "CreateObject"); // Получение адреса функции if (CreateObject == 0) return; tBaseClass* Instance = 0; CreateObject(&Instance);//Создание “неизвестного” потомка в библиотеке if (Instance == 0) return; //Попытка работать с ним ShowMessage(Instance->Display()); //"tDerived Display()" FreeLibrary(LibraryHandle); ShowMessage(Instance->Display()); //Project .. raised exception class EAccessViolation // with message 'Access Violation at address .. in module ‘..exe’ Read of address .. '. delete Instance; } |
|