This almost does what you want:
// Win32Project1.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include <stdio.h> // printf, _dup2
#include <io.h> // _open_osfhandle
void SetupConsole()
{
AttachConsole(ATTACH_PARENT_PROCESS);
HANDLE hConIn = GetStdHandle(STD_INPUT_HANDLE);
int fd0 = _open_osfhandle((intptr_t)hConIn, 0);
_dup2(fd0, 0);
HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
int fd1 = _open_osfhandle((intptr_t)hConOut, 0);
_dup2(fd1, 1);
HANDLE hConErr = GetStdHandle(STD_ERROR_HANDLE);
int fd2 = _open_osfhandle((intptr_t)hConErr, 0);
_dup2(fd2, 2);
}
WNDPROC g_pOldProc;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_CLOSE)
{
PostQuitMessage(0);
return 0;
}
return CallWindowProc(g_pOldProc, hwnd, uMsg, wParam, lParam);
}
void GUI(HINSTANCE hInstance)
{
HWND hWnd = CreateWindow(
_T("EDIT"),
_T("GUI"),
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
100, 100, 200,200,
NULL,
NULL,
hInstance,
NULL
);
g_pOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)&WindowProc);
SetWindowText(hWnd, _T("Hello world."));
MSG m;
while (GetMessage(&m, NULL, 0, 0))
{
DispatchMessage(&m);
}
DestroyWindow(hWnd);
}
void Console()
{
SetupConsole();
printf("Hello world.");
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hConOut)
GUI(hInstance);
else
Console();
return 0;
}