在没有函数修饰的情况下导出dll中的类

时间:2012-02-14 21:46:00

标签: c++ dll

我想知道如何摆脱我需要在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Ž

?getBlob @ @@托托AAAHM @ Z

那么如何使用程序功能使其干净?

谢谢,

2 个答案:

答案 0 :(得分:5)

您不能禁用C ++类的名称修改,也不能在没有修改的情况下导出它们。 C ++类支持需要修改的功能。例如,函数重载。

值得注意的是,mangling是编译器特定的。因此,如果您希望您的类可以被使用不同编译器或甚至不同语言的人访问,那么从DLL导出C ++类是一个糟糕的设计选择。

答案 1 :(得分:0)

不要直接导出类,使用抽象接口,就像COM一样。

以下是一些不错的文章:

Exporting C++ classes from a DLL

Binary-compatible C++ Interfaces

&安培;

HowTo Export C++ classes from a DLL