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;