Запрошенный член класса возвращает неправильное значение - PullRequest
0 голосов
/ 16 июня 2011

Я создал простой класс RAII в одной из моих DLL (назовем ее 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;

Идея состоит в том, что код восстановления в DLL exporting будет создавать экземпляр CEmuConfigurationRestoreMonitor в стеке, и когда он выходит из области видимости в конце метода, флаг будет отключен.

Проблема в том, что я хочу запросить флаг, используя IsRestoreInProgress(), из другой DLL (скажем, importing DLL). Вот почему я поместил __declspec(dllexport) в объявлении класса в exporting DLL.

Когда я связываю библиотеку importing, я получаю неразрешенный символ для m_restoreInProgress. Поэтому я добавил следующую строку в файл .cpp в importing DLL, и это исправляет эту проблему:

bool CEmuConfigurationRestoreMonitor::m_restoreInProgress = false;

Теперь я обнаружил, что даже если для m_restoreInProgress установлено значение true, когда я запрашиваю его из библиотеки importing, он всегда возвращает false.

Является ли статическая инициализация в importing DLL каким-либо образом переопределением реального (текущего) значения в exporting DLL?

1 Ответ

2 голосов
/ 16 июня 2011

Вы дали каждой DLL свою собственную копию m_restoreInProgress.

Вы можете исправить это следующим образом:

  • Не используя встроенную функцию.
  • Использованиепеременная области файла для m_resotreInProgress, в исходном файле, включенном только в экспортирующую DLL.
...