Вторник, 26 Ноября 2024, 10:56

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Интерфейсы и DLL
avolkoffДата: Четверг, 26 Сентября 2013, 19:06 | Сообщение # 1
частый гость
Сейчас нет на сайте
Всем доброго вечера! Суть проблемы: реализация интерфейсов в динамически подключаемой библиотеке (аля DLL).
В инете нашел три вида подключения исполняемого файла к библиотеке: статически, динамически и отложенно-загружаемые.
В качестве типа подключения предполагаю использовать статически-связываемые либы, дабы не заморачиваться с импортом функций, DEF-файлами и так далее.
Необходимо создать библиотеку, на с++, с интерфейсами. Насчет языков/компиляторов использующих DLL неизвестно.
Вопрос: как реализовать сие чудо, если преполагается использование только в окнах?
Сразу в голову пришла идея сделать кучу функций в Си-стиле. Не катит - их слишком много получится - неудобно.
Можно сделать костыль, в виде обертки функций в классы. Но все же.
Вторая идея это COM, но настараживает вопрос производительности почему-то.
Третья мысль просто экспортировать классы - теряется возможность использования другими компиляторами.
Как быть? В поиске не нашел! Отсылки в гугл не принимаются! Подскажите новичку! smile Заранее спасибо.


Сообщение отредактировал 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__

Подключаем статическую библиотеку, заголовок и вуаля smile
В итоге, простейшее использование, нет поддержки мультиязычности, незнаю насчет косяка, когда приложение "падает", ресурсы освобождаются, например память? Думаю что да, так как у объекта ядра длл ссылок нуль), он начинает уничтожаться и вызывается CRT, которая вызывает несуществующую DllMain(), но CRT же знает что длл использует ресурсы? так ли это? или скажите где почитать можно.

Добавлено (28.09.2013, 11:16)
---------------------------------------------
Ответы нашел, ответившим спасибо!

Добавлено (28.09.2013, 11:16)
---------------------------------------------
Ответы нашел, ответившим спасибо!

Сообщение отредактировал avolkoff - Пятница, 27 Сентября 2013, 19:36
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг