2

printf コマンド (クラス コンストラクター内) がコンソール ウィンドウに出力されないという奇妙なことが起こっています。

なぜこれが起こるか知っていますか?

関連情報:

  • 私のプロジェクトは、ネイティブの Win32 ウィンドウ アプリケーションです (Win32 コンソール プロジェクトではありません)。
  • AllocConsole() & _open_osfhandle() を使用してコンソール ウィンドウを開きます。
  • printf コマンドを呼び出すコンストラクターは Singleton クラスの一部であり、プライベート コンストラクター内で静的関数 isTVManagerTaskScheduled() を呼び出します。
  • コンストラクタの外で printf を使用すると、正しく動作します。つまり、データがコンソール ウィンドウに出力されます。
  • コンソール ウィンドウは、Win32 アプリケーションをデバッグするためだけに使用されます。
  • C++ Visual Studio 2010 Express を使用しています
  • コンストラクター内から静的関数 isTVManagerTaskScheduled() を呼び出さない場合、printf は正しく機能します。

なぜこれが起こるか知っていますか?

私のコード:

// Public Static Class Variables //
const tstring TVManager::TASK_NAME          = _T("TV Manager");
const tstring TVManager::TASK_TIME_STAMP    = _T("2012-03-22T13:46:00");

// Private constructor
TVManager::TVManager(HWND hwnd)
{
    mainHwnd = hwnd;

    bool res = isTVManagerTaskScheduled();
    std::cout << "Res: " << res << endl; // does not print to console
    _tprintf(_T("RES: %d\n"), res);      // does not print to console

    if (!res) {
        _tprintf(_T("hit\n"));
        EasyTaskScheduler::ScheduleTaskAtLogon(TASK_NAME, CPP_Utilities::getProcessPath(), TASK_TIME_STAMP);
    }
}

// Public Static function //
bool TVManager::isTVManagerTaskScheduled()
{
    std::vector <tstring> curTasks = EasyTaskScheduler::RetrieveScheduledTasks();
    tstring defTaskName            = CPP_Utilities::toLower( TASK_NAME );

    for (int i=0; i<=curTasks.size(); i++) {
        tstring task = CPP_Utilities::toLower(curTasks.at(i));
        // The following printf doesn't get printed to console
        _tprintf(_T("size %d, Task %d: %s\n"), curTasks.size(), i, task.c_str());
        if (task.find( defTaskName ) != npos) {
            _tprintf(_T("returning true\n"));
            return true;
        }
    }

    _tprintf(_T("returning false\n"));
    return false;
}

// Public static function
TVManager* TVManager::getInstance(HWND hwnd)
{
    static TVManager instance(hwnd);
    return &instance;
}

// Usage: Inside main window proceedure
case WM_CREATE:
{
    CPP_Utilities::openConsoleWindow();
    tvManager = TVManager::getInstance(hwnd);
}
break;
4

2 に答える 2

1

問題は、ここで無効なベクター要素にアクセスしていたことです。

for (int i=0; i<=curTasks.size(); i++) {
   tstring task = CPP_Utilities::toLower(curTasks.at(i));

そのはず:

for (int i=0; i<curTasks.size(); i++) {

奇妙なことに、実行時エラーやクラッシュは発生しませんでした。コンソールに何も出力しないことを除いて、動作を続けます。

于 2013-03-30T10:56:28.330 に答える
0

最も簡単で移植性の高い解決策は、出力ファイルを fopen または ofstream で開き、それに書き込むことです。MSVC 出力コンソールに出力することもできます。

Win32 アプリでデバッグ出力ウィンドウに出力するにはどうすればよいですか?

しかし、明らかに、MSVC でのデバッグに制限されます。

于 2013-03-24T08:39:46.357 に答える