0

1 つの exe と 2 つの DLL で構成される MFC アプリを取得しました。exe は、これら 2 つの DLL から関数を呼び出します。現在、Pantheios ロギング ライブラリを使用してロギングを追加しようとしています。

達成したいこと:
exe と 2 つの DLL はすべて、ハード ドライブの同じログ ファイルに記録されます。

これが私がやったことです:

1) メインの exe プログラムで暗黙的なリンクを使用する:


#include "stdafx.h"

#include <pantheios/implicit_link/core.h>
#include <pantheios/implicit_link/fe.simple.h>
#include <pantheios/implicit_link/be.file.h>


#define USER_SPECIFIED_LEVEL
#ifndef USER_SPECIFIED_LEVEL
  #include <pantheios/implicit_link/fe.simple.h>
#endif

#ifdef USER_SPECIFIED_LEVEL
PANTHEIOS_CALL(int) pantheios_fe_init(void*   reserved,void**  ptoken)
{
    *ptoken = NULL;
    return 0;
}

PANTHEIOS_CALL(void) pantheios_fe_uninit(void* token)
{}

PANTHEIOS_CALL(PAN_CHAR_T const*)  pantheios_fe_getProcessIdentity  (void *  token)
{
    return PANTHEIOS_LITERAL_STRING(MY_PROGRAM_ID);
}

PANTHEIOS_CALL(int) pantheios_fe_isSeverityLogged(void* token
                                                  , int   severity
                                                  , int   backEndId)
{
    //SEV_CRITICAL=2 < SEV_ERROR=3 < SEV_WARNING=4 < SEV_INFORMATIONAL=6
    if(severity <= pantheios::SEV_INFORMATIONAL)
        return 1;//allow output for anything above information lvl
    return 0;
}

#endif

私が使用するロギングを追加する必要があるメインのexeプログラムで(SOの話でこのリンクPANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWSを見た後):

pantheios_be_file_setFilePath(PSTR("C:\\TestLog.log"),**PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS**, 0, PANTHEIOS_BEID_ALL);
        pantheios::log_NOTICE(PSTR("process id: ["), pantheios::processId, PSTR("]"));
    pantheios::log_NOTICE(PSTR("thread id: ["), pantheios::threadId, PSTR("]"));
    pantheios::log_INFORMATIONAL(PSTR("testing log messagse"));

これは正常に機能し、期待どおりに c:\TestLog.log ファイルにログを記録できます。ただし、これら 2 つの DLL でログをまったく取得できません。ログの呼び出しごとにエラーが発生するだけです。

    pantheios::log_INFORMATIONAL(PSTR("testing message"));

トークンが空だと言ったので、Googleで解決策を見つけました:

2) 私は電話する必要があります:

pantheios::init();

DllMain関数内の各 DLL 初期化に対して。このようにして、DLL にログインしようとしたときに「空のトークン」エラーは発生しなくなりましたが、DLL によってログ ファイルに記録されたものはまだありません (メインの exe プログラムは問題ありません)。

3) 少し調整したので、DLL ログのログ ファイル名を変更して、すべてのログが別のファイルに記録されるようにする必要があります。

DLL #1:

pantheios_be_file_setFilePath(PSTR("C:\\TestLogDll1.log"),PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS, 0, PANTHEIOS_BEID_ALL);

DLL #2:

pantheios_be_file_setFilePath(PSTR("C:\\TestLogDll2.log"),PANTHEIOS_BE_FILE_F_SHARE_ON_WINDOWS, 0, PANTHEIOS_BEID_ALL);

このようにして、3 つのログ ファイルがすべて正常に動作しています。

  • メイン プログラムの TestLog.log
  • DLL #1 の TestLogDll1.log
  • DLL #2 の TestLogDll2.log

それでも、両方の DLL をメインの exe ファイル (TestLog.log) と同じファイルに記録することはできません。

4

1 に答える 1

0

exe と dll の間でエンティティまたはオブジェクトを共有するには、それらをエクスポートする exe で __declspec(dllexport) を宣言し、それらをインポートする dll で __declspec(dllimport) を宣言する必要がある場合があります。

参照用:
1) http://sourceforge.net/projects/pantheios/forums/forum/647484/topic/1639420/index/page/1
2) dll から Pantheios ログ フレームワークを使用する

于 2012-06-21T08:58:31.340 に答える