Интерфейсы и DLL
| |
avolkoff | Дата: Четверг, 26 Сентября 2013, 19:06 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Всем доброго вечера! Суть проблемы: реализация интерфейсов в динамически подключаемой библиотеке (аля DLL). В инете нашел три вида подключения исполняемого файла к библиотеке: статически, динамически и отложенно-загружаемые. В качестве типа подключения предполагаю использовать статически-связываемые либы, дабы не заморачиваться с импортом функций, DEF-файлами и так далее. Необходимо создать библиотеку, на с++, с интерфейсами. Насчет языков/компиляторов использующих DLL неизвестно. Вопрос: как реализовать сие чудо, если преполагается использование только в окнах? Сразу в голову пришла идея сделать кучу функций в Си-стиле. Не катит - их слишком много получится - неудобно. Можно сделать костыль, в виде обертки функций в классы. Но все же. Вторая идея это COM, но настараживает вопрос производительности почему-то. Третья мысль просто экспортировать классы - теряется возможность использования другими компиляторами. Как быть? В поиске не нашел! Отсылки в гугл не принимаются! Подскажите новичку! Заранее спасибо.
Сообщение отредактировал avolkoff - Пятница, 27 Сентября 2013, 10:44 |
|
| |
Нохчи | Дата: Четверг, 26 Сентября 2013, 23:24 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Для такой задачи специально была придумана COM. И DirectX никаких проблем с производительностью от этого не испытывает, так что не парься.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
avolkoff | Дата: Пятница, 27 Сентября 2013, 11:24 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| спасибо, но COM что-то перехотелось вообще видеть, вернее использовать для создания, как и MFC, ATL и прочее, лучше обойдусь си-вызовами с костылем подобно как Leadwerks
Сообщение отредактировал avolkoff - Пятница, 27 Сентября 2013, 11:25 |
|
| |
Archido | Дата: Пятница, 27 Сентября 2013, 12:32 | Сообщение # 4 |
Сэнсэй
Сейчас нет на сайте
| Ну через обычные ф-ции делать с передачей явного "this" там первым параметром, а потом на другой стороне оборачивать в классы - вполне реальная ситуация, не совсем это костыль, но немного не удобно, это да. Существует тулзы (да и самому такое написать не сложно) которые из описания сишных классов генерируют обычные ф-ции на экспорт, потом для каждого языка проделывают это в обратную сторону.
Что касается COM, то он специально создан для подобных вещей. В добавок для мультиязычности совсем не обязательно использовать полноценный COM, можно взять только его часть в виде трех базовых ф-ций (AddRef, Release, QueryInterface) и подсчет сылок, ну и возвращать всегда HRESULT. Этого будет достаточно и тормозам здесь, ессно, взяться неоткуда. И лучше меня об этом знает гугл.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
avolkoff | Дата: Суббота, 28 Сентября 2013, 11:16 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Определился с компилятором, студия :), думаю больше незачем будет использовать мою либу в других средах/языках. с другой стороны если придется переделывать, то... Поэтому подумал, может просто делать классы-интерфейсы (с чистыми виртуальными методами/функциями), от них делать реализацию в DLL, и соответственно хидеры с интерфейсами использовать в программах. Проверил, вроде работает. В коде так примерно: Interface.h Код #pragma once
#ifndef __INTERFACE__ #define __INTERFACE__
class IMyInterface { public: virtual int __stdcall Init() = 0; // Pure virtual func };
int __stdcall InterfaceCreate(IMyInterface **); // Создает экземпляр
#endif /* __INTERFACE__ */ InterfaceImpl.h Код #pragma once
#ifndef __INTERFACE_IMPL__ #define __INTERFACE_IMPL__
#include <Interface.h>
class CImpMyInterface : public IMyInterface { public: CImpMyInterface(); ~CImpMyInterface();
int __stdcall init(); };
// Реализация не нужна для примера...
#endif __INTERFACE_IMPL__ Подключаем статическую библиотеку, заголовок и вуаля В итоге, простейшее использование, нет поддержки мультиязычности, незнаю насчет косяка, когда приложение "падает", ресурсы освобождаются, например память? Думаю что да, так как у объекта ядра длл ссылок нуль), он начинает уничтожаться и вызывается CRT, которая вызывает несуществующую DllMain(), но CRT же знает что длл использует ресурсы? так ли это? или скажите где почитать можно.Добавлено (28.09.2013, 11:16) --------------------------------------------- Ответы нашел, ответившим спасибо! Добавлено (28.09.2013, 11:16) --------------------------------------------- Ответы нашел, ответившим спасибо!
Сообщение отредактировал avolkoff - Пятница, 27 Сентября 2013, 19:36 |
|
| |
|