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)文件?