Предоставление класса из dll C++?


3

Как открыть класс из dll?

Приложение, импортирующее dll, должно иметь возможность создавать объекты класса, а также иметь возможность вызывать функции-члены класса.

Это похоже на просмотр функций типа C с использованием _declspec (dllexport)?

А также когда я построил dll (который содержит только определение класса в файле заголовка и определения его функции-члена в файле cpp), соответствующий файл lib не создается.

1

Это похоже на выставление функций типа C с использованием _declspec(dllexport)?

Да. И __declspec можно применить к классу.

не соответствующий Lib файл не создается

IIRC это по умолчанию, но вы можете переопределить параметры компоновщика по умолчанию.


0

Def Files Посмотрите, в дополнительной первой ссылке оттуда Using __declspec(dllexport)


2

Here. Помните, что этот экспортированный класс нельзя использовать с помощью LoadLibrary()/GetProcAddress().


0

В качестве первого результата был получен код для «класса dllexport» в this page from MSDN.

Возможно, страница содержит только __declspec(dllexport) - это все, что вам нужно сделать.


2

Определение по меньшей мере одного общедоступного метода в экспортированном классе должно иметь префикс _declspec (dllexport) для создаваемого файла lib. Если ни один из методов не имеет этого префикса, будет доступно только объявление (т. Е. Заголовочный файл), но класс будет невозможно создать экземпляр (для этого необходим экспортированный конструктор). Если хотя бы один метод имеет префикс _declspec (dllexport), то компилятор поймет, что пользователи dll должны иметь возможность ссылаться на эту DLL. OS загружает такие DLL, как только загружается exe, связанная с ними.

Вы можете подумать о «заводском» подходе к вашей проблеме. Symbian OS, например, реализует такой подход с полиморфными DLL. Для этого нужно:

  1. Declare (т.е. файл заголовка) и определить (т.е. CPP-файл) класса в вашей библиотеке DLL. Не нужно ничего другого.

  2. Создайте «фабричную» функцию в своей DLL, которая сделает экземпляр для вашего класса и вернет указатель на него. Эта функция должна иметь префикс _declspec (dllexport).

  3. Поделитесь своим файлом заголовка и файлом lib с вашими пользователями.

  4. Пользователи включают файл заголовка и ссылку с файлом lib.

  5. Пользователи вызывают заводскую функцию для создания экземпляра класса (т. Е. Создания объекта), а затем используют его как обычный класс.

5 шагов выше работают как шарм в ОС Symbian. Вам придется попробовать себя на своей платформе и опубликовать результаты. Я, честно говоря, не пробовал это в Windows.

+1

infact мы можем объявить весь класс как _declspec (dllexport), который позволит создать экземпляр класса, а также разрешить вызов в функции-члены. (как указано ссылкой в ​​ответах выше). 22 фев. 092009-02-22 14:42:18