// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。

#pragma once

#define WIN32_LEAN_AND_MEAN		// Windows ヘッダーから使用されていない部分を除外する。

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <CGuid.h>
#include <vcclr.h>			// PtrToStringChars()
#include <MMSystem.h>
#include <math.h>
#include <msclr\lock.h>
#include <tchar.h>
#include <assert.h>

#include <InitGuid.h>
#include <d3d9.h>
#include <dxva2api.h>
#include <dxvahd.h>			// v90 ではサポートされない
#include <evr.h>
#include <evr9.h>
#include <mfapi.h>
#include <mfmp2dlna.h>		// v90 ではサポートされない
#include <Mferror.h>
#include <mfidl.h>
#include <mfobjects.h>
#include <mfplay.h>			// v90 ではサポートされない
#include <mfreadwrite.h>	// v90 ではサポートされない
#include <mftransform.h>
#include <opmapi.h>			// v90 ではサポートされない
#include <wmcontainer.h>
#include <evcode.h>			// EVR イベントコード (IMediaEventSink)

#pragma comment( lib, "d3d9.lib" )
#pragma comment( lib, "dxva2.lib" )
#pragma comment( lib, "evr.lib" )
#pragma comment( lib, "mf.lib" )
#pragma comment( lib, "mfplat.lib" )
#pragma comment( lib, "mfplay.lib" )		// v90 ではサポートされない
#pragma comment( lib, "mfreadwrite.lib" )	// v90 ではサポートされない
#pragma comment( lib, "mfuuid.lib" )
#pragma comment( lib, "strmiids.lib" )		// DirectShow のインターフェースの IID が入っている（例：IID_IMFVideoDisplayControl）
#pragma comment( lib, "winmm.lib" )

#pragma comment( lib, "kernel32.lib" )
#pragma comment( lib, "user32.lib" )
#pragma comment( lib, "gdi32.lib" )
#pragma comment( lib, "winspool.lib" )
#pragma comment( lib, "comdlg32.lib" )
#pragma comment( lib, "advapi32.lib" )
#pragma comment( lib, "shell32.lib" )
#pragma comment( lib, "ole32.lib" )
#pragma comment( lib, "oleaut32.lib" )
#pragma comment( lib, "uuid.lib" )
#pragma comment( lib, "odbc32.lib" )
#pragma comment( lib, "odbccp32.lib" )

#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include <DxErr.h>
#include <d3dx9.h>

#pragma comment( lib, "dinput8.lib" )
#pragma comment( lib, "DxErr.lib" )
#ifdef _DEBUG
#pragma comment( lib, "d3dx9d.lib" )
#else
#pragma comment( lib, "d3dx9.lib" )
#endif


#include "bass.h"
#include "bassmix.h"
#include "basswasapi.h"

#pragma comment( lib, "bass.lib" )
#pragma comment( lib, "bassmix.lib" )
#pragma comment( lib, "basswasapi.lib" )

using namespace System;
using namespace System::Collections::Generic;
using namespace System::Diagnostics;
using namespace System::Drawing;
using namespace System::Drawing::Imaging;
using namespace System::Globalization;
using namespace System::IO;
using namespace System::Runtime::InteropServices;
using namespace System::Text;
using namespace System::Threading;
using namespace System::Xml;
using namespace System::Xml::Schema;
using namespace System::Xml::Serialization;
using namespace System::Windows::Forms;
using namespace msclr;

#define WM_APP_MEDIASESSION_EVENT	(WM_APP+1)
#define WM_APP_MEDIASESSION_EXIT	(WM_APP+2)

