2013-03-24 92 views
2

我有一些奇怪的事情发生,其中printf命令(在类构造函数内)没有输出到控制台窗口。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; 
+1

也许你的对象是在控制台存在之前构建的?这很难说,因为你没有真正给我们一个工作的例子。 – 2013-03-24 05:23:14

+0

'curTasks.size()'是无符号的,所以不是%d。 – chris 2013-03-24 05:24:09

+0

@GuySirton请参阅编辑如何使用该类。但是我确定控制台在调用构造函数之前就已经存在了,因为其他的东西都是通过这个点写入控制台的。 – 2013-03-24 05:28:11

回答

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++) { 

奇怪的是,它从来没有抛出一个运行时错误或崩溃。它只是继续工作,除非它没有输出任何东西到控制台。

0

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

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

但显然限制你MSVC调试。

+1

有许多工具可以捕获'OutputDebugString()'信息(例如Sysinternals的DebugView:http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx),所以你不必绑定到MSVC调试器,如果您使用它。 – 2013-03-25 03:52:15