MFC程序标准输出重定向到命令行窗口

class CConsole
	{
	public:
		CConsole(void) 
		{ 
			m_inited = false; 
			streamStdout = 0; 
			streamStderr = 0;
		}

		~CConsole(void) 
		{
			if (m_inited) ::FreeConsole(); 
			if (streamStdout) fclose(streamStdout);
			if (streamStderr) fclose(streamStderr);
		}

		// 为当前进程分配console窗口
		bool AllocConsole()
		{
			if (!::AllocConsole())
			{
				return false;
			}

			// 重定向标准输出到创建的console窗口
			streamStdout = freopen("CONOUT$", "w", stdout);
			if (!streamStdout)
			{
				return false;
			}

			// 重定向标准错误输出到console窗口
			streamStderr = freopen("CONOUT$", "w", stderr);
			if (!streamStderr)
			{
				return false;
			}

			m_inited = true;
			return true;
		}

		// 释放当前窗口的console窗口
		void FreeConsole()
		{
			if (m_inited)
			{
				::FreeConsole();
			}

			if (streamStdout)
			{
				fclose(streamStdout);
			}

			if (streamStderr)
			{
				fclose(streamStderr);
			}

			m_inited = false;
		}

	private:
		bool m_inited;
		FILE *streamStdout;
		FILE *streamStderr;
		
	};

如何在Qt Designer中使用QGLWidget

众所周知,Qt提供了QGLWidget组件方便程序猿们在Qt框架下使用OpenGL。但是,美中不足的是我们无法直接在Qt Designer中可视化的添加这个这个组件,设置组件的位置、大小等。

全手动的添加?No!相信很多人和我一样脑袋有些大了。其实经过简单的步骤,我们就可以间接在Qt Designer中使用QGLWidget了:

  1. 首先,为你的工程创建一个QGLWidget的子类,如GLWidget(GLWidget.h GLWidget.cpp)。
  2. 在希望放置QGLWidget处放置一个QWidget控件。
  3. 右键单击QWidget控件。
  4. 选择”Promote To”。
  5. 在类名称处填写你创建的子类名,并保证下面的类头文件名与你创建的子类对应的头文件一致。
  6. 点击”Add”。
  7. 在上面的列表中选择添加的类。
  8. 点击”Promote”。

来源:http://stackoverflow.com/questions/944665/designing-a-qt-opengl-application-in-eclipse

 

注意ShellExecute函数的异步执行

耗费了很长时间才发现问题是由于ShellExecute()函数的异步执行导致的

ShellExecute()会在另一进程中执行调用的程序,并可能在该程序执行完毕前继续执行ShellEcecute()下面的语句

若需要同步执行,建议使用CreateProcess()函数,并使用WaiteForSingleObject()函数判断该进程是否执行完毕。