2012-04-19 6 views
2

私のexeとdllのログレベルでシングルトンロガーを書いています。EXEとDLLからSingletonオブジェクトのメンバ変数にアクセス

Logger.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は同じプロセス/スレッド上で実行されるため、シングルトンはメンバ変数を含むオブジェクトのインスタンスを共有しませんか?

答えて

0

この場合、シングルトンオブジェクトの場合、EXEおよびDLLで2回インスタンス化されます。

両方とも異なるメモリアドレスに作成されるため、異なるメンバ変数を共有しています。お互いを知らなくても、どちらも存在していることを示しています。

は今、この問題解決するには、おそらく2つの方法があります。
1)DLLにLoggerクラスをラップすることによってのみONEロガーをインスタンス化し
2)EXEとDLLは、彼らがログレベルを設定する必要があり、個別のインスタンスを作成しますEXEおよびDLLで

1

VC++でDLL 境界accross実体(関数、オブジェクトなど)を共有するために、あなたは で__declspec(dllexport)それらをエクスポートするDLLそれらを宣言する必要があり、それらをインポートするDLL で__declspec(dllimport)。これは、通常、条件付きの マクロで定義されています。エクスキュータをコンパイルしてリンクするときは、LOGGER_DLLの行に沿って コンパイラオプションに、そしてDLLの共通ヘッダファイルに、プリプロセッサ定義を追加します。

クラス定義で次に
#ifdef LOGGER_DLL 
#define LOGGER_EXPORTS __declspec(dllexport) 
#else 
#define LOGGER_EXPORTS __declspec(dllimport) 
#endif 

class LOGGER_EXPORTS Logger 
{ 
    // ... 
}; 

(他の二つの速いコメント:よう 単一資本C名 に接頭辞がMICRのであるとしてクラスがMicrosoft Microsoftライブラリで定義されていることを示し、ユーザーコードで使用しないでください。そのようなプレフィックスの目的は、名前の衝突を避けることです。また、C++のブール型 はboolであり、BOOLではありません。 BOOLは、 Microsoftマクロで、ブール値 型の前の日に提供され、下位互換性の理由からのみ存在します。 は新しいコードでは使用しないでください)。

関連する問題