Printf内部构造函数未在控制台中显示

时间:2013-03-24 05:20:33

标签: c++ debugging winapi printf

我发生了一些奇怪的事情,其中​​printf命令(在类构造函数内)没有输出到控制台窗口。

你知道为什么会这样吗?

一些相关信息:

  • 我的项目是Native Win32窗口应用程序(不是Win32控制台项目)
  • 我使用AllocConsole()& amp;打开控制台窗口。 _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;

2 个答案:

答案 0 :(得分: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++) {

奇怪的是,它从未引发运行时错误或崩溃。它只是继续工作,除了它没有输出任何东西到控制台。

答案 1 :(得分:0)

绝对最简单,最便携的解决方案是只用fopen或ofs​​tream打开一个输出文件,并写入它,你也可以输出到MSVC输出控制台:

How do I print to the debug output window in a Win32 app?

但显然这限制了您使用MSVC进行调试。