Помогите с Dll

Тема в разделе "MS Visual C++", создана пользователем Beginner_23, 6 апр 2006.

Статус темы:
Закрыта.
  1. Beginner_23

    Beginner_23 Гость

    Задача такая....

    Exe приложение, должно на основе классов, которые хранятся в dll файле, создавать объекты. Имена классов в dll файле не известны ….

    Повсюду я встречал примеры когда имена этих классов известны.
    То есть подгрузив dll-ку прямо в приложение можно в лоб создавать объект, если имя класса известно….А если неизвестно? Хочется изолировать exe приложение от dll-ки. - Тогда при каждом изменении содержимого dll файла, основной проект не нужно будет перекомпилировать, так как приложение будет само подхватывать новые функции или классы…..

    Может я чего не понимаю…. направте меня на верный путь ….
    Большое спасибо…

    P.S.
    Если можно…. ответы высылайте на e-mail….
     
  2. debug

    debug Гость

    Мда, задачка сложная. Во всяком случае в таком виде, как Вы пишите - практически невозможная. С++ - строго типизированный язык (как впрочем и многие другие). Читайте тип-класс (это конечно не одно и тоже) в данном случае. А теперь попробуйте задать себе вопрос, каким образом загрузить в память объект, о котором ничего заранее неизвестно!? как пользоваться его функциями-членами и т.д.? Возможно Вы что-либо не так описали в своём вопросе?
     
  3. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Почитай про СОМ. Там примерно что тебе нужно. Если в чистом С++ - тебе нужен будет базовый (виртуальный?) класс, от которого будут порождаться дополнительные. Из длл экспортируешь одну функцию типа CreateObject, которая будет возвращать объект. Если общая база тебя не устраивает, тогда читай СОМ - там есть, среди прочего, механизм опроса методов и универсальных вызовов через Dispatch. Может себе что-то подобное реализуешь, если не подойдет стандартное..
     
  4. Beginner_23

    Beginner_23 Гость

    Задача наверное простая....просто я профан...новичок...
    Может неправильно поставил ее...Думаю в ней можно и без COM обойтись....

    Конкретизирую задачу с Dll-кой.

    Представте, что есть dll файл в котором хранятся два класса, например, CRectangle, CCircle.
    Есть приложение, в котором есть пункт меню
    «Вставка фигуры». В этом пункте меню есть подпункты: «Квадрат», «Окружность». При активации некоторого из подпунктов должен создаваться соотв. объект на основе соотв. класса, который хранится в dll-ке.

    Допустим мы в dll-ку добавили третий класс, например, CStar. Как сделать так что бы в основном приложении подпункт «Звезда», отвечающий, за создание соотв. объекта, появился автоматически, - БЕЗ перекомпиляции.
     
  5. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    1. Все твои классы должны быть порождены от общего базового - CShape, который должен иметь достаточно методов чтобы ты мог работать с объектом не думая о его сущности.
    2. длл экспортирует следующие методы:
    BOOL GetClassName(int nID, LPTSTR szName, int nBufLen);
    CShape*CreateObject(int nID);

    3. Твое приложение первым делом опрашивает все имеющиеся длл'и с помощью GetClassName, получая пользовательские имена классов (Круг, Квадрат, звезда). Эти имена вводятся в меню, а приложение запоминает соответствие имя->длл+ID. Опрос, конечно, делается пока не вернется 0 из GetClassName, означающий что прошлый класс был последний из этой длл.
    4. При необходимости создать объект дергается CreateObject c соответствующим ID.

    Вот примерно так, в грубом приближении. По уму, конечно, надо добавить DeleteObject, потому как память должна удалятся там же, где выделяется. Да и сам подход плох тем что расширения можно писать только на С++, а можно изменить так чтобы работало со всеми. но это уже задача нормальной разработки, а не школьной задачи :lol:
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей