#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
//sound
#pragma comment(lib,"winmm")
//image
#define BMPFILE TEXT("bin/Misaka.bmp")
#define APP_NAME TEXT("とある魔術の実行書類")
#define BUFFER_SIZE 256
#include <ctime>
//Menu
#define IDM_WIND 40001
#define IDM_SET 40002
#define IDM_HOGE 40003
#define IDM_SIRIAL 40004
#define IDM_END 40005
//ini
#define INI_FILE TEXT(iniName)
#define INT_SECNAME TEXT("Test")
#define INI_VALUENAME TEXT("WINTOP")
#define INT_SECNAME2 TEXT("POSITION")
#define INI_WINDOWLEFT TEXT("WINDOWLEFT")
#define INT_SECNAME3 TEXT("POSITION2")
#define INI_WINDOWBOTTOM TEXT("WINDOWTOP")
#define INT_SECNAME4 TEXT("COUNT")
#define INI_ECOUNT TEXT("ECOUNT")
#define INT_SECNAME5 TEXT("SETTING")
#define INI_SETSHORT TEXT("SETSHORT")
#define INT_SECNAME6 TEXT("SHOWWATCH")
#define INI_WATCH TEXT("WATCH")
#define INT_SECNAME7 TEXT("SIRIAL")
#define INI_NOMBER TEXT("NOMBER")
//strcpy
#include <shlobj.h>
//warning breker
#pragma warning ( disable : 4996 )
#define _CRT_SECURE_NO_DEPRECATE
//乱数
#include <cstdlib>
typedef BOOL __stdcall SETLAYER( HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
SETLAYER    *SetLayeredWindowAttributes;
 HINSTANCE   hDllInst;  //終了処理で使用するので、広域変数等に取ります 

BOOL CreateShortCut( LPSTR, LPSTR, LPSTR, LPSTR, LPSTR );
HBRUSH hmyb; //グローバルあたりで宣言

void GetTime(TCHAR *length) {
    int total = 0, minutes = 0, seconds = 0, milliseconds = 0;
    total = atoi(length);
    milliseconds = total % 1000;
    total = total / 1000;
    seconds = total % 60;
    minutes = total / 60;
    wsprintf(length, "%02d: %02d: %02d", minutes, seconds, milliseconds);
}

typedef struct _ThreadParam{
	HWND owner;
}ThreadParam;
DWORD WINAPI ThreadFunc(LPVOID vdParam){
	HDC hdc;
	ThreadParam param;

	param.owner=((ThreadParam *)vdParam)->owner;
	hdc=GetDC(param.owner);
	while(TRUE){
		//OutputDebugString("hoge\n");
		InvalidateRect(param.owner,NULL,FALSE);
		Sleep(1000);
	}
	ReleaseDC(param.owner,hdc);
	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
	static ThreadParam param;
	DWORD dwID;

	//Paint
	HDC hdc;
	PAINTSTRUCT ps;
	static HDC hMemDC;
	static HBITMAP hBitmap;
	static BITMAP bitmap;

	
	//Sound
	static MCI_OPEN_PARMS mop,endmop;
	static MCI_STATUS_PARMS mciStatus;
	int iErr,iErr2;
	TCHAR strErr[BUFFER_SIZE],strErr2[BUFFER_SIZE];
	static int aa = 0;
	
	//Text
	//TEXTMETRIC tm;
	//TCHAR str[64];

	//Menu
	static MENUITEMINFO mii;
	POINT pt;
	static HMENU hMenu, hSubMenu;

	//ini
	static DWORD windTop;
	static TCHAR strss[0xFF],strst[0xFF],strsu[0xFF],strsv[0xFF],strsw[0xFF],strsx[0xFF],strsy[0xFF];
	static DWORD ECount;
	static DWORD setShort;
	static DWORD setWatch;
	static DWORD sirialNomber[2];

	//window
	RECT winRect;
	int windowLeft;
	int windowBottom;

	//pass
	static char szPath[_MAX_PATH];
	static char desktopPath[_MAX_PATH];
	static char linkPath[_MAX_PATH];
	static char linkName[_MAX_PATH] = "\\Misaka.lnk";

	char drive[_MAX_DIR];
	char dir[_MAX_DIR];
	char fname[_MAX_FNAME];
	char ext[_MAX_EXT];
	char dilectPath[_MAX_PATH];
	char FilePath[_MAX_PATH];
	static char iniName[_MAX_PATH];

	char vo1[_MAX_PATH];
	char vo2[_MAX_PATH];

	GetModuleFileName(NULL, dilectPath, sizeof(dilectPath));
	_splitpath(dilectPath,drive,dir, fname, ext);
	strcpy(FilePath,drive);
	strcat(FilePath,dir);

	strcpy(iniName,FilePath);
	strcat(iniName,"test.ini");

	strcpy(vo1,FilePath);
	strcat(vo1,"bin\\voice01.wav");
	strcpy(vo2,FilePath);
	strcat(vo2,"bin\\voice02.wav");

	//watch
	time_t t = time(NULL);
	struct tm *dt;
	char s[128];
	char v[128];
	char u[128];

	switch(msg){
		case WM_DESTROY:
			DeleteDC(hMemDC);
			DeleteObject(hBitmap);
			mciSendCommand(mop.wDeviceID,MCI_CLOSE,0,0);
			mciSendCommand(endmop.wDeviceID,MCI_CLOSE,0,0);
			DeleteObject(hmyb);
			PostQuitMessage(0);
			break;
		case WM_CREATE:
			param.owner = hWnd;
			CreateThread(NULL,0,ThreadFunc,(LPVOID)&param,0,&dwID);

			///////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	位置
			///////////////////////////////////////////////////////////////////////////////////////////////////////////

			windowBottom = GetPrivateProfileInt(INT_SECNAME2 , INI_WINDOWBOTTOM , 0 , INI_FILE);
			windowLeft = GetPrivateProfileInt(INT_SECNAME3 , INI_WINDOWLEFT , 0 , INI_FILE);

			////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	画面表示
			////////////////////////////////////////////////////////////////////////////////////////////////////////////

			MoveWindow(hWnd, windowLeft, windowBottom, 100, 270, TRUE);
			SetLayeredWindowAttributes(hWnd, RGB(0, 0, 255), 0, 1);

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//		メニュー
			/////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_TYPE|MIIM_ID;
			mii.fType = MFT_STRING;

			hMenu = CreateMenu();
			hSubMenu = CreatePopupMenu();

			mii.fMask = MIIM_TYPE | MIIM_ID;
			mii.dwTypeData = TEXT("最前表示");
			mii.wID = IDM_WIND;
			InsertMenuItem(hSubMenu , 0 , TRUE , &mii);

			mii.fMask = MIIM_TYPE | MIIM_ID;
			mii.dwTypeData = TEXT("Windows起動時に起動");
			mii.wID = IDM_SET;
			InsertMenuItem(hSubMenu , 1 , TRUE , &mii);

			mii.fMask = MIIM_TYPE | MIIM_ID;
			mii.dwTypeData = TEXT("時計表示");
			mii.wID = IDM_HOGE;
			InsertMenuItem(hSubMenu , 2 , TRUE , &mii);

			mii.dwTypeData = TEXT("シリアルナンバー確認");
			mii.wID = IDM_SIRIAL;
			InsertMenuItem(hSubMenu , 3 , TRUE , &mii);

			mii.dwTypeData = TEXT("終了");
			mii.wID = IDM_END;
			InsertMenuItem(hSubMenu , 4 , TRUE , &mii);

			mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
			mii.hSubMenu = hSubMenu;
			mii.dwTypeData = TEXT("ファイル");
			InsertMenuItem(hMenu , 0 , TRUE , &mii);

			//SetMenu(hWnd , hMenu);

			//////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//		メニュー設定
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_STATE;

			windTop = GetPrivateProfileInt(INT_SECNAME , INI_VALUENAME , 0 , INI_FILE);
			if(windTop==1){
				///////////////////////////////////////////////////////////////////////////////////////
				//	最前面表示の設定
				///////////////////////////////////////////////////////////////////////////////////////
				SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
				GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				mii.fState = MFS_CHECKED;
				SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
			}else if(windTop==0){
				//////////////////////////////////////////////////////////////////////////////////////
				//	最前面表示の解除
				//////////////////////////////////////////////////////////////////////////////////////
				SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
			}

			setShort = GetPrivateProfileInt(INT_SECNAME5,INI_SETSHORT , 0 , INI_FILE);
			if(setShort==1){
				GetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);
				mii.fState = MFS_CHECKED;
				SetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);
			}else if(setShort==0){}

			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	画像
			////////////////////////////////////////////////////////////////////////////////////////////////////////////////

			hMemDC = CreateCompatibleDC(NULL);
			hBitmap = (HBITMAP)LoadImage(NULL , BMPFILE , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE);

			SelectObject(hMemDC , hBitmap);
			GetObject(hBitmap , sizeof(BITMAP) , &bitmap);
			
			////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	シリアルナンバー
			////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			sirialNomber[1] = GetPrivateProfileInt(INT_SECNAME7,INI_NOMBER , 0 , INI_FILE);
			if(sirialNomber[1]==0){
				srand((unsigned) time(NULL));
				for(int z=0;z<2;z++){
					sirialNomber[z] = rand() % 9969 + 10032;
				}
				wsprintf(strsx , TEXT("%s=%d\0") , INI_NOMBER , sirialNomber[1]);
				WritePrivateProfileSection(INT_SECNAME7 , strsx , INI_FILE);
			}
			
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	音声
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mop.dwCallback = (DWORD)hWnd;
			mop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			mop.lpstrElementName = TEXT(vo1);

			endmop.dwCallback = (DWORD)hWnd;
			endmop.lpstrDeviceType = (LPTSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
			endmop.lpstrElementName = TEXT(vo2);

			iErr = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&mop);
			iErr2 = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT,(DWORD)&endmop);

			if(iErr){
				mciGetErrorString(iErr,strErr,BUFFER_SIZE);
				MessageBox(hWnd,strErr,NULL,MB_OK);
				return -1;
			}
			if(iErr2){
				mciGetErrorString(iErr2,strErr2,BUFFER_SIZE);
				MessageBox(hWnd,strErr2,NULL,MB_OK);
				return -1;
			}

			return 0;
		case WM_PAINT:
			hdc = BeginPaint(hWnd , &ps);
			BitBlt(hdc , 0 , 0 , bitmap.bmWidth , bitmap.bmHeight ,	hMemDC , 0 , 0 , SRCCOPY);

			setWatch = GetPrivateProfileInt(INT_SECNAME6,INI_WATCH , 0 , INI_FILE);
			if(setWatch==1){
				GetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);
				mii.fState = MFS_CHECKED;
				SetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);

				///////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//	Watch
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////
				Rectangle(hdc,0,200,100,260);
				dt = localtime(&t);

				strftime(s, 128, "%Y年", dt);
				strftime(v, 128,"%m/%d(%a)",dt);
				strftime(u, 128, "%H:%M:%S", dt);

				SetBkMode(hdc,TRANSPARENT);
				//wsprintf(watchStr , "%d" , s);
				TextOut(hdc,0,200,s,lstrlen(s));
				TextOut(hdc,0,218,v,lstrlen(v));
				TextOut(hdc,0,236,u,lstrlen(u));
			}else if(setShort==0){}

			EndPaint(hWnd , &ps);
			return 0;
		case WM_RBUTTONDOWN:
			return 0;
		case WM_RBUTTONUP:
			pt.x = LOWORD(lp);
			pt.y = HIWORD(lp);
			ClientToScreen(hWnd , &pt);
			TrackPopupMenu(hSubMenu , TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,pt.x , pt.y , 0 , hWnd , NULL);
			return 0;
		case WM_MBUTTONDOWN:
			////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	Count
			////////////////////////////////////////////////////////////////////////////////////////////////////////////
			ECount = GetPrivateProfileInt(INT_SECNAME4 , INI_ECOUNT , 0 , INI_FILE);
			ECount++;
			wsprintf(strsu , TEXT("%s=%d\0") , INI_ECOUNT , ECount);
			WritePrivateProfileSection(INT_SECNAME4 , strsu , INI_FILE);

			////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//	Sound
			////////////////////////////////////////////////////////////////////////////////////////////////////////////

			mciSendCommand(mop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
			mciSendCommand(mop.wDeviceID,MCI_PLAY,0,0);

			return 0;
		case WM_LBUTTONDOWN:
			PostMessage(hWnd,WM_NCLBUTTONDOWN,(WPARAM)HTCAPTION,lp);
			return 0;
		case WM_COMMAND:
			mii.cbSize = sizeof(MENUITEMINFO);
			mii.fMask = MIIM_STATE;

			switch(LOWORD(wp)){
			case IDM_WIND:
				if(windTop==0){

					///////////////////////////////////////////////////////////////////////////////////////////////
					//	最前面表示の設定
					////////////////////////////////////////////////////////////////////////////////////////////////

					SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop = 1;
					wsprintf(strss , TEXT("%s=%d\0") , INI_VALUENAME , windTop);

					WritePrivateProfileSection(INT_SECNAME , strss , INI_FILE);
					GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
					mii.fState = MFS_CHECKED;
					SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				}else if(windTop==1){

					/////////////////////////////////////////////////////////////////////////////////////////////////
					//	最前面表示の解除
					/////////////////////////////////////////////////////////////////////////////////////////////////

					SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, (SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE));
					windTop = 0;
					wsprintf(strss , TEXT("%s=%d\0") , INI_VALUENAME , windTop);

					WritePrivateProfileSection(INT_SECNAME , strss , INI_FILE);
					GetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
					mii.fState = MFS_UNCHECKED;
					SetMenuItemInfo(hSubMenu,IDM_WIND,FALSE,&mii);
				}
				return 0;
			case IDM_SET:
				//////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//		Path
				//////////////////////////////////////////////////////////////////////////////////////////////////////////////

				GetModuleFileName(NULL, szPath, sizeof(szPath));

				SHGetSpecialFolderPath(hWnd,desktopPath,CSIDL_STARTUP,FALSE);
				strcpy(linkPath,desktopPath);
				strcat(linkPath,linkName);

				if(setShort==1){
					setShort = 0;
					GetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);
					mii.fState = MFS_UNCHECKED;
					SetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);
					int result;

					result = remove(linkPath);
					if (result != 0)
					{
						MessageBox(NULL,"削除に失敗しました。元々ショートカットがなかったかもしれません。",NULL,MB_OK);
					}
				}else if(setShort==0){
					setShort = 1;
					GetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);
					mii.fState = MFS_CHECKED;
					SetMenuItemInfo(hSubMenu,IDM_SET,FALSE,&mii);

					//ショートカット作成
					if( !CreateShortCut(linkPath,szPath, NULL, NULL, NULL ) ) return 1;
				}

				wsprintf(strsv , TEXT("%s=%d\0") , INI_SETSHORT , setShort);
				WritePrivateProfileSection(INT_SECNAME5 , strsv , INI_FILE);
				return 0;
			case IDM_HOGE:
				if(setWatch==1){
					setWatch=0;
					GetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);
					mii.fState = MFS_UNCHECKED;
					SetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);
					wsprintf(strsw , TEXT("%s=%d\0") , INI_WATCH , setWatch);
					WritePrivateProfileSection(INT_SECNAME6 , strsw , INI_FILE);
					InvalidateRect(hWnd,NULL,TRUE);
				}else if(setWatch==0){
					setWatch=1;
					GetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);
					mii.fState = MFS_CHECKED;
					SetMenuItemInfo(hSubMenu,IDM_HOGE,FALSE,&mii);
					wsprintf(strsw , TEXT("%s=%d\0") , INI_WATCH , setWatch);
					WritePrivateProfileSection(INT_SECNAME6 , strsw , INI_FILE);
				}
				return 0;
			case IDM_SIRIAL:
				char test[0xFF];
				wsprintf(test , "ミサカのシリアルナンバーは%dです、とミサカは言説丁寧に説明しました。" , sirialNomber[1]);
				MessageBox(NULL,test,"御坂妹",MB_OK);
				return 0;
			case IDM_END:
				while(TRUE){
					//////////////////////////////////////////////////////////////////////////////////////////////////////////////
					//	音声
					//////////////////////////////////////////////////////////////////////////////////////////////////////////////

					mciStatus.dwCallback=NULL;
					mciStatus.dwItem=MCI_STATUS_MODE;
					mciSendCommand(endmop.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM|MCI_WAIT,(DWORD)&mciStatus);

					if(mciStatus.dwReturn==MCI_MODE_STOP){
						if(aa==0){
							mciSendCommand(endmop.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,0);
							mciSendCommand(endmop.wDeviceID,MCI_PLAY,0,0);
							aa=1;
						}
						else{
							////////////////////////////////////////////////////////////////////////////////////////
							//	座標
							////////////////////////////////////////////////////////////////////////////////////////

							GetWindowRect( hWnd, &winRect );
							windowLeft = winRect.left;
							windowBottom = winRect.top;
							
							////////////////////////////////////////////////////////////////////////////////////////
							//	write
							////////////////////////////////////////////////////////////////////////////////////////
							
							wsprintf(strst , TEXT("%s=%d\0") , INI_WINDOWBOTTOM , windowBottom);
							WritePrivateProfileSection(INT_SECNAME2 , strst , INI_FILE);
							wsprintf(strst , TEXT("%s=%d\0") , INI_WINDOWLEFT , windowLeft);
							WritePrivateProfileSection(INT_SECNAME3 , strst , INI_FILE);
							PostQuitMessage(0);
							break;
						}
					}
				}
				return 0;
			}
		default:
			return DefWindowProc(hWnd,msg,wp,lp);
	}
	return 0;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR pCmdLine,int showCmd){


	WNDCLASSEX wc;
	HWND hWnd;
	MSG msg;
	hmyb = CreateSolidBrush(RGB(0,0,255));//ブラシ

	wc.cbSize = sizeof(wc);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(hInst, "ICON");
	wc.hIconSm = wc.hIcon;
	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
	wc.hbrBackground = hmyb;
	wc.lpszMenuName = NULL;
	wc.lpszClassName = APP_NAME;
		//USER32.DLLからWindows2000で拡張された関数を取得する 
     hDllInst = LoadLibrary("user32.dll"); 
    if( hDllInst == NULL ){ 
        MessageBox(NULL, "USER32.DLLが読み込めませんでした。","Error", MB_OK|MB_ICONSTOP ); 
        return( FALSE ); 
    } 
    SetLayeredWindowAttributes = 
        (SETLAYER *)GetProcAddress( hDllInst, "SetLayeredWindowAttributes" ); 
    if( SetLayeredWindowAttributes == NULL ){ 
        MessageBox( NULL,"SetLayeredWindowAttributes()関数のポインタが取得できませんでした。Windows2000ではない可能性があります。","Error", MB_OK ); 
        return( FALSE ); 
    }
	long lStyle; 

    lStyle = GetWindowLong( hWnd, GWL_EXSTYLE ); 
    lStyle |= 0x00080000; 
    SetWindowLong( hWnd, GWL_EXSTYLE, lStyle );

	if(RegisterClassEx(&wc) == 0){return 1;}

	//WS_OVERLAPPEDWINDOW
	
	hWnd = CreateWindowEx(lStyle ,wc.lpszClassName,APP_NAME,WS_POPUP|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);
	
	if(hWnd == NULL){return 1;}

	while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg);DispatchMessage(&msg);}
	return msg.wParam;
}
BOOL CreateShortCut( LPSTR pShortCutPath, LPSTR pTargetPath, LPSTR pWorkFolderPath, LPSTR pDescription, LPSTR pArgs )
{
	//COM 初期化
	if( !SUCCEEDED( CoInitialize( NULL ) ) ) return FALSE;

	IShellLink*   p_sl;	//シェルリンクとやらをいじるためのオブジェクト
	IPersistFile* p_pf;	//ファイルをいろいろいじるためのオブジェクト
	HRESULT       hRes;	//戻り値を受け取り用

	//IShellLink オブジェクト生成
	hRes = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&p_sl );
	if( SUCCEEDED( hRes ) )
	{		
		//IPersistFile がサポートされてるか調べる
		hRes = p_sl->QueryInterface( IID_IPersistFile, (void **)&p_pf );
		if( SUCCEEDED( hRes ) )
		{
			//ショートカットを作るファイルのパスをセット
			hRes = p_sl->SetPath( pTargetPath );
			if( SUCCEEDED( hRes ) )
			{
				//作成するショートカットの設定
				p_sl->SetDescription( pDescription );
				p_sl->SetArguments( pArgs );
				p_sl->SetWorkingDirectory( pWorkFolderPath );
				p_sl->SetIconLocation( pTargetPath, 0 );
				p_sl->SetShowCmd( SW_NORMAL );

				//ppf->Save() の最初の引数が Unicode しかサポートしてないので
				//lpszShortCutPath を Unicode に変換する
				wchar_t path[MAX_PATH];
				MultiByteToWideChar( CP_ACP, 0, pShortCutPath, -1, path, MAX_PATH );
				hRes = p_pf->Save(path,TRUE);
			}
		}
	}
	
	//使用したオブジェクトを解放
	p_sl->Release();
	p_pf->Release();

	CoUninitialize();	//COM 終了

	return SUCCEEDED( hRes );
}