#define tFAILEDなら帰還(exp)				{if(FAILED(exp)){return hr;}}
#define tFAILEDなら例外発生(str目的, exp)	{if(FAILED(exp)){throw gcnew Exception(String::Format(L"{1} に失敗しました。(HRESULT = {2} (0x{0:X8}), {3})",hr,gcnew String(str目的),gcnew String((LPTSTR)DXGetErrorString(hr)),gcnew String((LPTSTR)DXGetErrorDescription(hr))));}}
#define tFAILEDならTraceError(str目的, exp)	{if(FAILED(exp)){Trace::TraceError(String::Format(L"{1} に失敗しました。(HRESULT = {2} (0x{0:X8}), {3})",hr,gcnew String(str目的),gcnew String((LPTSTR)DXGetErrorString(hr)),gcnew String((LPTSTR)DXGetErrorDescription(hr))));}}
#define tFALSEなら例外発生(str目的, b結果)	{if(!(b結果)){DWORD err=GetLastError();LPVOID mg;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,err,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&mg,0,NULL);throw gcnew Exception(String::Format(L"{1} に失敗しました。(LastError = 0x{0:X8}; {2})", err, gcnew String(str目的), (mg == NULL) ? "" : (gcnew String((LPTSTR)&mg))));LocalFree(mg);}}
#define tFALSEならTraceError(str目的, b結果){if(!(b結果)){DWORD err=GetLastError();LPVOID mg;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,err,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&mg,0,NULL);Trace::TraceError(String::Format(L"{1} に失敗しました。(LastError = 0x{0:X8}; {2})", err, gcnew String(str目的), (mg == NULL) ? "" : (gcnew String((LPTSTR)&mg))));LocalFree(mg);}}
#define tHRESULT付き例外発生(hr, str説明 )	{if(FAILED(hr))throw gcnew Exception( String::Format(L"{1}(HRESULT = {2} (0x{0:X8}, {3})",hr,gcnew String(str説明),gcnew String((LPTSTR)DXGetErrorString(hr)),gcnew String((LPTSTR)DXGetErrorDescription(hr))));}
#define tNULLなら例外発生(str目的, p結果)	{if((p結果)==NULL){DWORD err=GetLastError();LPVOID mg;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,err,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&mg,0,NULL);throw gcnew Exception(String::Format(L"{1} に失敗しました。(LastError = 0x{0:X8}; {2})", err, gcnew String(str目的), (mg == NULL) ? "" : (gcnew String((LPTSTR)&mg))));LocalFree(mg);}}

#define SAFE_DELETE(p)		{if(p){delete p;p=NULL;}}
#define SAFE_CLOSE_HANDLE(p){if(p){::CloseHandle(p);p=NULL;}}
#define SAFE_COM_RELEASE(p) {if(p){(p)->Release();p=NULL;}}
#define SAFE_REF_DELETE(p)	{if(p){delete p;p=nullptr;}}

#define ARRAY_SIZE(x)	(sizeof(x) / sizeof(x[0]) )
#define CHECK_HR(hr)	if(FAILED(hr)){goto done;}
#define LODWORD(_qw)    ((DWORD)(_qw))
#define HIDWORD(_qw)    ((DWORD)(((_qw) >> 32) & 0xffffffff))

// ネイティブC++で、try-finally の代わりに使う。
#define BREAKABLE_BLOCK		for(int nBREAKABLEBLOCK=0;nBREAKABLEBLOCK<1;nBREAKABLEBLOCK++)


// .cpp を持たない .h

#include "共通\CritSec.h"
#include "共通\AutoLock.h"
#include "共通\Atom.h"
#include "共通\ComPtrList.h"
#include "共通\CopyComPointer.h"
#include "共通\CUnknown.h"
#include "共通\LinkList.h"
#include "共通\refCAtom.h"
#include "共通\refCAtomBool.h"
#include "共通\refCDisposed.h"
#include "共通\refCCounter.h"
#include "共通\refCFPS.h"
#include "共通\refCTimerBase.h"
#include "共通\refCTimer.h"
#include "共通\refCTraceLogListener.h"
#include "共通\refCWindow.h"
#include "共通\refC一定間隔処理.h"
#include "共通\refMouseCursor.h"
#include "共通\refUtils.h"
#include "共通\refCSerializableDictionary.h"
