Я создал простой класс 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?