#include "stdafx.h"
#include "win7lib.h"

// Windows 7から新しく追加された機能を代理で呼び出すためのライブラリ。

// このプログラムをコンパイルするためには、Windows SDK 7.1 が必要です。
// ライブラリをリンクするときには不要です。

// このプログラムでは、下記の宣言を使う代わりに、以下のIIDを宣言します。
//EXTERN_C const IID IID_ITaskbarList3;
static const GUID  IID_ITaskbarList3_alt =
    {0xea1afb91,0x9e28,0x4b86,{0x90,0xe9,0x9e,0x9f,0x8a,0x5e,0xef,0xaf}}; /* IID   */

// このライブラリを使う前に、CoInitialize を必ず呼び出してください。
// また、プログラム終了前には CoUninitialize を必ず呼び出してください。

LibExport BOOL w7tbProgress(HWND hWnd, DWORD dwTbpFlag, DWORD dwValue, DWORD dwMax)
{
	static ITaskbarList3* ptl; // インタフェース

	if (hWnd == NULL) {
		// 解放
		if (ptl != NULL) {
			ptl->Release();
			ptl = NULL;
			return TRUE;
		}
		else {
			return FALSE;
		}
	}

	if (ptl == NULL) {
		if (S_OK != CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3_alt, (void**)&ptl)) {
			return FALSE; // 失敗
		}

		// ptlに値が入れば、以後はCoCreateInstanceは呼び出されない
	}

	if (ptl) {
		ptl->SetProgressState(hWnd, (TBPFLAG)dwTbpFlag);
		if (dwTbpFlag == TBPF_NORMAL) {
			ptl->SetProgressValue(hWnd, (ULONGLONG)dwValue, (ULONGLONG)dwMax);
		}
		return TRUE;
	}
	else {
		return FALSE;
	}
}
