реклама на сайте
подробности

 
 
> Экспорт класса из dll
Pathfinder
сообщение Nov 22 2007, 13:56
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400



Может кто знает, как правильно экспортировать из dll непосредственно методы класса? Сейчас я экспортирую функции, в которые в качестве первого параметра передается адрес экземпляра класса, и внутри функций уже происходит вызов соответствующего метода, получается лишняя обертка из практически пустых функций...


--------------------
ADC / DAC LC Filter Designer — Удобный инструмент проектирования LC-фильтров для ЦАП и АЦП
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
makc
сообщение Nov 22 2007, 16:41
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Если компилятор микрософтовский:


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 имена.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
hr-ufa
сообщение Nov 22 2007, 17:53
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 13-11-07
Пользователь №: 32 279



Экспортировать из dll лучше интерфейсы, а не методы классов.
Go to the top of the page
 
+Quote Post
Pathfinder
сообщение Nov 23 2007, 09:37
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 275
Регистрация: 29-06-05
Пользователь №: 6 400



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

Проблема в том, как сделать, чтобы метод класса при этом встраивался (inline) в эту функцию, но не встраивался во внутренние функции библиотеки. Пробовал разные варианты, в результате получилось, что метод встраивается только если его определить прямо в объявлении класса в хеадере, но при этом он встраивается везде, и вообще решение не самое изящное. Еще пробовал с атрибутом __forceinline, - во внешние вызовы не встраивается.
Можно конечно отказаться от использования классов внутри dll, но тогда в коде будет много лишнего.


--------------------
ADC / DAC LC Filter Designer — Удобный инструмент проектирования LC-фильтров для ЦАП и АЦП
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 23 2007, 11:38
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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


Эффективно и переносимо будет сделать в виде COM объектов (dll соотвественно будет COM сервером)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01568 секунд с 7
ELECTRONIX ©2004-2016