0

I have created a simple RAII class in one of my DLLs (let's call it the exporting DLL) which monitors for configuration restore in my application:


Header file

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

    ~CEmuConfigurationRestoreMonitor()
    {
        m_restoreInProgress = false;
    }

    static bool IsRestoreInProgress()
    {
        return m_restoreInProgress;
    }

private:
    static bool m_restoreInProgress;
};

Source file

bool CEmuConfigurationRestoreMonitor::m_restoreInProgress = false;

The idea is that the restore code in the exporting DLL will instantiate a CEmuConfigurationRestoreMonitor on the stack and when it goes out of scope at the end of the method, the flag will be switched off.

The problem is that I want to query the flag, using IsRestoreInProgress(), from another DLL (let's say the importing DLL). This is why I put __declspec(dllexport) in the class declaration in the exporting DLL.

When I link the importing DLL, I got an unresolved symbol for m_restoreInProgress. So I added the following line to a .cpp file in the importing DLL and it fixes that issue:

bool CEmuConfigurationRestoreMonitor::m_restoreInProgress = false;

What I am finding now is that even if m_restoreInProgress is set to true, when I query it from the importing DLL, it's always returning false.

Is the static initialization in the importing DLL somehow overriding the real (current) value in the exporting DLL?

icedwater
  • 4,701
  • 3
  • 35
  • 50
LeopardSkinPillBoxHat
  • 28,915
  • 15
  • 75
  • 111

1 Answers1

2

You've given each DLL its own copy of m_restoreInProgress.

You could fix this by:

  • Not using an inline function.
  • Using a file-scoped variable for m_resotreInProgress, in a source file included in only the exporting DLL.
Andy Thomas
  • 84,978
  • 11
  • 107
  • 151