查询的类成员返回错误的值

时间:2011-06-16 01:21:53

标签: c++ dll raii

我在我的一个DLL中创建了一个简单的RAII类(我们称之为exporting DLL),它监视我的应用程序中的配置恢复:


头文件

class __declspec(dllexport) CEmuConfigurationRestoreMonitor
{
public:
    CEmuConfigurationRestoreMonitor()
    {
        m_restoreInProgress = true;
    }

    ~CEmuConfigurationRestoreMonitor()
    {
        m_restoreInProgress = false;
    }

    static bool IsRestoreInProgress()
    {
        return m_restoreInProgress;
    }

private:
    static bool m_restoreInProgress;
};

源文件

bool CEmuConfigurationRestoreMonitor::m_restoreInProgress = false;

我们的想法是exporting DLL中的恢复代码将在堆栈上实例化CEmuConfigurationRestoreMonitor,当它在方法结束时超出范围时,该标志将被关闭。

问题是我想使用IsRestoreInProgress()从另一个DLL(比如importing DLL)查询标志。这就是我将__declspec(dllexport)放在exporting DLL中的类声明中的原因。

当我链接importing DLL时,我得到m_restoreInProgress的未解析符号。所以我将以下行添加到importing DLL中的.cpp文件中,它解决了这个问题:

bool CEmuConfigurationRestoreMonitor::m_restoreInProgress = false;

我现在发现的是,即使m_restoreInProgress设置为true,当我从importing DLL查询时,它总是返回false

importing DLL中的静态初始化是否会以某种方式覆盖exporting DLL中的实际(当前)值?

1 个答案:

答案 0 :(得分:2)

您已经为每个DLL提供了自己的m_restoreInProgress副本。

您可以通过以下方式解决此问题:

  • 不使用内联函数。
  • 在m_resotreInProgress中使用文件范围的变量,仅在导出DLL中包含的源文件中。