如何在dll导出的类中隐藏成员变量

How to hide member variables in a dll-exported class

本文关键字:隐藏 成员 变量 dll      更新时间:2023-10-16

我想在dll文件中导出一个1024字节的类。

class __declspec(dllexport) ExportedClass
{
private:
    char Data[1024]; // Holding 1024 bytes.
public:
    void Foo();
};

所以,当我把这个类的头文件提供给我的客户端时,我想隐藏它的成员变量,在这种情况下是charData[1024]。

class __declspec(dllimport) ExportedClass
{
private:
    // char Data[1024]; // You don't have to know.
public:
    void Foo();
};

然而,如果没有数据的定义,堆栈内存中就没有1024字节的分配,这最终会导致访问冲突。

int main()
{
    ExportedClass Obj; // The compiler thinks Obj has no variables to allocate.
    Obj.Foo(); // Crushes because Data points to some invalid space.
    return 0;
}

有没有一种方法可以不显式地告诉编译器类的大小,但也可以告诉它在应该从dll文件导入类时的行为?

我已经使用Visual Studio 2013 Update 3测试了此代码。

提前谢谢。

如果不想显示成员,只需创建一个要公开的方法的Interface,然后将该接口提供给DLL用户。

您必须创建一个工厂方法来在dll中创建类,然后只返回一个指向接口的指针。

另一个有趣的事实是:如果所有的方法都是虚拟的,你甚至不必用declspec导出它们
虚拟查找表负责为程序提供指向方法的实际指针。