Java 从EXE和DLL访问Singleton对象中的成员变量

Java 从EXE和DLL访问Singleton对象中的成员变量,java,c++,logging,mfc,singleton,Java,C++,Logging,Mfc,Singleton,我正在为我的exe和dll编写一个具有日志记录级别的单例记录器 记录器。h: #define LOG CLogger::GetInstance().Log #define LOG_PATH _T(".\\LogFile\\Logger.log") enum eLogLevel { NONE=0, ERR, WARNING, USER, SYSTEM, DEVELOPER }; class CLogger { public: //Construcor & Destruct

我正在为我的exe和dll编写一个具有日志记录级别的单例记录器

记录器。h:

#define LOG CLogger::GetInstance().Log
#define LOG_PATH _T(".\\LogFile\\Logger.log")
enum eLogLevel { NONE=0, ERR, WARNING, USER, SYSTEM, DEVELOPER };  

class CLogger  
{
public:
    //Construcor & Destructor
                    CLogger();
    virtual             ~CLogger();
    //Singleton 
    static CLogger&     GetInstance();          
    //For logging level preference
    //Example: WARNING -> Log only ERR & WARNING messages
    //Default = NONE
    virtual void        SetLogLevel(eLogLevel eLevel);  
    //Logging
    virtual void        Log(eLogLevel eLevelType, CString szText);  

protected:
    //Open & Close the log after used
    virtual void        CloseLog();
    virtual BOOL        OpenLog();

    CStdioFile      m_File;
    CString         m_szFile;
    eLogLevel       m_eLevel;
    BOOL            m_bFileOpened;
};
想法是,EXE项目将需要包括Logger.cpp和Logger.h,负责设置日志记录级别

同时,DLL项目将需要包括Logger.cpp和Logger.h,但不需要设置日志记录级别,因为它将遵循EXE项目的日志记录级别

EXE和DLL都应该能够将任何内容写入同一个日志文件

现在的结果是,我需要将DLL项目请求为SetLogLevel(),以便DLL项目能够写入日志文件


有人能在上面的Logger.h上发现问题吗?由于EXE和DLL将在同一进程/线程上运行,所以单例共享一个包含成员变量的对象实例不是吗?

以便共享实体(函数、对象等)和DLL 在VC++中,您需要在 导出它们的DLL,以及DLL中的
\u declspec(dllimport)
他们进口的。这通常是通过有条件的 在某处定义的宏:编译和链接导出器时 将沿
LOGGER\u DLL
的行添加预处理器定义到 编译器选项,并在DLL的公共头文件中 比如:

然后在类定义中:

class LOGGER_EXPORTS Logger
{
    // ...
};
(还有另外两个快速注释:一个大写字母
C
作为名称的前缀 是Microsoft约定,表示类是在 Microsoft库,并且不应在用户代码中使用 这样一个前缀的目的是避免名称冲突 C++中的类型拼写为<代码>布尔O/COD>,而不是<代码> BOOL。 Microsoft宏,在该语言具有布尔值之前提供 类型,并且仅出于向后兼容的原因而仍然存在。它
不应在新代码中使用。)

对于本例中的单例对象,它将在EXE和DLL中实例化两次

它们都是在不同的内存地址中创建的,因此,它们共享不同的成员变量。这表明他们两个都存在,彼此都不认识

现在,解决这个问题可能有两种方法:
1) 通过将记录器类包装到DLL中来实例化唯一一个记录器
2) EXE和DLL分别创建实例,它们需要将日志级别设置为EXE和DLL

class LOGGER_EXPORTS Logger
{
    // ...
};