Перейти к содержанию
    

Экспорт класса из dll

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым.

С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов. Сама управляющая программа может не быть объектно ориентированной. Одно из удобных решений - создавать и удалять объекты с помощью вызовов функций dll, а при вызове методов передавать адрес экземпляра объекта (хэндлер) в качестве первого параметра. Так сделано в API виндов, в частности при работе с GDI.

Очевидно, что при этом для каждого метода нужно сделать экспортируемую обертку типа:

__declspec(dllexport)
MyMethod( HOBJECT instance, ...параметры... )
{
    ((MyClass*)instance)->MyMethod( ...параметры... );
}

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

Можно конечно отказаться от использования классов внутри dll, но тогда в коде будет много лишнего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым.

С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов.

 

Эффективно и переносимо будет сделать в виде COM объектов (dll соотвественно будет COM сервером)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...