Java 从EXE和DLL访问Singleton对象中的成员变量
我正在为我的exe和dll编写一个具有日志记录级别的单例记录器 记录器。h: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
#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
{
// ...
};