Pathfinder 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Может кто знает, как правильно экспортировать из dll непосредственно методы класса? Сейчас я экспортирую функции, в которые в качестве первого параметра передается адрес экземпляра класса, и внутри функций уже происходит вызов соответствующего метода, получается лишняя обертка из практически пустых функций... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
makc 229 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Если компилятор микрософтовский: 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 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Экспортировать из dll лучше интерфейсы, а не методы классов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pathfinder 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым. С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов. Сама управляющая программа может не быть объектно ориентированной. Одно из удобных решений - создавать и удалять объекты с помощью вызовов функций dll, а при вызове методов передавать адрес экземпляра объекта (хэндлер) в качестве первого параметра. Так сделано в API виндов, в частности при работе с GDI. Очевидно, что при этом для каждого метода нужно сделать экспортируемую обертку типа: __declspec(dllexport) MyMethod( HOBJECT instance, ...параметры... ) { ((MyClass*)instance)->MyMethod( ...параметры... ); } Проблема в том, как сделать, чтобы метод класса при этом встраивался (inline) в эту функцию, но не встраивался во внутренние функции библиотеки. Пробовал разные варианты, в результате получилось, что метод встраивается только если его определить прямо в объявлении класса в хеадере, но при этом он встраивается везде, и вообще решение не самое изящное. Еще пробовал с атрибутом __forceinline, - во внешние вызовы не встраивается. Можно конечно отказаться от использования классов внутри dll, но тогда в коде будет много лишнего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Компилятор для dll именно микрософт, но я наверно неточно выразился: проблема не в самом экспорте, а в том, как сделать его эффективным и переносимым. С точки зрения внешней программы работа с dll должна заключаться в создании объектов и вызове для них методов. Эффективно и переносимо будет сделать в виде COM объектов (dll соотвественно будет COM сервером) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться