MFC程序利用控制台输出调试信息
近日研究师兄的一个MFC程序,见其会生成一个控制台窗口输出信息,就如同ANSYS的Output窗口,觉得这个功能实在有用。
于是研究了一下他的代码,不过因为其为DLL工程,又可怜我的VC6打不开他的VS2005的Test工程,原先的工程没有办法编通过。
于是想把实现此功能的类拆出来,仔细研究之后,做了个Test工程,居然不好用,不知道哪里出了问题。
于是google之,有几个结果可供参考:
(1)Creating a console for your MFC app's debug output[]
(2)MFC 利用控制台输出调试信息[http://writeblog.csdn.net/PostEdit.aspx?entryId=1842880]
(3) MFC/DLL 编程时用独立的控制台窗口显示用户自定义调试信息[这篇文章因为被转载多次,找不到出处,google标题即可找到]
(4) GUI程序也能使用控制台窗口[]
综合一下,其实现的方法基本一致。
1)调用AllocConsole()
函数,创建一个Console;
2)调用_cprintf()
函数,输出字符串;
或者,重定向输出流(详见下文);
3)调用FreeConsole()
函数,释放Console。
为了使用方便,参考了师兄使用的“单身模式”,写了下面的class。
-
- class CConsolePrinter
- {
- public:
- void print(const char* str);
- static void Destroy();
- static CConsolePrinter* Instance();
-
-
- virtual ~CConsolePrinter();
-
- protected:
- CConsolePrinter();
-
- private:
- static CConsolePrinter* _instance;
- FILE *file;
-
- };
//.h
class CConsolePrinter
{
public:
void print(const char* str);
static void Destroy();
static CConsolePrinter* Instance();
virtual ~CConsolePrinter();
protected:
CConsolePrinter();
private:
static CConsolePrinter* _instance;
FILE *file;
};
class="csharp" name="code">
- CConsolePrinter* CConsolePrinter::_instance = 0;
-
- CConsolePrinter::CConsolePrinter()
- {
-
- AllocConsole();
-
- int hCrun;
- hCrun = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
- file = _fdopen(hCrun, "w");
-
-
- setvbuf(file, NULL, _IONBF, 0);
- *stdout = *file;
-
- std::cout << "Ready!\n";
- }
-
- CConsolePrinter::~CConsolePrinter()
- {
- FreeConsole();
- fclose(file);
-
- }
-
- CConsolePrinter* CConsolePrinter::Instance()
- {
- if (_instance == 0)
- {
- _instance = new CConsolePrinter;
- }
- return _instance;
- }
-
- void CConsolePrinter::Destroy()
- {
- if (_instance)
- {
- delete _instance;
- }
- _instance = 0;
- }
-
- void CConsolePrinter::print(const char *str)
- {
- std::cout << str << std::endl;
- }
-
class
="csharp" name="code"> 使
用方法也很简单。
首先在应用程序类的InitInstance()函数中添加
CConsolePrinter::Instance();,例如:
class="csharp" name="code">BOOL CMfcWithConsoleApp::InitInstance()
- {
-
-
-
- #ifdef _DEBUG
- CConsolePrinter::Instance();
- #endif
-
-
-
-
- m_pMainWnd->ShowWindow(SW_SHOW);
- m_pMainWnd->UpdateWindow();
-
- return TRUE;
- }
-
class
="csharp" name="code"> 第二步在应用程序类的ExitInstance()函数中添加CConsolePrinter::Destroy();,例如:
class="csharp" name="code">int CMfcWithConsoleApp::ExitInstance()
- {
-
-
- #ifdef _DEBUG
- CConsolePrinter::Destroy();
- #endif
-
- return CWinApp::ExitInstance();
- }
-
-
然后就是在需要输出字符串信息的地方调用CConsolePrinter::Instance()->print();函数。
class="csharp" name="code">void CMfcWithConsoleDoc::OnEditCopy()
- {
-
- #ifdef _DEBUG
- CConsolePrinter::Instance()->print("CMfcWithConsoleDoc::OnEditCopy() ");
- #endif
-
- }
-
- 需要注意的是,如果关闭控制台窗口会导致主程序退出。
-
-
-
阅读(1211) | 评论(0) | 转发(0) |