AllocConsole コンソールの割り当て

Cの宣言:

BOOL AllocConsole();

VBの宣言:

Declare Function AllocConsole Lib "kernel32" () As Long

説明:

呼び出し元プロセスにコンソールを割り当てる。既に割り当てられている場合は、関数の実行は失敗する。割り当てに成功すると、新規コンソールウィンドウが表示され、標準入出力はこれに対して行われるようになる。

割り当てられたコンソールのバッファの大きさやウィンドウの大きさなどの属性は、コンソールプロセス作成時にCreateProcess関数に与えられたSTARTUPINFO構造体の情報に従う。

新規に割り当てたコンソールに対する入出力をprintfなどの標準Cライブラリ関数で行った時に誤動作を起こす場合は、WriteFile関数などを用いなければならない。

GUIプロセスにコンソールを割り当てた場合、デフォルトの状態ではCTRL+Cによってプロセスが終了してしまうので、注意しなければならない。CTRL+Cを無効にするには、SetConsoleCtrlHandler関数などを使用する。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

主なエラーは、以下の通り。
ERROR_INVALID_FUNCTION すでにコンソールは割り当てられている。

Cのサンプル:

void DoAllocCon()
{
	int i;
	DWORD cbWritten;
	HANDLE hFile;
	char buf[1000];

	FreeConsole();
	AllocConsole();

	hFile = CreateFile(
		"CONOUT$",
		GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	for(i=1; i<=5; i++) {
		wsprintf(buf, "%d ", i);
		WriteFile(hFile, buf, lstrlen(buf), &cbWritten, NULL);

		Sleep(1000);
	}

	CloseHandle(hFile);
	FreeConsole();

}

VBのサンプル:

Private Sub DoAllocCon()
	Dim hFile As Long
	Dim i As Long
	Dim S As String
	Dim WriteNum As Long

	'コンソールの割り当て
	AllocConsole

	'コンソールバッファのオープン
	hFile = CreateFile("CONOUT$", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)

	'1秒に1回メッセージを表示
	For i = 1 To 5
		S = "count:" & i & vbCrLf
		WriteFile hFile, S, lstrlen(S), WriteNum, 0
		Sleep 1000
	Next

	'コンソールバッファのクローズ
	CloseHandle hFile

	'コンソールの開放
	FreeConsole

End Sub

メモ:

SetConsoleCtrlHandler関数で(NULL, TRUE)を渡すと、CTRL+Cで異常終了するようになる。
(original text:1999/02/02 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。