GUI exe和dll中的单个类实例不同

Posted

技术标签:

【中文标题】GUI exe和dll中的单个类实例不同【英文标题】:Single class instance is different in GUI exe and dll 【发布时间】:2011-12-02 12:21:44 【问题描述】:

在我的 GUI 应用程序 (MFC) 中,我使用 dll 在屏幕上显示某些内容。我有一个静态库,其中有一个单例类。 例如:sing.lib。我在应用程序(exe)项目和 dll 项目中包含 sing.lib(因为两者都使用这个单例类)

问题是进入 exe 和 dll 的实例不同。两者都调用构造函数!! 参见单例类代码 sn-p。

class A

private:
    A();
    virtual ~A();
    static A* m_pInstance;
public:
    static A* GetInstance()
    
        if (NULL == m_pInstance)
        
            m_pInstance = new A();
        
        return m_pInstance;
    

【问题讨论】:

[略过 OT] 我很震惊答案没有提到 Singleton 是一种反模式,考虑到我在这里看到的所有 Singleton 抨击...... 【参考方案1】:

如果您希望单例实例在 dll 和 exe 之间共享,请将其定义放在动态链接库而不是静态库中。

一般而言,如果您希望某些数据是全局且唯一的,则不应将其放入静态库中。

考虑

//static lib

int CurrentCounter =0;

int getNextCounter()

    return CurrentCounter;

静态库中有这样的代码。在您的情况下,如果针对此库的 exe 和 dll 链接都将获得自己的 CurrentCounter。所以exe和dll可以同时有不同的CurrentCounter值。

【讨论】:

【参考方案2】:

静态库链接到 EXE 和 DLL,因此这两个二进制文件都有您的类的“副本”,因此不同的单例是设计使然的行为。这种单例是“每个二进制”而不是每个进程。

您需要一个用于真正的进程范围单例的动态库,以便您的 EXE 使用 DLL 导出并处理链接到 DLL 的类。

【讨论】:

【参考方案3】:

与静态库链接的每个二进制文件都有自己的类副本。

【讨论】:

以上是关于GUI exe和dll中的单个类实例不同的主要内容,如果未能解决你的问题,请参考以下文章

CFileDialog的当前目录在.exe和.dll中不一致

如何在单个EXE中嵌入多语言* .resx(或* .resources)文件?

从 ATL exe 服务器 (COM) 调用 .NET GUI

dll与exe之间怎么共享数据

自定义引导程序作为单个实例

加载 .dll 时,实例指针与 vfptr 不同