Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Экспорт класса из dll
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Pathfinder
Может кто знает, как правильно экспортировать из dll непосредственно методы класса? Сейчас я экспортирую функции, в которые в качестве первого параметра передается адрес экземпляра класса, и внутри функций уже происходит вызов соответствующего метода, получается лишняя обертка из практически пустых функций...
makc
Если компилятор микрософтовский:


dllimport, dllexport
Microsoft Specific

__declspec( dllimport ) declarator

__declspec( dllexport ) declarator

The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. They enable you to export and import functions, data, and objects to and from a DLL. These attributes explicitly define the DLL’s interface to its client, which can be the executable file or another DLL. Declaring functions as dllexport eliminates the need for a module-definition (.DEF) file, at least with respect to the specification of exported functions. Note that dllexport replaces the __export keyword.

The declaration of dllexport and dllimport uses extended attribute syntax.

For more information, see __declspec.

Example

// Example of the dllimport and dllexport class attributes
__declspec( dllimport ) int i;
__declspec( dllexport ) void func(); END Microsoft Specific



C их помощью, afair, можно экспортировать и классы. Но! Это не переносимый метод, т.к. тут будут эскортироваться mangled имена.
hr-ufa
Экспортировать из dll лучше интерфейсы, а не методы классов.
Pathfinder
Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым.
С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов. Сама управляющая программа может не быть объектно ориентированной. Одно из удобных решений - создавать и удалять объекты с помощью вызовов функций dll, а при вызове методов передавать адрес экземпляра объекта (хэндлер) в качестве первого параметра. Так сделано в API виндов, в частности при работе с GDI.
Очевидно, что при этом для каждого метода нужно сделать экспортируемую обертку типа:
Код
__declspec(dllexport)
MyMethod( HOBJECT instance, ...параметры... )
{
    ((MyClass*)instance)->MyMethod( ...параметры... );
}

Проблема в том, как сделать, чтобы метод класса при этом встраивался (inline) в эту функцию, но не встраивался во внутренние функции библиотеки. Пробовал разные варианты, в результате получилось, что метод встраивается только если его определить прямо в объявлении класса в хеадере, но при этом он встраивается везде, и вообще решение не самое изящное. Еще пробовал с атрибутом __forceinline, - во внешние вызовы не встраивается.
Можно конечно отказаться от использования классов внутри dll, но тогда в коде будет много лишнего.
XVR
Цитата(Pathfinder @ Nov 23 2007, 12:37) *
Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым.
С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов.


Эффективно и переносимо будет сделать в виде COM объектов (dll соотвественно будет COM сервером)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.