Экспортируйте класс в dll без декорирования функции - PullRequest
4 голосов
/ 15 февраля 2012

Я хотел бы знать, как избавиться от декораций вокруг функции класса, который мне нужно экспортировать в DLL. Например, когда у вас есть что-то вроде этого:

extern "C"
{
    __declspec(dllexport) int __cdecl getWhatever();
}

И что вы проверите с помощью dependencyWalker, имя экспортируемой функции, у вас будет точно такое же имя функции.

Но если вы сделаете что-то похожее с классом, будет набор символов, украшающий функцию, подобную этой:

extern "C"
{

  class __declspec(dllexport) Toto
  {
    __cdecl Toto(){}
    __cdecl  ~Toto(){}

    int __cdecl getBlob(float y){return (int)y;}
   };

} 

В dependencyWalker вы увидите это:

?? 0Toto @@ AAE @ XZ

?? 1Toto @@ AAE @ XZ

?? 4Toto @@ QAEAAV0 @ ABV0 @@ Z

? GetBlob @ Тото @@ AAAHM @ Z

Так, как сделать его чистым, как с процедурной функцией?

Спасибо

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Вы не можете отключить искажение имен для классов C ++ и не можете экспортировать их без искажения.Классы C ++ поддерживают функции, которые требуют искажения.Например, перегрузка функций.

Стоит также отметить, что искажение зависит от компилятора.Поэтому, если вы хотите, чтобы ваш класс был доступен для людей, использующих разные компиляторы или даже разные языки, то экспорт классов C ++ из DLL - плохой выбор дизайна.

0 голосов
/ 01 января 2014

Не экспортируйте класс напрямую, используйте абстрактный интерфейс, как это делает COM.

Вот несколько хороших статей:

Экспорт классов C ++ из DLL

Бинарно-совместимые интерфейсы C ++

&

Как экспортировать классы C ++ из DLL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...