Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.cpp	(revision 774)
@@ -0,0 +1,809 @@
+#include "stdafx.h"
+#include <process.h>
+#include <fcntl.h>
+#include <io.h>
+
+#include <ver.h>
+
+#include "BasicCompiler.h"
+
+#if defined HeapAlloc
+#define MEM_MAX 65536
+LPVOID pCheckMem[MEM_MAX];
+int now;
+#undef HeapAlloc
+#undef HeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hf,DWORD dwFlags,DWORD dwBytes){
+	LPVOID ret;
+	ret=HeapAlloc(hf,dwFlags,dwBytes);
+	pCheckMem[now]=ret;
+
+	//この部分にnowのチェックを挿入
+
+	now++;
+	if(now>=MEM_MAX){
+		MessageBox(0,"pCheckMemの最大値を超えました","Check - BasicCompiler.exe",0);
+	}
+	return ret;
+}
+LPVOID CheckHeapReAlloc(HANDLE hf,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes){
+	int i;
+	LPVOID ret;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX){
+			MessageBox(0,"エラー","Check - BasicCompiler.exe",0);
+			break;
+		}
+	}
+	ret=HeapReAlloc(hf,dwFlags,lpMem,dwBytes);
+	pCheckMem[i]=ret;
+	return ret;
+}
+void HeapDefaultFree(LPVOID lpMem){
+	int i;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX||lpMem==0){
+			MessageBox(0,"エラー","Check - BasicCompiler.exe",0);
+			break;
+		}
+	}
+	pCheckMem[i]=0;
+	HeapFree(hHeap,0,lpMem);
+}
+void CheckHeapCheck(){
+	int i,i2;
+	char temp[100];
+	temp[0]=0;
+	for(i=0,i2=0;i<MEM_MAX;i++){
+		if(pCheckMem[i]){
+			sprintf(temp+lstrlen(temp),"%d\r\n",i);
+			i2++;
+			if(i2==10){
+				lstrcat(temp,"これ以上の未解放が確認されています");
+				break;
+			}
+		}
+	}
+	if(temp[0]) MessageBox(0,temp,"Check - BasicCompiler.exe",0);
+}
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+#else
+void HeapDefaultFree(LPVOID lpMem){
+	HeapFree(hHeap,0,lpMem);
+}
+#endif
+
+void ts(int i){
+	char temporary[255];
+	sprintf(temporary,"0x%08x",i);
+	MessageBox(0,temporary,"TestMessage",0);
+}
+void ts(int i,int i2){
+	char temporary[255];
+	sprintf(temporary,"0x%08x\r\n0x%08x",i,i2);
+	MessageBox(0,temporary,"TestMessage",0);
+}
+void ts(const char *msg){
+	MessageBox(0,FormatEscapeSequenceStringToDefaultString(msg).c_str(),"TestMessage",0);
+}
+void ts(const char *msg,const char *title){
+	MessageBox(0,FormatEscapeSequenceStringToDefaultString(msg).c_str(),title,0);
+}
+void ts(const std::string msg)
+{
+	ts(msg.c_str());
+}
+
+void epi_check(){
+	//この部分にobpのチェックを挿入
+	//※例 … epi=0x41999  →  obp>=0x0999
+/*
+	extern int obp;
+	if(obp>=0x988DE){
+		int test=0;
+	}*/
+}
+
+void GetRelationalPath(char *path,char *dir){
+	//相対パスを取得
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH],temp4[MAX_PATH];
+
+	//ドライブ名をチェック
+	_splitpath(path,temporary,0,0,0);
+	_splitpath(dir,temp2,0,0,0);
+	if(lstrcmpi(temporary,temp2)!=0) return;
+
+	_splitpath(path,0,temporary,0,0);
+	_splitpath(dir,0,temp2,0,0);
+	i=1;i2=1;
+	while(1){
+		i4=i;
+		if(temporary[i-1]=='\\'&&temporary[i]){	//path側
+			for(i3=0;;i++,i3++){
+				if(temporary[i]=='\\'){
+					temp3[i3]=0;
+					i++;
+					break;
+				}
+				temp3[i3]=temporary[i];
+			}
+		}
+		else temp3[0]=0;
+
+		i5=i2;
+		if(temp2[i2-1]=='\\'&&temp2[i2]){		//dir側
+			for(i3=0;;i2++,i3++){
+				if(temp2[i2]=='\\'){
+					temp4[i3]=0;
+					i2++;
+					break;
+				}
+				temp4[i3]=temp2[i2];
+			}
+		}
+		else temp4[0]=0;
+
+		if(temp3[0]=='\0'&&temp4[0]=='\0'){
+			lstrcpy(temp3,".\\");
+			break;
+		}
+
+		if(lstrcmpi(temp3,temp4)!=0){
+			for(i3=0;;i5++){
+				if(temp2[i5]=='\0') break;
+				if(temp2[i5]=='\\') i3++;
+			}
+			if(i3==0) lstrcpy(temp3,".\\");
+			else{
+				temp3[0]=0;
+				for(i2=0;i2<i3;i2++) lstrcat(temp3,"..\\");
+			}
+			lstrcat(temp3,temporary+i4);
+			break;
+		}
+	}
+	_splitpath(path,0,0,temporary,temp2);
+	lstrcat(temp3,temporary);
+	lstrcat(temp3,temp2);
+	lstrcpy(path,temp3);
+}
+void GetFullPath( char *path, const std::string &baseDirPath ){
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH];
+
+	// '/'→'\'
+	for( i=0;path[i];i++ ){
+		if( path[i] == '/' ){
+			path[i]='\\';
+		}
+	}
+
+	if(strstr(path,":")||strstr(path,"\\\\")) return;
+
+	i=0;i2=0;
+	while(1){
+		if(path[i]=='.'&&path[i+1]=='\\') i+=2;
+		if(path[i]=='.'&&path[i+1]=='.'&&path[i+2]=='\\'){
+			i2++;
+			i+=3;
+		}
+		else break;
+	}
+
+	std::string tempBaseDirPath = baseDirPath;
+	if( tempBaseDirPath[tempBaseDirPath.size()-1] != '\\' )
+	{
+		tempBaseDirPath += "\\";
+	}
+
+	i3=(int)tempBaseDirPath.size();i4=0;
+	while(i4<i2){
+		for(i3--;;i3--){
+			if(tempBaseDirPath[i3-1]=='\\'){
+				i4++;
+				break;
+			}
+		}
+	}
+	memcpy(temporary,tempBaseDirPath.c_str(),i3);
+	temporary[i3]=0;
+	lstrcat(temporary,path+i);
+	lstrcpy(path,temporary);
+}
+
+void ShowErrorLine(int LineNum,const char *constFileName){
+	HANDLE hFile;
+	DWORD dw;
+	char FileName[MAX_PATH];
+	char temporary[MAX_PATH];
+
+	lstrcpy( FileName, constFileName );
+
+	if(LineNum==-1) return;
+
+	if(IsWindow(hOwnerEditor)){
+		if(FileName){
+
+			while( !IsFileExist( FileName ) ){
+				char temp2[MAX_PATH],temp3[MAX_PATH];
+				_splitpath(FileName,NULL,NULL,temp2,temp3);
+				lstrcat(temp2,temp3);
+
+				sprintf(temporary,"\"%s\" が見つかりません。格納されているディレクトリを指定してください。",temp2);
+				if(!GetFolder(hOwnerEditor,temp3,temporary)) return;
+
+				if(temp3[lstrlen(temp3)-1]!='\\') lstrcat(temp3,"\\");
+
+				sprintf(FileName,"%s%s",temp3,temp2);
+			}
+
+			hFile=CreateFile(
+				( ActiveBasic::Common::Environment::GetUserAppDir() + "\\pgm.tmp" ).c_str(),
+				GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
+			WriteFile(hFile,FileName,lstrlen(FileName),&dw,NULL);
+			CloseHandle(hFile);
+
+			SendMessage(hOwnerEditor,WM_SHOWERROR,LineNum,0);
+		}
+	}
+}
+
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen){
+	OPENFILENAME ofstr;
+	filename[0]=0;
+	ofstr.lStructSize=sizeof(OPENFILENAME);
+	ofstr.hwndOwner=hwnd;
+	ofstr.hInstance=0;
+	ofstr.lpstrFilter=Filter;
+	ofstr.lpstrCustomFilter=NULL;
+	ofstr.nMaxCustFilter=0;
+	ofstr.nFilterIndex=1;
+	ofstr.lpstrFile=filename;
+	ofstr.nMaxFile=MAX_PATH;
+	ofstr.lpstrFileTitle=NULL;
+	ofstr.nMaxFileTitle=0;
+	ofstr.lpstrInitialDir=0;
+	ofstr.lpstrTitle=Title;
+	ofstr.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
+	ofstr.nFileOffset=0;
+	ofstr.nFileExtension=0;
+	ofstr.lpstrDefExt="*";
+	ofstr.lCustData=NULL;
+	ofstr.lpfnHook=NULL;
+	ofstr.lpTemplateName=NULL;
+	if(bOpen){
+		if(!GetOpenFileName(&ofstr)) return FALSE;
+	}
+	else{
+		if(!GetSaveFileName(&ofstr)) return FALSE;
+	}
+	return TRUE;
+}
+
+LRESULT CALLBACK ErrorListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,pos;
+	int StartPos,EndPos;
+
+	switch(message){
+		case WM_CHAR:
+			if(GetKeyState(VK_CONTROL)&0x8000){
+				//アクセラレータキーの場合を考慮
+				break;
+			}
+			return 0;
+		case WM_LBUTTONDBLCLK:
+			SendMessage(hwnd,EM_GETSEL,(WPARAM)&pos,0);
+			i=(int)SendMessage(hwnd,EM_LINEFROMCHAR,pos,0);
+			compiler.errorMessenger.ShowErrorLine( i );
+
+			StartPos=(int)SendMessage(hwnd,EM_LINEINDEX,i,0);
+			EndPos=StartPos+(int)SendMessage(hwnd,EM_LINELENGTH,pos,0);
+			SendMessage(hwnd,EM_SETSEL,StartPos,EndPos);
+			return 0;
+	}
+	return CallWindowProc(OldErrorListProc,hwnd,message,wParam,lParam);
+}
+LRESULT CALLBACK DebugListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_CHAR:
+			if(GetKeyState(VK_CONTROL)&0x8000){
+				//アクセラレータキーの場合を考慮
+				break;
+			}
+			return 0;
+	}
+	return CallWindowProc(OldDebugListProc,hwnd,message,wParam,lParam);
+}
+void MakeMessageText(char *buffer,char *msg,int flag){
+	if( program.IsClipCompileView() ){
+		//ProjectView埋め込みがたインターフェイスのとき
+
+		//生成するファイルの相対パスを取得
+		char relationalPath[MAX_PATH];
+		lstrcpy( relationalPath, program.GetOutputFilePath().c_str() );
+		GetRelationalPath( relationalPath, BasicCurDir );
+
+		//////////
+		// 合成
+
+#if defined(JPN)
+		//日本語
+		if(flag==0){
+			if(compiler.IsDll())
+			{
+				sprintf(buffer,"DLLファイル \"%s\"     [ %s ]",relationalPath,msg);
+			}
+			else sprintf(buffer,"実行ファイル \"%s\"     [ %s ]",relationalPath,msg);
+		}
+		if(flag==1) sprintf(buffer,"\"%s\" を生成しています     [ %s ]",relationalPath,msg);
+		if(flag==2) lstrcpy(buffer,msg);
+#else
+		//英語
+		if(flag==0){
+			if(compiler.IsDll()) sprintf(buffer,"DLL file \"%s\"     [ %s ]",relationalPath,msg);
+			else sprintf(buffer,"Execution file \"%s\"     [ %s ]",relationalPath,msg);
+		}
+		if(flag==1) sprintf(buffer,"Creating \"%s\"     [ %s ]",relationalPath,msg);
+		if(flag==2) lstrcpy(buffer,msg);
+#endif
+	}
+	else{
+		//通常ダイアログのとき
+		lstrcpy(buffer,msg);
+	}
+}
+
+void SetPosCenter(HWND hwnd){
+	RECT OwnerRect,rect;
+	int x,y;
+
+	if(IsWindow(hOwnerEditor)) GetWindowRect(hOwnerEditor,&OwnerRect);
+	else{
+		OwnerRect.left=0;
+		OwnerRect.top=0;
+		OwnerRect.right=ScreenX;
+		OwnerRect.bottom=ScreenY;
+	}
+	GetWindowRect(hwnd,&rect);
+
+	x=((OwnerRect.right-OwnerRect.left)-(rect.right-rect.left))/2+OwnerRect.left;
+	y=((OwnerRect.bottom-OwnerRect.top)-(rect.bottom-rect.top))/2+OwnerRect.top;
+	SetWindowPos(hwnd,0,x,y,0,0,SWP_NOSIZE);
+}
+BOOL CALLBACK DlgCompile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hDebugProcess;
+	char temporary[MAX_PATH];
+	RECT rect;
+	POINT pos;
+	SIZE size;
+	static POINT pos_List,pos_Progress;
+	static int height_Progress;
+
+	switch(message){
+		case WM_INITDIALOG:
+			pos=pobj_nv->MainDlgPos;
+			GetWindowRect(hwnd,&rect);
+			size.cx=rect.right-rect.left;
+			size.cy=rect.bottom-rect.top;
+			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+			char relationalPath[MAX_PATH];
+			lstrcpy(relationalPath,program.GetOutputFilePath().c_str());
+			GetRelationalPath(relationalPath,BasicCurDir);
+			SetDlgItemText(hwnd,IDC_EXEPATH,relationalPath);
+
+			//"エラー無し"
+			SetDlgItemText(hwnd,IDC_ERRORLIST,STRING_NOERROR);
+
+			//"デバッグ情報無し"
+			SetDlgItemText(hwnd,IDC_DEBUGLIST,STRING_NODEBUGMSG);
+
+			//リストボックスの初期位置
+			GetWindowRect(GetDlgItem(hwnd,IDC_ERRORLIST),&rect);
+			pos_List.x=rect.left;
+			pos_List.y=rect.top;
+			ScreenToClient(hwnd,&pos_List);
+
+			//プログレスバーの初期位置と高さ
+			GetWindowRect(GetDlgItem(hwnd,IDC_PROGRESS),&rect);
+			pos_Progress.x=rect.left;
+			pos_Progress.y=rect.top;
+			ScreenToClient(hwnd,&pos_Progress);
+			height_Progress=rect.bottom-rect.top;
+
+			//バージョン表記
+			sprintf(temporary,"Version %d.%02d.%02d %s",MAJOR_VER,MINOR_VER,REVISION_VER,VER_INFO);
+			SetDlgItemText(hwnd,IDC_STATIC_VERSION,temporary);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDOK,temporary,MAX_PATH);
+
+					//STRING_COMPILE = "コンパイル"
+					if(lstrcmp(temporary,STRING_COMPILE)==0){
+						char tempOutputFileName[MAX_PATH];
+						GetDlgItemText(hwnd,IDC_EXEPATH,tempOutputFileName,MAX_PATH);
+						program.SetOutputFilePath(
+							Jenga::Common::Path::MakeFullPath( tempOutputFileName, BasicCurDir )
+						);
+						_beginthread( &MainThread, NULL, NULL );
+					}
+
+					//STRING_STOP = "中断"
+					else if(lstrcmp(temporary,STRING_STOP)==0){
+						if(hDebugProcess){
+							//デバッグ中のとき
+
+							//プロセスを終了
+							TerminateProcess(hDebugProcess,0);
+							hDebugProcess=0;
+
+							//デバッグダイアログを終了
+							if(hDebugWnd){
+								DestroyWindow(hDebugWnd);
+							}
+						}
+						else{
+							//コンパイル中のとき
+							bStopCompile=1;
+
+							/* メインスレッドで「閉じる」ボタンに変更することで、
+								コンパイルを中断中の早いタイミングでも終了することが可能 */
+							//"閉じる"
+							SetDlgItemText(hwnd,IDOK,STRING_CLOSE);
+						}
+					}
+
+					else{
+						SetFocus(hOwnerEditor);
+						DestroyWindow(hwnd);
+					}
+					return 1;
+				case IDCANCEL:
+					//×ボタン用
+
+					if(hDebugProcess){
+						//デバッグ中のとき
+
+						//プロセスを終了
+						TerminateProcess(hDebugProcess,0);
+						hDebugProcess=0;
+
+						//デバッグダイアログを終了
+						if(hDebugWnd){
+							DestroyWindow(hDebugWnd);
+						}
+					}
+
+					SetFocus(hOwnerEditor);
+					DestroyWindow(hwnd);
+					return 1;
+				case IDC_SHOWERROR:
+					ShowWindow(GetDlgItem(hwnd,IDC_ERRORLIST),SW_SHOW);
+					ShowWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),SW_HIDE);
+					return 1;
+				case IDC_SHOWDEBUG:
+					ShowWindow(GetDlgItem(hwnd,IDC_ERRORLIST),SW_HIDE);
+					ShowWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),SW_SHOW);
+					return 1;
+			}
+			break;
+		case WM_SHOWVARLIST:
+			if( program.IsClipCompileView() ){
+				//埋め込み表示
+				CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_DEBUGGER),hOwnerEditor,(DLGPROC)DlgDebugger,lParam);
+				ShowWindow(hDebugWnd,SW_SHOW);
+
+				SendMessage(hOwnerEditor,WM_SETDEBUGGERVIEW,0,(LPARAM)hDebugWnd);
+			}
+			else{
+				//ポップアップ表示
+				CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_VARLIST),hOwnerEditor,(DLGPROC)DlgVarList,lParam);
+				SetForegroundWindow(hDebugWnd);
+			}
+			return 1;
+		case WM_SIZE:
+			if( program.IsClipCompileView() ){
+				//エラーリストの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_ERRORLIST),
+					pos_List.x,
+					pos_List.y,
+					LOWORD(lParam)-pos_List.x,
+					HIWORD(lParam)-pos_List.y,
+					1);
+
+				//デバッグリストの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_DEBUGLIST),
+					pos_List.x,
+					pos_List.y,
+					LOWORD(lParam)-pos_List.x,
+					HIWORD(lParam)-pos_List.y,
+					1);
+
+				//プログレスバーの位置
+				MoveWindow(GetDlgItem(hwnd,IDC_PROGRESS),
+					pos_Progress.x,
+					pos_Progress.y,
+					LOWORD(lParam)-pos_Progress.x,
+					height_Progress,
+					1);
+			}
+			return 1;
+		case WM_DESTROY:
+			GetWindowRect(hwnd,&rect);
+
+			if( !program.IsClipCompileView() ){
+				pobj_nv->MainDlgPos.x=rect.left;
+				pobj_nv->MainDlgPos.y=rect.top;
+			}
+
+			PostQuitMessage(0);
+			return 1;
+
+
+
+		///////////////////////
+		// デバッグコマンド
+		///////////////////////
+
+		case WM_DEBUG_STOP:
+			Debugger_Stop();
+			return 1;
+		case WM_DEBUG_PAUSE:
+			Debugger_Pause();
+			return 1;
+
+
+		case WM_CLOSE_DEBUGGER:
+			if(hDebugWnd){
+				DestroyWindow(hDebugWnd);
+			}
+			return 1;
+	}
+	return 0;
+}
+
+void _Test()
+{
+	Jenga::Common::LoggerSetting loggerSetting;
+	bool result = loggerSetting.WriteXml( Jenga::Common::Environment::GetAppDir() + "\\logger.setting.xml" );
+}
+
+int main()
+{
+	int i;
+	char temporary[1024],temp2[MAX_PATH];
+
+	ActiveBasic::Common::EnableNX();
+	ActiveBasic::Common::SetHeapOptions();
+
+	hInst = GetModuleHandle( NULL );
+
+	// グローバルローケルを日本語にする
+	std::locale::global(std::locale("japanese"));
+	_setmode(_fileno(stdout), _O_BINARY);
+
+	//_Test();
+
+	//MessageBox(0,"starting compiler/debugger","ActiveBasic",MB_OK);
+	trace( "Start ActiveBasic Compiler!" );
+
+	//コモンコントロールを初期化
+	InitCommonControls();
+
+	hHeap=GetProcessHeap();
+	ScreenX=GetSystemMetrics(SM_CXSCREEN);
+	ScreenY=GetSystemMetrics(SM_CYSCREEN);
+
+	//不揮発性データを取得
+	pobj_nv=new CNonVolatile;
+	pobj_nv->load();
+
+	program.Configurate();
+
+	if( !program.AnalysisCommandLines() )
+	{
+		// コマンドラインが不正
+		return 0;
+	}
+
+	bool isSpecifiedSourceFilePathByCommandLine = false;
+	if( program.GetSourceFilePath().size() > 0 )
+	{
+		// ソースファイル名が与えられていたとき
+		isSpecifiedSourceFilePathByCommandLine = true;
+	}
+	else
+	{
+		// ソースファイル名が与えられなかったとき
+		char temp[MAX_PATH];
+		if(!GetFilePathDialog(0,temp,BasicFileFilter,"コンパイルするファイルを指定して下さい",1))
+		{
+			return 0;
+		}
+		program.SetSourceFilePath( temp );
+	}
+
+	//出力ファイル名が与えられなかったとき
+	if( program.GetOutputFilePath().size() == 0 )
+	{
+		char tempOutputFileName[MAX_PATH];
+		_splitpath( program.GetSourceFilePath().c_str(), tempOutputFileName,temporary,temp2,0);
+		lstrcat(tempOutputFileName,temporary);
+		lstrcat(tempOutputFileName,temp2);
+		if( compiler.IsSll() )
+		{
+			if( program.IsDebugRun() || compiler.IsDebug() )
+			{
+				lstrcat(tempOutputFileName,"_debug.abobj");
+			}
+			else
+			{
+				lstrcat(tempOutputFileName,".abobj");
+			}
+		}
+		else
+		{
+			if( program.IsDebugRun() || compiler.IsDebug() )
+			{
+				lstrcat(tempOutputFileName,"_debug.exe");
+			}
+			else
+			{
+				lstrcat(tempOutputFileName,".exe");
+			}
+		}
+
+		program.SetOutputFilePath( tempOutputFileName );
+	}
+
+	{
+		// カレントディレクトリを取得
+		std::string baseDirPath = Jenga::Common::Environment::GetAppDir()+"\\";
+
+		// インクルードディレクトリが指定されなかったとき
+		if( program.GetIncludeDir().size() == 0 )
+		{
+			program.SetIncludeDir( Jenga::Common::Path::MakeFullPath( ".\\Include", ActiveBasic::Common::Environment::GetAbdevRootPath() ) );
+		}
+		else
+		{
+			// インクルードディレクトリを絶対パスに変更
+			program.SetIncludeDir( Jenga::Common::Path::MakeFullPathByCurrentDirectory( program.GetIncludeDir() ) );
+		}
+
+		// ソースファイル名を絶対パスに変換
+		program.SetSourceFilePath( Jenga::Common::Path::MakeFullPathByCurrentDirectory( program.GetSourceFilePath() ) );
+
+		// 出力ファイル名を絶対パスに変換
+		program.SetOutputFilePath( Jenga::Common::Path::MakeFullPathByCurrentDirectory( program.GetOutputFilePath() ) );
+
+		// モジュール名をセット
+		compiler.SetModuleName( Jenga::Common::Path( program.GetOutputFilePath() ).GetFileName() );
+	}
+
+	if( compiler.IsDll() )
+	{
+		//DLLファイル名を取得
+		_splitpath( program.GetOutputFilePath().c_str(),NULL,NULL,szDllName,temporary);
+		lstrcat(szDllName,temporary);
+	}
+
+	if( program.IsDebugRun() )
+	{
+		//コマンドライン、DLLの実行可能アプリケーションを取得
+		HANDLE hFile;
+		DWORD dwAccessBytes;
+		hFile=CreateFile(
+			( ActiveBasic::Common::Environment::GetUserAppDir() + "\\pgm.tmp" ).c_str(),
+			GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile!=INVALID_HANDLE_VALUE){
+			ReadFile(hFile,temporary,MAX_PATH,&dwAccessBytes,NULL);
+			CloseHandle(hFile);
+			temporary[dwAccessBytes]=0;
+		}
+		else temporary[0]=0;
+
+		for(i=0;;i++){
+			if(temporary[i]=='\r'&&temporary[i+1]=='\n'||temporary[i]=='\0'){
+				szDebugExeForDll[i]=0;
+				break;
+			}
+			szDebugExeForDll[i]=temporary[i];
+		}
+		if(temporary[i]){
+			lstrcpy(szDebugCmdLine,temporary+i+2);
+		}
+	}
+
+	_splitpath( program.GetSourceFilePath().c_str(), BasicCurDir,temporary,NULL,NULL);
+	lstrcat(BasicCurDir,temporary);
+
+	if( program.IsClipCompileView() ){
+		//ProjectEditor埋め込み型インターフェイス
+		hMainDlg=CreateDialog(hInst,MAKEINTRESOURCE(IDD_CLIPMAIN),hOwnerEditor,(DLGPROC)DlgCompile);
+		ShowWindow(hMainDlg,SW_SHOW);
+		SendMessage(hOwnerEditor,WM_SETCOMPILEVIEW,0,(LPARAM)hMainDlg);
+
+		//プログレスバーの色をセットする
+		PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETBARCOLOR,0,RGB(255,220,192));
+		PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_SETBKCOLOR,0,RGB(255,255,255));
+	}
+	else{
+		//通常ダイアログインターフェイス
+		hMainDlg=CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),hOwnerEditor,(DLGPROC)DlgCompile);
+
+		if( program.IsKickedFromEditor() )
+		{
+			// エディタから起動されたとき
+			PostMessage( hMainDlg, WM_COMMAND, IDOK, 0 );
+		}
+		else if( program.IsShowDlg() )
+		{
+			// コマンドラインでshow_dlgパラメータが指定された場合、ダイアログを表示する
+			// すぐにビルドを開始する
+			ShowWindow(hMainDlg,SW_SHOW);
+			PostMessage( hMainDlg, WM_COMMAND, IDOK, 0 );
+		}
+		else if( isSpecifiedSourceFilePathByCommandLine )
+		{
+			// コマンドラインでソースコード指定があった場合はウィンドウは表示せず、そのままビルドを開始する。
+			MainThread(0);
+
+			trace("Complete ActiveBasic Compiler!");
+
+			ExitProcess( program.GetExitCode() );
+			return 0;
+		}
+		else
+		{
+			ShowWindow(hMainDlg,SW_SHOW);
+		}
+	}
+	SendDlgItemMessage(hMainDlg,IDC_SHOWERROR,BM_SETCHECK,BST_CHECKED,0);
+
+	//エラーリストをサブクラス化
+	OldErrorListProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hMainDlg,IDC_ERRORLIST),GWLP_WNDPROC);
+	SetWindowLongPtr(GetDlgItem(hMainDlg,IDC_ERRORLIST),GWLP_WNDPROC,(LONG_PTR)ErrorListProc);
+
+	//デバッグリストをサブクラス化
+	OldDebugListProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hMainDlg,IDC_DEBUGLIST),GWLP_WNDPROC);
+	SetWindowLongPtr(GetDlgItem(hMainDlg,IDC_DEBUGLIST),GWLP_WNDPROC,(LONG_PTR)DebugListProc);
+
+	if( program.IsKickedFromEditor() )
+	{
+		SendMessage(hMainDlg,WM_COMMAND,IDOK,0);
+	}
+
+	MSG msg;
+	while(GetMessage(&msg,0,0,0)){
+		if(IsDialogMessage(hMainDlg,&msg)) continue;
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+
+	//不揮発性データを保存
+	pobj_nv->save();
+	delete pobj_nv;
+	pobj_nv=0;
+
+#if defined HeapAlloc
+	CheckHeapCheck();
+#endif
+
+	if( program.IsClipCompileView() ){
+		SendMessage(hOwnerEditor,WM_DESTROYCOMPILEVIEW,0,0);
+	}
+
+	trace("Complete ActiveBasic Compiler!");
+
+	ExitProcess( program.GetExitCode() );
+
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/BasicCompiler.h	(revision 774)
@@ -0,0 +1,49 @@
+#include "../BasicCompiler_Common/common.h"
+
+LPSTR BasicFileFilter="プログラム ファイル(*.ab;*.bas;*.abp;*.sbp)\0*.ab;*.bas;*.abp;*sbp\0テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+LPSTR ExeFileFilter="実行可能ファイル(*.exe)\0*.exe\0すべてのファイル(*.*)\0*\0\0";
+
+HINSTANCE hInst;
+HWND hOwnerEditor;
+HWND hMainDlg;
+HWND hDebugWnd;
+HANDLE hHeap;
+int ScreenX,ScreenY;
+WNDPROC OldErrorListProc,OldDebugListProc;
+WNDPROC OldThreadComboProc;
+WNDPROC OldProcComboProc;
+unsigned short TypeOfSubSystem;
+
+//不揮発性データ（レジストリに保存される）
+CNonVolatile *pobj_nv;
+
+//プログラム情報
+DWORD ImageBase;
+
+BOOL bStopCompile;
+
+//リソース情報
+char ResourceFileName[MAX_PATH];
+
+//デバッグ
+BOOL bDebugSupportProc;
+DWORD dwStepRun;
+double width_ratio_VarList=0.3;
+HWND hDebuggerToolbar;
+char szDebugCmdLine[1024];
+char szDebugExeForDll[1024];
+
+//ウォッチリスト
+int width_WatchColumn_Expression=200;
+int width_WatchColumn_Value=400;
+
+
+int cp;
+
+int typeOfPtrChar = MAKE_PTR_TYPE(DEF_SBYTE,1);
+int typeOfPtrUChar = MAKE_PTR_TYPE(DEF_BYTE,1);
+
+char *basbuf;
+
+char BasicCurDir[MAX_PATH];		//コンパイルするファイルが存在するディレクトリ
+char szDllName[MAX_PATH];
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/CDebugThreadInfo.cpp	(revision 774)
@@ -0,0 +1,115 @@
+#include "stdafx.h"
+
+#include "common.h"
+#include "DebugSection.h"
+
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+
+extern HANDLE hDebugProcess;
+extern DebugSectionCollection debugSectionCollection;
+
+CDebugThreadInfo *pobj_dti;
+
+CDebugThreadInfo::CDebugThreadInfo(){
+	memset(this,0,sizeof(CDebugThreadInfo));
+}
+CDebugThreadInfo::~CDebugThreadInfo(){
+	Free();
+}
+
+BOOL CDebugThreadInfo::Reflesh(int ThreadNum){
+	Free();
+
+	ULONG_PTR lpData;
+	ULONG_PTR lpAccBytes;
+
+	DWORD dwRWSectionPos;
+	dwRWSectionPos=debugSectionCollection.debugSections[0]->dwImageBase+
+						debugSectionCollection.debugSections[0]->dwRVA_RWSection;
+
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256+ThreadNum*sizeof(DWORD)),
+		&iProcLevel,
+		sizeof(DWORD),&lpAccBytes);
+	lplpObp=(ULONG_PTR *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(ULONG_PTR));
+	lplpSpBase=(ULONG_PTR *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(ULONG_PTR));
+	lpdwCp=(DWORD *)HeapAlloc(hHeap,0,(iProcLevel+1)*sizeof(DWORD));
+	this->relationalObjectModuleIndexes.resize( iProcLevel + 1 );
+
+	//lplpObp
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256*2+ThreadNum*sizeof(DWORD)),
+		&lpData,
+		sizeof(ULONG_PTR),&lpAccBytes);
+	ReadProcessMemory(hDebugProcess,
+		(void *)lpData,
+		lplpObp,
+		(iProcLevel+1)*sizeof(ULONG_PTR),&lpAccBytes);
+
+	//lplpSpBase
+	ReadProcessMemory(hDebugProcess,
+		(void *)(dwRWSectionPos+sizeof(DWORD)*256*2+sizeof(ULONG_PTR)*256+ThreadNum*sizeof(ULONG_PTR)),
+		&lpData,
+		sizeof(ULONG_PTR),&lpAccBytes);
+	ReadProcessMemory(hDebugProcess,
+		(void *)lpData,
+		lplpSpBase,
+		(iProcLevel+1)*sizeof(ULONG_PTR),&lpAccBytes);
+
+	//現在の実行情報
+	CONTEXT Context;
+	Context.ContextFlags=CONTEXT_CONTROL;
+	GetThreadContext(array_hDebugThread[ThreadNum],&Context);
+
+
+	//マッピングされているモジュールのイメージベースを取得
+	HMODULE array_hModule[1024];
+	DWORD cbReturned;
+	if(!EnumProcessModules( hDebugProcess, array_hModule, sizeof(HMODULE)*1024, &cbReturned )) return 0;
+
+	int i;
+	HMODULE hTargetModule=0;
+	for(i=0;i<(int)(cbReturned/sizeof(HMODULE));i++){
+		if((LONG_PTR)array_hModule[i]<=(LONG_PTR)EIP_RIP(Context)){
+			if(hTargetModule<array_hModule[i]) hTargetModule=array_hModule[i];
+		}
+	}
+
+	extern DWORD ImageBase;
+	if((HMODULE)(ULONG_PTR)ImageBase!=hTargetModule){
+		for(i=0;i<debugSectionCollection.debugSections.size();i++){
+			if((HMODULE)(ULONG_PTR)debugSectionCollection.debugSections[i]->dwImageBase==hTargetModule){
+				debugSectionCollection.choice(i);
+				break;
+			}
+		}
+	}
+
+
+
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+
+	if(ImageBase+MemPos_CodeSection <= EIP_RIP(Context) &&
+		EIP_RIP(Context) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+		lplpObp[iProcLevel]=EIP_RIP(Context);
+		lplpSpBase[iProcLevel]=SP_BASE(Context);
+	}
+	//else API関数内などの場合は既存の lplpObp[iProcLevel] を利用する
+
+	return 1;
+}
+
+void CDebugThreadInfo::Free(void){
+	if(lplpObp){
+		HeapDefaultFree(lplpObp);
+		HeapDefaultFree(lplpSpBase);
+		HeapDefaultFree(lpdwCp);
+		relationalObjectModuleIndexes.clear();
+	}
+
+	memset(this,0,sizeof(CDebugThreadInfo));
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/CommandFormat.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/CommandFormat.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/CommandFormat.cpp	(revision 774)
@@ -0,0 +1,318 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void ComOpen(char *Parameter,char *buffer,int nowLine){
+	int i,i2,IsStr;
+	char temporary[255];
+
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		if((
+			((Parameter[i]==' '||Parameter[i]=='\t')&&(Parameter[i+1]=='f'||Parameter[i+1]=='F')&&(Parameter[i+2]=='o'||Parameter[i+2]=='O')&&(Parameter[i+3]=='r'||Parameter[i+3]=='R')&&(Parameter[i+4]==' '||Parameter[i+4]=='\t'))||
+			(Parameter[i]==1&&Parameter[i+1]==ESC_AS)
+			)&&IsStr==0){
+			buffer[i2]=0;
+			break;
+		}
+		buffer[i2]=Parameter[i];
+		if(Parameter[i]=='\0') return;
+	}
+
+	KillStringSpaces(buffer);
+
+	if(Parameter[i]==1&&Parameter[i+1]==ESC_AS) lstrcat(buffer,",0");
+	else{
+		i+=4;
+		while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+		for(i2=0;;i++,i2++){
+			if(Parameter[i]=='\0'){
+				compiler.errorMessenger.Output(1,NULL,nowLine);
+				return;
+			}
+			if(Parameter[i]==' '||Parameter[i]=='\t'||(Parameter[i]==1&&Parameter[i+1]==ESC_AS)){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=Parameter[i];
+		}
+		if(lstrcmpi(temporary,"input")==0) lstrcat(buffer,",1");
+		else if(lstrcmpi(temporary,"output")==0) lstrcat(buffer,",2");
+		else if(lstrcmpi(temporary,"append")==0) lstrcat(buffer,",3");
+		else{
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return;
+		}
+
+		while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+		if(!(Parameter[i]==1&&Parameter[i+1]==ESC_AS)) return;
+	}
+
+	i+=2;
+	while(Parameter[i]==' '||Parameter[i]=='\t') i++;
+	if(Parameter[i]=='#') i++;
+
+	lstrcat(buffer,",");
+	lstrcat(buffer,Parameter+i);
+}
+void ComClose(char *Parameter,char *buffer){
+	if(Parameter[0]=='#') lstrcpy(buffer,Parameter+1);
+	else lstrcpy(buffer,Parameter);
+}
+void ComField(char *Parameter,char *buffer){
+	if(Parameter[0]=='#') KillSpaces(Parameter+1,buffer);
+	else KillSpaces(Parameter,buffer);
+}
+
+void ComLine(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+	char temporary[VN_SIZE],temp2[VN_SIZE];
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]=='-'){
+		lstrcpy(buffer,"&H80000000,&H80000000");
+		i=0;
+	}
+	else{
+		if(Parameter[0]!='('){
+			compiler.errorMessenger.Output(10,"Line",nowLine);
+			return;
+		}
+		for(i=1,i2=0,PareNum=1;;i++,i2++){
+			if(Parameter[i]=='(') PareNum++;
+			if(Parameter[i]==')'){
+				PareNum--;
+				if(PareNum==0){
+					temporary[i2]=0;
+					break;
+				}
+			}
+			temporary[i2]=Parameter[i];
+		}
+
+		lstrcpy(buffer,temporary);
+
+		if(Parameter[i+1]!='-'){
+			compiler.errorMessenger.Output(10,"Line",nowLine);
+			return;
+		}
+		i++;
+	}
+
+	i++;
+	if((Parameter[i]=='s'||Parameter[i]=='S')&&(Parameter[i+1]=='t'||Parameter[i+1]=='T')&&(Parameter[i+2]=='e'||Parameter[i+2]=='E')&&(Parameter[i+3]=='p'||Parameter[i+3]=='P')){
+		lstrcat(buffer,",1,");
+		i+=4;
+	}
+	else lstrcat(buffer,",0,");
+
+	if(Parameter[i]!='('){
+		compiler.errorMessenger.Output(10,"Line",nowLine);
+		return;
+	}
+	for(i++,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				temporary[i2]=0;
+				break;
+			}
+		}
+		temporary[i2]=Parameter[i];
+	}
+
+	lstrcat(buffer,temporary);
+
+	if(Parameter[i+1]=='\0'){
+		lstrcat(buffer,",7");
+		return;
+	}
+	else if(Parameter[i+1]!=','){
+		compiler.errorMessenger.Output(10,"Line",nowLine);
+		return;
+	}
+	i+=2;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第５パラメータ取得
+	if(temporary[0]=='\0')
+		lstrcpy(temporary,"7");
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	lstrcpy(temp2,temporary);
+
+	if(Parameter[i]=='\0') return;
+	i=GetOneParameter(Parameter,i,temporary);	//第６パラメータ取得
+	if(temporary[0]=='\0') lstrcat(buffer,",0");
+	else if(lstrcmpi(temporary,"b")==0) lstrcat(buffer,",1");
+	else if(lstrcmpi(temporary,"bf")==0) lstrcat(buffer,",2");
+	else{
+		compiler.errorMessenger.Output(10,"Line",nowLine);
+		return;
+	}
+
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",");
+		lstrcat(buffer,temp2);
+		return;
+	}
+	i=GetOneParameter(Parameter,i,temporary);	//第７パラメータ取得
+	if(Parameter[i-1]==','){
+		compiler.errorMessenger.Output(10,"Line",nowLine);
+		return;
+	}
+	if(temporary[0]=='\0') lstrcpy(temporary,temp2);
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+}
+void ComCircle(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+	char temporary[VN_SIZE],temp2[VN_SIZE];
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		compiler.errorMessenger.Output(10,"Circle",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+
+	i++;
+	if(Parameter[i]!=','){
+		compiler.errorMessenger.Output(10,"Circle",nowLine);
+		return;
+	}
+	i++;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第３パラメータ取得(radius)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",7,0,0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第４パラメータ取得(color)
+	if(temporary[0]=='\0') lstrcpy(temporary,"7");
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	lstrcpy(temp2,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",0,0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第５パラメータ取得(start)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",0,1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第６パラメータ取得(end)
+	lstrcat(buffer,",");
+	lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0'){
+		lstrcat(buffer,",1");
+		return;
+	}
+
+	i=GetOneParameter(Parameter,i,temporary);	//第７パラメータ取得(aspect)
+	lstrcat(buffer,",");
+	if(temporary[0]=='\0')
+		lstrcat(buffer,"1");
+	else
+		lstrcat(buffer,temporary);
+	if(Parameter[i]=='\0') return;
+
+	i=GetOneParameter(Parameter,i,temporary);	//第８パラメータ取得(f)
+	if(lstrcmpi(temporary,"f")==0){
+		lstrcat(buffer,",1");
+	}
+	else{
+		compiler.errorMessenger.Output(10,"Circle",nowLine);
+		return;
+	}
+
+	if(Parameter[i]){
+		i=GetOneParameter(Parameter,i,temporary);	//第９パラメータ取得(BrushColor)
+		if(temporary[0]=='\0') lstrcpy(temporary,"7");
+		lstrcat(buffer,",");
+		lstrcat(buffer,temporary);
+		if(Parameter[i-1]==','){
+			compiler.errorMessenger.Output(10,"Circle",nowLine);
+			return;
+		}
+	}
+	else{
+		lstrcat(buffer,",");
+		lstrcat(buffer,temp2);
+	}
+}
+void ComPSet(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		compiler.errorMessenger.Output(10,"PSet",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+
+	if(Parameter[i+1]==',')lstrcat(buffer,Parameter+i+1);
+	else if(Parameter[i+1]=='\0') lstrcat(buffer,",7");
+	else{
+		compiler.errorMessenger.Output(10,"PSet",nowLine);
+		return;
+	}
+}
+void ComPaint(char *Parameter,char *buffer,int nowLine){
+	int i,i2,PareNum;
+
+	KillStringSpaces(Parameter);
+
+	if(Parameter[0]!='('){
+		compiler.errorMessenger.Output(10,"Paint",nowLine);
+		return;
+	}
+	for(i=1,i2=0,PareNum=1;;i++,i2++){
+		if(Parameter[i]=='(') PareNum++;
+		if(Parameter[i]==')'){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i2]=0;
+				break;
+			}
+		}
+		buffer[i2]=Parameter[i];
+	}
+	if(Parameter[i+1]!=','){
+		compiler.errorMessenger.Output(10,"Paint",nowLine);
+		return;
+	}
+
+	lstrcat(buffer,Parameter+i+1);
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Compile.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Compile.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Compile.cpp	(revision 774)
@@ -0,0 +1,816 @@
+#include "stdafx.h"
+
+#include <LexicalScope.h>
+#include <CodeGenerator.h>
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+//With情報
+WithInfos withInfos;
+
+// オブジェクトモジュールリストに類似したソースコードリスト
+BasicSources sourcesLinkRelationalObjectModule;
+
+
+
+///////////////////////////////////////////////////
+// トークンを取得
+///////////////////////////////////////////////////
+void GetIdentifierToken( char *token, const char *source, int &pos )
+{
+	for( int i=0; ; i++, pos++ ){
+		if( ! IsVariableChar( source[pos] ) ){
+			token[i] = 0;
+			break;
+		}
+		token[i] = source[pos];
+	}
+}
+void GetCommandToken( char *token, const char *source, int &pos )
+{
+	for( int i=0; ; i++, pos++ ){
+		if( IsCommandDelimitation( source[pos] ) ){
+			token[i] = 0;
+			break;
+		}
+		token[i] = source[pos];
+	}
+}
+void GetCustomToken( char *token, const char *source, int &pos, char delimitation, bool isEscapeSequence )
+{
+	for( int i=0; ; i++, pos++ ){
+		if( isEscapeSequence )
+		{
+			if( source[pos] == 1 && source[pos+1] == delimitation )
+			{
+				token[i] = 0;
+				pos++;
+				break;
+			}
+		}
+		else
+		{
+			if( source[pos] == delimitation )
+			{
+				token[i] = 0;
+				break;
+			}
+		}
+
+		token[i] = source[pos];
+
+		if( source[pos] == '\0' )
+		{
+			break;
+		}
+	}
+}
+
+
+///////////////////////////////////////////////////
+// ジェネリクスのクラス型記述を分析
+///////////////////////////////////////////////////
+void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass, Jenga::Common::Strings *pTypeParameterBaseClassNames )
+{
+	if( isDefiningClass )
+	{
+		if( !pTypeParameterBaseClassNames )
+		{
+			compiler.errorMessenger.OutputFatalError();
+		}
+		pTypeParameterBaseClassNames->clear();
+	}
+
+	int i = 0;
+	typeParameters.clear();
+
+	//クラス名を取得
+	GetIdentifierToken( className, fullName, i );
+
+
+	/////////////////////////////////////////////////////////
+	// ☆★☆ ジェネリクスサポート ☆★☆
+	if( fullName[i] == '<' )
+	{
+		while( true )
+		{
+			i++;
+
+			// 型パラメータを取得
+			char temporary[VN_SIZE];
+			GetIdentifierToken( temporary, fullName, i );
+			if( temporary[0] == '\0' )
+			{
+				extern int cp;
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+			typeParameters.push_back( temporary );
+
+			if( isDefiningClass )
+			{
+				// クラス定義中にこの関数が呼び出されたとき
+
+				if( fullName[i] == 1 && fullName[i+1] == ESC_AS )
+				{
+					// 型パラメータの制約クラスを取得
+					i += 2;
+					GetIdentifierToken( temporary, fullName, i );
+					if( temporary[0] == '\0' )
+					{
+						extern int cp;
+						compiler.errorMessenger.Output(1,NULL,cp);
+					}
+				}
+				else
+				{
+					temporary[0] = 0;
+				}
+				pTypeParameterBaseClassNames->push_back( temporary );
+			}
+
+			if( fullName[i] == ',' )
+			{
+				continue;
+			}
+			else if( fullName[i] == '>' )
+			{
+				break;
+			}
+			else
+			{
+				extern int cp;
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+		}
+	}
+	/////////////////////////////////////////////////////////
+}
+
+
+///////////////////////////////////////////////////
+// 対になっているステートメントを飛び越す
+// ※グローバル領域用
+///////////////////////////////////////////////////
+int JumpStatement(const char *source, int &pos){
+	if( source[pos] != 1 ) return 0;
+
+	if( ! IsCommandDelimitation( source[pos - 1] ) ){
+		//直前がコマンド区切りではない場合
+		return 0;
+	}
+
+	char cStatement = source[pos + 1];
+
+	char cEnd = GetEndXXXCommand( cStatement );
+	if( cEnd == 0 ) return 0;
+
+	pos += 2;
+	while( ! ( source[pos] == 1 && source[pos + 1] == cEnd ) ){
+
+		if( source[pos] == '\0' ){
+			char temporary[64];
+			GetDefaultNameFromES( cStatement, temporary );
+			compiler.errorMessenger.Output( 22, temporary, pos );
+			return -1;
+		}
+
+		pos++;
+	}
+	if( ! ( source[pos] == '\0' || source[pos + 2] == '\0' ) ){
+		pos += 2;
+	}
+
+	return 1;
+}
+
+void Compile( const char *source )
+{
+	char *temporary = (char *)malloc( lstrlen( source ) + 8192 );
+	lstrcpy( temporary, source );
+	int backCp = cp;
+	MakeMiddleCode( temporary );
+	cp = backCp;
+	ChangeOpcode( temporary );
+	cp = backCp;
+	free( temporary );
+}
+
+void ChangeOpcode(char *Command){
+	extern HANDLE hHeap;
+
+	if(Command[0]=='\0')
+	{
+		return;
+	}
+
+	trace_for_sourcecodestep( FormatEscapeSequenceStringToDefaultString(Command) );
+
+	if(Command[0]=='*'&&IsVariableTopChar(Command[1])){
+		//Goto先ラベル
+		compiler.codeGenerator.gotoLabels.push_back( GotoLabel( Command + 1, compiler.codeGenerator.GetNativeCodeSize() ) );
+
+		//書き込みスケジュール
+		GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
+		while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
+		{
+			if( (*it)->GetName() == Command+1 )
+			{
+				compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
+				
+				//詰める
+				it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
+			}
+			else
+			{
+				it++;
+			}
+		}
+		return;
+	}
+	if(Command[0]==1){
+		switch(Command[1]){
+			case ESC_CONST:
+				OpcodeDim(Command+2, DIMFLAG_CONST);
+				break;
+
+			case ESC_TYPEDEF:
+				if( compiler.IsLocalAreaCompiling() ){
+					// ローカル領域をコンパイルしているとき
+					compiler.errorMessenger.Output(65,"TypeDef",cp );
+				}
+
+				//既に収集済み
+				break;
+
+			case ESC_DELEGATE:
+				if( compiler.IsLocalAreaCompiling() ){
+					// ローカル領域をコンパイルしているとき
+					compiler.errorMessenger.Output(65,"Delegate",cp );
+				}
+
+				//既に収集済み
+				break;
+
+			case ESC_STATIC:
+				OpcodeDim(Command+2,DIMFLAG_STATIC);
+				break;
+
+			case ESC_IF:
+				OpcodeIf(Command+2);
+				break;
+			case ESC_EXITWHILE:
+				{
+					LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_WHILE );
+					if( !pScope ){
+						compiler.errorMessenger.Output(12,"Exit While",cp);
+						return;
+					}
+					pScope->Break();
+				}
+				break;
+			case ESC_EXITFOR:
+				{
+					LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_FOR );
+					if( !pScope ){
+						compiler.errorMessenger.Output(12,"Exit For",cp);
+						return;
+					}
+					pScope->Break();
+				}
+				break;
+			case ESC_EXITDO:
+				{
+					LexicalScope *pScope = compiler.codeGenerator.lexicalScopes.SearchScope( LexicalScope::SCOPE_TYPE_DO );
+					if( !pScope ){
+						compiler.errorMessenger.Output(12,"Exit Do",cp);
+						return;
+					}
+					pScope->Break();
+				}
+				break;
+			case ESC_CONTINUE:
+				OpcodeContinue();
+				break;
+
+			case ESC_EXITSUB:
+			case ESC_EXITFUNCTION:
+			case ESC_EXITMACRO:
+				OpcodeExitSub();
+				break;
+
+			case ESC_SELECTCASE:
+				OpcodeSelect(Command+2);
+				break;
+			case ESC_CASE:
+			case ESC_CASEELSE:
+				OpcodeCase(Command+2);
+				break;
+
+			case ESC_WITH:
+				{
+					extern WithInfos withInfos;
+					withInfos.push_back( WithInfo( Command+2, cp ) );
+					break;
+				}
+			case ESC_ENDWITH:
+				{
+					extern WithInfos withInfos;
+					if( withInfos.size() <= 0 )
+					{
+						compiler.errorMessenger.Output(12,"End With",cp);
+						return;
+					}
+
+					withInfos.pop_back();
+					break;
+				}
+			case ESC_DECLARE:
+				if( compiler.IsLocalAreaCompiling() ){
+					// ローカル領域をコンパイルしているとき
+					compiler.errorMessenger.Output(65,"Declare",cp );
+				}
+				break;
+
+			case ESC_NAMESPACE:
+				compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().push_back( Command + 2 );
+				break;
+			case ESC_ENDNAMESPACE:
+				if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().empty() )
+				{
+					compiler.errorMessenger.Output(12,"End Namespace",cp);
+					break;
+				}
+				compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().pop_back();
+				break;
+			case ESC_IMPORTS:
+				compiler.GetNamespaceSupporter().ImportsNamespace( Command + 2 );
+				break;
+			case ESC_CLEARNAMESPACEIMPORTED:
+				// Imports情報のクリア
+				compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+				break;
+
+				//Tryによる例外処理
+			case ESC_TRY:
+				Exception::TryCommand();
+				break;
+			case ESC_CATCH:
+				Exception::CatchCommand( Command + 2 );
+				break;
+			case ESC_FINALLY:
+				Exception::FinallyCommand();
+				break;
+			case ESC_ENDTRY:
+				Exception::EndTryCommand();
+				break;
+			case ESC_THROW:
+				Exception::ThrowCommand( Command + 2 );
+				break;
+
+			default:
+				char temporary[64];
+				GetDefaultNameFromES(Command[1],temporary);
+				compiler.errorMessenger.Output(30,temporary,cp);
+				break;
+		}
+		return;
+	}
+	switch(MAKEWORD(Command[1],Command[0])){
+		case COM_DIM:
+			OpcodeDim(Command+2,0);
+			break;
+		case COM_DELETE:
+			OpcodeDelete(Command+2, false);
+			break;
+		case COM_SWEEPINGDELETE:
+			OpcodeDelete(Command+2, true);
+			break;
+
+		case COM_GOTO:
+			OpcodeGoto(Command+2);
+			break;
+		case COM_WHILE:
+			OpcodeWhile(Command+2);
+			break;
+		case COM_FOR:
+			OpcodeFor(Command+2);
+			break;
+		case COM_FOREACH:
+			OpcodeForeach(Command+2);
+			break;
+		case COM_DO:
+			OpcodeDo(Command+2);
+			break;
+
+		case COM_GOSUB:
+			OpcodeGosub(Command+2);
+			break;
+		case COM_RETURN:
+			OpcodeReturn(Command+2);
+			break;
+
+		case COM_SETDOUBLE:
+			OpcodeSetPtrData(Command+2,DEF_DOUBLE);
+			break;
+		case COM_SETSINGLE:
+			OpcodeSetPtrData(Command+2,DEF_SINGLE);
+			break;
+		case COM_SETQWORD:
+			OpcodeSetPtrData(Command+2,DEF_QWORD);
+			break;
+		case COM_SETDWORD:
+			OpcodeSetPtrData(Command+2,DEF_DWORD);
+			break;
+		case COM_SETWORD:
+			OpcodeSetPtrData(Command+2,DEF_WORD);
+			break;
+		case COM_SETBYTE:
+			OpcodeSetPtrData(Command+2,DEF_BYTE);
+			break;
+
+		case COM_DEBUG:
+			//int 3
+			if( compiler.IsDebug() )
+			{
+				breakpoint;
+			}
+			else
+			{
+//#if defined(_DEBUG)
+				breakpoint;
+//#endif
+			}
+			break;
+
+		case COM_LET:
+			OpcodeCalc(Command+2);
+
+			break;
+		default:
+			OpcodeOthers(Command);
+
+			// コード生成過程で発生した構造体の一時メモリを破棄する
+			compiler.codeGenerator.op_FreeTempStructure();
+
+			break;
+	}
+}
+
+void GetGlobalDataForDll(void){
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i2,BufferSize;
+	char *Command;
+	DWORD dwRetCode;
+
+	dwRetCode=0;
+	BufferSize=128;
+	Command=(char *)HeapAlloc(hHeap,0,BufferSize);
+	for(cp++,i2=0;;cp++,i2++){
+		if(i2>=BufferSize){
+			//バッファ領域が足りなくなった場合はバッファを増量する
+			BufferSize+=128;
+			Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+		}
+		if(basbuf[cp]=='\"'){
+			Command[i2]=basbuf[cp];
+			for(cp++,i2++;;cp++,i2++){
+				if(i2>=BufferSize){
+					//バッファ領域が足りなくなった場合はバッファを増量する
+					BufferSize+=128;
+					Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+				}
+				Command[i2]=basbuf[cp];
+				if(basbuf[cp]=='\"') break;
+			}
+			continue;
+		}
+		if(IsCommandDelimitation(basbuf[cp])){
+			Command[i2]=0;
+
+			if(Command[0]==1&&Command[1]==ESC_SUB){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDSUB)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Sub",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_FUNCTION){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDFUNCTION)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Function",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_MACRO){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDMACRO)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Macro",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_TYPE){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDTYPE)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Type",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_CLASS){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDCLASS)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Class",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+			if(Command[0]==1&&Command[1]==ESC_INTERFACE){
+				i2=cp;
+				while(!(basbuf[cp]==1&&basbuf[cp+1]==ESC_ENDINTERFACE)){
+					if(basbuf[cp]=='\0'){
+						compiler.errorMessenger.Output(22,"Interface",i2);
+						break;
+					}
+					cp++;
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+
+			//DLLのグローバルデータに必要なコマンドだけ
+			if(MAKEWORD(Command[1],Command[0])==COM_DIM)
+				OpcodeDim(Command+2,0);
+
+			if(basbuf[cp]=='\0') break;
+			i2=-1;
+			continue;
+		}
+		Command[i2]=basbuf[cp];
+	}
+	HeapDefaultFree(Command);
+}
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command){
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,BufferSize,ScopeStart;
+	char *Command,temporary[VN_SIZE],*temp2,temp3[32];
+	DWORD dwRetCode;
+
+	ScopeStart=cp;
+
+	dwRetCode=0;
+	BufferSize=128;
+	Command=(char *)HeapAlloc(hHeap,0,BufferSize);
+
+	for(cp++,i2=0;;cp++,i2++){
+		if(i2>=BufferSize){
+			//バッファ領域が足りなくなった場合はバッファを増量する
+			BufferSize+=128;
+			Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+		}
+		if(basbuf[cp]=='\"'){
+			Command[i2]=basbuf[cp];
+			for(cp++,i2++;;cp++,i2++){
+				if(i2>=BufferSize){
+					//バッファ領域が足りなくなった場合はバッファを増量する
+					BufferSize+=128;
+					Command=(char *)HeapReAlloc(hHeap,0,Command,BufferSize);
+				}
+				Command[i2]=basbuf[cp];
+				if(basbuf[cp]=='\"') break;
+			}
+			continue;
+		}
+		if(IsCommandDelimitation(basbuf[cp])){
+			Command[i2]=0;
+
+			if(Command[0]==1&&Command[1]==ESC_LINENUM){
+				for(i=2,i2=0;;i++,i2++){
+					if(Command[i]==','){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=Command[i];
+				}
+				i3=atoi(temporary);
+				i4=i+1;
+
+				//Goto先ラベル
+				compiler.codeGenerator.gotoLabels.push_back( GotoLabel( (long)i3, compiler.codeGenerator.GetNativeCodeSize() ) );
+
+				//書き込みスケジュール
+				GotoLabelSchedules::iterator it = compiler.codeGenerator.gotoLabelSchedules.begin();
+				while( it != compiler.codeGenerator.gotoLabelSchedules.end() )
+				{
+					if( (*it)->GetName().size() == 0 && (*it)->GetLineNum() == i3 )
+					{
+						compiler.codeGenerator.opfix_JmpPertialSchedule( (*it) );
+
+						//詰める
+						it = compiler.codeGenerator.gotoLabelSchedules.erase( it );
+					}
+					else
+					{
+						it++;
+					}
+				}
+
+				temp2=(char *)HeapAlloc(hHeap,0,lstrlen(Command+i4)+1);
+				lstrcpy(temp2,Command+i4);
+				lstrcpy(Command,temp2);
+				HeapDefaultFree(temp2);
+			}
+
+			if(Command[0]==1&&
+				(((Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE)&&Command[2]==1&&(Command[3]==ESC_SUB||Command[3]==ESC_FUNCTION))||
+				Command[1]==ESC_SUB||
+				Command[1]==ESC_FUNCTION||
+				Command[1]==ESC_MACRO||
+				Command[1]==ESC_TYPE||
+				Command[1]==ESC_CLASS||
+				Command[1]==ESC_INTERFACE||
+				Command[1]==ESC_ENUM||
+				(Command[1]==ESC_CONST&&Command[2]==1&&Command[3]==ESC_ENUM)
+				)
+				){
+				if(Command[1]==ESC_VIRTUAL||Command[1]==ESC_OVERRIDE||Command[1]==ESC_CONST){
+					GetDefaultNameFromES(Command[3],temporary);
+				}
+				else{
+					GetDefaultNameFromES(Command[1],temporary);
+				}
+				if(Return_Sequence){
+					compiler.errorMessenger.Output(12,temporary,cp);
+					break;
+				}
+
+				if(Command[1]==ESC_CONST) i3=GetEndXXXCommand(Command[3]);
+				else i3=GetEndXXXCommand(Command[1]);
+				for(i2=cp;;cp++){
+					if(basbuf[cp]==1){
+						if(basbuf[cp+1]==i3) break;
+						if(Command[1]==ESC_CLASS||Command[1]==ESC_INTERFACE){
+							//クラス、インターフェイスではSub、Functionの定義を可能にしておく
+							if(basbuf[cp+1]==ESC_MACRO||
+								basbuf[cp+1]==ESC_TYPE||
+								basbuf[cp+1]==ESC_CLASS||
+								basbuf[cp+1]==ESC_INTERFACE||
+								basbuf[cp+1]==ESC_ENUM){
+								GetDefaultNameFromES(basbuf[cp+1],temp3);
+								compiler.errorMessenger.Output(12,temp3,cp);
+							}
+						}
+						else{
+							if(basbuf[cp-1]!='*'&&(
+								basbuf[cp+1]==ESC_VIRTUAL||
+								basbuf[cp+1]==ESC_OVERRIDE||
+								basbuf[cp+1]==ESC_SUB||
+								basbuf[cp+1]==ESC_FUNCTION||
+								basbuf[cp+1]==ESC_MACRO||
+								basbuf[cp+1]==ESC_TYPE||
+								basbuf[cp+1]==ESC_CLASS||
+								basbuf[cp+1]==ESC_INTERFACE||
+								basbuf[cp+1]==ESC_ENUM)){
+								GetDefaultNameFromES(basbuf[cp+1],temp3);
+								compiler.errorMessenger.Output(12,temp3,cp);
+							}
+						}
+					}
+					if(basbuf[cp]=='\0'){
+						//error
+						//既にエラー発行済みのため、何もせずに抜ける
+						break;
+					}
+				}
+				if(basbuf[cp+2]=='\0'||basbuf[cp]=='\0') break;
+				cp+=2;
+				i2=-1;
+				continue;
+			}
+
+			if(Command[0]==0x10||Command[0]==0x11){
+				//Wend、Next、Loopなど
+				if(Return_Command==MAKEWORD(Command[1],Command[0])){
+					if(Return_Command==COM_NEXT){
+						//Nextの場合は、パラメータ（省略化）の整合性を判断する必要がある（OpcodeFor関数を参照）
+						extern char szNextVariable[VN_SIZE];
+						if(Command[2]) lstrcpy(szNextVariable,Command+2);
+						else szNextVariable[0]=0;
+					}
+					break;
+				}
+			}
+
+			if( basbuf[cp] != '\0' )
+			{
+				compiler.codeGenerator.NextSourceLine(
+					SourceCodePosition( compiler.GetCurrentRelationalObjectModuleIndexForSource(), cp ),
+					compiler.GetCompilingUserProc().IsSystem()
+				);
+			}
+
+			if(Command[0]==1){
+				if(Return_Sequence==ESC_ENDIF&&Command[1]==ESC_ELSE){
+					dwRetCode=ESC_ELSE;
+					break;
+				}
+
+				if(Command[1]==Return_Sequence){
+					dwRetCode=Command[1];
+					break;
+				}
+			}
+
+			if( Command[0] )
+			{
+				ChangeOpcode(Command);
+			}
+
+
+			epi_check();
+
+
+			//コンパイルを中断するとき
+			extern BOOL bStopCompile;
+			if(bStopCompile) return 0;
+
+			if(basbuf[cp]=='\0'){
+				switch(Return_Command){
+					case COM_WEND:
+						compiler.errorMessenger.Output(4,"\"While\" - \"Wend\" ",ScopeStart);
+						break;
+					case COM_NEXT:
+						compiler.errorMessenger.Output(4,"\"For\" - \"Next\" ",ScopeStart);
+						break;
+					case COM_LOOP:
+						compiler.errorMessenger.Output(4,"\"Do\" - \"Loop\" ",ScopeStart);
+						break;
+				}
+				switch(Return_Sequence){
+					case ESC_ENDSUB:
+						compiler.errorMessenger.Output(4,"\"Sub\" - \"End Sub\" ",ScopeStart);
+						break;
+					case ESC_ENDFUNCTION:
+						compiler.errorMessenger.Output(4,"\"Function\" - \"End Function\" ",ScopeStart);
+						break;
+					case ESC_ENDMACRO:
+						compiler.errorMessenger.Output(4,"\"Macro\" - \"End Macro\" ",ScopeStart);
+						break;
+					case ESC_ENDIF:
+						compiler.errorMessenger.Output(22,"If",ScopeStart);
+						break;
+				}
+				break;
+			}
+			i2=-1;
+			continue;
+		}
+		Command[i2]=basbuf[cp];
+	}
+	HeapDefaultFree(Command);
+
+	return dwRetCode;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp	(revision 774)
@@ -0,0 +1,830 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "../BasicCompiler_Common/DebugSection.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+
+char *OpBuffer;
+
+extern DWORD dwStepRun;
+
+HANDLE hDebugProcess;
+
+DWORD _DebugSys_dwThreadID[MAX_DEBUG_THREAD];
+HANDLE array_hDebugThread[MAX_DEBUG_THREAD];
+
+int StepCursorObpSchedule=-1;
+int StepCursor_BackupChar;
+
+int NextStepThreadNum;
+
+DebugSectionCollection debugSectionCollection;
+
+void Debugger_StepIn(void){
+	dwStepRun=1;
+}
+void Debugger_StepOver(void){
+	dwStepRun=2;
+}
+
+void Debugger_StepCursor(void){
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+	lstrcat(temporary,"ab_breakpoint.tmp");
+
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg(temporary);
+
+	int i=0;
+	char szFilePath[MAX_PATH];
+	i=GetOneParameter(buffer,i,szFilePath);
+	RemoveStringQuotes(szFilePath);
+
+	int iLineNum;
+	i=GetOneParameter(buffer,i,temporary);
+	iLineNum=atoi(temporary);
+
+
+
+	/////////////////////////////////////////////////////////
+	// デバッグ中プロセスのネイティブバッファ領域を更新
+	/////////////////////////////////////////////////////////
+
+	int FileNum;
+	const IncludedFilesRelation *pIncludedFilesRelation = NULL;
+	const BasicSource *pNowSource = NULL;
+
+	extern BasicSources sourcesLinkRelationalObjectModule;
+	foreach( const BasicSource &source, sourcesLinkRelationalObjectModule )
+	{
+		pIncludedFilesRelation = &source.GetIncludedFilesRelation();
+
+		for(FileNum=0;FileNum<pIncludedFilesRelation->GetFileCounts();FileNum++)
+		{
+			if(lstrcmpi(pIncludedFilesRelation->GetFilePathFromFileNumber(FileNum).c_str(),szFilePath)==0)
+			{
+				pNowSource = &source;
+				break;
+			}
+		}
+		if( FileNum == pIncludedFilesRelation->GetFileCounts() )
+		{
+			pIncludedFilesRelation = NULL;
+		}
+		else
+		{
+			break;
+		}
+	}
+
+	if( !pIncludedFilesRelation )
+	{
+		return;
+	}
+
+	for(i=0;;i++){
+		if( pIncludedFilesRelation->GetFileNumber( i ) == FileNum
+			|| pIncludedFilesRelation->GetFileNumber( i ) == -1 )
+		{
+			break;
+		}
+	}
+	if( pIncludedFilesRelation->GetFileNumber( i ) == -1 )
+	{
+		return;
+	}
+
+	int FileBaseLine;
+	FileBaseLine=i;
+
+	int i2;
+	for(i2=0;;i++,i2++)
+	{
+		if( FileNum < pIncludedFilesRelation->GetFileNumber( i ) )
+		{
+			while( FileNum != pIncludedFilesRelation->GetFileNumber( i ) )
+			{
+				i++;
+			}
+		}
+
+		if(i2==iLineNum)
+		{
+loop:
+			int tempCp = GetSourceCodeIndexFromLine( pNowSource->GetBuffer(), FileBaseLine+i2 );
+
+			const SourceLines &sourceLines = debugSectionCollection.GetCurrent()._oldSourceLines;
+
+			int i3;
+			for( i3=0; i3<static_cast<int>(sourceLines.size()-1); i3++ )
+			{
+				if( sourceLines[i3].GetSourceCodePosition().GetPos() == tempCp )
+				{
+					break;
+				}
+			}
+			if( i3 == sourceLines.size() - 1 )
+			{
+				i2--;
+				goto loop;
+			}
+
+			StepCursorObpSchedule = sourceLines[i3].GetNativeCodePos();
+			StepCursor_BackupChar=debugSectionCollection.GetCurrent().BreakStepCodeBuffer[StepCursorObpSchedule];
+
+			debugSectionCollection.GetCurrent().BreakStepCodeBuffer[StepCursorObpSchedule]=(char)0xCC;
+
+			break;
+		}
+	}
+
+	extern HWND hDebugWnd;
+	SendMessage(hDebugWnd,WM_DEBUG_CONTINUE,0,0);
+
+
+
+	HeapDefaultFree(buffer);
+}
+void Debugger_Stop(void){
+	//プロセスを終了
+	TerminateProcess(hDebugProcess,0);
+	hDebugProcess=0;
+
+	//デバッグダイアログを終了
+	extern HWND hDebugWnd;
+	if(hDebugWnd){
+		DestroyWindow(hDebugWnd);
+	}
+}
+void Debugger_Pause(void){
+	///////////////////////////
+	// デバッグを一時中断
+	///////////////////////////
+
+	//ターゲットプロセス内のスレッドを一時中断
+	int i;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			SuspendThread(array_hDebugThread[i]);
+	}
+
+	//デバッグレジスタにフラグをセット
+	CONTEXT Context;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]){
+			Context.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
+			GetThreadContext(array_hDebugThread[i],&Context);
+			Context.EFlags|=0x100;
+			SetThreadContext(array_hDebugThread[i],&Context);
+		}
+	}
+
+	//スレッドを再開
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			ResumeThread(array_hDebugThread[i]);
+	}
+}
+
+void ReleaseCPUSingleStep(void){
+	////////////////////////////////////////
+	// CPU機構のシングルステップを解除
+	////////////////////////////////////////
+
+	//ターゲットプロセス内のスレッドを一時中断
+	int i;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			SuspendThread(array_hDebugThread[i]);
+	}
+
+	//デバッグレジスタにフラグをセット
+	CONTEXT Context;
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]){
+			Context.ContextFlags=CONTEXT_CONTROL|CONTEXT_DEBUG_REGISTERS;
+			GetThreadContext(array_hDebugThread[i],&Context);
+			Context.EFlags&=~0x00000100;
+			SetThreadContext(array_hDebugThread[i],&Context);
+		}
+	}
+
+	//スレッドを再開
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i])
+			ResumeThread(array_hDebugThread[i]);
+	}
+}
+
+
+ULONG_PTR rva_to_real(DWORD p){
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	return p+ImageBase+MemPos_CodeSection;
+}
+
+void ShowVarList(DEBUG_EVENT *pde,BOOL bExit){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+
+	//デバッグダイアログを表示
+	extern HINSTANCE hInst;
+	extern HWND hMainDlg;
+	extern HWND hDebugWnd;
+	dwStepRun=0;
+	if(!hDebugWnd) SendMessage(hMainDlg,WM_SHOWVARLIST,0,pde->dwThreadId);
+	else InitVarList(pde->dwThreadId);
+
+	if(bExit){
+		//"中断"
+		SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+		extern HWND hDebuggerToolbar;
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_START,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPOVER,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPIN,TBSTATE_INDETERMINATE);
+	}
+	else{
+		//"継続"
+		SetDlgItemText(hDebugWnd,IDCANCEL,STRING_CONTINUE);
+	}
+	while(hDebugWnd&&dwStepRun==0) Sleep(1);
+}
+void DebugMessage(char *buffer){
+	extern HWND hMainDlg;
+	int pos;
+
+	if(!IsWindowEnabled(GetDlgItem(hMainDlg,IDC_DEBUGLIST))){
+		SetDlgItemText(hMainDlg,IDC_DEBUGLIST,"");
+		EnableWindow(GetDlgItem(hMainDlg,IDC_DEBUGLIST),1);
+	}
+
+	pos=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_DEBUGLIST));
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_SETSEL,pos,pos);
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
+}
+UserProc *GetSubFromObp(ULONG_PTR pos)
+{
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+
+		if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pos  &&
+			pos < rva_to_real(pUserProc->GetEndOpAddress()))
+		{
+			return pUserProc;
+		}
+	}
+	return NULL;
+}
+void ReleaseSingleStep(DWORD dwBeforeStepRun,HANDLE hThread,CONTEXT *pContext){
+	//以前にシングルステップ実行をした場合
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+	int i2;
+	ULONG_PTR lpAccBytes;
+
+	///////////////////////////
+	// シングルステップOFF
+	///////////////////////////
+
+	//ユーザー指定のブレークポイントをセット
+	WriteProcessMemory(hDebugProcess,
+		(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+		debugSectionCollection.GetCurrent().BreakStepCodeBuffer,
+		FileSize_CodeSection,&lpAccBytes);
+
+	//次に実行すべき命令はユーザー指定によるブレークポイントをはずしておく
+	if(ImageBase+MemPos_CodeSection<=EIP_RIP(*pContext)&&EIP_RIP(*pContext)<ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+		if(OpBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection-1]!=
+			debugSectionCollection.GetCurrent().BreakStepCodeBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection-1]){
+			//直前のブレークポイントがユーザー指定によるものだったとき
+
+			//eip/ripを1だけ減少
+			EIP_RIP(*pContext)--;
+			SetThreadContext(hThread,pContext);
+
+			//ブレークポイントを解除
+			WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(*pContext),&OpBuffer[EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+
+			extern int StepCursorObpSchedule;
+			if(StepCursorObpSchedule==(int)(EIP_RIP(*pContext)-ImageBase-MemPos_CodeSection)){
+				//カーソル行までのステップ実行の場合
+				debugSectionCollection.GetCurrent().BreakStepCodeBuffer[StepCursorObpSchedule]=StepCursor_BackupChar;
+				StepCursorObpSchedule=-1;
+			}
+
+			return;
+		}
+	}
+
+
+	if(dwBeforeStepRun){
+		//直前にシングルステップを行った場合
+		if(ImageBase+MemPos_CodeSection <= EIP_RIP(*pContext) &&
+			EIP_RIP(*pContext) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+			//オリジナルコード内のみ、シングルステップ用の"int 3"を考慮
+			EIP_RIP(*pContext)--;
+			SetThreadContext(hThread,pContext);
+		}
+
+		//他のスレッドのサスペンドを解除
+		for(i2=0;i2<MAX_DEBUG_THREAD;i2++){
+			if(array_hDebugThread[i2] && hThread!=array_hDebugThread[i2])
+				ResumeThread(array_hDebugThread[i2]);
+		}
+	}
+}
+
+void Set_DebugSys_dwThreadID()
+{
+	foreach( DebugSection *pDebugSection, debugSectionCollection.debugSections )
+	{
+		ULONG_PTR lpAccBytes;
+		WriteProcessMemory(hDebugProcess,
+			(void *)(ULONG_PTR)(pDebugSection->dwImageBase + pDebugSection->dwRVA_RWSection),
+			_DebugSys_dwThreadID,
+			sizeof(DWORD)*MAX_DEBUG_THREAD,
+			&lpAccBytes
+		);
+	}
+}
+void AddThread(DWORD dwThreadId, HANDLE hThread){
+	int i;
+
+
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]==0){
+			_DebugSys_dwThreadID[i]=dwThreadId;
+			array_hDebugThread[i]=hThread;
+			break;
+		}
+	}
+
+	Set_DebugSys_dwThreadID();
+}
+void DeleteThread(DWORD dwThreadId){
+	int i;
+
+	for(i=0;i<MAX_DEBUG_THREAD;i++){
+		if(_DebugSys_dwThreadID[i]==dwThreadId){
+			_DebugSys_dwThreadID[i]=0;
+			array_hDebugThread[i]=0;
+			break;
+		}
+	}
+
+	Set_DebugSys_dwThreadID();
+}
+
+void DebugProgram(void){
+	extern HWND hMainDlg;
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int MemPos_RWSection;
+	extern int FileSize_CodeSection;
+	int i2,i3,i4;
+	char temporary[1024];
+
+	char ExeFilePathForDll[MAX_PATH];
+	if( compiler.IsDll() ){
+		//DLLをデバッグする場合
+		extern char szDebugExeForDll[1024];
+		if(szDebugExeForDll[0]){
+			//指定済み
+			lstrcpy(ExeFilePathForDll,szDebugExeForDll);
+		}
+		else{
+			//ユーザーに実行ファイルを選択させる
+			extern HWND hOwnerEditor;
+			extern LPSTR ExeFileFilter;
+			if(!GetFilePathDialog(hOwnerEditor,ExeFilePathForDll,ExeFileFilter,"デバッグ用の実行可能ファイルを指定してください。",1)) return;
+		}
+	}
+
+
+	//"中断"
+	SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
+
+	SendMessage(hOwnerEditor,WM_SETDEBUGGERBASE,0,0);
+
+	//カレントディレクトリを設定
+	extern char BasicCurDir[MAX_PATH];
+	SetCurrentDirectory(BasicCurDir);
+
+	SendDlgItemMessage(hMainDlg,IDC_SHOWERROR,BM_SETCHECK,BST_UNCHECKED,0);
+	SendDlgItemMessage(hMainDlg,IDC_SHOWDEBUG,BM_SETCHECK,BST_CHECKED,0);
+	SendMessage(hMainDlg,WM_COMMAND,IDC_SHOWDEBUG,0);
+
+	//ブレークポイントを生成
+	pobj_DBBreakPoint=new BreakPointManager;
+
+
+	// デバッグをスタート
+	debugger.DebugStart();
+
+
+	if( program.IsAttach() )
+	{
+		//プロセスIDを元にハンドルを取得
+		HANDLE hProcess;
+		hProcess=OpenProcess(PROCESS_ALL_ACCESS,0, program.GetAttachProcessId() );
+		if(!hProcess) goto AttachError;
+
+		//そのプロセスにおける実行モジュールのインスタンスハンドルを取得
+		HINSTANCE hModule;
+		DWORD cbReturned;
+		if(!EnumProcessModules( hProcess, &hModule, sizeof(HINSTANCE), &cbReturned )) goto AttachError;
+
+		//実行ファイル名を取得
+		char tempOutputFileName[MAX_PATH];
+		GetModuleFileNameEx(hProcess,hModule,tempOutputFileName,MAX_PATH);
+		program.SetOutputFilePath( tempOutputFileName );
+
+		CloseHandle(hProcess);
+
+/*
+		//デバッグ用の拡張情報を取得
+		pobj_DebugSection->load(program.GetOutputFilePath().c_str());*/
+
+		if(!DebugActiveProcess( program.GetAttachProcessId() )){
+AttachError:
+			DebugMessage("アタッチに失敗しました。");
+			return;
+		}
+	}
+	else{
+		/*if(!pobj_DebugSection->load(program.GetOutputFilePath().c_str())){
+			extern BOOL bDebugCompile;
+			bDebugCompile=1;
+			Build();
+			pobj_DebugSection->load(program.GetOutputFilePath().c_str());
+		}*/
+
+		//スレッドを生成
+		extern char szDebugCmdLine[1024];
+		STARTUPINFO si;
+		PROCESS_INFORMATION pi;
+		memset(&si,0,sizeof(STARTUPINFO));
+		si.cb=sizeof(STARTUPINFO);
+		if( !compiler.IsDll() ){
+			//EXEファイルをデバッグ
+			CreateProcess(program.GetOutputFilePath().c_str(),szDebugCmdLine,NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS|CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
+		}
+		else{
+			//DLLファイルをデバッグ
+			CreateProcess(ExeFilePathForDll,szDebugCmdLine,NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS|CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
+		}
+
+		CloseHandle(pi.hProcess);
+		CloseHandle(pi.hThread);
+	}
+
+
+	//デバッグスレッド情報（プロシージャの階層構造を管理）を生成
+	pobj_dti=new CDebugThreadInfo();
+
+	UserProc *pUserProc;
+
+	extern DWORD dwStepRun;
+	BOOL bFirstBreak=1;
+	CONTEXT Context;
+	HANDLE hMainThread;
+	ULONG_PTR lpAccBytes;
+
+	DEBUG_EVENT de;
+	memset(&de,0,sizeof(DEBUG_EVENT));
+
+	while(WaitForDebugEvent(&de,INFINITE)){
+		if(de.dwDebugEventCode==LOAD_DLL_DEBUG_EVENT){
+			WCHAR wcBuf[MAX_PATH];
+			LONG_PTR lpData;
+
+			wcBuf[0]=0;
+			temporary[0]=0;
+
+			if(de.u.LoadDll.lpImageName){
+				if(!ReadProcessMemory(hDebugProcess,de.u.LoadDll.lpImageName,&lpData,sizeof(LONG_PTR),&lpAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",(ULONG_PTR)de.u.LoadDll.lpImageName);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+				if(!lpData) goto Attach_DllLoad;
+
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,wcBuf,sizeof(WCHAR)*MAX_PATH,&lpAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",lpData);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+
+				if(de.dwThreadId,de.u.LoadDll.fUnicode)
+					WideCharToMultiByte(CP_ACP,0,wcBuf,-1,temporary,255,NULL,NULL);
+				else lstrcpy(temporary,(char *)wcBuf);
+			}
+			else{
+Attach_DllLoad:
+				//アタッチした場合
+				GetModuleFileNameEx(hDebugProcess,(HINSTANCE)de.u.LoadDll.lpBaseOfDll,temporary,MAX_PATH);
+			}
+
+			char temp2[1024];
+			sprintf(temp2,"\"%s\" をロードしました。\r\n",temporary);
+			DebugMessage(temp2);
+
+
+			//可能であればデバッグ情報を読みとる
+			if(debugSectionCollection.add((HMODULE)de.u.LoadDll.lpBaseOfDll)){
+				debugSectionCollection.choice(0);
+				Set_DebugSys_dwThreadID();
+			}
+
+
+			/*if(lstrcmpi(temporary, program.GetOutputFilePath().c_str())==0){
+				ImageBase=(DWORD)de.u.LoadDll.lpBaseOfDll;
+
+				AddThread(de.dwThreadId,hMainThread);
+			}*/
+		}
+		else if(de.dwDebugEventCode==UNLOAD_DLL_DEBUG_EVENT){
+			//DLLのアンロード
+
+			debugSectionCollection.del((HMODULE)de.u.UnloadDll.lpBaseOfDll);
+		}
+		else if(de.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT){
+			hDebugProcess=de.u.CreateProcessInfo.hProcess;
+			hMainThread=de.u.CreateProcessInfo.hThread;
+
+			if(debugSectionCollection.add((HMODULE)de.u.CreateProcessInfo.lpBaseOfImage)){
+				debugSectionCollection.choice(0);
+			}
+
+			AddThread(de.dwThreadId,de.u.CreateProcessInfo.hThread);
+		}
+		else if(de.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENT){
+			AddThread(de.dwThreadId,de.u.CreateThread.hThread);
+		}
+		else if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT){
+			//デバッグダイアログを終了
+			SendMessage(hMainDlg,WM_CLOSE_DEBUGGER,0,0);
+
+			DeleteThread(de.dwThreadId);
+
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+
+			//"プログラムはコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_PROCESSFINISH,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+			break;
+		}
+		else if(de.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENT){
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitThread.dwExitCode);
+			DebugMessage(temporary);
+
+			//以前にシングルステップ実行をした場合
+			//ステップ実行を解除
+			if(dwStepRun){
+				extern HWND hDebugWnd;
+				if(hDebugWnd) SendMessage(hDebugWnd,WM_VARLIST_CLOSE,0,0);
+
+				for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+					if(de.dwThreadId==_DebugSys_dwThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL;
+				GetThreadContext(array_hDebugThread[i4],&Context);
+
+				ReleaseSingleStep(dwStepRun,array_hDebugThread[i4],&Context);
+			}
+
+			DeleteThread(de.dwThreadId);
+		}
+		else if(de.dwDebugEventCode==OUTPUT_DEBUG_STRING_EVENT){
+			ReadProcessMemory(hDebugProcess,(void *)de.u.DebugString.lpDebugStringData,temporary,de.u.DebugString.nDebugStringLength,&lpAccBytes);
+			DebugMessage(temporary);
+		}
+		else if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT){
+
+			//////////////////////////////////////
+			// モジュールを再確認
+			// ※DLLへのデバッグ分岐を可能にする
+			//////////////////////////////////////
+
+
+			//初回例外は無視
+			if(bFirstBreak){
+				bFirstBreak=0;
+				goto NextContinue;
+			}
+
+			for(i2=0;;i2++){
+				if(_DebugSys_dwThreadID[i2]==de.dwThreadId) break;
+			}
+
+			//スレッド情報をリフレッシュ
+			if(!pobj_dti->Reflesh(i2)){
+				MessageBox(hOwnerEditor,"デバッグ情報が壊れています。ターゲットファイルを再コンパイルしてください。","ActiveBasic",MB_OK|MB_ICONEXCLAMATION);
+
+				break;
+			}
+
+			if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_ACCESS_VIOLATION){
+
+				//"スレッド(&H%X)でアクセス違反がありました(EIP=&H%08X)。\r\n"
+				sprintf(temporary,
+					STRING_DEBUG_THREAD_ACCESSVIOLATION,
+					de.dwThreadId,
+					(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress,
+#ifdef _AMD64_
+					(ULONG_PTR)Context.Rsp
+#else
+					(ULONG_PTR)Context.Esp
+#endif
+					);
+				DebugMessage(temporary);
+
+				MessageBeep(MB_ICONEXCLAMATION);
+				ShowVarList(&de,1);
+				break;
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT||
+				de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP){
+				/////////////////////////
+				// ブレークポイント
+				/////////////////////////
+
+				if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP){
+					//CPU機構のシングルステップによるブレークポイント
+					//※シングルステップを解除
+					ReleaseCPUSingleStep();
+				}
+
+				i3=dwStepRun;
+
+				for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+					if(de.dwThreadId==_DebugSys_dwThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL | CONTEXT_INTEGER;
+				GetThreadContext(array_hDebugThread[i4],&Context);
+
+				if(i3==0||
+					i3&&(!(ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection))
+					){
+					//"スレッド(&H%X)のブレーク ポイント(EIP=&H%08X)。\r\n"
+					sprintf(temporary,
+						STRING_DEBUG_BREAKPOINT,
+						de.dwThreadId,
+						(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress,
+#ifdef _AMD64_
+						(ULONG_PTR)Context.Rsp
+#else
+						(ULONG_PTR)Context.Esp
+#endif
+					);
+					DebugMessage(temporary);
+				}
+
+				ShowVarList(&de,0);
+
+				//ステップ実行を解除
+				ReleaseSingleStep(i3,array_hDebugThread[i4],&Context);
+
+				if(dwStepRun){
+					//新たにシングルステップを行う場合
+
+					if(i4!=NextStepThreadNum){
+						//次回のステップ対象が別スレッドの場合
+						Context.ContextFlags=CONTEXT_CONTROL;
+						GetThreadContext(array_hDebugThread[NextStepThreadNum],&Context);
+					}
+
+					if(ImageBase+MemPos_CodeSection <= EIP_RIP(Context) &&
+						EIP_RIP(Context) < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+						//Debug命令語が続く場合はシングルステップは不要になるので、無効にする
+						//（オリジナルコード内のみ）
+						if(OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection]==(char)0xCC)
+							dwStepRun=0;
+					}
+					if(dwStepRun==1){
+						//ステップイン
+StepIn:
+						//シングルステップON
+						WriteProcessMemory(hDebugProcess,(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+							debugSectionCollection.GetCurrent().SingleStepCodeBuffer,
+							FileSize_CodeSection,&lpAccBytes);
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(Context),&OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+							if(_DebugSys_dwThreadID[i4] && NextStepThreadNum!=i4)
+								SuspendThread(array_hDebugThread[i4]);
+						}
+					}
+					else if(dwStepRun==2){
+						//ステップオーバー
+
+						BOOL bRet;
+						bRet=ReadProcessMemory(hDebugProcess,
+							(void *)EIP_RIP(Context),
+							temporary,
+							5,
+							&lpAccBytes);
+						if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
+
+						extern const UserProc *pSub_DebugSys_EndProc;
+						if((BYTE)temporary[0]==0xE8&&
+							*((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->GetBeginOpAddress())-(long)EIP_RIP(Context)){
+							//プロシージャの終端位置の場合はステップインを行う
+							goto StepIn;
+						}
+
+						extern int GlobalOpBufferSize;
+						if(ImageBase+MemPos_CodeSection<=pobj_dti->lplpObp[pobj_dti->iProcLevel]&&
+							pobj_dti->lplpObp[pobj_dti->iProcLevel]<ImageBase+MemPos_CodeSection+GlobalOpBufferSize){
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)(ULONG_PTR)(ImageBase+MemPos_CodeSection),
+								debugSectionCollection.GetCurrent().SingleStepCodeBuffer,
+								GlobalOpBufferSize,
+								&lpAccBytes);
+						}
+						else{
+							//プロシージャを識別
+							pUserProc=GetSubFromObp(pobj_dti->lplpObp[pobj_dti->iProcLevel]);
+
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)rva_to_real(pUserProc->GetBeginOpAddress()),
+								debugSectionCollection.GetCurrent().SingleStepCodeBuffer+pUserProc->GetBeginOpAddress(),
+								pUserProc->GetEndOpAddress()-pUserProc->GetBeginOpAddress(),
+								&lpAccBytes);
+						}
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=EIP_RIP(Context)&&EIP_RIP(Context)<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)EIP_RIP(Context),&OpBuffer[EIP_RIP(Context)-ImageBase-MemPos_CodeSection],1,&lpAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<MAX_DEBUG_THREAD;i4++){
+							if(_DebugSys_dwThreadID[i4] && NextStepThreadNum!=i4)
+								SuspendThread(array_hDebugThread[i4]);
+						}
+					}
+				}
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_INTEGER_DIVIDE_BY_ZERO){
+				//"0による除算が行われました。スレッド(&H%X) ブレーク ポイント(EIP=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_DIVIDE_BY_ZERO,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				ShowVarList(&de,1);
+				break;
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_NO_MEMORY){
+				//"メモリ不足、またはヒープが壊れていることが原因で、メモリの割り当てに失敗しました。スレッド(&H%X) ブレーク ポイント(EIP=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_DIVIDE_NO_MEMORY,de.dwThreadId,(ULONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				ShowVarList(&de,1);
+				break;
+			}
+			else{
+				//"例外処理\ncode:%X"
+				sprintf(temporary,STRING_DEBUG_ERROR,de.u.Exception.ExceptionRecord.ExceptionCode);
+				DebugMessage(temporary);
+			}
+		}
+NextContinue:
+		ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
+	}
+
+	extern HWND hDebugWnd;
+	if(hDebugWnd) SendMessage(hDebugWnd,WM_COMMAND,IDCANCEL,0);
+
+	//デバッグスレッド情報を解放
+	delete pobj_dti;
+
+	//ブレークポイントを解放
+	delete pobj_DBBreakPoint;
+
+	//"閉じる"
+	SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+	debugger.FinishDebug();
+
+	SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERBASE,0,0);
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugMiddleFile.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugMiddleFile.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugMiddleFile.cpp	(revision 774)
@@ -0,0 +1,472 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/DebugSection.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+#define MDLFILE_VER	0x70000003
+
+using namespace ActiveBasic::Compiler;
+
+
+void SetLpIndex_DebugFile(char *buffer,int *p,const Type &type){
+	if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
+		lstrcpy(buffer+(*p),type.GetClass().GetName().c_str());
+		(*p)+=lstrlen(buffer+(*p))+1;
+	}
+	else{
+		*(LONG_PTR *)(buffer+(*p))=type.GetIndex();
+		(*p)+=sizeof(LONG_PTR);
+	}
+}
+
+
+void GetLpIndex_DebugFile(char *buffer,int *p,Type &type){
+	if(NATURAL_TYPE(type.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(type.GetBasicType())==DEF_STRUCT){
+		char szClassName[VN_SIZE];
+		lstrcpy(szClassName,buffer+(*p));
+		(*p)+=lstrlen(buffer+(*p))+1;
+
+		type.SetClassPtr(
+			compiler.GetObjectModule().meta.GetClasses().FindEx( LexicalAnalyzer::FullNameToSymbol( szClassName ) )
+		);
+	}
+	else{
+		type.SetIndex( *(LONG_PTR *)(buffer+(*p)) );
+		(*p)+=sizeof(LONG_PTR);
+	}
+}
+
+
+
+DebugSection::~DebugSection(){
+	if(dwImageBase) DeleteDebugInfo();
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+}
+void DebugSection::make( const SourceLines &sourceLines )
+{
+	int i2,BufferSize;
+
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+
+	i2=0;
+
+	extern char *basbuf;
+	BufferSize=lstrlen(basbuf)+65535;
+	buffer=(char *)HeapAlloc(hHeap,0,BufferSize);
+
+	//デバッグ用ファイルのバージョン
+	*(long *)(buffer+i2)=MDLFILE_VER;
+	i2+=sizeof(long);
+
+	//プラットフォームのビット数
+	*(long *)(buffer+i2)=PLATFORM;
+	i2+=sizeof(long);
+
+
+	// オブジェクトモジュール
+	{
+		// テキストデータにシリアライズ
+		std::string textString;
+		compiler.GetObjectModule().WriteString( textString );
+
+		// サイズ
+		*(long *)(buffer+i2) = (long)textString.size();
+		i2+=sizeof(long);
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+(int)textString.size()+32768){
+			while( BufferSize<i2+(int)textString.size()+32768 )
+			{
+				BufferSize+=32768;
+			}
+
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+
+		// バッファ
+		memcpy( buffer+i2, textString.c_str(), textString.size() );
+		i2 += (int)textString.size();
+	}
+
+	// オブジェクトモジュールリストに類似したソースコードリスト
+	{
+		// オブジェクトモジュールリストに類似したソースコードリストを作成
+		BasicSources sources;
+		foreach( const ObjectModule *pObjectModule, compiler.staticLibraries )
+		{
+			sources.push_back( pObjectModule->GetSource() );
+		}
+
+		// テキストデータにシリアライズ
+		std::string textString;
+		sources.WriteBinaryString( textString );
+
+		// サイズ
+		*(long *)(buffer+i2) = (long)textString.size();
+		i2+=sizeof(long);
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+(int)textString.size()+32768){
+			while( BufferSize<i2+(int)textString.size()+32768 )
+			{
+				BufferSize+=32768;
+			}
+
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+
+		// バッファ
+		memcpy( buffer+i2, textString.c_str(), textString.size() );
+		i2 += (int)textString.size();
+	}
+
+
+	////////////////////////
+	// コードと行番号の関係
+	////////////////////////
+	*(long *)(buffer+i2)=(long)sourceLines.size();
+	i2+=sizeof(long);
+	foreach( const SourceLine &sourceLine, sourceLines )
+	{
+		*(long *)(buffer+i2) = sourceLine.GetNativeCodePos();
+		i2+=sizeof(long);
+
+		*(long *)(buffer+i2) = sourceLine.GetCodeType();
+		i2+=sizeof(long);
+
+		*(long *)(buffer+i2) = sourceLine.GetSourceCodePosition().GetRelationalObjectModuleIndex();
+		i2+=sizeof(long);
+
+		*(long *)(buffer+i2) = sourceLine.GetSourceCodePosition().GetPos();
+		i2+=sizeof(long);
+
+		//バッファが足りない場合は再確保
+		if(BufferSize<i2+32768){
+			BufferSize+=32768;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufferSize);
+		}
+	}
+
+	//グローバル実行領域のサイズ
+	extern int GlobalOpBufferSize;
+	*(long *)(buffer+i2)=GlobalOpBufferSize;
+	i2+=sizeof(long);
+
+	length=i2;
+}
+
+char *DebugSection::MakeSingleStepCode(){
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
+
+	memcpy(buffer,OpBuffer,SizeOf_CodeSection);
+
+	foreach( const SourceLine &sourceLine, _oldSourceLines )
+	{
+		if(!(
+			sourceLine.IsInSystemProc()
+			|| sourceLine.IsInDebugProc() ) )
+		{
+			//int 3
+			buffer[sourceLine.GetNativeCodePos()]=(char)0xCC;
+		}
+	}
+
+	return buffer;
+}
+BOOL DebugSection::__load(){
+	int i2,i3;
+
+	compiler.ClearCompilingUserProcAndClass();
+
+	i2=0;
+
+	//デバッグ用ファイルのバージョンをチェック
+	if(*(long *)(buffer+i2)<MDLFILE_VER){
+		HeapDefaultFree(buffer);
+		return 0;
+	}
+	i2+=sizeof(long);
+
+	//プラットフォームのビット数をチェック
+	if(*(long *)(buffer+i2)!=PLATFORM){
+		HeapDefaultFree(buffer);
+		return 0;
+	}
+	i2+=sizeof(long);
+
+	// オブジェクトモジュール
+	{
+		// サイズ
+		int size = *(long *)(buffer+i2);
+		i2 += sizeof(long);
+
+		// バッファ
+		const std::string textString( (const char *)(buffer + i2), size );
+		i2 += size;
+
+		// テキストデータからシリアライズ
+		this->objectModule.ReadString( textString );
+
+		compiler.SelectObjectModule( &this->objectModule );
+	}
+
+	// オブジェクトモジュールリストに類似したソースコードリスト
+	{
+		// サイズ
+		int size = *(long *)(buffer+i2);
+		i2 += sizeof(long);
+
+		// バッファ
+		const std::string textString( (const char *)(buffer + i2), size );
+		i2 += size;
+
+		// テキストデータからシリアライズ
+		this->_sourcesLinkRelationalObjectModule.ReadBinaryString( textString );
+	}
+
+	//コードと行番号の関係
+	int maxLineInfoNum = *(long *)(buffer+i2);
+	i2+=sizeof(long);
+	for(i3=0;i3<maxLineInfoNum;i3++){
+		int nativeCodePos = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		DWORD sourceLineType = *(DWORD *)(buffer+i2);
+		i2+=sizeof(long);
+
+		int relationalObjectModuleIndex = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		int sourceCodePos = *(long *)(buffer+i2);
+		i2+=sizeof(long);
+
+		_oldSourceLines.push_back(
+			SourceLine(
+				nativeCodePos,
+				sourceLineType,
+				SourceCodePosition( relationalObjectModuleIndex, sourceCodePos )
+			)
+		);
+	}
+
+	//グローバル実行領域のサイズ
+	GlobalOpBufferSize=*(long *)(buffer+i2);
+	i2+=sizeof(long);
+
+
+	HeapDefaultFree(buffer);
+	buffer=0;
+
+
+	this->pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc");
+	if( this->pSub_DebugSys_EndProc == NULL )
+	{
+		MessageBox( 0, "_DebugSys_EndProcが見つからない", "ActiveBasic", MB_OK );
+	}
+
+
+	SingleStepCodeBuffer=MakeSingleStepCode();
+	
+	//ソースコード
+	extern char *basbuf;
+	basbuf = const_cast<char *>(compiler.GetObjectModule().GetSource().GetBuffer());
+
+
+	/////////////////////////////
+	// ブレークポイントを適用
+	/////////////////////////////
+
+	// オブジェクトモジュールリストに類似したソースコードリスト
+	extern BasicSources sourcesLinkRelationalObjectModule;
+	sourcesLinkRelationalObjectModule = this->_sourcesLinkRelationalObjectModule;
+
+	BreakStepCodeBuffer=pobj_DBBreakPoint->update(OpBuffer,SizeOf_CodeSection, this->_oldSourceLines);
+
+	//プロセスメモリにコピー
+	extern HANDLE hDebugProcess;
+	SIZE_T accessBytes;
+	WriteProcessMemory(hDebugProcess,(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),
+		BreakStepCodeBuffer,
+		SizeOf_CodeSection,&accessBytes);
+
+
+	return 1;
+}
+
+BOOL DebugSection::load(HMODULE hModule){
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+
+
+	extern HANDLE hDebugProcess;
+	SIZE_T accessBytes;
+	IMAGE_DOS_HEADER ImageDosHeader;
+	ReadProcessMemory(hDebugProcess,hModule,&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),&accessBytes);
+
+	int pe_size;
+#ifdef _AMD64_
+	IMAGE_NT_HEADERS64 pe_hdr;
+	pe_size=sizeof(IMAGE_NT_HEADERS64);
+#else
+	IMAGE_NT_HEADERS pe_hdr;
+	pe_size=sizeof(IMAGE_NT_HEADERS);
+#endif
+	ReadProcessMemory(hDebugProcess,(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew),&pe_hdr,pe_size,&accessBytes);
+
+	IMAGE_SECTION_HEADER *pSectionHdr;
+	pSectionHdr=(IMAGE_SECTION_HEADER *)HeapAlloc(hHeap,0,pe_hdr.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
+	ReadProcessMemory(hDebugProcess,
+		(void *)(((ULONG_PTR)hModule)+ImageDosHeader.e_lfanew+pe_size),
+		pSectionHdr,
+		pe_hdr.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER),
+		&accessBytes);
+
+	int i;
+	for(i=0;i<pe_hdr.FileHeader.NumberOfSections;i++){
+
+		//リライタブルセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".data")==0){
+			dwRVA_RWSection=pSectionHdr[i].VirtualAddress;
+		}
+
+		//コードセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".text")==0){
+			dwRVA_CodeSection=pSectionHdr[i].VirtualAddress;
+			SizeOf_CodeSection=pSectionHdr[i].SizeOfRawData;
+		}
+
+		//デバッグセクション内の情報
+		if(lstrcmp((char *)pSectionHdr[i].Name,".debug")==0){
+			length=pSectionHdr[i].Misc.VirtualSize;
+			buffer=(char *)HeapAlloc(hHeap,0,length+1);
+
+			ReadProcessMemory(hDebugProcess,
+				(void *)(((ULONG_PTR)hModule)+pSectionHdr[i].VirtualAddress),
+				buffer,
+				length,
+				&accessBytes);
+			buffer[length]=0;
+		}
+
+	}
+	HeapDefaultFree(pSectionHdr);
+
+	if(!buffer) return 0;
+
+
+	dwImageBase=(DWORD)(ULONG_PTR)hModule;
+
+
+
+	if(OpBuffer) free(OpBuffer);
+	OpBuffer=(char *)malloc(SizeOf_CodeSection);
+
+	ReadProcessMemory(hDebugProcess,
+		(void *)(ULONG_PTR)(dwImageBase+dwRVA_CodeSection),OpBuffer,
+		SizeOf_CodeSection,&accessBytes);
+
+
+	return __load();
+}
+
+void DebugSection::choice(){
+	//イメージベース
+	extern DWORD ImageBase;
+	ImageBase=this->dwImageBase;
+
+	//リライタブルセクションのRVA
+	extern int MemPos_RWSection;
+	MemPos_RWSection=this->dwRVA_RWSection;
+
+	//コードセクションのRVAとサイズ
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+	MemPos_CodeSection=this->dwRVA_CodeSection;
+	FileSize_CodeSection=this->SizeOf_CodeSection;
+
+	// オブジェクトモジュール
+	compiler.SelectObjectModule( &this->objectModule );
+
+	//グローバル実行領域のサイズ
+	extern int GlobalOpBufferSize;
+	GlobalOpBufferSize=this->GlobalOpBufferSize;
+
+	extern const UserProc *pSub_DebugSys_EndProc;
+	pSub_DebugSys_EndProc=this->pSub_DebugSys_EndProc;
+
+	//ネイティブコードバッファ
+	extern char *OpBuffer;
+	OpBuffer=this->OpBuffer;
+}
+
+void DebugSection::DeleteDebugInfo(){
+	//コードバッファを解放
+	free(OpBuffer);
+	OpBuffer=0;
+
+	HeapDefaultFree(SingleStepCodeBuffer);
+	SingleStepCodeBuffer=0;
+
+	HeapDefaultFree(BreakStepCodeBuffer);
+	BreakStepCodeBuffer=0;
+}
+
+
+
+DebugSectionCollection::DebugSectionCollection()
+{
+}
+DebugSectionCollection::~DebugSectionCollection()
+{
+	foreach( DebugSection *pDebugSection, debugSections )
+	{
+		delete pDebugSection;
+	}
+	debugSections.clear();
+}
+
+BOOL DebugSectionCollection::add(HMODULE hModule){
+	DebugSection *pobj_d;
+	pobj_d=new DebugSection();
+	if(!pobj_d->load(hModule)){
+		//デバッグ情報が存在しないとき
+		delete pobj_d;
+		return 0;
+	}
+
+	debugSections.push_back( pobj_d );
+
+	return 1;
+}
+
+void DebugSectionCollection::del(HMODULE hModule){
+	for( int i=0; i<static_cast<int>(this->debugSections.size()); i++ )
+	{
+		if( (HMODULE)(ULONG_PTR)this->debugSections[i]->dwImageBase == hModule )
+		{
+			delete debugSections[i];
+			Jenga::Common::EraseVectorItem<std::vector<DebugSection *>>( debugSections, i );
+			break;
+		}
+	}
+}
+
+void DebugSectionCollection::choice( int index )
+{
+	pCurrent = debugSections[index];
+	pCurrent->choice();
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugSection.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugSection.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/DebugSection.h	(revision 774)
@@ -0,0 +1,99 @@
+#pragma once
+
+class DebugSection{
+public:
+	char szNowFilePath[MAX_PATH];
+
+	char *buffer;
+	int length;
+
+
+	////////////////////////////////////
+	// デバッグ用の固有情報
+
+	//イメージベース
+	DWORD dwImageBase;
+
+	//リライタブルセクションのRVA
+	DWORD dwRVA_RWSection;
+
+	//コードセクションのRAVとサイズ
+	DWORD dwRVA_CodeSection;
+	int SizeOf_CodeSection;
+
+	// オブジェクトモジュール
+	ObjectModule objectModule;
+
+	// オブジェクトモジュールリストに類似したソースコードリスト
+	BasicSources _sourcesLinkRelationalObjectModule;
+
+	//コードと行番号の関係
+	SourceLines _oldSourceLines;
+
+	//グローバル実行領域のサイズ
+	int GlobalOpBufferSize;
+
+	const UserProc *pSub_DebugSys_EndProc;
+
+	//ネイティブコードバッファ
+	char *OpBuffer;
+
+	//シングルステップ用コードバッファ
+	char *SingleStepCodeBuffer;
+
+	//ブレークポイント用コードバッファ
+	char *BreakStepCodeBuffer;
+
+
+	////////////////////////////////////
+
+
+	DebugSection()
+		: buffer( NULL )
+		, length( 0 )
+		, dwImageBase( 0 )
+		, dwRVA_RWSection( 0 )
+		, dwRVA_CodeSection( 0 )
+		, SizeOf_CodeSection( 0 )
+		, GlobalOpBufferSize( 0 )
+		, pSub_DebugSys_EndProc( NULL )
+		, OpBuffer( NULL )
+		, SingleStepCodeBuffer( NULL )
+		, BreakStepCodeBuffer( NULL )
+	{
+		szNowFilePath[0]=0;
+	}
+	~DebugSection();
+
+	void make( const SourceLines &sourceLines );
+private:
+	void UpdateBreakPoint();
+	char *MakeSingleStepCode();
+	BOOL __load();
+public:
+	BOOL load(HMODULE hModule);
+
+	void choice();
+
+	void DeleteDebugInfo();
+};
+
+class DebugSectionCollection{
+	DebugSection *pCurrent;
+public:
+	std::vector<DebugSection *> debugSections;
+
+	DebugSectionCollection();
+	~DebugSectionCollection();
+
+	BOOL add(HMODULE hModule);
+	void del(HMODULE hModule);
+
+	void choice(int index);
+
+	DebugSection &GetCurrent()
+	{
+		MyAssert( pCurrent != NULL );
+		return *pCurrent;
+	}
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 774)
@@ -0,0 +1,132 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+
+void Diagnose(){
+	char temporary[8192];
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// グローバル / ローカル コード領域のサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		extern int GlobalOpBufferSize;
+		sprintf(temporary, "%d", GlobalOpBufferSize/1024 );
+		trace_for_size( (std::string)"グローバル領域のコードサイズ: " + temporary + "KB" );
+		//sprintf(temporary, "%d", (obp-GlobalOpBufferSize)/1024 );
+		//trace_for_size( (std::string)"ローカル領域のコードサイズ: " + temporary + "KB" );
+		//sprintf(temporary, "%d", obp/1024 );
+		//trace_for_size( (std::string)"コードサイズ総量: " + temporary + "KB" );
+	}
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// グローバル関数、クラスメソッドのサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		int codeSizeOfGlobalProc = 0;
+		int codeSizeOfClassMethod = 0;
+		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+		{
+			UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+			if( pUserProc->IsCompiled() ){
+				if( pUserProc->HasParentClass() ){
+					codeSizeOfClassMethod += pUserProc->GetCodeSize();
+				}
+				else{
+					codeSizeOfGlobalProc += pUserProc->GetCodeSize();
+				}
+			}
+		}
+
+		sprintf(temporary, "%d", codeSizeOfGlobalProc/1024 );
+		trace_for_size( (std::string)"グローバル関数のコードサイズ総量: " + temporary + "KB" );
+		sprintf(temporary, "%d", codeSizeOfClassMethod/1024 );
+		trace_for_size( (std::string)"クラスメソッドのコードサイズ総量: " + temporary + "KB" );
+	}
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// Enumに必要なのコードサイズを調べる
+		///////////////////////////////////////////////////////////////////
+		int codeSizeOfEnum = 0;
+
+		// イテレータをリセット
+		compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
+
+		while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
+			int codeSizeOfClass = 0;
+
+			CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
+
+			if( !objClass.IsEnum() ){
+				// 列挙型以外は無視
+				continue;
+			}
+
+			// 動的メソッド
+			foreach( const CMethod *pMethod, objClass.GetDynamicMethods() ){
+				if( pMethod->GetUserProc().IsCompiled() ){
+					codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
+				}
+			}
+
+			// 静的メソッド
+			foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
+					codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
+			}
+
+			codeSizeOfEnum += codeSizeOfClass;
+		}
+
+		sprintf(temporary, "%d", codeSizeOfEnum/1024 );
+		trace_for_size( (std::string)"Enumのコードサイズ総量: " + temporary + "KB" );
+	}
+
+	trace_for_size( "\n\n" );
+
+	{
+		///////////////////////////////////////////////////////////////////
+		// クラスのサイズを調べる
+		///////////////////////////////////////////////////////////////////
+
+		// イテレータをリセット
+		compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
+
+		while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
+			int codeSizeOfClass = 0;
+
+			CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
+
+			// 動的メソッド
+			foreach( const CMethod *pMethod, objClass.GetDynamicMethods() ){
+				if( pMethod->GetUserProc().IsCompiled() ){
+					codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
+				}
+			}
+
+			// 静的メソッド
+			foreach( const CMethod *pMethod, objClass.GetStaticMethods() ){
+					codeSizeOfClass += pMethod->GetUserProc().GetCodeSize();
+			}
+
+			if( codeSizeOfClass ){
+				temporary[0]=0;
+				lstrcat( temporary, "------------------------------------------------------------------\n" );
+				sprintf( temporary + lstrlen(temporary), "【 %s クラスのコード情報】\n", objClass.GetName().c_str() );
+				sprintf( temporary + lstrlen(temporary), "class code size: %d bytes\n", codeSizeOfClass );
+				lstrcat( temporary, "------------------------------------------------------------------\n" );
+				lstrcat( temporary, "\n" );
+				trace_for_size( temporary );
+			}
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step1.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step1.cpp	(revision 774)
@@ -0,0 +1,1270 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+void ChangeReturnCode(char *buffer)
+{
+	bool isMustChange = false;
+	for( int i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]=='\n' )
+		{
+			if( i>0 )
+			{
+				if( buffer[i-1] == '\r' )
+				{
+					isMustChange = true;
+				}
+			}
+		}
+	}
+
+	if( !isMustChange )
+	{
+		// 改行コードの変換は必要ない
+		return;
+	}
+
+#ifdef _DEBUG
+	//改行コードの整合性チェック
+	for( int i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]!='\r' && buffer[i+1]=='\n'
+			||  buffer[i]=='\r' && buffer[i+1]!='\n' ){
+				char temporary[255];
+				strncpy( temporary, buffer + i-100, 130 );
+				temporary[130] = 0;
+				for(int i2=0; ;i2++){
+					if(temporary[i2]=='\r') temporary[i2]='A';
+					if(temporary[i2]=='\n') temporary[i2]='B';
+					if(temporary[i2]=='\0') break;
+				}
+				MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
+		}
+	}
+#endif
+
+	ChangeReturnCodeImpl(buffer);
+}
+void DeleteComment(char *buffer){	//注釈「'」の取り除き
+	int i,i2,i3,IsStr;
+	char *temporary=(char *)calloc(lstrlen(buffer)+1,sizeof (char));
+	for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			if(i2 > 0){
+				i2--;
+				while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+				i2++;
+			}
+
+			if(i3){
+				//複数行に渡る注釈文の中に改行が存在するとき
+				memset(temporary+i2,'\n',i3);
+				i2+=i3;
+				i3=0;
+			}
+		}
+		if(buffer[i]=='\''&&IsStr==0){
+			//注釈文
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+			while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
+		}
+		if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
+			//注釈文（複数行）
+			i+=2;
+			i3=0;
+			while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+				if(buffer[i]=='\n') i3++;
+				if(buffer[i]=='\0') break;
+				i++;
+			}
+			if(buffer[i]){
+				i+=2;
+			}
+			i--;
+			i2--;
+			continue;
+		}
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	free(temporary);
+}
+void CheckParenthesis(char *buffer){
+	int i,IsStr,PareNum,sw;
+	_int8 bracket[1024];
+
+	for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
+		if(buffer[i]=='\"'){
+			IsStr^=1;
+			continue;
+		}
+
+		else if(buffer[i]=='('&&IsStr==0){
+			bracket[PareNum]=0;
+			PareNum++;
+		}
+		else if(buffer[i]=='['&&IsStr==0){
+			bracket[PareNum]=1;
+			PareNum++;
+		}
+
+		else if(buffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=0||PareNum<0){
+				//"カッコ \'( )\'"
+				compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i);
+				return;
+			}
+		}
+		else if(buffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=1||PareNum<0){
+				//"カッコ \'( )\'"
+				compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i);
+				return;
+			}
+		}
+
+		else if(buffer[i]=='\n'||buffer[i]=='\0'){
+
+			//"カッコ \'( )\'"
+			if(PareNum!=0) compiler.errorMessenger.Output(4,STRING_PARENTHESIS,i);
+
+			if(IsStr!=0) compiler.errorMessenger.Output(5,NULL,i);
+			if(buffer[i]=='\0') break;
+			PareNum=0;
+			IsStr=0;
+
+			sw=0;
+		}
+
+		else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
+			//不正な文字コード
+			if(sw==0){
+				//全角スペース
+				if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40)
+					compiler.errorMessenger.Output(20,NULL,i);
+
+				//その他の全角文字
+				else compiler.errorMessenger.Output(8,NULL,i);
+				sw=1;
+			}
+		}
+	}
+}
+BOOL CheckParenthesis2(char *buffer){
+	int i,IsStr,PareNum,sw;
+	_int8 bracket[1024];
+
+	for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
+		if(buffer[i]=='\"'){
+			IsStr^=1;
+			continue;
+		}
+
+		else if(buffer[i]=='('&&IsStr==0){
+			bracket[PareNum]=0;
+			PareNum++;
+		}
+		else if(buffer[i]=='['&&IsStr==0){
+			bracket[PareNum]=1;
+			PareNum++;
+		}
+
+		else if(buffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=0||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+		else if(buffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=1||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+
+		else if(buffer[i]=='\n'||buffer[i]=='\0'){
+
+			//"カッコ \'( )\'"
+			if(PareNum!=0){
+				return 0;
+			}
+
+			if(IsStr!=0){
+				return 0;
+			}
+			if(buffer[i]=='\0') break;
+			PareNum=0;
+			IsStr=0;
+
+			sw=0;
+		}
+
+		else if((IsDBCSLeadByte(buffer[i])||buffer[i]==1)&&IsStr==0){
+			//不正な文字コード
+			if(sw==0){
+				//全角スペース
+				if(buffer[i]==(char)0x81&&buffer[i+1]==(char)0x40){
+					return 0;
+				}
+
+				//その他の全角文字
+				else return 0;
+				sw=1;
+			}
+		}
+	}
+	return 1;
+}
+
+inline int FindLineEnd(char const *basbuf, int i2){
+	for(;;i2++){
+		if(basbuf[i2]=='\n'||basbuf[i2]=='\0') break;
+	}
+	return i2;
+}
+
+void DirectiveCheck(void){
+	extern char *basbuf;
+	extern char BasicCurDir[MAX_PATH];
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(basbuf[i]=='\0') break;
+		if(((basbuf[i-2]==0&&basbuf[i-1]==-1)||basbuf[i-1]=='\n')&&
+			basbuf[i]=='#'){
+			for(i2=i+1,i3=0;;i2++,i3++){
+				if(!IsVariableChar(basbuf[i2])){
+					temporary[i3]=0;
+					break;
+				}
+				temporary[i3]=basbuf[i2];
+			}
+			if( lstrcmp( temporary, "static_link" ) == 0 )
+			{
+				// 静的リンクライブラリ
+				while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
+				if(basbuf[i2]!='\"'){
+					compiler.errorMessenger.Output(1,NULL,i2);
+					return;
+				}
+				for(i3=0,i2++;;i2++,i3++){
+					if(basbuf[i2]=='\"'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=basbuf[i2];
+				}
+				GetFullPath(temporary,BasicCurDir);
+
+				compiler.staticLibraryFilePaths.push_back( temporary );
+
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if( lstrcmpi( temporary, "_core" ) == 0 )
+			{
+				// #_core
+				// コアモジュール
+				compiler.SetCoreMark( true );
+
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"noprompt")==0){
+				//#noprompt
+				//旧機能なので、無視
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"strict")==0){
+				//#strict
+				//旧機能なので、無視
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"struct")==0){
+				//#struct code
+				//旧機能なので、無視
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+			else if(lstrcmpi(temporary,"resource")==0){
+				//#resource
+				while(basbuf[i2]==' '||basbuf[i2]=='\t') i2++;
+				if(basbuf[i2]!='\"'){
+					compiler.errorMessenger.Output(1,NULL,i2);
+					return;
+				}
+				for(i3=0,i2++;;i2++,i3++){
+					if(basbuf[i2]=='\"'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=basbuf[i2];
+				}
+				GetFullPath(temporary,BasicCurDir);
+
+				extern char ResourceFileName[MAX_PATH];
+				lstrcpy(ResourceFileName,temporary);
+
+				i2 = FindLineEnd(basbuf, i2);
+				SlideString(basbuf+i2,i-i2);
+			}
+		}
+	}
+}
+void NextCommandFormat(char *buffer){
+	int i,i2,i3;
+	char temporary[255];
+
+	//Next命令語のフォーマット
+	for(i=0;;i++){
+		if(buffer[i]=='\n'||buffer[i]==':'||i==0){
+			if(buffer[i]=='\n'||buffer[i]==':') i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			while(buffer[i]>='0'&&buffer[i]<='9') i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if((buffer[i]=='n'||buffer[i]=='N')&&(buffer[i+1]=='e'||buffer[i+1]=='E')&&(buffer[i+2]=='x'||buffer[i+2]=='X')&&(buffer[i+3]=='t'||buffer[i+3]=='T')&&
+				(buffer[i+4]==' '||buffer[i+4]=='\t')){
+				i2=i+5;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+				if(buffer[i2]!='\n'){
+					lstrcpy(temporary,"NEXT");
+					for(i3=0;;i2++){
+						if(buffer[i2]=='\n'||buffer[i2]==':'||buffer[i2]=='\0') break;
+						if(buffer[i2]==','){
+							lstrcat(temporary,":NEXT");
+							i3=1;
+						}
+					}
+					if(i3){
+						i3=lstrlen(temporary);
+						SlideString(buffer+i2,i-i2+i3);
+						memcpy(buffer+i,temporary,i3);
+					}
+				}
+			}
+		}
+		if(buffer[i]=='\0') break;
+	}
+}
+void SetEscapeSequenceFormat(char *buffer){
+	/*「MOD」「AND」「OR」
+		その他制御文字をエスケープシーケンスを使用した記号へ変換 */
+	int i,i2,i3,i4,i5,i6,sw1,IsStr;
+	char *temporary,temp2[VN_SIZE];
+
+	bool isBeforeCharDelimitation = true;
+	temporary=(char *)calloc((lstrlen(buffer)+255)*2,sizeof (char));
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='-'&&buffer[i+1]=='>'&&IsStr==0){
+			buffer[i]=1;
+			buffer[i+1]=ESC_PSMEM;
+		}
+
+		if( buffer[i] && IsCommandDelimitation( buffer[i] ) ){
+			isBeforeCharDelimitation = true;
+
+			temporary[i2]=buffer[i];
+			continue;
+		}
+
+		if(IsVariableChar(buffer[i])&&IsStr==0){
+
+			i3=i2;
+			for(;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+
+			bool isAfterCharBlank = false;
+			if( IsBlank( buffer[i] ) ){
+				isAfterCharBlank = true;
+			}
+
+			if(lstrcmpi(temporary+i3,"End")==0) i6=1;
+			else if(lstrcmpi(temporary+i3,"Exit")==0) i6=2;
+			else if(lstrcmpi(temporary+i3,"Select")==0) i6=3;
+			else if(lstrcmpi(temporary+i3,"Case")==0) i6=4;
+			else if(lstrcmpi(temporary+i3,"Else")==0) i6=5;
+			else i6=0;
+			if(i6){
+				i4=i;
+				while(buffer[i4]==' '||buffer[i4]=='\t') i4++;
+				for(i5=0;;i4++,i5++){
+					if(!IsVariableChar(buffer[i4])){
+						temp2[i5]=0;
+						break;
+					}
+					temp2[i5]=buffer[i4];
+				}
+				sw1=0;
+				if(i6==3){
+					//Select～
+					if(lstrcmpi(temp2,"Case")==0) sw1=1;
+				}
+				else if(i6==4){
+					//Case～
+					if(lstrcmpi(temp2,"Else")==0) sw1=1;
+				}
+				else if(i6==5){
+					//Else If
+					if(lstrcmpi(temp2,"If")==0) sw1=1;
+				}
+				else if(i6==1){
+					//End～
+					switch(temp2[0]){
+						case 'c':
+						case 'C':
+							if(lstrcmpi(temp2,"Class")==0) sw1=1;
+							break;
+						case 'e':
+						case 'E':
+							if(lstrcmpi(temp2,"Enum")==0) sw1=1;
+							break;
+						case 'i':
+						case 'I':
+							if(lstrcmpi(temp2,"If")==0) sw1=1;
+							else if(lstrcmpi(temp2,"Interface")==0) sw1=1;
+							break;
+						case 'f':
+						case 'F':
+							if(lstrcmpi(temp2,"Function")==0) sw1=1;
+							break;
+						case 'm':
+						case 'M':
+							if(lstrcmpi(temp2,"Macro")==0) sw1=1;
+							break;
+						case 'n':
+						case 'N':
+							if(lstrcmpi(temp2,"Namespace")==0) sw1=1;
+							break;
+						case 's':
+						case 'S':
+							if(lstrcmpi(temp2,"Sub")==0) sw1=1;
+							else if(lstrcmpi(temp2,"Select")==0) sw1=1;
+							break;
+						case 't':
+						case 'T':
+							if(lstrcmpi(temp2,"Try")==0) sw1=1;
+							else if(lstrcmpi(temp2,"Type")==0) sw1=1;
+							break;
+						case 'w':
+						case 'W':
+							if(lstrcmpi(temp2,"With")==0) sw1=1;
+							break;
+					}
+				}
+				else if(i6==2){
+					//Exit～
+					if(
+						lstrcmpi(temp2,"For")==0||
+						lstrcmpi(temp2,"While")==0||
+						lstrcmpi(temp2,"Do")==0||
+						lstrcmpi(temp2,"Function")==0||
+						lstrcmpi(temp2,"Sub")==0||
+						lstrcmpi(temp2,"Macro")==0
+						) sw1=1;
+				}
+
+				if(sw1){
+					i=i4;
+					memcpy(temporary+i2,temp2,i5);
+					i2+=i5;
+					temporary[i2]=0;
+				}
+			}
+			i--;
+			i2--;
+
+			switch(temporary[i3]){
+				case '_':
+					if(lstrcmpi(temporary+i3,"_ClearNamespaceImported")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CLEARNAMESPACEIMPORTED;
+					}
+					if(lstrcmpi(temporary+i3,"_System_Static_New")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SYSTEM_STATIC_NEW;
+					}
+					break;
+				case 'a':
+				case 'A':
+					if(lstrcmpi(temporary+i3,"And")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_AND;
+					}
+					else if(lstrcmpi(temporary+i3,"Abstract")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ABSTRACT;
+					}
+					else if(lstrcmpi(temporary+i3,"As")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_AS;
+					}
+					break;
+				case 'b':
+				case 'B':
+					if(lstrcmpi(temporary+i3,"ByVal")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_BYVAL;
+					}
+					else if(lstrcmpi(temporary+i3,"ByRef")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_BYREF;
+					}
+					break;
+				case 'c':
+				case 'C':
+					if(lstrcmpi(temporary+i3,"Catch")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CATCH;
+					}
+					else if(lstrcmpi(temporary+i3,"Continue")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CONTINUE;
+					}
+					else if(lstrcmpi(temporary+i3,"cdecl")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CDECL;
+					}
+					else if(lstrcmpi(temporary+i3,"Case")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CASE;
+					}
+					else if(lstrcmpi(temporary+i3,"CaseElse")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CASEELSE;
+					}
+					else if(lstrcmpi(temporary+i3,"Const")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CONST;
+					}
+					else if(lstrcmpi(temporary+i3,"Class")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_CLASS;
+					}
+					break;
+				case 'd':
+				case 'D':
+					if(lstrcmpi(temporary+i3,"Declare")==0){
+						i2=i3;
+						int i9=i2;
+						temporary[i2]=1;
+						temporary[++i2]=ESC_DECLARE;
+						i++;
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						// Sub/Function
+						for(i4=0;;i++,i4++){
+							if(!IsVariableChar(buffer[i])){
+								temp2[i4]=0;
+								break;
+							}
+							temp2[i4]=buffer[i];
+						}
+						if(lstrcmpi(temp2,"Sub")==0) temporary[++i2]=ESC_SUB;
+						else if(lstrcmpi(temp2,"Function")==0) temporary[++i2]=ESC_FUNCTION;
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						// 関数名
+						for(i2++;;i++,i2++){
+							if(!IsVariableChar(buffer[i])){
+								i2--;
+								break;
+							}
+							temporary[i2]=buffer[i];
+						}
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						for(i4=0;;i++,i4++){
+							if(!IsVariableChar(buffer[i])){
+								temp2[i4]=0;
+								break;
+							}
+							temp2[i4]=buffer[i];
+						}
+						if(lstrcmpi(temp2,"cdecl")==0){
+							temporary[++i2]=1;
+							temporary[++i2]=ESC_CDECL;
+
+							while(buffer[i]==' '||buffer[i]=='\t') i++;
+							for(i4=0;;i++,i4++){
+								if(!IsVariableChar(buffer[i])){
+									temp2[i4]=0;
+									break;
+								}
+								temp2[i4]=buffer[i];
+							}
+						}
+						if(lstrcmpi(temp2,"Lib")==0) temporary[++i2]=',';
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						if(buffer[i]=='\"'){
+							temporary[++i2]=buffer[i];
+							for(i++,i2++;;i++,i2++){
+								temporary[i2]=buffer[i];
+								if(buffer[i]=='\"'){
+									i++;
+									break;
+								}
+								if(buffer[i]=='\0') break;
+							}
+						}
+						else{
+							for(i2++;;i++,i2++){
+								if(!IsVariableChar(buffer[i])){
+									i2--;
+									break;
+								}
+								temporary[i2]=buffer[i];
+							}
+						}
+						while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+						temporary[++i2]=',';
+
+						if( memicmp( buffer + i, "Alias", 5 ) ==0 ){
+							i+=5;
+							for(i++,i2++;;i++,i2++){
+								temporary[i2]=buffer[i];
+								if(buffer[i]=='('){
+									i2--;
+									break;
+								}
+								if(buffer[i]=='\0') break;
+							}
+						}
+
+						temporary[++i2]=',';
+
+						i--;
+					}
+					else if(lstrcmpi(temporary+i3,"Def")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_DEF;
+					}
+					else if( lstrcmpi(temporary+i3,"Delegate")==0 )
+					{
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_DELEGATE;
+					}
+					break;
+				case 'e':
+				case 'E':
+					if(lstrcmpi(temporary+i3,"ElseIf")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ELSEIF;
+					}
+					else if(lstrcmpi(temporary+i3,"Else")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ELSE;
+					}
+					else if(lstrcmpi(temporary+i3,"Export")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_EXPORT;
+					}
+					else if(lstrcmpi(temporary+i3,"Enum")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_ENUM;
+					}
+
+					else if(temporary[i3+1]=='n'||temporary[i3+1]=='N'){
+						//終了記述
+						if(lstrcmpi(temporary+i3,"EndIf")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDIF;
+						}
+						else if(lstrcmpi(temporary+i3,"EndFunction")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDFUNCTION;
+						}
+						else if(lstrcmpi(temporary+i3,"EndSub")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDSUB;
+						}
+						else if(lstrcmpi(temporary+i3,"EndMacro")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDMACRO;
+						}
+						else if(lstrcmpi(temporary+i3,"EndNamespace")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDNAMESPACE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndClass")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDCLASS;
+						}
+						else if(lstrcmpi(temporary+i3,"EndInterface")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDINTERFACE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndTry")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDTRY;
+						}
+						else if(lstrcmpi(temporary+i3,"EndType")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDTYPE;
+						}
+						else if(lstrcmpi(temporary+i3,"EndEnum")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDENUM;
+						}
+						else if(lstrcmpi(temporary+i3,"EndSelect")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDSELECT;
+						}
+						else if(lstrcmpi(temporary+i3,"EndWith")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_ENDWITH;
+						}
+					}
+					else if(temporary[i3+1]=='x'||temporary[i3+1]=='X'){
+						if(lstrcmpi(temporary+i3,"ExitFor")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITFOR;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitWhile")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITWHILE;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitDo")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITDO;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitFunction")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITFUNCTION;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitSub")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITSUB;
+						}
+						else if(lstrcmpi(temporary+i3,"ExitMacro")==0){
+							i2=i3;
+							temporary[i2++]=1;
+							temporary[i2]=ESC_EXITMACRO;
+						}
+					}
+					break;
+				case 'f':
+				case 'F':
+					if(lstrcmpi(temporary+i3,"Finally")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_FINALLY;
+					}
+					else if(lstrcmpi(temporary+i3,"Function")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_FUNCTION;
+					}
+					break;
+				case 'i':
+				case 'I':
+					if(lstrcmpi(temporary+i3,"If")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_IF;
+					}
+					else if(lstrcmpi(temporary+i3,"Imports")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_IMPORTS;
+					}
+					else if(lstrcmpi(temporary+i3,"Inherits")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_INHERITS;
+					}
+					else if( lstrcmpi( temporary + i3, "Implements" ) == 0 )
+					{
+						i2 = i3;
+						temporary[i2++] = 1;
+						temporary[i2] = ESC_IMPLEMENTS;
+					}
+					else if(lstrcmpi(temporary+i3,"Interface")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_INTERFACE;
+					}
+					break;
+				case 'm':
+				case 'M':
+					if(lstrcmpi(temporary+i3,"Mod")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_MOD;
+					}
+					else if(lstrcmpi(temporary+i3,"Macro")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_MACRO;
+					}
+					break;
+				case 'n':
+				case 'N':
+					if(isBeforeCharDelimitation
+						&& lstrcmpi(temporary+i3,"Namespace")==0
+						&& isAfterCharBlank ){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NAMESPACE;
+					}
+					else if(lstrcmpi(temporary+i3,"New")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NEW;
+					}
+					else if(lstrcmpi(temporary+i3,"Not")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_NOT;
+					}
+					break;
+				case 'o':
+				case 'O':
+					if(lstrcmpi(temporary+i3,"Or")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OR;
+					}
+					else if(lstrcmpi(temporary+i3,"Override")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OVERRIDE;
+					}
+					else if(lstrcmpi(temporary+i3,"Operator")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_OPERATOR;
+					}
+					break;
+				case 's':
+				case 'S':
+					if(lstrcmpi(temporary+i3,"Sub")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SUB;
+					}
+					else if(lstrcmpi(temporary+i3,"SelectCase")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_SELECTCASE;
+					}
+					else if(lstrcmpi(temporary+i3,"Static")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_STATIC;
+					}
+					break;
+				case 't':
+				case 'T':
+					if(lstrcmpi(temporary+i3,"Then")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_THEN;
+					}
+					else if(lstrcmpi(temporary+i3,"Throw")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_THROW;
+					}
+					else if(lstrcmpi(temporary+i3,"Try")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TRY;
+					}
+					else if(lstrcmpi(temporary+i3,"Type")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TYPE;
+					}
+					else if(lstrcmpi(temporary+i3,"TypeDef")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_TYPEDEF;
+					}
+					break;
+				case 'u':
+				case 'U':
+					if(lstrcmpi(temporary+i3,"Using")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_USING;
+					}
+					break;
+				case 'v':
+				case 'V':
+					if(lstrcmpi(temporary+i3,"Virtual")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_VIRTUAL;
+					}
+					break;
+				case 'w':
+				case 'W':
+					if(lstrcmpi(temporary+i3,"With")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_WITH;
+					}
+					break;
+				case 'x':
+				case 'X':
+					if(lstrcmpi(temporary+i3,"Xor")==0){
+						i2=i3;
+						temporary[i2++]=1;
+						temporary[i2]=ESC_XOR;
+					}
+					break;
+			}
+					
+			continue;
+		}
+
+		if( !IsBlank( buffer[i] ) ){
+			isBeforeCharDelimitation = false;
+		}
+
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	free(temporary);
+}
+void DefCommandFormat(char *buffer){
+	int i,i2,PareNum;
+	char temporary[255];
+
+	//Def命令語からFunction命令語へ
+	for(i=0;;i++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_DEF){
+			buffer[i+1]=ESC_FUNCTION;
+			i+=2;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if(buffer[i]!='('){
+				compiler.errorMessenger.Output(1,NULL,i);
+				return;
+			}
+			i++;
+			while(1){
+				while(buffer[i]==' '||buffer[i]=='\t') i++;
+				if(buffer[i]==')') break;
+				SlideString(buffer+i,2);
+				buffer[i]=1;
+				buffer[i+1]=ESC_BYVAL;
+				i+=2;
+				PareNum=0;
+				for(;;i++){
+					if(buffer[i]=='(') PareNum++;
+					if(buffer[i]==')'){
+						PareNum--;
+						if(PareNum<0) break;
+					}
+					if(buffer[i]==','&&PareNum==0) break;
+				}
+				if(buffer[i]==')') break;
+				i++;
+			}
+			i++;
+			while(buffer[i]==' '||buffer[i]=='\t') i++;
+			if(buffer[i]!='='){
+				compiler.errorMessenger.Output(1,NULL,i);
+				break;
+			}
+			i2=lstrlen(temporary);
+			SlideString(buffer+i,i2+1);
+			buffer[i]=':';
+			i++;
+			memcpy(buffer+i,temporary,i2);
+			i+=i2;
+			while(!IsCommandDelimitation(buffer[i])) i++;
+			SlideString(buffer+i,3);
+			buffer[i]=':';
+			buffer[i+1]=1;
+			buffer[i+2]=ESC_ENDFUNCTION;
+		}
+		if(buffer[i]=='\0') break;
+	}
+}
+
+void ChangeOneIf(char *write,int &wp,char *read,int &rp){
+	int IsStr,sw;
+
+	//ブロック形式でないときはThenの後に区切り文字を入れる
+	for(IsStr=0,sw=0;;wp++,rp++){
+		if(read[rp]=='\"') IsStr^=1;
+
+		write[wp]=read[rp];
+
+		if(IsCommandDelimitation(read[rp])&&IsStr==0) return;
+		if(read[rp]==1&&read[rp+1]==ESC_THEN&&
+			(read[rp+2]==' '||read[rp+2]=='\t')){
+				write[wp+1]=read[rp+1];
+				write[wp+2]=':';
+				rp+=3;
+				wp+=3;
+				while(read[rp]==' '||read[rp]=='\t') rp++;
+				if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
+					memcpy(write+wp,"Goto ",5);
+					wp+=5;
+				}
+				break;
+		}
+	}
+
+	//Elseの後に区切り文字を入れる
+	for(IsStr=0;;wp++,rp++){
+		if(read[rp]=='\"') IsStr^=1;
+
+		write[wp]=read[rp];
+
+		if(read[rp]=='\n'||read[rp]=='\0') break;
+		if(read[rp]==1&&read[rp+1]==ESC_IF){
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+			ChangeOneIf(write,wp,read,rp);
+			wp--;
+			rp--;
+			continue;
+		}
+		if(read[rp]==1&&read[rp+1]==ESC_ELSE){
+			write[wp++]=':';
+
+			write[wp]=read[rp];
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+
+			write[wp++]=':';
+
+			while(read[rp]==' '||read[rp]=='\t') rp++;
+			if((read[rp]>='0'&&read[rp]<='9')||read[rp]=='*'){
+				memcpy(write+wp,"Goto ",5);
+				wp+=5;
+			}
+			break;
+		}
+	}
+
+	//"End If" を付加
+	for(;;rp++,wp++){
+		if(read[rp]=='\n'||read[rp]=='\0') break;
+
+		if(read[rp]==1&&read[rp+1]==ESC_IF){
+			write[wp+1]=read[rp+1];
+			wp+=2;
+			rp+=2;
+			ChangeOneIf(write,wp,read,rp);
+			wp--;
+			rp--;
+			continue;
+		}
+		if(read[rp]==1&&read[rp+1]==ESC_ELSE) break;
+
+		write[wp]=read[rp];
+	}
+	write[wp]=':';
+	write[wp+1]=1;
+	write[wp+2]=ESC_ENDIF;
+	wp+=3;
+}
+void OutsideIfFormat(char *write,int &wp,char *read,int &rp){
+	int ElseCount=1;
+
+	for(;;rp++,wp++){
+		if(read[rp]==1){
+			if(read[rp+1]==ESC_IF){
+				write[wp++]=read[rp++];
+				write[wp++]=read[rp++];
+				OutsideIfFormat(write,wp,read,rp);
+				wp--,rp--;
+				continue;
+			}
+			if(read[rp+1]==ESC_ENDIF){
+				for(;ElseCount>0;wp+=3,ElseCount--){
+					write[wp]=1;
+					write[wp+1]=ESC_ENDIF;
+					write[wp+2]=':';
+				}
+				rp+=2;
+				break;
+			}
+			if(read[rp+1]==ESC_ELSEIF){
+				write[wp]=1;
+				write[wp+1]=ESC_ELSE;
+				write[wp+2]=':';
+
+				write[wp+3]=1;
+				write[wp+4]=ESC_IF;
+
+				wp+=4;
+				rp++;
+
+				ElseCount++;
+				continue;
+			}
+		}
+
+		write[wp]=read[rp];
+		if(read[rp]=='\0') break;
+	}
+}
+void IfCommandFormat(char *buffer){
+	int i,i2;
+
+	char *temporary = (char*)malloc(strlen(buffer)*2+1024);
+
+	//１行Ifをブロック形式にする
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_IF){
+			temporary[i2++]=buffer[i++];
+			temporary[i2++]=buffer[i++];
+			ChangeOneIf(temporary,i2,buffer,i);
+			i2--,i--;
+			continue;
+		}
+
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+
+	//ElseIfを入れ子構造に変更する
+	for(i=0,i2=0;;i++,i2++){
+		if(temporary[i]==1&&temporary[i+1]==ESC_IF){
+			buffer[i2++]=temporary[i++];
+			buffer[i2++]=temporary[i++];
+			OutsideIfFormat(buffer,i2,temporary,i);
+			i2--,i--;
+			continue;
+		}
+
+		buffer[i2]=temporary[i];
+		if(temporary[i]=='\0') break;
+	}
+
+	free(temporary);
+}
+void CheckPareCommand(void){
+	extern char *basbuf;
+	int i2,i3;
+
+	int FuncNum=0;
+	int FuncType=0;
+	int FuncPtr=-1;
+	for(i2=0;;i2++){
+		if(basbuf[i2]=='\0') break;
+		if(IsCommandDelimitation(basbuf[i2])){
+			if(basbuf[i2+1]==1){
+				i2++;
+				switch(basbuf[i2+1]){
+					case ESC_FUNCTION:
+					case ESC_SUB:
+					case ESC_MACRO:
+						if(FuncNum!=0){
+							if(FuncType==ESC_FUNCTION)
+								compiler.errorMessenger.Output(54,"End Function",FuncPtr);
+							else if(FuncType==ESC_SUB)
+								compiler.errorMessenger.Output(54,"End Sub",FuncPtr);
+							else if(FuncType==ESC_MACRO)
+								compiler.errorMessenger.Output(54,"End Macro",FuncPtr);
+							return;
+						}
+						FuncType=basbuf[i2+1];
+						FuncNum++;
+						FuncPtr=i2;
+						break;
+					case ESC_ENDFUNCTION:
+					case ESC_ENDSUB:
+					case ESC_ENDMACRO:
+						if(basbuf[i2+1]==ESC_ENDFUNCTION)	i3=ESC_FUNCTION;
+						else if(basbuf[i2+1]==ESC_ENDSUB)	i3=ESC_SUB;
+						else if(basbuf[i2+1]==ESC_ENDMACRO)	i3=ESC_MACRO;
+
+						FuncNum--;
+
+						if(FuncNum!=0||i3!=FuncType){
+							if(basbuf[i2+1]==ESC_ENDFUNCTION)
+								compiler.errorMessenger.Output(12,"End Function",i2);
+							else if(basbuf[i2+1]==ESC_ENDSUB)
+								compiler.errorMessenger.Output(12,"End Sub",i2);
+							else if(basbuf[i2+1]==ESC_ENDMACRO)
+								compiler.errorMessenger.Output(12,"End Macro",i2);
+							return;
+						}
+						break;
+				}
+			}
+
+
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step2.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step2.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Intermediate_Step2.cpp	(revision 774)
@@ -0,0 +1,470 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+
+char ConstructorDestructorSchedule[MAX_PATH];
+void MakeConstructorAndDestructor(char *buffer,int nowLine,char *ClassName){
+	int i,i2;
+	char temporary[MAX_PATH],*pTemp;
+	BOOL bConstructor,bDestructor;
+
+	ConstructorDestructorSchedule[0]=0;
+	bConstructor=0;
+	bDestructor=0;
+
+	for(i=nowLine;;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]==1&&buffer[i+1]==ESC_ENDCLASS){
+			if((!bConstructor)||(!bDestructor)){
+				pTemp=ConstructorDestructorSchedule;
+
+				lstrcpy(pTemp,"Public:");
+
+				if(!bConstructor){
+					//コンストラクタが無いときは生成する
+					sprintf(pTemp+lstrlen(pTemp),"%c%c%s():%c%c:",
+						1,ESC_SUB,
+						ClassName,
+						1,ESC_ENDSUB);
+				}
+
+				if(!bDestructor){
+					//デストラクタが無いときは生成する
+					sprintf(pTemp+lstrlen(pTemp),"%c%c~%s():%c%c:",
+						1,ESC_SUB,
+						ClassName,
+						1,ESC_ENDSUB);
+				}
+			}
+			break;
+		}
+
+		if(buffer[i]==1&&(buffer[i+1]==ESC_SUB||buffer[i+1]==ESC_FUNCTION)){
+			i+=2;
+			while(IsBlank(buffer[i])) i++;
+			if(buffer[i]=='~'){
+				//デストラクタ
+				bDestructor=1;
+			}
+			else{
+				//コンストラクタかどうかをチェック
+				for(i2=0;;i++,i2++){
+					if(!IsVariableChar(buffer[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				if(lstrcmp(temporary,ClassName)==0) bConstructor=1;
+			}
+		}
+	}
+}
+void ChangeCommand(char *buffer,int nowLine,char *Command){
+	int i,i2,IsStr;
+	unsigned _int16 ComNum;
+	char com[8192],pam[8192];
+
+	static int nCountOfNonGlobalScope = 0;
+
+	if(Command[0]==1){
+		switch(Command[1]){
+			case ESC_SELECTCASE:
+			case ESC_CASE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_WITH:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_TYPEDEF:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_DECLARE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_IF:
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_CLASS:
+				KillStringSpaces(Command+2);
+				i2 = 2;
+				if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM )
+				{
+					i2 += 2;
+				}
+				else if( Command[i2] == 1 && Command[i2+1] == ESC_DELEGATE )
+				{
+					i2 += 2;
+				}
+				else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 )
+				{
+					i2 += 10;
+					i2 = JumpStringInPare(Command,i2)+1;
+				}
+
+				// クラス名を取得
+				char className[VN_SIZE];
+				GetIdentifierToken( className, Command, i2 );
+
+				//コンストラクタ、デストラクタを暗黙的に生成
+				MakeConstructorAndDestructor(buffer,nowLine,className);
+				break;
+			case ESC_INTERFACE:
+				KillStringSpaces(Command+2);
+				break;
+			case ESC_ENDCLASS:
+				if(ConstructorDestructorSchedule[0]){
+					//生成されたコンストラクタ、デストラクタを挿入
+					sprintf(Command,"%s%c%c",ConstructorDestructorSchedule,1,ESC_ENDCLASS);
+				}
+				break;
+
+			case ESC_TYPE:
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_CONST:
+				KillStringSpaces(Command+2);
+				if( Command[2] == 1 && Command[3] == ESC_ENUM ){
+					nCountOfNonGlobalScope++;
+				}
+				break;
+
+			case ESC_ENUM:
+				nCountOfNonGlobalScope++;
+				KillStringSpaces(Command+2);
+				break;
+
+			case ESC_ENDENUM:
+				nCountOfNonGlobalScope--;
+				break;
+
+			case ESC_INHERITS:
+			case ESC_IMPLEMENTS:
+			case ESC_VIRTUAL:
+			case ESC_OVERRIDE:
+			case ESC_ABSTRACT:
+			case ESC_SUB:
+			case ESC_FUNCTION:
+			case ESC_MACRO:
+			case ESC_STATIC:
+			case ESC_NAMESPACE:
+			case ESC_IMPORTS:
+			case ESC_DELEGATE:
+			case ESC_CATCH:
+			case ESC_THROW:
+				KillStringSpaces(Command+2);
+				break;
+		}
+		return;
+	}
+
+	bool isPare = false;
+	for(i=0;;i++){
+		if(Command[i]==' '||Command[i]=='\t'||Command[i]=='('||Command[i]=='\"'||Command[i]=='@'||Command[i]=='-'){
+			com[i]=0;
+			while(Command[i]==' '||Command[i]=='\t') i++;
+			if( Command[i] == '(' ) isPare = true;
+			break;
+		}
+		if(Command[i]=='='){
+			KillStringSpaces(Command);
+			return;
+		}
+		com[i]=Command[i];
+		if(Command[i]=='\0') break;
+	}
+
+	//マクロによるコマンド
+	i2=1;
+	if( nCountOfNonGlobalScope == 0 ){
+		//グローバル
+		if(lstrcmpi(com,"Open")==0) ComOpen(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Close")==0) ComClose(Command+i,pam);
+		else if(lstrcmpi(com,"Field")==0||
+			lstrcmpi(com,"Get")==0||
+			lstrcmpi(com,"Put")==0) ComField(Command+i,pam);
+		else if(lstrcmpi(com,"Line")==0) ComLine(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Circle")==0) ComCircle(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"PSet")==0) ComPSet(Command+i,pam,nowLine);
+		else if(lstrcmpi(com,"Paint")==0) ComPaint(Command+i,pam,nowLine);
+
+		else if(
+			lstrcmpi(com,"EXEC")==0||
+			lstrcmpi(com,"INPUT")==0||
+			lstrcmpi(com,"PRINT")==0||
+			lstrcmpi(com,"RANDOMIZE")==0||
+			( lstrcmpi(com,"WRITE")==0 && isPare == false )||
+			lstrcmpi(com,"MSGBOX")==0||
+			lstrcmpi(com,"WINDOW")==0||
+			lstrcmpi(com,"DELWND")==0||
+			lstrcmpi(com,"INSMENU")==0||
+			lstrcmpi(com,"CHDIR")==0||
+			lstrcmpi(com,"MKDIR")==0||
+			lstrcmpi(com,"KILL")==0||
+			lstrcmpi(com,"CLS")==0||
+			lstrcmpi(com,"COLOR")==0||
+			lstrcmpi(com,"LOCATE")==0
+			){
+			KillSpaces(Command+i,pam);
+
+			//大文字に変換
+			CharUpper(com);
+
+			sprintf(Command,"%s(%s)",com,pam);
+			return;
+		}
+
+		else i2=0;
+	}
+	else i2=0;
+	if(i2){
+		//大文字に変換
+		CharUpper(com);
+
+		sprintf(Command,"%s(%s)",com,pam);
+		return;
+	}
+
+
+
+	//コンパイラに搭載されるコマンド
+	if(lstrcmpi(com,"Do")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DO;
+	}
+	else if(lstrcmpi(com,"goto")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_GOTO;
+	}
+	else if(lstrcmpi(com,"gosub")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_GOSUB;
+	}
+	else if(lstrcmpi(com,"Loop")==0){
+		if((Command[i]=='w'||Command[i]=='W')&&(Command[i+1]=='h'||Command[i+1]=='H')&&(Command[i+2]=='i'||Command[i+2]=='I')&&(Command[i+3]=='l'||Command[i+3]=='L')&&(Command[i+4]=='e'||Command[i+4]=='E')){
+			lstrcpy(pam,"0,");
+			KillSpaces(Command+i+5,pam+2);
+		}
+		else if((Command[i]=='u'||Command[i]=='U')&&(Command[i+1]=='n'||Command[i+1]=='N')&&(Command[i+2]=='t'||Command[i+2]=='T')&&(Command[i+3]=='i'||Command[i+3]=='I')&&(Command[i+4]=='l'||Command[i+4]=='L')){
+			lstrcpy(pam,"1,");
+			KillSpaces(Command+i+5,pam+2);
+		}
+		else pam[0]=0;
+		ComNum=COM_LOOP;
+	}
+	else if(lstrcmpi(com,"For")==0){
+		for(i2=0,IsStr=0;;i++,i2++){
+			while(Command[i]==' '||Command[i]=='\t') i++;
+			if(Command[i]=='\"') IsStr^=1;
+			if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='t'||Command[i]=='T')&&(Command[i+1]=='o'||Command[i+1]=='O')&&(Command[i+2]==' '||Command[i+2]=='\t')&&IsStr==0){
+				pam[i2]=',';
+				break;
+			}
+			pam[i2]=Command[i];
+			if(Command[i]=='\0') break;
+		}
+		if(Command[i]){
+			for(i+=3,i2++,IsStr=0;;i++,i2++){
+				while(Command[i]==' '||Command[i]=='\t') i++;
+				if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='s'||Command[i]=='S')&&(Command[i+1]=='t'||Command[i+1]=='T')&&(Command[i+2]=='e'||Command[i+2]=='E')&&(Command[i+3]=='p'||Command[i+3]=='P')&&(Command[i+4]==' '||Command[i+4]=='\t')){
+					pam[i2]=',';
+					i+=4;
+					continue;
+				}
+				pam[i2]=Command[i];
+				if(Command[i]=='\0') break;
+			}
+		}
+		ComNum=COM_FOR;
+	}
+	else if(lstrcmpi(com,"Foreach")==0)
+	{
+		for(i2=0,IsStr=0;;i++,i2++)
+		{
+			while(Command[i]==' '||Command[i]=='\t') i++;
+			if(Command[i]=='\"') IsStr^=1;
+			if((Command[i-1]==' '||Command[i-1]=='\t')&&(Command[i]=='i'||Command[i]=='I')&&(Command[i+1]=='n'||Command[i+1]=='N')&&(Command[i+2]==' '||Command[i+2]=='\t')&&IsStr==0){
+				pam[i2++] = 1;
+				pam[i2] = ESC_IN;
+				break;
+			}
+			pam[i2]=Command[i];
+			if(Command[i]=='\0') break;
+		}
+		if(Command[i])
+		{
+			lstrcpy( pam + i2 + 1, Command + i + 3 );
+		}
+		ComNum=COM_FOREACH;
+	}
+	else if(lstrcmpi(com,"Next")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_NEXT;
+	}
+	else if(lstrcmpi(com,"Return")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_RETURN;
+	}
+	else if(lstrcmpi(com,"While")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_WHILE;
+	}
+	else if(lstrcmpi(com,"Wend")==0){
+		pam[0]=0;
+		ComNum=COM_WEND;
+	}
+
+	//変数、データ操作
+	else if(lstrcmpi(com,"dim")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DIM;
+	}
+	else if(lstrcmpi(com,"Delete")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_DELETE;
+	}
+	else if( lstrcmpi( com, "_System_SweepingDelete" ) == 0 ){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SWEEPINGDELETE;
+	}
+
+	//その他
+	else if(lstrcmpi(com,"Debug")==0){
+		pam[0]=0;
+		ComNum=COM_DEBUG;
+	}
+	else if(lstrcmpi(com,"let")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_LET;
+	}
+	else if(lstrcmpi(com,"rem")==0){
+		Command[0]=0;
+		return;
+	}
+
+	//ポインタ
+	else if(lstrcmpi(com,"SetDouble")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETDOUBLE;
+	}
+	else if(lstrcmpi(com,"SetSingle")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETSINGLE;
+	}
+	else if(lstrcmpi(com,"SetQWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETQWORD;
+	}
+	else if(lstrcmpi(com,"SetDWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETDWORD;
+	}
+	else if(lstrcmpi(com,"SetWord")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETWORD;
+	}
+	else if(lstrcmpi(com,"SetByte")==0){
+		KillSpaces(Command+i,pam);
+		ComNum=COM_SETBYTE;
+	}
+
+	else{
+		//その他のコマンド（一般コード）
+		lstrcpy(com,Command);
+		KillSpaces(com,Command);
+		return;
+	}
+
+	i=lstrlen(pam);
+	while(pam[i-1]==' '||pam[i-1]=='\t') i--;
+	pam[i]=0;
+	if(pam[0]) sprintf(Command,"%c%c%s",HIBYTE(ComNum),LOBYTE(ComNum),pam);
+	else sprintf(Command,"%c%c",HIBYTE(ComNum),LOBYTE(ComNum));
+
+	return;
+}
+
+void ChangeCommandToCode(char *buffer){
+	extern HANDLE hHeap;
+	int i,i2,i3,IsStr,CommandBufferSize;
+	char *temporary,*tempBase,temp2[VN_SIZE],*lpCommand;
+
+	tempBase=(char *)malloc((lstrlen(buffer)+1)*2+8192);
+	temporary=tempBase+1;
+	temporary[0]=0;
+	i=0;
+	i3=0;
+
+	CommandBufferSize=512;
+
+	lpCommand=(char *)malloc(CommandBufferSize);
+
+	while(1){
+		i2=0;
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+		while(buffer[i]>='0'&&buffer[i]<='9'){
+			temp2[i2]=buffer[i];
+			i++;
+			i2++;
+		}
+		temp2[i2]=0;
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+		for(i2=0,IsStr=0;;i++,i2++){
+			if(i2>=CommandBufferSize){	//バッファ領域が足りなくなった場合はバッファを増量する
+				CommandBufferSize+=512;
+				lpCommand=(char *)realloc(lpCommand,CommandBufferSize);
+			}
+			if(buffer[i]=='\"') IsStr^=1;
+			if(buffer[i]=='\n'||(buffer[i]==':'&&IsStr==0)||buffer[i]=='\0'){
+				lpCommand[i2]=0;
+
+				if(temp2[0]){
+					//行番号ラベル
+					sprintf(temporary+i3,"%c%c%s,",1,ESC_LINENUM,temp2);
+					i3+=lstrlen(temporary+i3);
+
+					temp2[0]=0;
+				}
+
+				//命令コードへ変換
+				if(i2){
+					//エラー用
+					extern int cp;
+					cp=i;
+
+					ChangeCommand(buffer,i,lpCommand);
+
+					lstrcpy(temporary+i3,lpCommand);
+					i3+=lstrlen(temporary+i3);
+				}
+
+				if(!(lpCommand[0]=='\0'&&buffer[i]==':')){
+					temporary[i3++]=buffer[i];
+					temporary[i3]=0;
+				}
+
+				if(buffer[i]=='\n'){
+					i++;
+					break;
+				}
+				else if(buffer[i]==':'){
+					while(buffer[i+1]==' '||buffer[i+1]=='\t') i++;
+				}
+				if(buffer[i]=='\0') break;
+				i2=-1;
+				continue;
+			}
+			lpCommand[i2]=buffer[i];
+		}
+		if(buffer[i]=='\0') break;
+	}
+	free(lpCommand);
+	lstrcpy(buffer,temporary);
+
+	free(tempBase);
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/MakeExe.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/MakeExe.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/MakeExe.cpp	(revision 774)
@@ -0,0 +1,335 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "common.h"
+#include <ver.h>
+
+void StepCompileProgress(void){
+	extern HWND hMainDlg;
+	PostMessage(GetDlgItem(hMainDlg,IDC_PROGRESS),PBM_STEPIT,0,0);
+}
+
+void MakeMiddleCode( char *buffer )
+{
+	// 改行コードをCRLFからLFにする
+	ChangeReturnCode( buffer );
+
+	// コメントを除去
+	DeleteComment( buffer );
+
+	//エスケープシーケンス設定
+	SetEscapeSequenceFormat( buffer );
+
+	//コマンド対応
+	ChangeCommandToCode( buffer );
+}
+
+void AddSourceCode(const char *buffer){
+	char *temp=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)+8192);
+	lstrcpy(temp,buffer);
+
+	MakeMiddleCode( temp );
+
+	//最後尾に貼り付け
+	compiler.GetObjectModule().GetSource().Addition( temp );
+
+	HeapDefaultFree(temp);
+}
+
+namespace{
+	const char *GetCoreLibName()
+	{
+		if( compiler.IsDebug() ){
+			if( compiler.IsUnicode() ){
+				return "coreud.lib";
+			}
+			else{
+				return "cored.lib";
+			}
+		}
+		else{
+			if( compiler.IsUnicode() ){
+				return "coreu.lib";
+			}
+			else{
+				return "core.lib";
+			}
+		}
+	}
+}
+
+void Build()
+{
+	extern HANDLE hHeap;
+	extern char *basbuf;
+	extern BOOL bStopCompile;
+	extern HWND hMainDlg;
+	char temp2[MAX_PATH];
+
+	// 開始時刻を記録
+	DWORD beforeTickCount = GetTickCount();
+
+	//プログレスバーの設定
+	HWND hwndProgress=GetDlgItem(hMainDlg,IDC_PROGRESS);
+	PostMessage(hwndProgress,PBM_SETRANGE,0,MAKELPARAM(0,6));
+	PostMessage(hwndProgress,PBM_SETSTEP,1,0);
+
+	//"中断"
+	SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
+
+	//中断フラグを初期化
+	bStopCompile=0;
+
+	//サブシステムのタイプ
+	extern unsigned short TypeOfSubSystem;
+	TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_GUI;
+
+	// オブジェクトモジュール名をセットする
+	compiler.GetObjectModule().SetName( program.GetOutputFileName() );
+
+	//プログラムをファイルから読み込む
+	bool result = compiler.GetObjectModule().GetSource().ReadFile(
+		program.GetSourceFilePath(),
+		compiler.IsDebug(),
+		compiler.IsDll(),
+		compiler.IsUnicode(),
+		MAJOR_VER,
+		program.GetSourceFilePath(),
+		program.GetIncludeDir()
+	);
+	if( !result ){
+		compiler.errorMessenger.Output(201,program.GetSourceFilePath(),-1);
+		goto EndCompile;
+	}
+	if( !compiler.GetCurrentSource().cannotIncludePath.empty() )
+	{
+		compiler.errorMessenger.Output(
+			35,
+			compiler.GetCurrentSource().cannotIncludePath,
+			compiler.GetCurrentSource().cannotIncludeSourcePos
+		);
+		goto EndCompile;
+	}
+
+	//イメージベースの設定
+	extern DWORD ImageBase;
+	if(compiler.IsDll()) ImageBase=0x10000000;
+	else ImageBase=0x00400000;
+
+	if( compiler.errorMessenger.HasError() || bStopCompile ) goto EndCompile;
+
+
+	//////////////////////////
+	// 中間コードの生成を開始
+
+	//"最適化中..."
+	compiler.messenger.Output( STRING_COMPILE_OPTIMIZING );
+
+	//カッコを相互チェック（ダブルクォートチェックチェックを含む）
+	CheckParenthesis(basbuf);
+
+	if( compiler.errorMessenger.HasError() || bStopCompile )
+	{
+		goto EndCompile;
+	}
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+	//ディレクティブ
+	DirectiveCheck();
+
+	//Next命令語を正規表現に変換
+	//NextCommandFormat(basbuf);
+
+	//エスケープシーケンス設定
+	SetEscapeSequenceFormat(basbuf);
+
+	//Def命令語をFunction命令語に変換
+	DefCommandFormat(basbuf);
+
+	//すべてのIf命令語をブロック形式に変換
+	IfCommandFormat(basbuf);
+
+	//対になる命令語を相互チェック
+	//CheckPareCommand();
+
+	if( compiler.errorMessenger.HasError() || bStopCompile )
+	{
+		goto EndCompile;
+	}
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+	// 重複エラー情報をクリア
+	compiler.errorMessenger.ClearSynonymKeyWords();
+
+	ChangeCommandToCode(basbuf);
+	compiler.GetObjectModule().GetSource()._ResetLength();
+
+	if( compiler.errorMessenger.HasError() || bStopCompile )
+	{
+		//定数に関する情報を解放
+		goto EndCompile;
+	}
+
+	StepCompileProgress();
+
+
+	/////////////////////////////////////////////////////////////////
+	// 静的リンクライブラリをロードする
+	/////////////////////////////////////////////////////////////////
+	{
+		bool isSuccessfulLoadStaticLinkLibrary = true;
+		if( !compiler.IsCore() )
+		{
+			// コアモジュールをロードする
+			extern BOOL bDebugCompile;
+
+			const char *coreFileName = GetCoreLibName();
+
+			char coreFilePath[MAX_PATH];
+#if defined _AMD64_
+			sprintf( coreFilePath, "..\\lib\\x64\\%s", coreFileName );
+#else
+			sprintf( coreFilePath, "..\\lib\\%s", coreFileName );
+#endif
+			GetFullPath( coreFilePath, program.GetIncludeDir() );
+
+			Jenga::Common::Path path( coreFilePath );
+			if( path.IsExistFile() )
+			{
+				compiler.staticLibraries.push_back( new ObjectModule() );
+				if( compiler.staticLibraries.back()->Read( coreFilePath ) )
+				{
+					compiler.messenger.Output( ('\"' + path.GetFullPath() + "\" を読み込みました。").c_str() );
+				}
+				else
+				{
+					compiler.errorMessenger.Output( 203, path.GetFullPath() );
+					isSuccessfulLoadStaticLinkLibrary = false;
+				}
+			}
+			else
+			{
+				compiler.errorMessenger.Output( 202, path.GetFullPath() );
+				isSuccessfulLoadStaticLinkLibrary = false;
+			}
+		}
+
+		ActiveBasic::Common::Environment::SetRemoveExternalMark( true );
+
+		foreach( const std::string &filePath, compiler.staticLibraryFilePaths )
+		{
+			Jenga::Common::Path path( filePath );
+			if( path.IsExistFile() )
+			{
+				compiler.staticLibraries.push_back( new ObjectModule() );
+				if( compiler.staticLibraries.back()->Read( filePath ) )
+				{
+					compiler.messenger.Output( ('\"' + path.GetFullPath() + "\" を読み込みました。").c_str() );
+				}
+				else
+				{
+					compiler.errorMessenger.Output( 203, path.GetFullPath() );
+					isSuccessfulLoadStaticLinkLibrary = false;
+				}
+			}
+			else
+			{
+				compiler.errorMessenger.Output( 202, path.GetFullPath() );
+				isSuccessfulLoadStaticLinkLibrary = false;
+			}
+		}
+
+		ActiveBasic::Common::Environment::SetRemoveExternalMark( false );
+
+		if( !isSuccessfulLoadStaticLinkLibrary )
+		{
+			// 静的リンクライブラリのロードに失敗したとき
+			goto EndCompile;
+		}
+	}
+
+
+	///////////////////////
+	// コンパイル開始
+
+	MakeExe();
+
+	//コンパイルダイアログのプログレスバーを上げる
+	StepCompileProgress();
+
+
+	//////////////////////////
+	// 終了処理
+EndCompile:
+	if(bStopCompile){
+		PostMessage(hwndProgress,PBM_SETPOS,0,0);
+
+		//"コンパイルはユーザーにより中断されました。"
+		compiler.messenger.Output(STRING_COMPILE_STOP);
+	}
+	else{
+		extern int WarningNum;
+		if( !compiler.errorMessenger.HasError() )
+		{
+			//"コンパイルは正常に完了しました（エラー:%d、警告:%d）"
+			sprintf(temp2,
+				STRING_COMPILE_SUCCESS,
+				compiler.errorMessenger.GetErrorCount(),
+				compiler.errorMessenger.GetWarningCount(),
+				((double)(GetTickCount() - beforeTickCount))/1000
+			);
+		}
+		else
+		{
+			//"コンパイルは中断されました（エラー:%d、警告:%d）"
+			sprintf(temp2,STRING_COMPILE_ERROR,
+				compiler.errorMessenger.GetErrorCount(),
+				compiler.errorMessenger.GetWarningCount() );
+		}
+
+		compiler.messenger.Output( "" );
+		compiler.messenger.Output( "-----------------------------------------------------" );
+		compiler.messenger.Output( temp2 );
+	}
+
+	//"閉じる"
+	SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+	// エラーがない場合はビルド成功とする
+	if( !compiler.errorMessenger.HasError() )
+	{
+		// ビルド成功
+		compiler.BuildSuccessful();
+	}
+
+#ifdef _DEBUG
+	// デバッグモードのときはダイアログが隠れている
+	ShowWindow(hMainDlg,SW_SHOW);
+#endif
+}
+void MainThread(void *)
+{
+	if( program.IsDebugRun() )
+	{
+		if( compiler.IsDebug() )
+		{
+			//デバッグコンパイル
+			Build();
+		}
+
+		//デバッグ実行
+		if( !compiler.errorMessenger.HasError() )
+		{
+			DebugProgram();
+		}
+	}
+	else{
+		//リリースコンパイル
+		Build();
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.cpp	(revision 774)
@@ -0,0 +1,283 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+
+
+char *ReadBuffer_NonErrMsg( const std::string &path ){
+	extern HANDLE hHeap;
+	int i;
+	DWORD dw;
+	char *buffer;
+	HANDLE hFile;
+
+	hFile=CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE) return 0;
+	i=GetFileSize(hFile,0);
+	buffer=(char *)HeapAlloc(hHeap,0,i+1);
+	ReadFile(hFile,buffer,i,&dw,0);
+	buffer[dw]=0;
+	CloseHandle(hFile);
+	return buffer;
+}
+_int8 WriteBuffer( const std::string &path, char *buffer,int length){
+	extern HWND hOwnerEditor;
+	HANDLE hFile;
+	DWORD dw;
+	hFile=CreateFile(path.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		char temporary[MAX_PATH];
+
+		sprintf(temporary,"\"%s\" ファイルへの書き込みに失敗しました。",path);
+		MessageBox(hOwnerEditor,temporary,"エラー",MB_OK|MB_ICONEXCLAMATION);
+		return 0;
+	}
+	if(length) WriteFile(hFile,buffer,length,&dw,NULL);
+	CloseHandle(hFile);
+	return 1;
+}
+
+
+///////////////////////////
+// 不揮発性のデータ管理
+///////////////////////////
+
+BOOL CNonVolatile::GetDataLine(char *name,char *parms){
+	int i,i2,length;
+	length=lstrlen(name);
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(i==0||buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
+			if(memcmp(buffer+i,name,length)==0&&buffer[i+length]=='='){
+				i+=length+1;
+				for(i2=0;;i++,i2++){
+					if(buffer[i]=='\r'&&buffer[i+1]=='\n'||buffer[i]=='\0'){
+						parms[i2]=0;
+						break;
+					}
+					parms[i2]=buffer[i];
+				}
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+BOOL CNonVolatile::GetWholeValue(char *name,int *pi32data){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	*pi32data=atoi(temporary);
+	return 1;
+}
+BOOL CNonVolatile::Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d",pd1,pd2,pd3);
+	return 1;
+}
+BOOL CNonVolatile::GetRGBValue(char *name,COLORREF *prgb){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%x",prgb);
+	return 1;
+}
+BOOL CNonVolatile::GetStringValue(char *name,char *str){
+	if(!GetDataLine(name,str)) return 0;
+	return 1;
+}
+BOOL CNonVolatile::GetRectValue(char *name,RECT *prc){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d,%d",&prc->left,&prc->top,&prc->right,&prc->bottom);
+	return 1;
+}
+BOOL CNonVolatile::GetPointValue(char *name,POINT *pos){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d",&pos->x,&pos->y);
+	return 1;
+}
+
+void CNonVolatile::load(){
+	extern HANDLE hHeap;
+	int i;
+
+	//開く
+	buffer=ReadBuffer_NonErrMsg( Program::GetAbcUserAppDir() + "\\compiler.ini" );
+	if(!buffer){
+		//レジストリを読み込む
+		OldLoad();
+		return;
+	}
+
+
+	if(!GetWholeValue("IsShow_DefaultSystem_Var",&bShow_DefaultSystem_Var)) bShow_DefaultSystem_Var=0;
+	if(!GetWholeValue("IsShow_Rad_Var",&bShow_Rad_Var)) bShow_Rad_Var=0;
+	if(!GetWholeValue("IsShow_GUID_Var",&bShow_GUID_Var)) bShow_Rad_Var=0;
+
+	extern int ScreenX,ScreenY;
+	if(!GetPointValue("MainDlgPos",&MainDlgPos)){
+		MainDlgPos.x=ScreenX/2-100;
+		MainDlgPos.y=ScreenX/2-250;
+	}
+
+	if(!GetRectValue("VarDlgRect",&VarDlgRect)){
+		VarDlgRect.left=ScreenX/2-390/2;
+		VarDlgRect.top=ScreenY/2-270/2;
+		VarDlgRect.right=ScreenX/2+390/2;
+		VarDlgRect.bottom=ScreenY/2+270/2;
+	}
+
+	//ウォッチリスト
+	if(!GetWholeValue("WatchNum",&WatchNum)) WatchNum=0;
+
+	ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
+	for(i=0;i<WatchNum;i++){
+		char temporary[VN_SIZE];
+		sprintf(temporary,"Watch%03d",i);
+
+		char temp2[VN_SIZE];
+		GetStringValue(temporary,temp2);
+		ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+		lstrcpy(ppWatchStr[i],temp2);
+	}
+
+
+	HeapDefaultFree(buffer);
+}
+void CNonVolatile::OldLoad(){
+	extern HANDLE hHeap;
+	extern int ScreenX,ScreenY;
+
+	int i;
+	HKEY hKey;
+	ULONG ulSize;
+	char temporary[MAX_PATH],temp2[VN_SIZE];
+
+	if(RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Discoversoft\\BasicCompiler",0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS){
+		bShow_DefaultSystem_Var=0;
+		bShow_Rad_Var=0;
+		bShow_GUID_Var=0;
+
+		MainDlgPos.x=ScreenX/2-100;
+		MainDlgPos.y=ScreenX/2-250;
+
+		VarDlgRect.left=ScreenX/2-390/2;
+		VarDlgRect.top=ScreenY/2-270/2;
+		VarDlgRect.right=ScreenX/2+390/2;
+		VarDlgRect.bottom=ScreenY/2+270/2;
+
+		WatchNum=0;
+		ppWatchStr=(char **)HeapAlloc(hHeap,0,1);
+	}
+	else{
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_DefaultSystem_Var",NULL,NULL,(BYTE *)&bShow_DefaultSystem_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_DefaultSystem_Var=0;
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_Rad_Var",NULL,NULL,(BYTE *)&bShow_Rad_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_Rad_Var=0;
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"bShow_GUID_Var",NULL,NULL,(BYTE *)&bShow_GUID_Var,&ulSize)!=ERROR_SUCCESS)
+			bShow_GUID_Var=0;
+
+		ulSize=1024;
+		if(RegQueryValueEx(hKey,"MainDlgPos",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
+			MainDlgPos.x=ScreenX/2-100;
+			MainDlgPos.y=ScreenX/2-250;
+		}
+		else sscanf(temporary,"%d %d",
+			&MainDlgPos.x,
+			&MainDlgPos.y);
+
+		ulSize=1024;
+		if(RegQueryValueEx(hKey,"VarDlgRect",NULL,NULL,(unsigned char *)temporary,&ulSize)!=ERROR_SUCCESS){
+			VarDlgRect.left=ScreenX/2-390/2;
+			VarDlgRect.top=ScreenY/2-270/2;
+			VarDlgRect.right=ScreenX/2+390/2;
+			VarDlgRect.bottom=ScreenY/2+270/2;
+		}
+		else sscanf(temporary,"%d %d %d %d",
+			&VarDlgRect.left,
+			&VarDlgRect.top,
+			&VarDlgRect.right,
+			&VarDlgRect.bottom);
+
+		ulSize=sizeof(DWORD);
+		if(RegQueryValueEx(hKey,"WatchNum",NULL,NULL,(BYTE *)&WatchNum,&ulSize)!=ERROR_SUCCESS)
+			WatchNum=0;
+		ppWatchStr=(char **)HeapAlloc(hHeap,0,WatchNum*sizeof(char *)+1);
+		for(i=0;i<WatchNum;i++){
+			sprintf(temporary,"WathNum%03d",i);
+			ulSize=VN_SIZE;
+			if(RegQueryValueEx(hKey,temporary,NULL,NULL,(unsigned char *)temp2,&ulSize)!=ERROR_SUCCESS){
+				WatchNum=i;
+				break;
+			}
+			ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+			lstrcpy(ppWatchStr[i],temp2);
+		}
+	}
+}
+
+void CNonVolatile::SetWholeValue(char *name,long i32data){
+	sprintf(buffer+lstrlen(buffer),"%s=%d\r\n",name,i32data);
+}
+void CNonVolatile::Set3WholeValue(char *name,long d1,long d2,long d3){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d\r\n",name,d1,d2,d3);
+}
+void CNonVolatile::SetRGBValue(char *name,COLORREF rgb){
+	sprintf(buffer+lstrlen(buffer),"%s=%x\r\n",name,rgb);
+}
+void CNonVolatile::SetStringValue(char *name,char *str){
+	sprintf(buffer+lstrlen(buffer),"%s=%s\r\n",name,str);
+}
+void CNonVolatile::SetRectValue(char *name,RECT *prc){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d,%d\r\n",name,prc->left,prc->top,prc->right,prc->bottom);
+}
+void CNonVolatile::SetPointValue(char *name,POINT *pos){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d\r\n",name,pos->x,pos->y);
+}
+
+void CNonVolatile::save(){
+	int i;
+	char temporary[MAX_PATH];
+
+	// ユーザ情報保存用のディレクトリを作成
+	Jenga::Common::Directory dir( Program::GetAbcUserAppDir(), true );
+
+
+	extern HANDLE hHeap;
+	buffer=(char *)HeapAlloc(hHeap,0,65536);
+	buffer[0]=0;
+
+
+	SetWholeValue("IsShow_DefaultSystem_Var",bShow_DefaultSystem_Var);
+	SetWholeValue("IsShow_Rad_Var",bShow_Rad_Var);
+	SetWholeValue("IsShow_GUID_Var",bShow_GUID_Var);
+
+	SetPointValue("MainDlgPos",&MainDlgPos);
+
+	SetRectValue("VarDlgRect",&VarDlgRect);
+
+	//ウォッチリスト
+	SetWholeValue("WatchNum",WatchNum);
+	for(i=0;i<WatchNum;i++){
+		sprintf(temporary,"Watch%03d",i);
+		SetStringValue(temporary,ppWatchStr[i]);
+		HeapDefaultFree(ppWatchStr[i]);
+	}
+	HeapDefaultFree(ppWatchStr);
+
+
+	//保存
+	WriteBuffer(
+		Program::GetAbcUserAppDir() + "\\compiler.ini",
+		buffer,lstrlen(buffer));
+
+
+	HeapDefaultFree(buffer);
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/NonVolatile.h	(revision 774)
@@ -0,0 +1,42 @@
+
+char *ReadBuffer_NonErrMsg( const std::string &path );
+
+class CNonVolatile{
+	char *buffer;
+
+	void OldLoad();
+
+	BOOL GetDataLine(char *name,char *parms);
+
+	BOOL GetWholeValue(char *name,int *pi32data);
+	BOOL Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3);
+	BOOL GetRGBValue(char *name,COLORREF *prgb);
+	BOOL GetStringValue(char *name,char *str);
+	BOOL GetRectValue(char *name,RECT *prc);
+	BOOL GetPointValue(char *name,POINT *prc);
+
+	void SetWholeValue(char *name,long i32data);
+	void Set3WholeValue(char *name,long d1,long d2,long d3);
+	void SetRGBValue(char *name,COLORREF rgb);
+	void SetStringValue(char *name,char *str);
+	void SetRectValue(char *name,RECT *prc);
+	void SetPointValue(char *name,POINT *prc);
+public:
+	BOOL bShow_DefaultSystem_Var;
+	BOOL bShow_Rad_Var;
+	BOOL bShow_GUID_Var;
+
+	POINT MainDlgPos;
+	RECT VarDlgRect;
+
+	//デバッグのウォッチリスト
+	int WatchNum;
+	char **ppWatchStr;
+
+
+	CNonVolatile(){};
+	~CNonVolatile(){};
+	void load();
+	void save();
+};
+extern CNonVolatile *pobj_nv;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/NumOpe_GetType.cpp	(revision 774)
@@ -0,0 +1,1054 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "common.h"
+
+using namespace ActiveBasic::Compiler;
+
+int MakeWholeType(int size,int bSigned){
+	switch(size){
+		case 1:
+			if(bSigned) return DEF_SBYTE;
+			else return DEF_BYTE;
+			break;
+		case 2:
+			if(bSigned) return DEF_INTEGER;
+			else return DEF_WORD;
+			break;
+		case 4:
+			if(bSigned) return DEF_LONG;
+			else return DEF_DWORD;
+			break;
+		case 8:
+			if(bSigned) return DEF_INT64;
+			else return DEF_QWORD;
+			break;
+	}
+	return 0;
+}
+
+int AutoBigCast(int BaseType,int CalcType){
+	int type;
+	type=CalcType;
+
+	if(BaseType==0||BaseType==-1){
+		//ベースタイプが未定のとき
+		return type;
+	}
+
+	if(!IsWholeNumberType(type)){
+		//整数型ではないときは暗黙の変換は必要なし
+		return type;
+	}
+
+	if(BaseType==DEF_OBJECT||BaseType==DEF_STRUCT){
+		//ベースタイプがオブジェクトのときは暗黙の変換は必要なし
+		return type;
+	}
+
+	int BaseTypeSize;
+	BaseTypeSize=Type(BaseType,-1).GetSize();
+
+	if(IsRealNumberType(BaseType)){
+		if(Type(CalcType,-1).GetSize()<4)
+			type=MakeWholeType(4,IsSignedType(CalcType));
+	}
+	else if(BaseTypeSize>Type(CalcType,-1).GetSize()){
+		//要求される型のほうがサイズが大きいとき
+		type=MakeWholeType(BaseTypeSize,IsSignedType(CalcType));
+	}
+
+	if(!type){
+		extern int cp;
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	return type;
+}
+
+BOOL CheckCalcType(int idCalc,int *type,int sp){
+	//演算子の右辺、左辺の型をチェック
+	extern int cp;
+
+	//演算子名を取得
+	char temporary[255];
+	GetCalcName(idCalc,temporary);
+
+	switch(idCalc){
+
+		/////////////////////////////////////
+		// 実数に対する論理演算はエラー
+		/////////////////////////////////////
+
+		case CALC_XOR:
+		case CALC_OR:
+		case CALC_AND:
+			if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+				//いずれかの項が実数のとき
+				compiler.errorMessenger.Output(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_NOT:
+			if(IsRealNumberType(type[sp-1])){
+				//実数のとき
+				compiler.errorMessenger.Output(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if(type[sp-1]&FLAG_CAST){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+
+
+		/////////////////////////////////////
+		// 比較演算はチェック項目なし
+		/////////////////////////////////////
+
+		case CALC_PE:
+		case CALC_QE:
+		case CALC_NOTEQUAL:
+		case CALC_EQUAL:
+		case CALC_P:
+		case CALC_Q:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+
+
+		/////////////////////////////////////
+		// 算術演算をチェック
+		/////////////////////////////////////
+
+		case CALC_ADDITION:
+		case CALC_SUBTRACTION:
+		case CALC_PRODUCT:
+		case CALC_QUOTIENT:
+		case CALC_POWER:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_SHL:
+		case CALC_SHR:
+		case CALC_MOD:
+		case CALC_INTQUOTIENT:
+			if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+				//いずれかの項が実数のとき
+				compiler.errorMessenger.Output(45,temporary,cp);
+				return 0;
+			}
+
+			//As以外の演算子に型名が指定されていないかをチェック
+			if((type[sp-2]&FLAG_CAST)||(type[sp-1]&FLAG_CAST)){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_AS:
+			if((type[sp-1]&FLAG_CAST)==0){
+				//型名が指定されていないときはエラー
+				compiler.errorMessenger.Output(47,NULL,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_BYVAL:
+			if(type[sp-1]&FLAG_CAST){
+				//型名が指定されていないときはエラー
+				compiler.errorMessenger.Output(47,NULL,cp);
+				return 0;
+			}
+			break;
+
+		case CALC_MINUSMARK:
+			//As以外の演算子に型名が指定されていないかをチェック
+			if(type[sp-1]&FLAG_CAST){
+				compiler.errorMessenger.Output(48,temporary,cp);
+				return 0;
+			}
+			break;
+	}
+	return 1;
+}
+
+int GetReturnType_OperatorProc(int idCalc,const Type &baseType,int *type_stack,LONG_PTR *index_stack,int &sp)
+{
+	if( sp < 2 )
+	{
+		Jenga::Throw( "GetReturnType_OperatorProcのspが2以下" );
+	}
+
+	Type leftType( type_stack[sp-2], index_stack[sp-2] );
+	Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
+
+	//オーバーロードされたオペレータ関数を呼び出す
+	const CClass *pobj_c = &leftType.GetClass();
+
+	std::vector<const UserProc *> subs;
+	pobj_c->GetDynamicMethods().Enum( idCalc, subs );
+	if( subs.size() == 0 ){
+		return 0;
+	}
+
+
+	//項の数
+	BOOL bTwoTerm=1;
+	if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+
+	/////////////////////////////////////////////
+	// オーバーロード解決用のパラメータを設定
+	/////////////////////////////////////////////
+
+
+	//_System_LocalThis
+	Parameters params;
+
+	if(bTwoTerm){
+		params.push_back( new Parameter( "", rightType ) );
+	}
+
+
+	//オーバーロードを解決
+	char temporary[255];
+	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+	else GetCalcName(idCalc,temporary);
+	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType, leftType );
+
+	if(bTwoTerm){
+		delete params[0];
+	}
+
+	if(!pUserProc){
+		return 0;
+	}
+	else{
+		//オーバーロードされていないが、パラメータ個数が一致しないとき
+		if(params.size()!=pUserProc->Params().size()){
+			return 0;
+		}
+	}
+
+	sp--;
+	type_stack[sp-1]=pUserProc->ReturnType().GetBasicType();
+	index_stack[sp-1]=pUserProc->ReturnType().GetIndex();
+
+	return 1;
+}
+
+bool Operator_New_GetType(const char *Parameter,const Type &baseType, Type &resultType ){
+	char TypeName[VN_SIZE],objectSizeStr[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	if(Parameter[0]=='['){
+		i=GetStringInBracket(objectSizeStr,Parameter);
+
+		SlideString(objectSizeStr+1,-1);
+		objectSizeStr[i-2]=0;
+	}
+	else objectSizeStr[0]=0;
+
+	for(i2=0;;i++,i2++){
+		if(Parameter[i]=='(' || Parameter[i]=='['){
+			TypeName[i2]=0;
+			break;
+		}
+		TypeName[i2]=Parameter[i];
+		if(Parameter[i]=='\0'){
+			break;
+		}
+	}
+
+	if( !compiler.StringToType( TypeName, resultType ) )
+	{
+		compiler.errorMessenger.Output(3,TypeName,cp);
+		return false;
+	}
+
+	if( !resultType.IsObject() )
+	{
+		compiler.errorMessenger.Output(121,NULL,cp);
+		return false;
+	}
+
+	if( baseType.IsObject() ){
+		resultType.SetBasicType( DEF_OBJECT );
+	}
+	else{
+		resultType.SetBasicType( DEF_PTR_OBJECT );
+	}
+	return true;
+}
+
+bool GetMemberTermType( const Type &leftType, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member, bool *pIsVariable )
+{
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(member,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		if( VarName[0] == '\0' )
+		{
+			classType = leftType;
+
+			if( classType.IsObject() )
+			{
+				// 既にuseRegにオブジェクトポインタが格納されており、それに対するインデクサを呼び出す場合
+				// ※「プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す」場合にここにくる
+			}
+		}
+		else
+		{
+			GetMemberType( leftType, VarName, classType, 0, false );
+		}
+
+		if( classType.IsObject() )
+		{
+			if( !GetReturnTypeOfIndexerGetterProc( classType, resultType ) ){
+				compiler.errorMessenger.Output(1,NULL,cp);
+				return false;
+			}
+
+			return true;
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// メンバを検索
+	///////////////////////////////////////////////////////////////////
+	if( GetMemberType( leftType, member, resultType, 0, false ) ){
+		// メンバが見つかったとき
+
+		if( pIsVariable )
+		{
+			*pIsVariable = true;
+		}
+
+		return true;
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// 動的メソッドを検索
+	///////////////////////////////////////////////////////////////////
+	char methodName[VN_SIZE] ,lpPtrOffset[VN_SIZE], dummy[1];
+	char parameter[VN_SIZE];
+	ReferenceKind refType;
+	PareOrBracket pareOrBracket = None;
+	lstrcpy( methodName, member );
+	GetVarFormatString( methodName, parameter, lpPtrOffset, dummy, refType, &pareOrBracket );
+
+	std::vector<const UserProc *> userProcs;
+	leftType.GetClass().EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
+	if(userProcs.size()){
+		//オーバーロードを解決
+		const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
+
+		if( pUserProc )
+		{
+			if(
+				pUserProc->Params().size() == 0				// 仮引数の個数は0
+				&& parameter[0]								// 実引数は1つ以上
+				&& pUserProc->ReturnType().IsObject()		// 戻り値がクラス型の場合
+				&& pareOrBracket == Bracket )				// 実引数は[]で囲まれている
+			{
+				// プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す
+
+				// まずはプロパティ値を取得
+				bool dummyIsVariable;
+				GetMemberTermType( leftType, baseType, resultType, termFull, termLeft, methodName, &dummyIsVariable );
+
+				// 戻り値のオブジェクトインスタンスのインデクサを呼び出す
+				char temporary[VN_SIZE], temp2[VN_SIZE];
+				sprintf( temporary, "[%s]", parameter );
+				sprintf( temp2, "%s.%s", termLeft, methodName );
+				Type classType = resultType;
+				return GetMemberTermType( classType, baseType, resultType, termFull, temp2, temporary, pIsVariable );
+			}
+
+			resultType = pUserProc->ReturnType();
+
+			// 型パラメータを解決
+			ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc );
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName, bool *pIsVariable )
+{
+	char parameter[VN_SIZE];
+
+	// Withを解決
+	char termFull[VN_SIZE];
+	if(term[0]=='.'){
+		GetWithName(termFull);
+		lstrcat(termFull,term);
+	}
+	else lstrcpy(termFull,term);
+
+	char termLeft[VN_SIZE];
+	lstrcpy(termLeft,termFull);
+
+	// パース
+	char member[VN_SIZE];
+	ReferenceKind refType;
+	if( SplitMemberName( termFull, termLeft, member, refType ) ){
+		///////////////////////////////////////////////////////////////////
+		// オブジェクトとメンバに分解できるとき
+		// termLeft.member
+		///////////////////////////////////////////////////////////////////
+
+		isLiteral = false;
+
+		// オブジェクト側の型を取得
+		bool isClassName = false;
+		Type leftType;
+		if( GetTermType( termLeft, Type(), leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					compiler.GetObjectModule().meta.GetBlittableTypes().Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+
+				if( !GetTermType( termLeft, Type(), leftType, isLiteral, &isClassName ) ){
+					goto globalArea;
+				}
+			}
+		}
+		else{
+			goto globalArea;
+		}
+
+		if( isClassName ){
+			// 静的メンバ/メソッドの場合
+			goto globalArea;
+		}
+
+		if( !leftType.HasMember() ){
+			// メンバを持たない型の場合
+			return false;
+		}
+
+		return GetMemberTermType( leftType, baseType, resultType, termFull, termLeft, member, pIsVariable );
+	}
+
+
+	//////////////////////////////////////////////
+	// クラス名かどうかをチェック（静的メンバ用）
+	//////////////////////////////////////////////
+
+	if( pIsClassName )
+	{
+		if( compiler.GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( termFull ) ) )
+		{
+			*pIsClassName = true;
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// グローバル属性
+	/////////////////////////////////////////////////////////////////
+globalArea:
+
+
+	if(lstrcmpi(termFull,"This")==0)
+	{
+		if( !compiler.IsCompilingClass() )
+		{
+			return false;
+		}
+
+		//Thisオブジェクト
+		resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+		isLiteral = false;
+		return true;
+	}
+
+
+	//////////////////////////////////////
+	// 関数（DLL、ユーザー定義、組み込み）
+	//////////////////////////////////////
+	char procName[VN_SIZE];
+	char temporary[8192];
+
+	int i2=GetCallProcName(termFull,procName);
+	if(termFull[i2]=='('){
+		int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
+
+		void *pProc;
+		int idProc=GetProc(procName,(void **)&pProc);
+
+		if(idProc){
+			//閉じカッコ")"に続く文字がNULLでないとき
+			if(termFull[i2+1+i4+1]!='\0'){
+				compiler.errorMessenger.Output(42,NULL,cp);
+			}
+
+
+			////////////////
+			// 呼び出し
+			////////////////
+
+			if( !CallProc(idProc,pProc,procName,parameter, baseType, resultType, false ) ){
+				return false;
+			}
+			if( resultType.IsNull() ){
+				//戻り値が存在しないとき
+				return false;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+		else
+		{
+			ConstMacro *pConstMacro = compiler.GetObjectModule().meta.GetGlobalConstMacros().Find(
+				ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( procName )
+			);
+			if( pConstMacro )
+			{
+				if( ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, parameter, temporary ) )
+				{
+					/////////////////////////
+					// マクロ関数
+					/////////////////////////
+
+					//閉じカッコ")"に続く文字がNULLでないときはエラーにする
+					if(termFull[i2+1+i4+1]!='\0') compiler.errorMessenger.Output(42,NULL,cp);
+
+					//マクロ関数の場合
+					if( !NumOpe_GetType(temporary,Type(),resultType) ){
+						return false;
+					}
+
+					if( !IS_LITERAL( resultType.GetIndex() ) ){
+						//リテラル値ではなかったとき
+						isLiteral = false;
+					}
+
+					return true;
+				}
+			}
+		}
+	}
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(termFull,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		GetVarType(VarName,classType,false);
+		if( classType.IsObject() ){
+			if( !GetReturnTypeOfIndexerGetterProc( classType, resultType ) ){
+				compiler.errorMessenger.Output(1,NULL,cp);
+				return false;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+	}
+
+
+	////////////////////////////////
+	// 変数
+	////////////////////////////////
+
+	if( GetVarType( termFull, resultType, false ) ){
+		if( resultType.GetBasicType() & FLAG_PTR ){
+			//配列ポインタ
+			resultType.SetBasicType( GetPtrType( resultType.GetBasicType()^FLAG_PTR ) );
+		}
+
+		isLiteral = false;
+
+		if( pIsVariable )
+		{
+			// 変数である
+			*pIsVariable = true;
+		}
+
+		return true;
+	}
+
+
+	/////////////////////////////////
+	// プロパティ用のメソッド
+	/////////////////////////////////
+
+	//配列要素を排除
+	GetArrayElement(termFull,VarName,ArrayElements);
+
+	if(GetSubHash(VarName,0)){
+		GetReturnTypeOfPropertyMethod(termFull,NULL,resultType);
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	return false;
+}
+
+bool GetTermType( const char *term, Type &resultType )
+{
+	bool isLiteral;
+	return GetTermType( term, Type(), resultType, isLiteral );
+}
+
+bool GetTermTypeOnlyVariable( const char *term, Type &resultType )
+{
+	bool isLiteral, isVariable = false;
+	bool result = GetTermType( term, Type(), resultType, isLiteral, NULL, &isVariable );
+	return ( result && isVariable );
+}
+
+bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType, bool *pIsLiteralCalculation ){
+	extern int cp;
+	int i,i3;
+
+	//リテラル値のみの計算かどうかを判別するためのフラグ
+	bool dummyBool;
+	if( pIsLiteralCalculation == NULL )
+	{
+		pIsLiteralCalculation = &dummyBool;
+	}
+	*pIsLiteralCalculation = true;
+
+	if(expression[0]=='\0'){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return false;
+	}
+
+	if(expression[0]==1&& ( expression[1]==ESC_NEW || expression[1] == ESC_SYSTEM_STATIC_NEW ) ){
+		//New演算子（オブジェクト生成）
+		*pIsLiteralCalculation = false;
+		return Operator_New_GetType(expression+2,baseType, resultType );
+	}
+
+	if( expression[0] == '[' ){
+		if( !baseType.IsPointer() ){
+			return false;
+		}
+
+		resultType = baseType;
+		return true;
+	}
+
+
+	/////////////////////////////////
+	// 式要素を逆ポーランド式で取得
+	/////////////////////////////////
+
+	char *values[255];
+	long calc[255];
+	long stack[255];
+	int pnum;
+	if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
+		for(i=0;i<pnum;i++){
+			if(values[i]) HeapDefaultFree(values[i]);
+		}
+		return false;
+	}
+
+
+
+	////////////////////////////////
+	// 演算部分のコード生成を開始
+	////////////////////////////////
+
+	BOOL bError;
+	bError=0;
+
+	int sp;
+	int type_stack[255];
+	LONG_PTR index_stack[255];
+	bool isNothing_stack[255];
+	_int64 i64data;
+	int idCalc;
+	for(i=0,sp=0;i<pnum;i++){
+		idCalc=calc[i]%100;
+
+		if(idCalc && sp >= 2){
+			if(type_stack[sp-2]==DEF_OBJECT){
+				if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& index_stack[sp-1] == index_stack[sp-2]
+					|| isNothing_stack[sp-2] ){
+						// 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
+				}
+				else if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
+					)){
+						// ダウンキャストを許可する
+				}
+				else if( idCalc == CALC_AS ){
+					// NumOpe_GetTypeではすべてのキャストを許可する
+				}
+				else{
+					//オーバーロードされたオペレータを呼び出す
+					if(!GetReturnType_OperatorProc(idCalc,baseType,type_stack,index_stack,sp)){
+						goto error;
+					}
+
+					continue;
+				}
+			}
+
+			if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
+		}
+
+		switch(idCalc){
+			//数値
+			case 0:
+				index_stack[sp]=-1;
+				isNothing_stack[sp] = false;
+
+				char *term;
+				term = values[i];
+
+				if( calc[i+1]%100 == CALC_AS ){
+					// As演算子の右辺値
+					//型名
+					if( compiler.StringToType( term, resultType ) ){
+
+						if( resultType.IsObject() ){
+							if( resultType.GetClass().IsBlittableType() ){
+								// Blittable型のときは基本型として扱う
+								// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+								if( compiler.IsLocalAreaCompiling()
+									&& compiler.GetCompilingUserProc().HasParentClass()
+									&& compiler.GetCompilingUserProc().GetParentClass().IsBlittableType() )
+								{
+									// コンパイル中のメソッドがBlittable型クラスに属している
+								}
+								else{
+									resultType = resultType.GetClass().GetBlittableType();
+								}
+							}
+						}
+
+						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
+					}
+					else{
+						compiler.errorMessenger.Output(3, term, cp );
+						goto error;
+					}
+
+					type_stack[sp] = resultType.GetBasicType();
+					index_stack[sp] = resultType.GetIndex();
+					sp++;
+
+					break;
+				}
+
+				if(term[0]=='\"'){
+StrLiteral:
+
+					if( !baseType.IsPointer() ){
+						//要求タイプがオブジェクト、または未定のとき
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+						*pIsLiteralCalculation = false;
+
+						sp++;
+						break;
+					}
+
+					type_stack[sp]=typeOfPtrChar;
+					*pIsLiteralCalculation = false;
+				}
+				else if((term[0]=='e'||term[0]=='E')&&
+					(term[1]=='x'||term[1]=='X')&&
+					term[2]=='\"'){
+					//拡張版リテラル文字列（エスケープシーケンス可能）
+					goto StrLiteral;
+				}
+				else if(IsVariableTopChar(term[0])||
+					term[0]=='*'||
+					(term[0]=='.'&&IsVariableTopChar(term[1])))
+				{
+					//////////////////
+					// 何らかの識別子
+
+					bool isLiteral = true;
+					if( GetTermType( term, baseType, resultType, isLiteral ) ){
+						type_stack[sp] = resultType.GetBasicType();
+						index_stack[sp] = resultType.GetIndex();
+
+						if( !isLiteral ){
+							*pIsLiteralCalculation = false;
+						}
+
+						sp++;
+						break;
+					}
+
+
+					// Nothing
+					if( lstrcmp( term, "Nothing" ) == 0 ){
+						isNothing_stack[sp] = true;
+
+						if( baseType.IsObject() ){
+							type_stack[sp] = DEF_OBJECT;
+							index_stack[sp] = baseType.GetIndex();
+						}
+						else{
+							type_stack[sp] = baseType.GetBasicType();
+							index_stack[sp] = baseType.GetIndex();
+						}
+
+						*pIsLiteralCalculation = false;
+						sp++;
+						break;
+					}
+
+
+					//////////////
+					// 定数の場合
+					//////////////
+
+					i3 = compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType(
+						ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+					);
+					if(i3){
+						if( compiler.GetObjectModule().meta.GetGlobalConsts().IsStringPtr( ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term ), compiler.IsUnicode() ) )
+						{
+							//リテラル文字列
+							goto StrLiteral;
+						}
+
+						type_stack[sp]=i3;
+						if(IsRealNumberType(i3)){
+							//実数
+							goto Literal;
+						}
+						else if(IsWholeNumberType(i3)){
+							//整数
+							goto Literal;
+						}
+						else if(Is64Type(i3)){
+							//64ビット整数値
+							goto Literal;
+						}
+						else{
+							compiler.errorMessenger.Output(1,NULL,0);
+							goto error;
+						}
+					}
+
+
+					/////////////////////////////////
+					// プロパティ用のメソッド
+					/////////////////////////////////
+
+					//配列要素を排除
+					char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+					GetArrayElement(term,VarName,ArrayElements);
+
+					if(GetSubHash(VarName,0)){
+						compiler.errorMessenger.OutputFatalError();
+						Type tempType;
+						GetReturnTypeOfPropertyMethod(term,NULL,tempType);
+
+						//大きな型への暗黙の変換
+						type_stack[sp]=tempType.GetBasicType();
+
+						index_stack[sp]=tempType.GetIndex();
+						*pIsLiteralCalculation = false;
+
+						sp++;
+						break;
+					}
+
+
+
+					//該当する識別子が見当たらないときはエラー扱いにする
+					bError=1;
+					compiler.errorMessenger.Output(3,term,cp);
+					type_stack[sp]=DEF_DOUBLE;
+				}
+				else{
+					//リテラル値
+					int base_type = 0;
+					if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
+					type_stack[sp]=GetLiteralValue(term,&i64data,base_type);
+Literal:
+					if((long)i64data==0&&index_stack[sp]==-1) index_stack[sp]=LITERAL_NULL;
+				}
+
+				sp++;
+				break;
+
+			//論理演算子
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_NOT:
+				//values[sp-1]=Not values[sp-1]
+				//NOT演算子
+				break;
+
+			//比較演算子
+			case CALC_PE:		//values[sp-2] <= values[sp-1]
+			case CALC_QE:		//values[sp-2] >= values[sp-1]
+			case CALC_P:		//values[sp-2] <  values[sp-1]
+			case CALC_Q:		//values[sp-2] >  values[sp-1]
+			case CALC_NOTEQUAL:	//values[sp-2] <> values[sp-1]
+			case CALC_EQUAL:	//values[sp-2] =  values[sp-1]	
+				sp--;
+				type_stack[sp-1]=DEF_LONG;
+				break;
+
+			//ビットシフト
+			case CALC_SHL:	//values[sp-2] << values[sp-1]
+			case CALC_SHR:	//values[sp-2] >> values[sp-1]
+				sp--;
+				break;
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_MOD:
+				//values[sp-2]%=values[sp-1]
+				//剰余演算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_QUOTIENT:
+				//values[sp-2]/=values[sp-1];
+				//除算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_INTQUOTIENT:
+				//values[sp-2]/=values[sp-1]
+				//整数除算
+				sp--;
+				type_stack[sp-1]=NeutralizationType(type_stack[sp-1],index_stack[sp-1],type_stack[sp],index_stack[sp]);
+				break;
+			case CALC_MINUSMARK:
+				//values[sp-1]=-values[sp-1]
+				//符号反転
+				break;
+			case CALC_POWER:
+				//べき乗演算（浮動小数点演算のみ）
+				sp--;
+				//未完成
+				break;
+			case CALC_AS:
+				//キャスト
+				type_stack[sp-2]=type_stack[sp-1]&(~FLAG_CAST);
+				index_stack[sp-2]=index_stack[sp-1];
+
+				sp--;
+				break;
+
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					compiler.errorMessenger.Output( 1, NULL, cp );
+					goto error;
+				}
+
+				type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
+				break;
+		}
+	}
+
+	if(bError) goto error;
+
+	if(sp!=1){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		goto error;
+	}
+
+	if( *pIsLiteralCalculation ){
+		//右辺値が数値の定数式の場合
+		int base_type = 0;
+		if( !baseType.IsNull() ) base_type = baseType.GetBasicType();
+		Type tempType;
+		StaticCalculation(true, expression,base_type,&i64data,tempType);
+
+		type_stack[0]=tempType.GetBasicType();
+		index_stack[0]=tempType.GetIndex();
+	}
+	else{
+		//右辺値が数値の定数式ではないとき
+		if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+	}
+
+	resultType.SetType( type_stack[0], index_stack[0] );
+
+	bool isSuccessful = true;
+	goto finish;
+
+
+	//////////////////
+	// エラー処理
+	//////////////////
+
+error:
+	isSuccessful = false;
+	goto finish;
+
+
+finish:
+	for(i=0;i<pnum;i++){
+		if(values[i]) HeapDefaultFree(values[i]);
+	}
+	return isSuccessful;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Object.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Object.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Object.cpp	(revision 774)
@@ -0,0 +1,138 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+extern HANDLE hHeap;
+
+void CallConstructor( const char *ObjectName,const Subscripts &subscripts,const Type &type,const char *Parameter){
+	if( !type.IsObject() ){
+		return;
+	}
+
+	/////////////////////////////////////
+	// クラスオブジェクトの場合
+	// ※コンストラクタの呼び出し
+	/////////////////////////////////////
+
+	const UserProc *pUserProc = GetMethodHash(ObjectName,type.GetClass().GetName().c_str(),Parameter);
+	if(!pUserProc){
+		if(Parameter[0]) compiler.errorMessenger.Output(113,type.GetClass().GetName().c_str(),cp);
+		return;
+	}
+
+
+	char temporary[VN_SIZE];
+
+	if( subscripts.size() > 0 ){
+		int ss[MAX_ARRAYDIM];
+		memset(ss,0,MAX_ARRAYDIM*sizeof(int));
+		while(1){
+			int i3;
+			for(i3=0; i3<(int)subscripts.size(); i3++){
+				if(ss[i3]>subscripts[i3]){
+					ss[i3]=0;
+					ss[i3+1]++;
+				}
+				else break;
+			}
+			if( i3 == subscripts.size() )
+			{
+				break;
+			}
+			sprintf(temporary,"%s[%d",ObjectName,ss[0]);
+			for(i3=1; i3<(int)subscripts.size(); i3++){
+				sprintf(temporary+lstrlen(temporary),",%d",ss[i3]);
+			}
+			lstrcat(temporary,"]");
+
+			Type dummyType;
+			sprintf(temporary+lstrlen(temporary),".%s",type.GetClass().GetName().c_str());
+			CallProc( PROC_DEFAULT,
+				pUserProc,
+				temporary,
+				Parameter,
+				Type(),			// baseTypeはなし
+				dummyType );
+
+			ss[0]++;
+		}
+	}
+	else{
+		Type dummyType;
+		sprintf(temporary,"%s.%s",ObjectName,type.GetClass().GetName().c_str());
+		CallProc( PROC_DEFAULT,
+			pUserProc,
+			temporary,
+			Parameter,
+			Type(),			// baseTypeはなし
+			dummyType );
+	}
+}
+
+bool Operator_New( const char *expression, const Type &baseType, Type &resultType ){
+	char CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	if(expression[0]=='['){
+		i=GetStringInBracket(objectSizeStr,expression);
+
+		SlideString(objectSizeStr+1,-1);
+		objectSizeStr[i-2]=0;
+	}
+	else objectSizeStr[0]=0;
+
+	char typeName[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(expression[i]=='('){
+			typeName[i2]=0;
+
+			//コンストラクタに渡すパラメータを取得
+			i2=GetStringInPare(CreateParameter,expression+i);
+			RemoveStringPare(CreateParameter);
+			i+=i2;
+			if(expression[i]!='\0'){
+				compiler.errorMessenger.Output(42,NULL,cp);
+				return false;
+			}
+			break;
+		}
+		typeName[i2]=expression[i];
+		if(expression[i]=='\0'){
+			CreateParameter[0]=0;
+			break;
+		}
+	}
+
+	if( !compiler.StringToType( typeName, resultType ) ){
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return false;
+	}
+
+	if( !resultType.IsObject() ){
+		////////////////////////
+		// 通常のデータ型の場合
+		////////////////////////
+
+		compiler.errorMessenger.Output(121,NULL,cp);
+		return false;
+	}
+
+	Operator_New( resultType.GetClass(), objectSizeStr, CreateParameter, baseType );
+
+	if( !baseType.IsObject() ){
+		// オブジェクトポインタ向け
+		resultType.SetBasicType( DEF_PTR_OBJECT );
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/OldStatement.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/OldStatement.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/OldStatement.cpp	(revision 774)
@@ -0,0 +1,334 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+void Opcode_Input(const char *Parameter){
+	extern int cp;
+	int i2,i3,i4,i5;
+	BOOL bFile;
+	char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		i2=i3+1;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+
+		//表示用文字列パラメータをセット
+		if(Parameter[0]=='\"'){
+			buffer[0]='\"';
+			for(i2=1;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else compiler.errorMessenger.Output(10,"Input",cp);
+			i2+=2;
+		}
+		else if((Parameter[0]=='e'||Parameter[0]=='E')&&
+			(Parameter[1]=='x'||Parameter[1]=='X')&&
+			Parameter[2]=='\"'){
+			memcpy(buffer,Parameter,3);
+			for(i2=3;;i2++){
+				if(Parameter[i2]=='\"'){
+					buffer[i2]=0;
+					break;
+				}
+				buffer[i2]=Parameter[i2];
+			}
+			if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
+			else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
+			else compiler.errorMessenger.Output(10,"Input",cp);
+			i2+=2;
+		}
+		else{
+			lstrcpy(buffer,"\"? \"");
+			i2=0;
+		}
+	}
+
+	//変数ポインタ、変数のタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='('){
+				i5=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+			}
+			if(Parameter[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			compiler.errorMessenger.Output(10,"Input",cp);
+			return;
+		}
+
+		Type varType;
+		if( !GetVarType(temporary, varType, 1) ){
+			return;
+		}
+
+		sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
+		OpcodeCalc(temp2);
+
+		if(varType.IsLong()) varType.SetBasicType( DEF_DWORD );
+		else if(varType.IsInteger()) varType.SetBasicType( DEF_WORD );
+		else if(varType.IsObject()){
+			varType.SetBasicType( DEF_OBJECT );
+			if( varType.IsStringClass() ){
+				varType.SetBasicType( DEF_STRING );
+			}
+		}
+		sprintf(temp2,"_System_InputDataType[%d]=%d",i4,varType.GetBasicType());
+		OpcodeCalc(temp2);
+
+		i4++;
+		if(Parameter[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
+	OpcodeCalc(temp2);
+
+	const UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("INPUT_FromFile");
+	else pUserProc=GetSubHash("INPUT_FromPrompt");
+	if(!pUserProc){
+		compiler.errorMessenger.Output(3,"Input",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"");
+}
+void Opcode_PrintUsing(const char *Parameter,char *buffer,BOOL bFile){
+	extern int cp;
+	int i2,i3,i4,i5;
+	char temporary[VN_SIZE],temp2[8192];
+	BOOL bReturnLine;
+
+	char parms[8192];
+	lstrcpy( parms, Parameter );
+
+	i2=lstrlen(parms);
+	if(parms[i2-1]==';'){
+		bReturnLine=0;
+		parms[i2-1]=0;
+	}
+	else bReturnLine=1;
+
+	i3=lstrlen(buffer);
+	for(i2=0;;i2++,i3++){
+		if(parms[i2]==';'){
+			buffer[i3]=0;
+			break;
+		}
+		buffer[i3]=parms[i2];
+		if(parms[i2]=='\0') break;
+	}
+	if(parms[i2]==';') i2++;
+
+	if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	//データポインタ、データのタイプをセット
+	i4=0;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(parms[i2]=='\"'){
+				temporary[i3]=parms[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=parms[i2];
+					if(parms[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(parms[i2]=='('){
+				i5=GetStringInPare(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]=='['){
+				i5=GetStringInBracket(temporary+i3,parms+i2);
+				i2+=i5-1;
+				i3+=i5-1;
+				continue;
+			}
+			if(parms[i2]==','){
+				temporary[i3]=0;
+				i2++;
+				break;
+			}
+			temporary[i3]=parms[i2];
+			if(parms[i2]=='\0') break;
+		}
+		if(temporary[0]=='\0'){
+			compiler.errorMessenger.Output(10,"Print",cp);
+			return;
+		}
+
+		int iResult;
+		iResult=IsStrCalculation(temporary);
+
+		if(iResult==1){
+			//文字列
+			sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
+			OpcodeCalc(temp2);
+		}
+		else if(iResult==0){
+			//数値
+			sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
+			OpcodeCalc(temp2);
+
+			sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
+			OpcodeCalc(temp2);
+		}
+		//else if(iResult==-1) エラー
+
+		i4++;
+		if(parms[i2]=='\0') break;
+	}
+	sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
+	OpcodeCalc(temp2);
+
+	const UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINTUSING_ToFile");
+	else pUserProc=GetSubHash("PRINTUSING_ToPrompt");
+	if(!pUserProc){
+		compiler.errorMessenger.Output(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"");
+}
+void Opcode_Print(const char *Parameter,BOOL bWrite){
+	int i2,i3,i4,sw;
+	char temporary[VN_SIZE],buffer[VN_SIZE];
+	BOOL bFile;
+
+	if(Parameter[0]=='#'){
+		bFile=1;
+		for(i2=0,i3=1;;i2++,i3++){
+			buffer[i2]=Parameter[i3];
+			if(Parameter[i3]==','||Parameter[i3]=='\0') break;
+		}
+		buffer[i2+1]=0;
+		if(Parameter[i3]==',') i3++;
+		i2=i3;
+	}
+	else{
+		bFile=0;
+		i2=0;
+		buffer[0]=0;
+	}
+	if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
+		Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
+		return;
+	}
+
+	lstrcat(buffer,"_System_DummyStr+");
+
+	sw=1;
+	while(1){
+		for(i3=0;;i2++,i3++){
+			if(Parameter[i2]=='\"'){
+				temporary[i3]=Parameter[i2];
+				for(i2++,i3++;;i2++,i3++){
+					temporary[i3]=Parameter[i2];
+					if(Parameter[i2]=='\"') break;
+				}
+				continue;
+			}
+			if(Parameter[i2]=='('){
+				i4=GetStringInPare(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]=='['){
+				i4=GetStringInBracket(temporary+i3,Parameter+i2);
+				i2+=i4-1;
+				i3+=i4-1;
+				continue;
+			}
+			if(Parameter[i2]==','||Parameter[i2]==';'){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3]=Parameter[i2];
+			if(Parameter[i2]=='\0') break;
+		}
+
+		if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
+		else{
+			int iResult;
+			iResult=IsStrCalculation(temporary);
+			if(iResult==-1){
+				//エラー
+				lstrcat(buffer,"\"\"");
+			}
+			else if(iResult){
+				//文字列
+				lstrcat(buffer,temporary);
+			}
+			else{
+				//数値
+				sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
+			}
+		}
+
+		if(Parameter[i2]==','){
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\"\t\"+");
+		}
+		else if(Parameter[i2]==';'){
+			if(Parameter[i2+1]=='\0'){
+				sw=0;
+				break;
+			}
+			if(bWrite) lstrcat(buffer,"+\",\"+");
+			else lstrcat(buffer,"+\" \"+");
+		}
+		else if(Parameter[i2]=='\0') break;
+
+		i2++;
+	}
+
+	if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
+
+	const UserProc *pUserProc;
+	if(bFile) pUserProc=GetSubHash("PRINT_ToFile");
+	else pUserProc=GetSubHash("PRINT_ToPrompt");
+	if(!pUserProc){
+		compiler.errorMessenger.Output(3,"Print",cp);
+		return;
+	}
+	Opcode_CallProc(buffer,pUserProc,0,"");
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Overload.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Overload.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Overload.cpp	(revision 774)
@@ -0,0 +1,79 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+const UserProc *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<const UserProc *> &subs,
+	const char *Parameter,
+	const char *ObjectName){
+
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
+
+
+		////////////////////////
+		// パラメータをセット
+		////////////////////////
+
+		ParamImpl *pobj_parameter=0;
+
+		char MethodName[VN_SIZE];
+		if( !SplitMemberName( name, NULL, MethodName ) ) lstrcpy( MethodName, name );
+
+/*
+		//メソッドの場合は静的かどうかを調べる
+		bool isStatic = false;
+		CClass *pClass = subs[0]->GetParentClassPtr();
+		if( pClass ){
+			isStatic = pClass->IsExistStaticMethod( MethodName );
+		}
+*/
+		//パラメータオブジェクトを生成
+		pobj_parameter=new ParamImpl(Parameter);
+
+		Type leftType;
+		GetTermType( ObjectName, leftType );
+
+		const UserProc *pUserProc = pobj_parameter->OverloadSolution( name, subs, leftType );
+
+
+		//パラメータオブジェクトを破棄
+		delete pobj_parameter;
+		pobj_parameter=0;
+
+		return pUserProc;
+}
+const UserProc *OverloadSolution(
+	const char *name,
+	std::vector<const UserProc *> &subs,
+	const Parameters &params,
+	const Type &returnType,
+	const Type &leftType )
+{
+
+		// オーバーロードの解決
+
+		//オーバーロードされていないとき
+		if( subs.size() == 1 ) return subs[0];
+
+
+		ParamImpl *pobj_Parameter=new ParamImpl( params );
+		if( !returnType.IsNull() ){
+			pobj_Parameter->SetReturnType( returnType );
+		}
+
+		const UserProc *pUserProc = pobj_Parameter->OverloadSolution( name, subs, leftType);
+
+		delete pobj_Parameter;
+
+		return pUserProc;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.cpp	(revision 774)
@@ -0,0 +1,132 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+extern HANDLE hHeap;
+
+/////////////////////////////////////////////
+// 再配置スケジュール
+//
+// メモリの再配置は.textセクション、または.dataセクションに行われることが予想される。
+//        .textセクション … セクションデータへのポインタ
+//        .dataセクション … vtblの再配置
+/////////////////////////////////////////////
+
+CReloc *pobj_Reloc;
+
+CReloc::CReloc(){
+	buffer=0;
+	length=0;
+	NowPageRVAToReloc=0;
+}
+CReloc::~CReloc(){
+	AllFree();
+}
+void CReloc::AllFree(void){
+	if(buffer){
+		HeapDefaultFree(buffer);
+		buffer=0;
+	}
+}
+void CReloc::copy(CReloc *por){
+	AllFree();
+
+	if(por->buffer){
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,por->length);
+		memcpy(buffer,por->buffer,por->length);
+	}
+	else buffer=0;
+
+	length=por->length;
+
+	NowPageRVAToReloc=por->NowPageRVAToReloc;
+	NowCountAddrToReloc=por->NowCountAddrToReloc;
+
+	codeSectionAddresses = por->codeSectionAddresses;
+
+	dataSectionAddresses = por->dataSectionAddresses;
+}
+
+void CReloc::AddSchedule_CodeSection(DWORD addr){
+	if( !compiler.IsDll() ) return;
+
+	codeSectionAddresses.push_back( addr );
+}
+void CReloc::AddSchedule_DataSection(DWORD addr){
+	if( !compiler.IsDll() ) return;
+
+	dataSectionAddresses.push_back( addr );
+}
+
+void CReloc::__add(DWORD addr){
+	if( !compiler.IsDll() ) return;
+
+	BOOL sw;
+	sw=0;
+	while((addr-(addr%MEM_ALIGNMENT))>NowPageRVAToReloc){
+		NowPageRVAToReloc+=MEM_ALIGNMENT;
+		sw=1;
+	}
+
+	if(sw){
+		//ページを増やす
+		while(length%4){
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
+			(*(WORD *)(buffer+length))=0;
+			length+=2;
+
+			(*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
+		}
+
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,
+			length+
+			sizeof(DWORD)+
+			sizeof(DWORD));
+
+		//Page RVA
+		*(DWORD *)(buffer+length)=NowPageRVAToReloc;
+		length+=sizeof(DWORD);
+
+		NowCountAddrToReloc=length;
+
+		//Block size
+		*(DWORD *)(buffer+length)=sizeof(DWORD)*2;
+		length+=sizeof(DWORD);
+	}
+
+	//リロケーション情報の追加
+	buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+sizeof(WORD));
+	buffer[length]=0;
+	buffer[length+1]=0x30;	//=IMAGE_REL_BASED_HIGHLOW
+	(*(WORD *)(buffer+length))|=addr&0x0FFF;
+	length+=2;
+
+	(*(DWORD *)(buffer+NowCountAddrToReloc))+=sizeof(WORD);
+}
+void CReloc::ResetRelocBuffer(void){
+	if(buffer) HeapDefaultFree(buffer);
+
+	buffer=(char *)HeapAlloc(hHeap,0,1);
+	length=0;
+	NowPageRVAToReloc=0;
+
+	foreach( DWORD addr, codeSectionAddresses )
+	{
+		extern int MemPos_CodeSection;
+		__add(MemPos_CodeSection + addr);
+	}
+
+	foreach( DWORD addr, dataSectionAddresses )
+	{
+		extern int MemPos_DataSection;
+		__add(MemPos_DataSection + addr);
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/PESchedule.h	(revision 774)
@@ -0,0 +1,37 @@
+#pragma once
+
+
+///////////////////////
+// リロケーション情報
+///////////////////////
+class CReloc{
+public:
+	char *buffer;
+	int length;
+	DWORD NowPageRVAToReloc;
+	DWORD NowCountAddrToReloc;
+
+	CReloc();
+	~CReloc();
+	void AllFree(void);
+	void copy(CReloc *por);
+
+private:
+	std::vector<DWORD> codeSectionAddresses;
+public:
+	void AddSchedule_CodeSection(DWORD addr);
+
+private:
+	std::vector<DWORD> dataSectionAddresses;
+public:
+	void AddSchedule_DataSection(DWORD addr);
+
+private:
+	void __add(DWORD addr);
+public:
+	void ResetRelocBuffer(void);
+};
+extern CReloc *pobj_Reloc;
+
+
+void NativeBuffer_StaticRelocation(int iStartPos,int iSize,int offset);
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/ParamImpl.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/ParamImpl.cpp	(revision 774)
@@ -0,0 +1,368 @@
+#include "stdafx.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+#define OVERLOAD_MIN_LEVEL 0
+#define OVERLOAD_MAX_LEVEL 6
+#define OVERLOAD_LEVEL0 0		// 型調整なし。厳密に等しい
+#define OVERLOAD_LEVEL1 1		// 型調整なし。レベル1以上はオブジェクトの場合は派生関係を考慮
+#define OVERLOAD_LEVEL2 2		// 型調整なし。整数型/実数型レベルでの同一性チェック（サイズ照合あり）
+#define OVERLOAD_LEVEL3 3		// 型調整なし。整数型/実数型レベルでの同一性チェック
+#define OVERLOAD_LEVEL4 4		// 型調整あり。厳密に等しい
+#define OVERLOAD_LEVEL5 5		// 型調整あり。整数型/実数型レベルでの同一性チェック
+#define OVERLOAD_LEVEL6 6		// 型調整あり。数値型/クラス型レベルでの同一性チェック
+
+ParamImpl::ParamImpl(const char *buffer):
+	returnType()
+{
+	///////////////////////////
+	// パラメータ文字列を整理
+	///////////////////////////
+
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	i=0;
+	ParmsNum=0;
+	while(1){
+		if(buffer[i]=='\0') break;
+
+		for(i2=0;;i2++,i++){
+			if(buffer[i]=='\"'){
+				temporary[i2]=buffer[i];
+				for(i++,i2++;;i++,i2++){
+					temporary[i2]=buffer[i];
+					if( buffer[i] == '\0' )
+					{
+						compiler.errorMessenger.OutputFatalError();
+						break;
+					}
+					if(buffer[i]=='\"') break;
+				}
+				continue;
+			}
+
+			if(buffer[i]=='('){
+				i3=GetStringInPare(temporary+i2,buffer+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(buffer[i]=='['){
+				i3=GetStringInBracket(temporary+i2,buffer+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+
+			if(buffer[i]==','||buffer[i]=='\0'){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+
+		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(Parms[ParmsNum],temporary);
+		ParmsNum++;
+
+		types.push_back( Type() );
+
+		if(buffer[i]==',') i++;
+	}
+}
+ParamImpl::ParamImpl(const Parameters &params):
+	returnType()
+{
+	ParmsNum = 0;
+	foreach( Parameter *pParam, params ){
+		Parms[ParmsNum]=0;
+		ParmsNum++;
+
+		types.push_back( *pParam );
+	}
+}
+ParamImpl::~ParamImpl(){
+	int i2;
+
+	//パラメータ文字列を解放
+	for(i2=0;i2<ParmsNum;i2++){
+		if(Parms[i2]==(char *)-1) continue;
+
+		if(Parms[i2]) HeapDefaultFree(Parms[i2]);
+	}
+}
+
+void ParamImpl::SetReturnType( const Type &returnType ){
+	this->returnType = returnType;
+}
+
+bool ParamImpl::EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored ){
+	//パラメータを識別してオーバーロードを解決
+
+	isErrored = false;
+
+	//パラメータの個数が不一致の場合
+	int max = (int)targetParms.size();
+
+	if( ParmsNum > max ){
+		// 実引数が駆り引数より多いとき
+		// ※無条件で不一致
+		return false;
+	}
+
+	Type argType;
+	for(int i=0;i<max;i++){
+		Parameter &param = *targetParms[i];
+
+		Type paramType( param );
+		ResolveFormalGenericTypeParameter( paramType, leftType, &userProc );
+
+		if( i >= ParmsNum ){
+			// 引数が多いとき
+			if( param.GetInitValue().size() > 0 ){
+				// 初期値が指定されているパラメータを考慮
+				return true;
+			}
+			else{
+				return false;
+			}
+		}
+
+		if(Parms[i]){
+			Type nullParam( DEF_NON );
+
+			if( !NumOpe_GetType(Parms[i],
+				( level <= OVERLOAD_LEVEL3 )? nullParam : paramType,
+				argType) )
+			{
+				isErrored = true;
+				return false;
+			}
+		}
+		else{
+			argType = types[i];
+		}
+
+		if( ( argType.IsObject() && paramType.IsObject() ) || argType.GetBasicType() == paramType.GetBasicType() )
+		{
+			if( argType.IsStruct() ){
+				if(argType.GetIndex()!=paramType.GetIndex()){
+					return false;
+				}
+			}
+			else if( argType.IsObject() ){
+				if( level == OVERLOAD_LEVEL0 ){
+					if( !paramType.GetClass().IsEquals( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+				else{
+					if( !paramType.GetClass().IsEqualsOrSubClass( &argType.GetClass() ) ){
+						return false;
+					}
+				}
+			}
+		}
+		else
+		{
+			if( level == OVERLOAD_LEVEL0 || level == OVERLOAD_LEVEL1 || level==OVERLOAD_LEVEL4 ){
+				return false;
+			}
+			else if( level == OVERLOAD_LEVEL2 ){
+				if( !(argType.IsWhole() && paramType.IsWhole() && argType.GetBasicSize() == paramType.GetBasicSize() ) ){
+					// サイズ違い
+					return false;
+				}
+			}
+			else if( level == OVERLOAD_LEVEL3 || level==OVERLOAD_LEVEL5){
+				if(!(
+					argType.IsWhole()&&paramType.IsWhole()||
+					argType.IsReal()&&paramType.IsReal()
+					)){
+						return false;
+				}
+				if( argType.IsPointer() || paramType.IsPointer() )
+				{
+					// ポインタ型の不整合は認めない
+					return false;
+				}
+			}
+			else if(level==OVERLOAD_LEVEL6){
+				if(argType.IsObject()||paramType.IsObject()) return false;
+			}
+		}
+	}
+
+	if( !targetResultType.IsNull() ){
+		//戻り値も比較対象にする
+
+		Type temp( targetResultType );
+		ResolveFormalGenericTypeParameter( temp, leftType, &userProc );
+
+		if( !returnType.Equals( temp ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+
+const UserProc *ParamImpl::_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
+	const UserProc *pUserProc = NULL;
+
+	for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ )
+	{
+		foreach( const UserProc *pTempUserProc, subs )
+		{
+			bool isErrored = false;
+			bool isHit = false;
+			isHit = EvaluateOverloadScore( level, pTempUserProc->Params(), isEnabledReturnType?pTempUserProc->ReturnType():Type(), leftType, *pTempUserProc, isErrored );
+			if( isErrored )
+			{
+				// 照合中にエラーが起きた場合
+				return NULL;
+			}
+
+			if( isHit )
+			{
+				trace_for_overload( "レベル" << level << " ○適合..." << pTempUserProc->_paramStr );
+
+				if( pUserProc ){
+					if( isEnabledReturnType ){
+						compiler.errorMessenger.Output(52,name,cp);
+						return NULL;
+					}
+					else{
+						// 戻り値も比較するモードにして再びオーバーロード解決を試みる
+
+						trace_for_overload( "戻り値も比較するモードに切り替えてオーバーロード解決を試みる" );
+
+						return OverloadSolution( name, subs, leftType, true);
+					}
+				}
+
+				pUserProc = pTempUserProc;
+			}
+			else
+			{
+				trace_for_overload( "レベル" << level << " ×不適合..." << pTempUserProc->_paramStr );
+			}
+		}
+
+		if( pUserProc ) break;
+	}
+
+	if( !pUserProc ){
+		foreach( const UserProc *pTempUserProc, subs )
+		{
+			//エラーチェック
+			if(pTempUserProc->Params().size()==this->ParmsNum)
+			{
+				if( pUserProc )
+				{
+					compiler.errorMessenger.Output(52,name,cp);
+					return NULL;
+				}
+
+				pUserProc=pTempUserProc;
+			}
+		}
+	}
+
+	if( !pUserProc )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	return pUserProc;
+}
+const UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType ){
+	trace_for_overload( "" );
+	trace_for_overload( "■■■■■■■■■■■■■■■■■■" );
+	trace_for_overload( "■■■ オーバーロード解決(" << name << ")" );
+
+	const UserProc *result = _OverloadSolution( name, subs, leftType, isEnabledReturnType );
+
+	trace_for_overload( "■■■ ここまで" );
+	trace_for_overload( "■■■■■■■■■■■■■■■■■■" );
+	trace_for_overload( "" );
+
+	return result;
+}
+
+void ParamImpl::ApplyDefaultParameters( const Parameters &params ){
+	if( ParmsNum == (int)params.size() ){
+		// デフォルト引数の適用が不必要なとき
+		return;
+	}
+
+	while( ParmsNum < (int)params.size() ){
+		Parameter &param = *params[ParmsNum];
+
+		Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,param.GetInitValue().size() + 1 );
+		lstrcpy(Parms[ParmsNum],param.GetInitValue().c_str() );
+		ParmsNum++;
+
+		types.push_back( Type() );
+	}
+}
+
+bool ParamImpl::ErrorCheck( const std::string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	if(ParmsNum>(int)params.size()){
+		if( params.size() == 0 || params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE ){
+			//パラメータが多すぎるとき
+			compiler.errorMessenger.Output(10,procName,cp);
+			return false;
+		}
+	}
+	else if(ParmsNum<(int)params.size()){
+		if(ParmsNum<SecondParmNum){
+			if(params[ParmsNum]->GetBasicType()==DEF_ELLIPSE){
+				return true;
+			}
+
+			//パラメータが少なすぎるとき
+			compiler.errorMessenger.Output(10,procName,cp);
+			return false;
+		}
+
+		//省略パラメータに "0" を指定する
+		while( ParmsNum < (int)params.size() )
+		{
+			extern HANDLE hHeap;
+			char temporary[64];
+			if(params[ParmsNum]->IsRef() == false) lstrcpy(temporary,"0");
+			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
+			Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(Parms[ParmsNum],temporary);
+
+			ParmsNum++;
+
+			types.push_back( Type() );
+		}
+	}
+
+	return true;
+}
+
+void ParamImpl::MacroParameterSupport( const Parameters &params ){
+	for(int i=0;i<ParmsNum;i++){
+		if(Parms[i][0]=='\0'){
+			extern HANDLE hHeap;
+			char temporary[64];
+			if( params[i]->IsRef() == false ) lstrcpy(temporary,"0");
+			else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
+			HeapDefaultFree(Parms[i]);
+			Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(Parms[i],temporary);
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Psapi.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Psapi.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Psapi.h	(revision 774)
@@ -0,0 +1,364 @@
+/*++ BUILD Version: 0001    // Increment this if a change has global effects
+
+Copyright (c) 1994-1999  Microsoft Corporation
+
+Module Name:
+
+    psapi.h
+
+Abstract:
+
+    Include file for APIs provided by PSAPI.DLL
+
+Author:
+
+    Richard Shupak   [richards]  06-Jan-1994
+
+Revision History:
+
+--*/
+
+#ifndef _PSAPI_H_
+#define _PSAPI_H_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BOOL
+WINAPI
+EnumProcesses(
+    DWORD * lpidProcess,
+    DWORD   cb,
+    DWORD * cbNeeded
+    );
+
+BOOL
+WINAPI
+EnumProcessModules(
+    HANDLE hProcess,
+    HMODULE *lphModule,
+    DWORD cb,
+    LPDWORD lpcbNeeded
+    );
+
+DWORD
+WINAPI
+GetModuleBaseNameA(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPSTR lpBaseName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetModuleBaseNameW(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPWSTR lpBaseName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetModuleBaseName  GetModuleBaseNameW
+#else
+#define GetModuleBaseName  GetModuleBaseNameA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+GetModuleFileNameExA(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetModuleFileNameExW(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetModuleFileNameEx  GetModuleFileNameExW
+#else
+#define GetModuleFileNameEx  GetModuleFileNameExA
+#endif // !UNICODE
+
+
+typedef struct _MODULEINFO {
+    LPVOID lpBaseOfDll;
+    DWORD SizeOfImage;
+    LPVOID EntryPoint;
+} MODULEINFO, *LPMODULEINFO;
+
+
+BOOL
+WINAPI
+GetModuleInformation(
+    HANDLE hProcess,
+    HMODULE hModule,
+    LPMODULEINFO lpmodinfo,
+    DWORD cb
+    );
+
+
+BOOL
+WINAPI
+EmptyWorkingSet(
+    HANDLE hProcess
+    );
+
+
+BOOL
+WINAPI
+QueryWorkingSet(
+    HANDLE hProcess,
+    PVOID pv,
+    DWORD cb
+    );
+
+BOOL
+WINAPI
+QueryWorkingSetEx(
+    HANDLE hProcess,
+    PVOID pv,
+    DWORD cb
+    );
+
+BOOL
+WINAPI
+InitializeProcessForWsWatch(
+    HANDLE hProcess
+    );
+
+
+typedef struct _PSAPI_WS_WATCH_INFORMATION {
+    LPVOID FaultingPc;
+    LPVOID FaultingVa;
+} PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;
+
+BOOL
+WINAPI
+GetWsChanges(
+    HANDLE hProcess,
+    PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
+    DWORD cb
+    );
+
+DWORD
+WINAPI
+GetMappedFileNameW(
+    HANDLE hProcess,
+    LPVOID lpv,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetMappedFileNameA(
+    HANDLE hProcess,
+    LPVOID lpv,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetMappedFileName  GetMappedFileNameW
+#else
+#define GetMappedFileName  GetMappedFileNameA
+#endif // !UNICODE
+
+BOOL
+WINAPI
+EnumDeviceDrivers(
+    LPVOID *lpImageBase,
+    DWORD cb,
+    LPDWORD lpcbNeeded
+    );
+
+
+DWORD
+WINAPI
+GetDeviceDriverBaseNameA(
+    LPVOID ImageBase,
+    LPSTR lpBaseName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetDeviceDriverBaseNameW(
+    LPVOID ImageBase,
+    LPWSTR lpBaseName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetDeviceDriverBaseName  GetDeviceDriverBaseNameW
+#else
+#define GetDeviceDriverBaseName  GetDeviceDriverBaseNameA
+#endif // !UNICODE
+
+
+DWORD
+WINAPI
+GetDeviceDriverFileNameA(
+    LPVOID ImageBase,
+    LPSTR lpFilename,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetDeviceDriverFileNameW(
+    LPVOID ImageBase,
+    LPWSTR lpFilename,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetDeviceDriverFileName  GetDeviceDriverFileNameW
+#else
+#define GetDeviceDriverFileName  GetDeviceDriverFileNameA
+#endif // !UNICODE
+
+// Structure for GetProcessMemoryInfo()
+
+typedef struct _PROCESS_MEMORY_COUNTERS {
+    DWORD cb;
+    DWORD PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+} PROCESS_MEMORY_COUNTERS;
+typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
+
+#if (_WIN32_WINNT >= 0x0501)
+
+typedef struct _PROCESS_MEMORY_COUNTERS_EX {
+    DWORD cb;
+    DWORD PageFaultCount;
+    SIZE_T PeakWorkingSetSize;
+    SIZE_T WorkingSetSize;
+    SIZE_T QuotaPeakPagedPoolUsage;
+    SIZE_T QuotaPagedPoolUsage;
+    SIZE_T QuotaPeakNonPagedPoolUsage;
+    SIZE_T QuotaNonPagedPoolUsage;
+    SIZE_T PagefileUsage;
+    SIZE_T PeakPagefileUsage;
+    SIZE_T PrivateUsage;
+} PROCESS_MEMORY_COUNTERS_EX;
+typedef PROCESS_MEMORY_COUNTERS_EX *PPROCESS_MEMORY_COUNTERS_EX;
+
+#endif
+
+BOOL
+WINAPI
+GetProcessMemoryInfo(
+    HANDLE Process,
+    PPROCESS_MEMORY_COUNTERS ppsmemCounters,
+    DWORD cb
+    );
+
+typedef struct _PERFORMANCE_INFORMATION {
+    DWORD cb;
+    SIZE_T CommitTotal;
+    SIZE_T CommitLimit;
+    SIZE_T CommitPeak;
+    SIZE_T PhysicalTotal;
+    SIZE_T PhysicalAvailable;
+    SIZE_T SystemCache;
+    SIZE_T KernelTotal;
+    SIZE_T KernelPaged;
+    SIZE_T KernelNonpaged;
+    SIZE_T PageSize;
+    DWORD HandleCount;
+    DWORD ProcessCount;
+    DWORD ThreadCount;
+} PERFORMANCE_INFORMATION, *PPERFORMANCE_INFORMATION, PERFORMACE_INFORMATION, *PPERFORMACE_INFORMATION;
+
+BOOL
+WINAPI
+GetPerformanceInfo (
+    PPERFORMACE_INFORMATION pPerformanceInformation,
+    DWORD cb
+    );
+
+typedef struct _ENUM_PAGE_FILE_INFORMATION {
+    DWORD cb;
+    DWORD Reserved;
+    SIZE_T TotalSize;
+    SIZE_T TotalInUse;
+    SIZE_T PeakUsage;
+} ENUM_PAGE_FILE_INFORMATION, *PENUM_PAGE_FILE_INFORMATION;
+
+typedef BOOL (*PENUM_PAGE_FILE_CALLBACKW) (LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCWSTR lpFilename);
+
+typedef BOOL (*PENUM_PAGE_FILE_CALLBACKA) (LPVOID pContext, PENUM_PAGE_FILE_INFORMATION pPageFileInfo, LPCSTR lpFilename);
+
+BOOL
+WINAPI
+EnumPageFilesW (
+    PENUM_PAGE_FILE_CALLBACKW pCallBackRoutine,
+    LPVOID pContext
+    );
+
+BOOL
+WINAPI
+EnumPageFilesA (
+    PENUM_PAGE_FILE_CALLBACKA pCallBackRoutine,
+    LPVOID pContext
+    );
+
+#ifdef UNICODE
+#define PENUM_PAGE_FILE_CALLBACK PENUM_PAGE_FILE_CALLBACKW
+#define EnumPageFiles EnumPageFilesW
+#else
+#define PENUM_PAGE_FILE_CALLBACK PENUM_PAGE_FILE_CALLBACKA
+#define EnumPageFiles EnumPageFilesA
+#endif // !UNICODE
+
+DWORD
+WINAPI
+GetProcessImageFileNameA(
+    HANDLE hProcess,
+    LPSTR lpImageFileName,
+    DWORD nSize
+    );
+
+DWORD
+WINAPI
+GetProcessImageFileNameW(
+    HANDLE hProcess,
+    LPWSTR lpImageFileName,
+    DWORD nSize
+    );
+
+#ifdef UNICODE
+#define GetProcessImageFileName  GetProcessImageFileNameW
+#else
+#define GetProcessImageFileName  GetProcessImageFileNameA
+#endif // !UNICODE
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/RSrcSection.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/RSrcSection.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/RSrcSection.cpp	(revision 774)
@@ -0,0 +1,900 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifndef RT_MANIFEST
+#define RT_MANIFEST                        MAKEINTRESOURCE(24)
+#endif
+
+//リソースアドレススケジュール
+DWORD *lpdwRSrcAddrSchedule;
+int RSrcAddrScheduleNum;
+
+void AddRSrcAddrSchedule(DWORD pos){
+	extern HANDLE hHeap;
+
+	//グローバル変数アドレススケジュールに追加する
+	lpdwRSrcAddrSchedule=(DWORD *)HeapReAlloc(hHeap,0,lpdwRSrcAddrSchedule,(RSrcAddrScheduleNum+1)*sizeof(DWORD));
+	lpdwRSrcAddrSchedule[RSrcAddrScheduleNum]=pos;
+	RSrcAddrScheduleNum++;
+}
+
+char *PermutationString(char *buffer,char *lpszSearch,char *lpszRewrite){
+	//バッファ長
+	int length;
+	length=lstrlen(buffer);
+
+	//サーチ文字列の長さ
+	int search_length;
+	search_length=lstrlen(lpszSearch);
+
+	//置換文字列の長さ
+	int write_length;
+	write_length=lstrlen(lpszRewrite);
+
+	//置換時オフセット
+	int offset;
+	offset=lstrlen(lpszRewrite)-search_length;
+
+	int i;
+	for(i=0;i<length-search_length;i++){
+		if(memcmp(buffer+i,lpszSearch,search_length)==0){
+			if(offset>0){
+				length+=offset;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,length+1);
+			}
+
+			SlideString(buffer+i+search_length,offset);
+			memcpy(buffer+i,lpszRewrite,write_length);
+			i+=write_length-1;
+		}
+	}
+
+	return buffer;
+}
+
+char *GetRSrcSectionBuffer(int *pLen){
+	extern HANDLE hHeap;
+	char *buffer,*temporary;
+	int i2,i3,i4,i5,i6,i7,sw,BufSize,TypeNum,NextBase;
+	HANDLE hFile;
+
+	//カーソルリソース
+	int CursorNum;
+	CURSORDIR *pCursorDir;
+	CURSORDIRENTRY *pCursorDirEntry;
+	CURSORDIRENTRY_RES CursorDirEntry_Res;
+	CursorNum=0;
+
+	//アイコンリソース
+	int IconNum;
+	ICONDIR *pIconDir;
+	ICONDIRENTRY *pIconDirEntry;
+	ICONDIRENTRY_RES IconDirEntry_Res;
+	IconNum=0;
+
+	BufSize=8192*2;
+	buffer=(char *)HeapAlloc(hHeap,0,BufSize);
+	i2=0;
+	NextBase=0;
+
+	//リソースアドレススケジュール
+	lpdwRSrcAddrSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
+	RSrcAddrScheduleNum=0;
+
+	*pLen=0;
+
+	if( compiler.resourceManager.cursorResources.empty()
+		&& compiler.resourceManager.bitmapResources.empty()
+		&& compiler.resourceManager.iconResources.empty()
+		&& compiler.resourceManager.manifestFilePath.empty() )
+	{
+		return buffer;
+	}
+
+	sw=0;
+
+	//カーソルの枚数を計算（CursorNumに格納）
+	foreach( const ActiveBasic::Common::ResourceItem &resourceItem, compiler.resourceManager.cursorResources )
+	{
+		hFile=CreateFile(resourceItem.filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,resourceItem.filepath.c_str(),-1);
+			sw=1;
+			continue;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pCursorDir=(CURSORDIR *)temporary;
+		CursorNum+=pCursorDir->idCount;
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ビットマップのファイルの有無を確認
+	foreach( const ActiveBasic::Common::ResourceItem &resourceItem, compiler.resourceManager.bitmapResources )
+	{
+		hFile=CreateFile(resourceItem.filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,resourceItem.filepath.c_str(),-1);
+			sw=1;
+			continue;
+		}
+		CloseHandle(hFile);
+	}
+
+	//アイコンの枚数を計算（IconNumに格納）
+	foreach( const ActiveBasic::Common::ResourceItem &resourceItem, compiler.resourceManager.iconResources )
+	{
+		hFile=CreateFile(resourceItem.filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,resourceItem.filepath.c_str(),-1);
+			sw=1;
+			continue;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pIconDir=(ICONDIR *)temporary;
+		IconNum+=pIconDir->idCount;
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ファイルの読み込みに失敗した場合
+	if(sw) return buffer;
+
+
+	/////////////////////////
+	// ディレクトリ エントリ
+	/////////////////////////
+	TypeNum=0;
+	if( !compiler.resourceManager.cursorResources.empty() ) TypeNum+=2;
+	if( !compiler.resourceManager.bitmapResources.empty() ) TypeNum++;
+	if( !compiler.resourceManager.iconResources.empty() ) TypeNum+=2;
+	if( !compiler.resourceManager.manifestFilePath.empty() ) TypeNum++;
+
+	NextBase=sizeof(IMAGE_RESOURCE_DIRECTORY)+
+		sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*TypeNum;
+
+	//1階層
+	IMAGE_RESOURCE_DIRECTORY ImgResDir;
+	ImgResDir.Characteristics=0;
+	ImgResDir.TimeDateStamp=0;
+	ImgResDir.MajorVersion=0;
+	ImgResDir.MinorVersion=0;
+	ImgResDir.NumberOfNamedEntries=0;
+	ImgResDir.NumberOfIdEntries=TypeNum;
+	memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+	i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+	i6=0;
+	IMAGE_RESOURCE_DIRECTORY_ENTRY ImgDirEntry;
+	if(CursorNum){
+		//RT_CURSOR
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_CURSOR;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*CursorNum;
+	}
+	if( !compiler.resourceManager.bitmapResources.empty() ){
+		//RT_BITMAP
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_BITMAP;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY) * compiler.resourceManager.bitmapResources.size();
+	}
+	if(IconNum){
+		//RT_ICON
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_ICON;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*IconNum;
+	}
+	if( !compiler.resourceManager.cursorResources.empty() )
+	{
+		//RT_GROUP_CURSOR
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_GROUP_CURSOR;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)*CursorNum;
+	}
+	if( !compiler.resourceManager.iconResources.empty() )
+	{
+		//RT_GROUP_ICON
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_GROUP_ICON;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY) * compiler.resourceManager.iconResources.size();
+	}
+	if( !compiler.resourceManager.manifestFilePath.empty() )
+	{
+		//RT_MANIFEST
+		ImgDirEntry.Name=(DWORD)(LONG_PTR)RT_MANIFEST;
+		ImgDirEntry.OffsetToData=(NextBase+i6)|0x80000000;
+		memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+
+		//2階層のサイズ
+		i6+=	sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY) * 1/*XPManiResourceNum*/ ;
+	}
+
+	NextBase+=i6;
+
+	//2階層
+	i6=0;
+	i7=0;
+	if(CursorNum){
+		//RT_CURSOR
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=CursorNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<CursorNum;i3++,i7++){
+			ImgDirEntry.Name=i7+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*CursorNum;
+	}
+	if( !compiler.resourceManager.bitmapResources.empty() ){
+		//RT_BITMAP
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries = compiler.resourceManager.bitmapResources.size();
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.bitmapResources.size());i3++)
+		{
+			ImgDirEntry.Name = static_cast<DWORD>(compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+				ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol(
+					compiler.resourceManager.bitmapResources[i3].idName
+				)
+			));
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)) * compiler.resourceManager.bitmapResources.size();
+	}
+	if(IconNum){
+		//RT_ICON
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries=IconNum;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<IconNum;i3++,i7++){
+			ImgDirEntry.Name=i7+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*IconNum;
+	}
+	if( !compiler.resourceManager.cursorResources.empty() )
+	{
+		//RT_GROUP_CURSOR
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries = compiler.resourceManager.cursorResources.size();
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.cursorResources.size());i3++){
+			ImgDirEntry.Name = static_cast<DWORD>(compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+				ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol(
+					compiler.resourceManager.cursorResources[i3].idName
+				)
+			));
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)) * compiler.resourceManager.cursorResources.size();
+	}
+	if( !compiler.resourceManager.iconResources.empty() )
+	{
+		//RT_GROUP_ICON
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries = compiler.resourceManager.iconResources.size();
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.iconResources.size());i3++){
+			ImgDirEntry.Name = static_cast<DWORD>(compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+				ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol(
+					compiler.resourceManager.iconResources[i3].idName
+				)
+			));
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		//3階層のサイズ
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)) * compiler.resourceManager.iconResources.size();
+	}
+	if( !compiler.resourceManager.manifestFilePath.empty() )
+	{
+		//RT_MANIFEST
+		ImgResDir.Characteristics=0;
+		ImgResDir.TimeDateStamp=0;
+		ImgResDir.MajorVersion=0;
+		ImgResDir.MinorVersion=0;
+		ImgResDir.NumberOfNamedEntries=0;
+		ImgResDir.NumberOfIdEntries = 1 /*XPManiResourceNum*/ ;
+		memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+		i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+		i3 = 0;
+		{
+			ImgDirEntry.Name=i3+1;
+			ImgDirEntry.OffsetToData=(NextBase+i6+
+				(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+				sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY))*i3)
+				|0x80000000;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=(sizeof(IMAGE_RESOURCE_DIRECTORY)+
+			sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)) * 1 /*XPManiResourceNum*/ ;
+	}
+
+
+	NextBase+=i6;
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+	//3階層
+	i6=0;
+	if(CursorNum){
+		//RT_CURSOR
+		for(i3=0;i3<CursorNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*CursorNum;
+	}
+	if( !compiler.resourceManager.bitmapResources.empty() ){
+		//RT_BITMAP
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.bitmapResources.size());i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY) * compiler.resourceManager.bitmapResources.size();
+	}
+	if(IconNum){
+		//RT_ICON
+		for(i3=0;i3<IconNum;i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*IconNum;
+	}
+	if( !compiler.resourceManager.cursorResources.empty() )
+	{
+		//RT_GROUP_CURSOR
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.cursorResources.size());i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY) * compiler.resourceManager.cursorResources.size();
+	}
+	if( !compiler.resourceManager.iconResources.empty() )
+	{
+		//RT_GROUP_ICON
+		for(i3=0;i3<static_cast<int>(compiler.resourceManager.iconResources.size());i3++){
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY)*compiler.resourceManager.iconResources.size();
+	}
+	if( !compiler.resourceManager.manifestFilePath.empty() ){
+		//RT_MANIFEST
+		i3 = 0;
+		{
+			ImgResDir.Characteristics=0;
+			ImgResDir.TimeDateStamp=0;
+			ImgResDir.MajorVersion=0;
+			ImgResDir.MinorVersion=0;
+			ImgResDir.NumberOfNamedEntries=0;
+			ImgResDir.NumberOfIdEntries=1;
+			memcpy(buffer+i2,&ImgResDir,sizeof(IMAGE_RESOURCE_DIRECTORY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY);
+
+			ImgDirEntry.Name=0x411;
+			ImgDirEntry.OffsetToData=NextBase+i6+
+				sizeof(IMAGE_RESOURCE_DATA_ENTRY)*i3;
+			memcpy(buffer+i2,&ImgDirEntry,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY));
+			i2+=sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY);
+		}
+
+		i6+=sizeof(IMAGE_RESOURCE_DATA_ENTRY) * 1 /*XPManiResourceNum*/ ;
+	}
+
+	NextBase+=i6;
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+
+
+	////////////////////////////////////////
+	// データ エントリ
+	////////////////////////////////////////
+
+	DWORD dwDataEntrySchedule[100];
+	int DataEntryScheduleNum;
+	int CursorEntryBase;
+	int CursorGroupEntryBase;
+	int BitmapEntryBase;
+	int IconEntryBase;
+	int IconGroupEntryBase;
+
+	DataEntryScheduleNum=0;
+
+	//空のデータエントリ領域を作成
+
+	//RT_CURSOR
+	CursorEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<CursorNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_BITMAP
+	BitmapEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<static_cast<int>(compiler.resourceManager.bitmapResources.size());i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_ICON
+	IconEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<IconNum;i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_GROUP_CURSOR
+	CursorGroupEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<static_cast<int>(compiler.resourceManager.cursorResources.size());i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_GROUP_ICON
+	IconGroupEntryBase=DataEntryScheduleNum;
+	for(i3=0;i3<static_cast<int>(compiler.resourceManager.iconResources.size());i3++){
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	//RT_MANIFEST
+	int XPManiEntryBase;
+	XPManiEntryBase=DataEntryScheduleNum;
+	i3 = 0;
+	{
+		dwDataEntrySchedule[DataEntryScheduleNum]=i2;
+		DataEntryScheduleNum++;
+		memset(buffer+i2,0,sizeof(IMAGE_RESOURCE_DATA_ENTRY));
+		i2+=sizeof(IMAGE_RESOURCE_DATA_ENTRY);
+	}
+
+	i4=i2%8;
+	if(i4){
+		memset(buffer+i2,0,8-i4);
+		i2+=8-i4;
+	}
+
+	while(i2+8192>BufSize){
+		BufSize+=8192;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+	}
+
+
+	///////////////////////////////////////
+	// バイナリ データ
+	// ※データエントリの内容も変更する
+	///////////////////////////////////////
+
+	IMAGE_RESOURCE_DATA_ENTRY *pImgDataEntry;
+
+	i7=0;
+
+	//カーソルリソース
+	for(i3=0,i6=0;i3<static_cast<int>(compiler.resourceManager.cursorResources.size());i3++){
+		hFile=CreateFile(compiler.resourceManager.cursorResources[i3].filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,compiler.resourceManager.cursorResources[i3].filepath.c_str(),-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pCursorDir=(CURSORDIR *)temporary;
+
+		for(i5=0;i5<pCursorDir->idCount;i5++,i6++){
+			pCursorDirEntry=(CURSORDIRENTRY *)(temporary+sizeof(CURSORDIR)+sizeof(CURSORDIRENTRY)*i5);
+
+			//データエントリ
+			pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[CursorEntryBase+i6]);
+			pImgDataEntry->OffsetToData=i2;
+			pImgDataEntry->Size=pCursorDirEntry->dwBytesInRes+sizeof(WORD)*2;
+			AddRSrcAddrSchedule(dwDataEntrySchedule[CursorEntryBase+i6]);
+
+			//RT_CURSOR バイナリ データ
+			*(WORD *)(buffer+i2)=0x001F;
+			i2+=sizeof(WORD);
+			*(WORD *)(buffer+i2)=0x001F;
+			i2+=sizeof(WORD);
+			memcpy(buffer+i2,temporary+pCursorDirEntry->dwImageOffset,pCursorDirEntry->dwBytesInRes);
+			i2+=pCursorDirEntry->dwBytesInRes;
+
+			i4=i2%8;
+			if(i4){
+				memset(buffer+i2,0,8-i4);
+				i2+=8-i4;
+			}
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[CursorGroupEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=sizeof(CURSORDIR)+0xE*pCursorDir->idCount;
+		AddRSrcAddrSchedule(dwDataEntrySchedule[CursorGroupEntryBase+i3]);
+
+		//RT_GROUP_CURSORヘッダデータ（CURSORDIR）
+		memcpy(buffer+i2,temporary,sizeof(CURSORDIR));
+		i2+=sizeof(CURSORDIR);
+
+		for(i5=0;i5<pCursorDir->idCount;i5++,i7++){
+			pCursorDirEntry=(CURSORDIRENTRY *)(temporary+sizeof(CURSORDIR)+sizeof(CURSORDIRENTRY)*i5);
+			CursorDirEntry_Res.wWidth=pCursorDirEntry->bWidth;
+			CursorDirEntry_Res.wHeight=CursorDirEntry_Res.wWidth*2;
+			CursorDirEntry_Res.wXHotspot=pCursorDirEntry->wXHotspot;
+			CursorDirEntry_Res.wYHotspot=pCursorDirEntry->wYHotspot;
+			CursorDirEntry_Res.dwBytesInRes=pCursorDirEntry->dwBytesInRes+sizeof(WORD)*2;
+			CursorDirEntry_Res.wCursorNum=i7+1;
+
+			//RT_GROUP_CURSORヘッダデータ（CURSORDIRENTRY_RES）
+			memcpy(buffer+i2,&CursorDirEntry_Res,0xE);
+			i2+=0xE;
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+		i4=i2%8;
+		if(i4){
+			memset(buffer+i2,0,8-i4);
+			i2+=8-i4;
+		}
+
+		HeapDefaultFree(temporary);
+	}
+
+	//ビットマップリソース
+	for(i3=0;i3<static_cast<int>(compiler.resourceManager.bitmapResources.size());i3++){
+		hFile=CreateFile(compiler.resourceManager.bitmapResources[i3].filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,compiler.resourceManager.bitmapResources[i3].filepath.c_str(),-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		BufSize+=i4;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[BitmapEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=i4-sizeof(BITMAPFILEHEADER);
+		AddRSrcAddrSchedule(dwDataEntrySchedule[BitmapEntryBase+i3]);
+
+		//RT_BITMAP バイナリ データ
+		memcpy(buffer+i2,temporary+sizeof(BITMAPFILEHEADER),i4-sizeof(BITMAPFILEHEADER));
+		i2+=i4-sizeof(BITMAPFILEHEADER);
+
+		HeapDefaultFree(temporary);
+	}
+
+	//アイコンリソース
+	for(i3=0,i6=0;i3<static_cast<int>(compiler.resourceManager.iconResources.size());i3++){
+		hFile=CreateFile(compiler.resourceManager.iconResources[i3].filepath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(23,compiler.resourceManager.iconResources[i3].filepath.c_str(),-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		CloseHandle(hFile);
+
+		pIconDir=(ICONDIR *)temporary;
+
+		for(i5=0;i5<pIconDir->idCount;i5++,i6++){
+			pIconDirEntry=(ICONDIRENTRY *)(temporary+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i5);
+
+			//データエントリ
+			pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[IconEntryBase+i6]);
+			pImgDataEntry->OffsetToData=i2;
+			pImgDataEntry->Size=pIconDirEntry->dwBytesInRes;
+			AddRSrcAddrSchedule(dwDataEntrySchedule[IconEntryBase+i6]);
+
+			//RT_ICON バイナリ データ
+			memcpy(buffer+i2,temporary+pIconDirEntry->dwImageOffset,pIconDirEntry->dwBytesInRes);
+			i2+=pIconDirEntry->dwBytesInRes;
+
+			i4=i2%8;
+			if(i4){
+				memset(buffer+i2,0,8-i4);
+				i2+=8-i4;
+			}
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[IconGroupEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=sizeof(ICONDIR)+0xE*pIconDir->idCount;
+		AddRSrcAddrSchedule(dwDataEntrySchedule[IconGroupEntryBase+i3]);
+
+		//RT_GROUP_ICONヘッダデータ（ICONDIR）
+		memcpy(buffer+i2,temporary,sizeof(ICONDIR));
+		i2+=sizeof(ICONDIR);
+
+		for(i5=0;i5<pIconDir->idCount;i5++,i7++){
+			pIconDirEntry=(ICONDIRENTRY *)(temporary+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i5);
+			IconDirEntry_Res.bWidth=pIconDirEntry->bWidth;
+			IconDirEntry_Res.bHeight=pIconDirEntry->bHeight;
+			IconDirEntry_Res.bColorCount=pIconDirEntry->bColorCount;
+			IconDirEntry_Res.bReserved=0;
+			IconDirEntry_Res.wPlanes=1;
+			if(pIconDirEntry->bColorCount==16)
+				IconDirEntry_Res.wBitCount=4;
+			else if(pIconDirEntry->bColorCount==0)
+				IconDirEntry_Res.wBitCount=8;
+			IconDirEntry_Res.dwBytesInRes=pIconDirEntry->dwBytesInRes;
+			IconDirEntry_Res.wIconNum=i7+1;
+
+			//RT_GROUP_ICONヘッダデータ（ICONDIRENTRY_RES）
+			memcpy(buffer+i2,&IconDirEntry_Res,0xE);
+			i2+=0xE;
+
+			while(i2+8192>BufSize){
+				BufSize+=8192;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+			}
+		}
+		i4=i2%8;
+		if(i4){
+			memset(buffer+i2,0,8-i4);
+			i2+=8-i4;
+		}
+
+		HeapDefaultFree(temporary);
+	}
+
+	//XPManifestリソース
+	i3 = 0;
+	if( !compiler.resourceManager.manifestFilePath.empty() )
+	{
+		hFile=CreateFile(compiler.resourceManager.manifestFilePath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE){
+			compiler.errorMessenger.Output(59,compiler.resourceManager.manifestFilePath.c_str(),-1);
+			return buffer;
+		}
+		i4=GetFileSize(hFile,NULL);
+		temporary=(char *)HeapAlloc(hHeap,0,i4+1);
+		ReadFile(hFile,temporary,i4,(DWORD *)&i5,NULL);
+		temporary[i4]=0;
+		CloseHandle(hFile);
+
+		//プラットフォームをセット
+#ifdef _AMD64_
+		temporary=PermutationString(temporary,"#PLATFORM#","amd64");
+#else
+		temporary=PermutationString(temporary,"#PLATFORM#","x86");
+#endif
+
+		//アプリケーション名をセット
+		char szAppliName[MAX_PATH];
+		char temp2[MAX_PATH];
+		_splitpath( program.GetOutputFilePath().c_str(),NULL,NULL,szAppliName,temp2);
+		lstrcat(szAppliName,temp2);
+		temporary=PermutationString(temporary,"#APPLI_FILE_NAME#",szAppliName);
+
+		i4=lstrlen(temporary)+1;
+
+		BufSize+=i4;
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+
+		//データエントリ
+		pImgDataEntry=(IMAGE_RESOURCE_DATA_ENTRY *)(buffer+dwDataEntrySchedule[XPManiEntryBase+i3]);
+		pImgDataEntry->OffsetToData=i2;
+		pImgDataEntry->Size=i4-1;	//※NULL文字はサイズに含めない
+		AddRSrcAddrSchedule(dwDataEntrySchedule[XPManiEntryBase+i3]);
+
+		//XMLデータ
+		memcpy(buffer+i2,temporary,i4);
+		i2+=i4;
+
+		HeapDefaultFree(temporary);
+	}
+
+	*pLen=i2;
+
+	return buffer;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.cpp	(revision 774)
@@ -0,0 +1,895 @@
+#include "stdafx.h"
+
+void KillSpaces(char *str1,char *str2){
+	int i,i2,i3,IsStr;
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if((str1[i]==' '||str1[i]=='\t')&&IsStr==0){
+			i3=i+1;
+			while(str1[i3]==' '||str1[i3]=='\t') i3++;
+			if(i!=0){
+				if(i==1){
+					if(IsVariableChar(str1[i-1])&&
+						IsVariableChar(str1[i3])){
+						//識別子間にある省略すべきでない空白
+						str2[i2++]=' ';
+					}
+				}
+				else{
+					if(str1[i-2]!=1&&IsVariableChar(str1[i-1])&&
+						IsVariableChar(str1[i3])){
+						//識別子間にある省略すべきでない空白
+						str2[i2++]=' ';
+					}
+				}
+			}
+			i=i3;
+		}
+		if(str1[i]=='\"') IsStr^=1;
+		str2[i2]=str1[i];
+		if(str1[i]=='\0') break;
+	}
+}
+void KillStringSpaces(char *str){
+	char *s2;
+
+	extern HANDLE hHeap;
+	s2=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
+	lstrcpy(s2,str);
+	KillSpaces(s2,str);
+	HeapDefaultFree(s2);
+	return;
+}
+BOOL RemoveStringQuotes(char *str){
+	int i;
+	if(str[0]!='\"') return 0;
+	for(i=0;;i++){
+		str[i]=str[i+1];
+		if(str[i]=='\"') break;
+	}
+	str[i]=0;
+	if(str[i+2]!='\0') return 0;
+	return 1;
+}
+bool RemoveStringQuotes( std::string &str )
+{
+	if( str[0] != '\"' )
+	{
+		return false;
+	}
+
+	str = str.substr( 1, str.length() - 2 );
+	return true;
+}
+void RemoveStringPare(char *str){
+	int i;
+	i=lstrlen(str);
+	if(str[0]!='('||str[i-1]!=')') return;
+	SlideString(str+1,-1);
+	str[i-2]=0;
+}
+void RemoveStringBracket(char *str){
+	int i;
+	i=lstrlen(str);
+	if(str[0]!='['||str[i-1]!=']') return;
+	SlideString(str+1,-1);
+	str[i-2]=0;
+}
+void SetStringQuotes(char *str){
+	int i;
+	if(str[0]=='\"') return;
+	i=lstrlen(str);
+	SlideString(str,1);
+	str[0]='\"';
+	str[i+1]='\"';
+	str[i+2]=0;
+}
+int FormatString_EscapeSequence(char *buffer){
+	int i2,i3,i4;
+
+	for(i2=0,i3=0;;i2++,i3++){
+		if(IsDBCSLeadByte(buffer[i3])){
+			buffer[i2++]=buffer[i3++];
+			buffer[i2]=buffer[i3];
+			if(buffer[i3]=='\0') break;
+			continue;
+		}
+		if(buffer[i3]=='\\'){
+			switch(buffer[i3+1]){
+				case '\\':
+					buffer[i2]='\\';
+					i3++;
+					break;
+				case '0':
+					buffer[i2]='\0';
+					i3++;
+					break;
+				case 'n':
+					buffer[i2]='\n';
+					i3++;
+					break;
+				case 'q':
+					buffer[i2]='\"';
+					i3++;
+					break;
+				case 'r':
+					buffer[i2]='\r';
+					i3++;
+					break;
+				case 't':
+					buffer[i2]='\t';
+					i3++;
+					break;
+				case 'x':
+					//16進表記
+					char temporary[8];
+					temporary[0]=buffer[i3+2];
+					temporary[1]=buffer[i3+3];
+					temporary[2]=0;
+					CharUpper(temporary);
+
+					i4=temporary[0]-0x30;
+					if(i4<0||9<i4){
+						i4=temporary[0]-0x41+10;
+						if(i4<0xA||0xF<i4){
+							buffer[i2]=buffer[i3];
+							break;
+						}
+					}
+					temporary[0]=i4;
+
+					i4=temporary[1]-0x30;
+					if(i4<0||9<i4){
+						i4=temporary[1]-0x41+10;
+						if(i4<0xA||0xF<i4){
+							buffer[i2]=buffer[i3];
+							break;
+						}
+					}
+					temporary[1]=i4;
+
+					buffer[i2]=temporary[0]*0x10+temporary[1];
+					i3+=3;
+					break;
+				default:
+					buffer[i2]=buffer[i3];
+					break;
+			}
+		}
+		else{
+			buffer[i2]=buffer[i3];
+			if(buffer[i3]=='\0') break;
+		}
+	}
+	return i2;
+}
+void SlideString(char *buffer, int slide){
+	Text::SlideString(buffer,slide);
+}
+void SlideBuffer(char *buffer,int length,int slide){
+	memmove(buffer+slide,buffer,length);
+}
+
+int GetSourceCodeIndexFromLine( const char *source, int LineNum ){
+	int i,nCount=0;
+	for(i=0;;i++){
+		if(source[i]=='\n'){
+			nCount++;
+			if(LineNum==nCount){
+				for(i++;;i++){
+					if(IsCommandDelimitation(source[i])) break;
+				}
+				return i;
+			}
+		}
+	}
+}
+
+char GetEndXXXCommand(char es){
+	switch(es){
+		case ESC_SUB:
+			return ESC_ENDSUB;
+		case ESC_FUNCTION:
+			return ESC_ENDFUNCTION;
+		case ESC_MACRO:
+			return ESC_ENDMACRO;
+		case ESC_TYPE:
+			return ESC_ENDTYPE;
+		case ESC_CLASS:
+			return ESC_ENDCLASS;
+		case ESC_INTERFACE:
+			return ESC_ENDINTERFACE;
+		case ESC_ENUM:
+			return ESC_ENDENUM;
+	}
+	return 0;
+}
+void GetDefaultNameFromES(char es,char *name){
+	name[0]=0;
+	switch(es){
+		case ESC_PSMEM:
+			lstrcpy(name,"->");
+			break;
+		case ESC_MOD:
+			lstrcpy(name,"Mod");
+			break;
+		case ESC_AND:
+			lstrcpy(name,"And");
+			break;
+		case ESC_OR:
+			lstrcpy(name,"Or");
+			break;
+		case ESC_XOR:
+			lstrcpy(name,"Xor");
+			break;
+		case ESC_NOT:
+			lstrcpy(name,"Not");
+			break;
+		case ESC_AS:
+			lstrcpy(name,"As");
+			break;
+		case ESC_THEN:
+			lstrcpy(name,"Then");
+			break;
+		case ESC_ELSE:
+			lstrcpy(name,"Else");
+			break;
+		case ESC_IF:
+			lstrcpy(name,"If");
+			break;
+		case ESC_ELSEIF:
+			lstrcpy(name,"ElseIf");
+			break;
+		case ESC_ENDIF:
+			lstrcpy(name,"End If");
+			break;
+		case ESC_DEF:
+			lstrcpy(name,"Def");
+			break;
+		case ESC_DECLARE:
+			lstrcpy(name,"Declare");
+			break;
+		case ESC_ABSTRACT:
+			lstrcpy(name,"Abstract");
+			break;
+		case ESC_VIRTUAL:
+			lstrcpy(name,"Virtual");
+			break;
+		case ESC_OVERRIDE:
+			lstrcpy(name,"Override");
+			break;
+		case ESC_SUB:
+			lstrcpy(name,"Sub");
+			break;
+		case ESC_ENDSUB:
+			lstrcpy(name,"End Sub");
+			break;
+		case ESC_EXITSUB:
+			lstrcpy(name,"Exit Sub");
+			break;
+		case ESC_FUNCTION:
+			lstrcpy(name,"Function");
+			break;
+		case ESC_ENDFUNCTION:
+			lstrcpy(name,"End Function");
+			break;
+		case ESC_EXITFUNCTION:
+			lstrcpy(name,"Exit Function");
+			break;
+		case ESC_BYVAL:
+			lstrcpy(name,"ByVal ");
+			break;
+		case ESC_BYREF:
+			lstrcpy(name,"ByRef ");
+			break;
+		case ESC_TYPE:
+			lstrcpy(name,"Type");
+			break;
+		case ESC_ENDTYPE:
+			lstrcpy(name,"End Type");
+			break;
+		case ESC_EXITFOR:
+			lstrcpy(name,"Exit For");
+			break;
+		case ESC_EXITWHILE:
+			lstrcpy(name,"Exit While");
+			break;
+		case ESC_EXITDO:
+			lstrcpy(name,"Exit Do");
+			break;
+		case ESC_SELECTCASE:
+			lstrcpy(name,"Select Case");
+			break;
+		case ESC_CASE:
+			lstrcpy(name,"Case");
+			break;
+		case ESC_CASEELSE:
+			lstrcpy(name,"Case Else");
+			break;
+		case ESC_ENDSELECT:
+			lstrcpy(name,"End Select");
+			break;
+		case ESC_CONST:
+			lstrcpy(name,"Const");
+			break;
+		case ESC_TYPEDEF:
+			lstrcpy(name,"TypeDef");
+			break;
+		case ESC_WITH:
+			lstrcpy(name,"With");
+			break;
+		case ESC_ENDWITH:
+			lstrcpy(name,"End With");
+			break;
+		case ESC_CDECL:
+			lstrcpy(name,"cdecl");
+			break;
+		case ESC_MACRO:
+			lstrcpy(name,"Macro");
+			break;
+		case ESC_ENDMACRO:
+			lstrcpy(name,"End Macro");
+			break;
+		case ESC_EXITMACRO:
+			lstrcpy(name,"Exit Macro");
+			break;
+		case ESC_EXPORT:
+			lstrcpy(name,"Export");
+			break;
+		case ESC_CONTINUE:
+			lstrcpy(name,"Continue");
+			break;
+		case ESC_CLASS:
+			lstrcpy(name,"Class");
+			break;
+		case ESC_ENDCLASS:
+			lstrcpy(name,"End Class");
+			break;
+		case ESC_INTERFACE:
+			lstrcpy(name,"Interface");
+			break;
+		case ESC_ENDINTERFACE:
+			lstrcpy(name,"End Interface");
+			break;
+		case ESC_ENUM:
+			lstrcpy(name,"Enum");
+			break;
+		case ESC_ENDENUM:
+			lstrcpy(name,"End Enum");
+			break;
+		case ESC_OPERATOR:
+			lstrcpy( name, "Operator" );
+			break;
+	}
+}
+const std::string &FormatEscapeSequenceStringToDefaultString( const std::string &source )
+{
+	int maxLength = (int)source.size();
+
+	char *temporary = (char *)malloc( source.size() + 8192 );
+	lstrcpy( temporary, source.c_str() );
+
+	for( int i=0; i<maxLength-1; i++ )
+	{
+		if( temporary[i] == 1 )
+		{
+			int esc = temporary[i+1];
+			char temp2[255];
+			GetDefaultNameFromES( esc, temp2 );
+			if( i>0 )
+			{
+				char temp3[255];
+				wsprintf( temp3, " %s", temp2 );
+				lstrcpy( temp2, temp3 );
+			}
+			if( i<maxLength-2 )
+			{
+				lstrcat( temp2, " " );
+			}
+
+			int slide = 2;
+
+			if( esc == ESC_OPERATOR )
+			{
+				extern char const *calcNames[256];
+				unsigned char calcId = temporary[i+2];
+				if( calcNames[calcId] )
+				{
+					lstrcat( temp2, calcNames[calcId] );
+				}
+				slide = 3;
+			}
+
+			int length = lstrlen( temp2 );
+			SlideString( temporary + i+slide, length-slide );
+			memcpy( temporary + i, temp2, length );
+			maxLength = lstrlen( temporary );
+		}
+	}
+
+	static std::string resultStr = temporary;
+
+	free( temporary );
+
+	return resultStr;
+}
+
+bool IsFileExist(const char *path){
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind;
+
+	hFind=FindFirstFile(path,&wfd);
+	if(hFind==INVALID_HANDLE_VALUE){
+		return false;
+	}
+	FindClose(hFind);
+
+	return true;
+}
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle){
+	BROWSEINFO BrowseInfo;
+	LPITEMIDLIST pidlBrowse;
+	char temporary[MAX_PATH];
+
+	BrowseInfo.hwndOwner=hWnd;
+	BrowseInfo.pszDisplayName=temporary;
+	BrowseInfo.pidlRoot=NULL;
+	BrowseInfo.lpszTitle=OpenFolderTitle;
+	BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
+	BrowseInfo.lpfn=NULL;
+	BrowseInfo.lParam=(LPARAM)0;
+	BrowseInfo.iImage=0;
+	pidlBrowse=SHBrowseForFolder(&BrowseInfo);
+	if(pidlBrowse){
+		BOOL ret = SHGetPathFromIDList(pidlBrowse,folder);
+		CoTaskMemFree(pidlBrowse);
+		return ret;
+	}
+	return 0;
+}
+
+void ShortPathToLongPath(const char *ShortPath,char *LongPath){
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	int i;
+	char dummy[MAX_PATH];
+	for(i=0;i<MAX_PATH;i++){
+		LongPath[i]=ShortPath[i];
+		if((ShortPath[i-1]==':'&&ShortPath[i]=='\\')||(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\')){
+			LongPath[i+1]=0;
+			break;
+		}
+	}
+	if(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\'){
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+	}
+	for(i++;i<MAX_PATH;i++){
+		if(IsDBCSLeadByte(ShortPath[i])){
+			i++;
+			continue;
+		}
+		if(ShortPath[i]=='\\'||ShortPath[i]=='\0'){
+			strncpy(dummy,ShortPath,i);
+			dummy[i]=0;
+			if((hFind=FindFirstFile(dummy,&wfd))!=INVALID_HANDLE_VALUE) FindClose(hFind);
+			lstrcat(LongPath,wfd.cFileName);
+
+			if(ShortPath[i]=='\0') break;
+			lstrcat(LongPath,"\\");
+
+			if(ShortPath[i]=='\\'&&ShortPath[i+1]=='\0'){
+				break;
+			}
+		}
+	}
+}
+
+
+bool IsVariableTopChar(char c){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_')
+	{
+		return true;
+	}
+	return false;
+}
+bool IsVariableChar( char c, bool isGenericsChars ){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
+		c=='%'||c=='!'||c=='#'||c=='$'||
+		c=='_'||c=='.')
+	{
+		return true;
+	}
+
+	if( isGenericsChars )
+	{
+		if( c == '<' || c == '>' )
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+bool IsBlank(char c){
+	if(c==' '||c=='\t') return 1;
+	return 0;
+}
+int GetOneParameter(const char *Parameter,int pos,char *retAns){
+	int i,i2,i3,IsStr;
+	for(i=pos,i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		else if(Parameter[i]=='('&&IsStr==0){
+			i3=GetStringInPare(retAns+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Parameter[i]=='['&&IsStr==0){
+			i3=GetStringInBracket(retAns+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Parameter[i]==','&&IsStr==0){
+			retAns[i2]=0;
+			i++;
+			break;
+		}
+
+		if(IsCommandDelimitation(Parameter[i])&&IsStr==0
+			|| Parameter[i] == ')' && IsStr == 0 ){
+				retAns[i2]=0;
+				break;
+		}
+
+		retAns[i2]=Parameter[i];
+	}
+	return i;
+}
+int JumpOneParameter(char *Parameter,int i){
+	int i2,IsStr;
+	for(i2=0,IsStr=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		else if(Parameter[i]=='('&&IsStr==0){
+			i=JumpStringInPare(Parameter,i+1);
+			continue;
+		}
+		else if(Parameter[i]=='['&&IsStr==0){
+			i=JumpStringInBracket(Parameter,i+1);
+			continue;
+		}
+		else if(Parameter[i]==','&&IsStr==0){
+			i++;
+			break;
+		}
+		if(IsCommandDelimitation(Parameter[i])) break;
+	}
+	return i;
+}
+int GetStringInQuotation(char *buffer,char *ReadBuffer){
+	int i;
+
+	if(ReadBuffer[0]=='\"'){
+		buffer[0]=ReadBuffer[0];
+		i=1;
+	}
+	else i=0;
+
+	for(;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"'){
+			i++;
+			buffer[i]=0;
+			break;
+		}
+		if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInPare( char *buffer, const char *ReadBuffer, bool isRemovePare ){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+
+	if( isRemovePare )
+	{
+		RemoveStringPare( buffer );
+	}
+
+	return i;
+}
+int GetStringInBracket(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInGenericBracket(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='<'&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]=='>'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int JumpStringInPare(const char *buffer,int pos){
+	int PareNum;
+	for(PareNum=1;;pos++){
+		if(buffer[pos]=='\"'){
+			for(pos++;;pos++){
+				if(buffer[pos]=='\"') break;
+			}
+			continue;
+		}
+		else if(buffer[pos]=='(') PareNum++;
+		else if(buffer[pos]==')'){
+			PareNum--;
+			if(PareNum==0) return pos;
+		}
+		else if(buffer[pos]=='\0') break;
+	}
+	return 0;
+}
+int JumpStringInBracket(const char *buffer,int pos){
+	int PareNum;
+	for(PareNum=1;;pos++){
+		if(buffer[pos]=='\"'){
+			for(pos++;;pos++){
+				if(buffer[pos]=='\"') break;
+			}
+			continue;
+		}
+		else if(buffer[pos]=='[') PareNum++;
+		else if(buffer[pos]==']'){
+			PareNum--;
+			if(PareNum==0) return pos;
+		}
+		else if(buffer[pos]=='\0') break;
+	}
+	return 0;
+}
+bool IsCommandDelimitation( char c ){
+	if( c == '\n' || c == ':' || c == '\0' ){
+		return true;
+	}
+
+	return false;
+}
+
+int GetStringInPare_RemovePare(char *buffer,const char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=1;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+
+void SplitParameter( const std::string &src, Jenga::Common::Strings &dests, bool isClear )
+{
+	const char *buffer = src.c_str();
+	int i = 0;
+
+	if( isClear )
+	{
+		dests.clear();
+	}
+
+	while( buffer[i] )
+	{
+		char result[8192];
+		i = GetOneParameter( buffer, i, result );
+		dests.push_back( result );
+	}
+}
+
+
+bool SplitMemberName( const char *desc, char *object, char *member, ReferenceKind &refType ){
+	int lastIndex = -1;
+	for( int i=0; desc[i]; i++ ){
+		if( desc[i] == '(' ){
+			i=JumpStringInPare(desc,i+1);
+			continue;
+		}
+		else if( desc[i] == '[' ){
+			i=JumpStringInBracket(desc,i+1);
+			continue;
+		}
+		else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
+			lastIndex = i;
+		}
+	}
+	if( lastIndex == -1 ){
+		if( object )
+		{
+			object[0] = 0;
+		}
+		lstrcpy( member, desc );
+		return false;
+	}
+
+	if(desc[lastIndex]=='.'){
+		lstrcpy(member,desc+lastIndex+1);
+		refType = RefDot;
+	}
+	else{
+		lstrcpy(member,desc+lastIndex+2);
+		refType = RefPointer;
+	}
+
+	if( object ){
+		lstrcpy( object, desc );
+		object[lastIndex]=0;
+	}
+
+	return true;
+}
+bool SplitMemberName( const char *desc, char *object, char *member ){
+	ReferenceKind dummyRefType;
+	return SplitMemberName( desc, object, member, dummyRefType );
+}
+
+void SplitSyntacticForAs( const char *src, char *varName, char *typeName)
+{
+	int i = 0;
+	for( ; ; i++ )
+	{
+		if( src[i] == '\0' || src[i] == 1 && src[i+1] == ESC_AS )
+		{
+			varName[i] = 0;
+			break;
+		}
+		varName[i] = src[i];
+	}
+
+	if( src[i] )
+	{
+		lstrcpy( typeName, src + i + 2 );
+	}
+	else
+	{
+		typeName[i] = 0;
+	}
+}
+
+bool IsGenericTypeSourcePart( const char *buffer )
+{
+	if( buffer[0] != '<' )
+	{
+		Jenga::Throw( "意図しない文字列に対してIsGenericTypeSourcePart関数が呼ばれた" );
+		return false;
+	}
+
+	int i=1, scopeCount=1;
+	for( ; ; i++ )
+	{
+		if( buffer[i] == '\0' )
+		{
+			break;
+		}
+		if( buffer[i] == '<' )
+		{
+			scopeCount++;
+		}
+		else if( buffer[i] == '>' )
+		{
+			scopeCount--;
+
+			if( scopeCount == 0 )
+			{
+				break;
+			}
+		}
+	}
+
+	if( buffer[i] != '>' )
+	{
+		return false;
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// '>'に続く文字を判定する
+	/////////////////////////////////////////////////////////////////
+
+	i++;
+	while( IsBlank( buffer[i] ) )
+	{
+		i++;
+	}
+
+	if( IsVariableChar( buffer[i] ) )
+	{
+		return false;
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.h	(revision 774)
@@ -0,0 +1,29 @@
+
+enum ReferenceKind
+{
+	RefNon = 0,		// no reference member
+	RefDot,			// obj.member
+	RefPointer,		// obj->member
+};
+
+bool IsVariableTopChar(char c);
+bool IsVariableChar( char c, bool isGenericsChars = false );
+bool IsBlank(char c);
+int GetOneParameter(const char *Parameter,int pos,char *retAns);
+int JumpOneParameter(char *Parameter,int i);
+int GetStringInQuotation(char *buffer,char *ReadBuffer);
+int GetStringInPare( char *buffer,const char *ReadBuffer, bool isRemovePare = false );
+int GetStringInBracket(char *buffer,const char *ReadBuffer);
+int GetStringInGenericBracket(char *buffer,const char *ReadBuffer);
+int JumpStringInPare(const char *buffer,int pos);
+int JumpStringInBracket(const char *buffer,int pos);
+bool IsCommandDelimitation( char c );
+int GetStringInPare_RemovePare(char *buffer,const char *ReadBuffer);
+void GetArrange(char *variable,char *variAnswer, Subscripts &subscripts );
+void SplitParameter( const std::string &src, Jenga::Common::Strings &dests, bool isClear = true );
+bool SplitMemberName( const char *desc, char *object, char *member, ReferenceKind &refType );
+bool SplitMemberName( const char *desc, char *object, char *member );
+void SplitSyntacticForAs( const char *src, char *varName, char *typeName);
+void GetCalcName(int idCalc,char *name);
+BYTE ToCalcId( const char *name );
+bool IsGenericTypeSourcePart( const char *buffer );
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 774)
@@ -0,0 +1,432 @@
+#include "stdafx.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+int GetCallProcName(const char *buffer,char *name){
+	int i2,i3,IsStr=0;
+
+	for(i2=0;;i2++){
+		if(buffer[i2]=='\"') IsStr^=1;
+		if(IsDBCSLeadByte(buffer[i2])){
+			name[i2]=buffer[i2];
+			i2++;
+			name[i2]=buffer[i2];
+			continue;
+		}
+		if(buffer[i2]=='['&&IsStr==0){
+			i3=GetStringInBracket(name+i2,buffer+i2);
+			i2+=i3-1;
+			continue;
+		}
+		if(buffer[i2]=='('&&IsStr==0){
+			name[i2]=0;
+			break;
+		}
+		if(buffer[i2]=='='&&IsStr==0){
+			name[i2]=0;
+			break;
+		}
+
+		name[i2]=buffer[i2];
+		if(buffer[i2]=='\0') break;
+	}
+	return i2;
+}
+
+int GetProc(char *name,void **ppInfo){
+
+	//ユーザー定義関数
+	*ppInfo=(void *)GetSubHash(name);
+	if(*ppInfo) return PROC_DEFAULT;
+
+	//DLL関数
+	*ppInfo=(void *)GetDeclareHash(name);
+	if(*ppInfo) return PROC_DLL;
+
+	//コンパイラ埋め込み型
+	*ppInfo=(void *)(_int64)GetFunctionFromName(name);
+	if(*ppInfo) return PROC_BUILTIN;
+
+
+	/////////////////////////////////////////////////////////////////
+	//関数ポインタ、またはデリゲート
+	/////////////////////////////////////////////////////////////////
+
+	Type type;
+	if( !GetVarType( name, type, false ) ){
+		return 0;
+	}
+
+	if( type.IsProcPtr() )
+	{
+		// 関数ポインタ
+		return PROC_PTR;
+	}
+
+	if( type.IsDelegate() )
+	{
+		// デリゲート
+		return PROC_DELEGATE;
+	}
+
+	return 0;
+}
+
+void SplitObjectName(const char *name,char *ObjectName, ReferenceKind &referenceFind )
+{
+	referenceFind = RefNon;
+
+	int i4;
+	for(i4=lstrlen(name)-1;i4>=0;i4--){
+		if(name[i4]=='.'||(name[i4]==1&&name[i4+1]==ESC_PSMEM))
+			break;
+	}
+	if(i4==-1) ObjectName[0]=0;
+	else{
+		//参照タイプを判別
+		if(name[i4]=='.')
+		{
+			referenceFind = RefDot;
+		}
+		else
+		{
+			referenceFind = RefPointer;
+		}
+
+		if(i4==0) GetWithName(ObjectName);
+		else{
+			memcpy(ObjectName,name,i4);
+			ObjectName[i4]=0;
+		}
+	}
+}
+
+bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn, int dwCallProcFlags )
+{
+	//GetSubHash内でエラー提示が行われた場合
+	if(pProc==(Procedure *)-1){
+		return false;
+	}
+
+	if(kind==PROC_DEFAULT){
+		/////////////////////
+		// ユーザー定義関数
+		/////////////////////
+
+		const UserProc *pUserProc = (const UserProc *)pProc;
+
+		//オブジェクト名を取得
+		char ObjectName[VN_SIZE];
+		ReferenceKind referenceKind;
+		SplitObjectName(fullCallName,ObjectName, referenceKind );
+
+
+		////////////////////////
+		// オーバーロードを解決
+		////////////////////////
+
+		std::vector<const UserProc *> subs;
+		GetOverloadSubHash(fullCallName,subs);
+		if(subs.size()){
+			//オーバーロードを解決
+			pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName);
+
+			if(!pUserProc){
+				return false;
+			}
+		}
+
+		resultType = pUserProc->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallProc(lpszParms,pUserProc,dwCallProcFlags,ObjectName ) ){
+				return false;
+			}
+		}
+	}
+	else if(kind==PROC_DLL){
+		/////////////////////////
+		// DLL関数
+		/////////////////////////
+		DllProc *pDllProc = (DllProc *)pProc;
+
+		resultType = pDllProc->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallDllProc(lpszParms,pDllProc) ){
+				return false;
+			}
+		}
+	}
+	else if(kind==PROC_BUILTIN){
+		/////////////////////////
+		// 組み込み関数
+		/////////////////////////
+		int FuncId = (int)(_int64)pProc;
+
+		if( !Opcode_CallFunc( lpszParms, FuncId, baseType, resultType, isCallOn ) ){
+			return false;
+		}
+	}
+	else if(kind==PROC_PTR){
+		/////////////////
+		// 関数ポインタ
+		/////////////////
+
+		Type type;
+		GetVarType(fullCallName,type,false);
+
+		ProcPointer *pProcPtr = compiler.GetObjectModule().meta.GetProcPointers()[type.GetIndex()];
+		resultType = pProcPtr->ReturnType();
+
+		if( isCallOn ){
+			if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){
+				return false;
+			}
+		}
+	}
+	else if( kind == PROC_DELEGATE )
+	{
+		// デリゲート
+		char tempName[VN_SIZE];
+		lstrcpy( tempName, fullCallName );
+		lstrcat( tempName, ".Call" );
+
+		void *pInfo=(void *)GetSubHash( tempName );
+		if( !pInfo )
+		{
+			Jenga::Throw( "デリゲートの内部Callメソッドの取得に失敗" );
+		}
+
+		return CallProc( PROC_DEFAULT, pInfo, tempName, lpszParms, baseType, resultType, isCallOn );
+	}
+	else{
+		return false;
+	}
+
+	return true;
+}
+bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){
+	//プロパティ用のメソッドを呼び出す
+
+	//配列要素を取得
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(variable,VarName,ArrayElements);
+
+	//オブジェクト名を取得
+	char ObjectName[VN_SIZE];
+	ReferenceKind referenceKind;
+	SplitObjectName(VarName,ObjectName, referenceKind );
+
+	//オーバーロード用の関数リストを作成
+	std::vector<const UserProc *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
+		return false;
+	}
+
+	//パラメータを整備
+	char *Parameter;
+	Parameter=(char *)malloc(lstrlen(ArrayElements)+(rightSide ? lstrlen(rightSide) : 0)+32);
+	lstrcpy(Parameter,ArrayElements);
+	if(rightSide){
+		if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
+		lstrcat(Parameter,rightSide);
+	}
+
+	//オーバーロードを解決
+	const UserProc *pUserProc = OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
+
+	if(pUserProc){
+		//呼び出し
+		Opcode_CallProc(Parameter,pUserProc,0,ObjectName);
+
+		resultType = pUserProc->ReturnType();
+
+		Type leftType;
+		GetVarType( ObjectName, leftType, false );
+
+		// 型パラメータを解決
+		ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc );
+	}
+
+	free(Parameter);
+
+	return true;
+}
+
+bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){
+	//プロパティ用のメソッドを呼び出す
+
+	//配列要素を取得
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(variable,VarName,ArrayElements);
+
+	//オブジェクト名を取得
+	char ObjectName[VN_SIZE];
+	ReferenceKind referenceKind;
+	SplitObjectName(VarName,ObjectName, referenceKind );
+
+	//オーバーロード用の関数リストを作成
+	std::vector<const UserProc *> subs;
+	GetOverloadSubHash(VarName,subs);
+	if(subs.size()==0){
+		return 0;
+	}
+
+	//パラメータを整備
+	char *Parameter;
+	Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+(rightSide ? lstrlen(rightSide) : 0)+32);
+	lstrcpy(Parameter,ArrayElements);
+	if(rightSide){
+		if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,",");
+		lstrcat(Parameter,rightSide);
+	}
+
+	//オーバーロードを解決
+	const UserProc *pUserProc = OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName);
+
+	if(pUserProc){
+		resultType = pUserProc->ReturnType();
+	}
+
+	return 1;
+}
+
+//インデクサ（getter）の戻り値を取得
+bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType )
+{
+	std::vector<const UserProc *> subs;
+	classType.GetClass().GetDynamicMethods().Enum( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
+		return false;
+	}
+
+	const UserProc *pUserProc = subs[0];
+
+	resultType = pUserProc->ReturnType();
+
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType, pUserProc );
+
+	return true;
+}
+
+bool IsNeedProcCompile(){
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+		if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
+			return true;
+		}
+	}
+	return false;
+}
+
+void CompileBufferInProcedure( const UserProc &userProc ){
+	if( userProc.IsCompiled() ) return;
+
+	_compile_proc( &userProc );
+
+/*
+	// ログを履く
+	char temporary[8192];
+	temporary[0]=0;
+	lstrcat( temporary, "------------------------------------------------------------------\n" );
+	sprintf( temporary + lstrlen(temporary), "【 %s のコード情報】\n", userProc.GetFullName().c_str() );
+	sprintf( temporary + lstrlen(temporary), "code size: %d bytes\n", userProc.GetCodeSize() );
+	lstrcat( temporary, "------------------------------------------------------------------\n" );
+	lstrcat( temporary, "\n" );
+	Smoothie::Logger::Put( temporary );*/
+}
+void CompileLocal(){
+	if( compiler.IsDll() )
+	{
+		//DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
+		const UserProc *pUserProc=GetSubHash("_System_InitDllGlobalVariables");
+		if(pUserProc){
+			CompileBufferInProcedure( *pUserProc );
+		}
+		else compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else
+	{
+		// グローバル領域を一番初めにコンパイルする
+		extern const UserProc *pSub_System_GlobalArea;
+		CompileBufferInProcedure( *pSub_System_GlobalArea );
+	}
+
+	//_System_TypeBase_InitializeUserTypesは一番最後にコンパイル
+	extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypes;
+	pSubStaticMethod_System_TypeBase_InitializeUserTypes->CompleteCompile();
+
+	//_System_TypeBase_InitializeUserTypesForBaseTypeは一番最後にコンパイル
+	extern const UserProc *pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType;
+	pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->CompleteCompile();
+
+	//_System_InitStaticLocalVariablesは一番最後にコンパイル
+	//※一般関数内の静的変数オブジェクトをすべて収集しなければならない
+	extern const UserProc *pSub_System_InitStaticLocalVariables;
+	pSub_System_InitStaticLocalVariables->CompleteCompile();
+
+	//_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+	extern const UserProc *pSub_System_Call_Destructor_of_GlobalObject;
+	pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile();
+
+	// _System_CGarbageCollection.RegisterGlobalRootsは一番最後にコンパイル
+	extern const UserProc *pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
+	pUserProc_System_CGarbageCollection_RegisterGlobalRoots->CompleteCompile();
+
+repeat:
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+		CompileBufferInProcedure( *pUserProc );
+	}
+
+	if( IsNeedProcCompile() ){
+		//プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
+		goto repeat;
+	}
+
+	if( !compiler.IsSll() )
+	{
+		//_System_TypeBase_InitializeUserTypesは最後のほうでコンパイル
+		pSubStaticMethod_System_TypeBase_InitializeUserTypes->KillCompileStatus();
+		CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypes );
+
+		//_System_TypeBase_InitializeUserTypesForBaseTypeは最後のほうでコンパイル
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->KillCompileStatus();
+		CompileBufferInProcedure( *pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType );
+
+		if( IsNeedProcCompile() ){
+			//プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
+
+			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			{
+				UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+				CompileBufferInProcedure( *pUserProc );
+			}
+		}
+
+		//_System_InitStaticLocalVariablesは一番最後にコンパイル
+		pSub_System_InitStaticLocalVariables->KillCompileStatus();
+		CompileBufferInProcedure( *pSub_System_InitStaticLocalVariables );
+
+		//_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
+		pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus();
+		CompileBufferInProcedure( *pSub_System_Call_Destructor_of_GlobalObject );
+
+		// _System_CGarbageCollection.RegisterGlobalRootsは一番最後にコンパイル
+		pUserProc_System_CGarbageCollection_RegisterGlobalRoots->KillCompileStatus();
+		CompileBufferInProcedure( *pUserProc_System_CGarbageCollection_RegisterGlobalRoots );
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp	(revision 774)
@@ -0,0 +1,1434 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+//デバッグ用
+#include "../BasicCompiler_Common/debug.h"
+#include "../BasicCompiler_Common/DebugSection.h"
+
+using namespace ActiveBasic::Compiler;
+
+HRESULT ApplyDialogTexture( HWND );
+
+//変数リストのツリーハンドル
+HWND hVarTree_Global,hVarTree_Local,hVarTree_This;
+
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type,const Subscripts &subscripts);
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr);
+void VarList_Insert(HWND hVarTree,TV_INSERTSTRUCT *lptv,const char *VarName,const Type &type,LONG_PTR offset){
+	extern HANDLE hDebugProcess;
+	int i2;
+	char temporary[255],temp2[255];
+	LONG_PTR pData;
+	SIZE_T accessBytes;
+	double dbl;
+	float flt;
+	WORD wData;
+	BYTE byteData;
+	HTREEITEM hParent;
+	_int64 i64data;
+
+	if( type.IsObject() || type.IsStruct() ){
+		i2=1;
+		if( type.IsObject() ){
+			// 参照型ということを考慮する
+			i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+			offset = pData;
+		}
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_OBJECT,(ULONG_PTR)offset);
+		lptv->item.iImage=1;
+		lptv->item.iSelectedImage=1;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		if(i2 && offset) VarList_Member(hVarTree,hParent,offset,type.GetClass(),0);
+		return;
+	}
+	else if( type.IsObjectPtr() || type.IsStructPtr() ){
+		i2=ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes);
+
+		sprintf(lptv->item.pszText,"%s %s(&H%X)",VarName,STRING_POINTEROFOBJECT,(ULONG_PTR)pData);
+		lptv->item.iImage=4;
+		lptv->item.iSelectedImage=4;
+		hParent=TreeView_InsertItem(hVarTree,lptv);
+
+		if(i2) VarList_Member(hVarTree,hParent,pData,type.GetClass(),1);
+		return;
+	}
+	else{
+		if(type.GetBasicType()==MAKE_PTR_TYPE(DEF_SBYTE,1)||type.GetBasicType()==MAKE_PTR_TYPE(DEF_BYTE,1))
+		{
+			// マルチバイト文字列
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes))
+			{
+				for(i2=0;;i2++)
+				{
+					if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2),&temporary[i2],sizeof(char),&accessBytes))
+					{
+						i2=-1;
+						break;
+					}
+					if(temporary[i2]=='\0') break;
+					if(i2==64)
+					{
+						lstrcpy(temporary+i2,"...");
+						break;
+					}
+				}
+				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData);
+				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if( type.GetBasicType()==MAKE_PTR_TYPE(DEF_WORD,1) )
+		{
+			// Unicode文字列
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&pData,sizeof(void *),&accessBytes))
+			{
+				WCHAR wstr[255];
+				for(i2=0;;i2++)
+				{
+					if(!ReadProcessMemory(hDebugProcess,(void *)(pData+i2*sizeof(WCHAR)),&wstr[i2],sizeof(WCHAR),&accessBytes))
+					{
+						i2=-1;
+						break;
+					}
+					if(wstr[i2]=='\0') break;
+					if(i2==64)
+					{
+						lstrcpyW(wstr+i2,L"...");
+						break;
+					}
+				}
+				std::string str = Jenga::Common::ToString( std::wstring( wstr ) );
+				if(i2==-1) sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData);
+				else sprintf(lptv->item.pszText,"%s %d(&H%X) \"%s\"",VarName,(ULONG_PTR)pData,(ULONG_PTR)pData,str.c_str());
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDouble()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&dbl,sizeof(double),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.15g",VarName,dbl);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSingle()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&flt,sizeof(float),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %.6g",VarName,flt);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInt64()){
+			_int64 i64data;
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_i64toa(i64data,temporary,10);
+				_i64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsQWord()||(type.IsPointer()&&PTR_SIZE==sizeof(_int64))){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				_ui64toa(i64data,temporary,10);
+				_ui64toa(i64data,temp2,16);
+				CharUpper(temp2);
+				sprintf(lptv->item.pszText,"%s %s(&H%s)",VarName,temporary,temp2);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsLong()){
+			long l;
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&l,sizeof(long),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,l,l);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsDWord()||(type.IsPointer()&&PTR_SIZE==sizeof(long))){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&i64data,sizeof(_int64),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,(int)i64data,(int)i64data);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsInteger()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %d(&H%X)",VarName,(short)wData,(short)wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsWord()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&wData,sizeof(WORD),&accessBytes)){
+				sprintf(lptv->item.pszText,"%s %u(&H%X)",VarName,wData,wData);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsSByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,(char)byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsByte()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				temporary[0]=byteData;
+				temporary[1]=0;
+				sprintf(lptv->item.pszText,"%s %d(&H%X)'%s'",VarName,byteData,byteData,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		else if(type.IsBoolean()){
+			if(ReadProcessMemory(hDebugProcess,(void *)offset,&byteData,sizeof(BYTE),&accessBytes)){
+				if( byteData ) lstrcpy( temporary, "True" );
+				else lstrcpy( temporary, "False" );
+
+				wsprintf(lptv->item.pszText,"%s %s",VarName,temporary);
+			}
+			else sprintf(lptv->item.pszText,"%s %s",VarName,STRING_CANNOTACCESS);
+		}
+		lptv->item.iImage=2;
+		lptv->item.iSelectedImage=2;
+	}
+	TreeView_InsertItem(hVarTree,lptv);
+}
+void VarList_Member(HWND hVarTree,HTREEITEM hParent,LONG_PTR pTopOffset,const CClass &objClass,BOOL bPtr)
+{
+	char VarData[VN_SIZE],VarName[VN_SIZE];
+	if( objClass.HasSuperClass() )
+	{
+		TV_INSERTSTRUCT tv;
+
+		memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+		tv.hInsertAfter=TVI_LAST;
+		tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+		tv.hParent=hParent;
+		tv.item.pszText=VarData;
+
+		// 基底クラス
+		sprintf(tv.item.pszText,"Inherits %s",objClass.GetSuperClass().GetName().c_str());
+		tv.item.iImage=1;
+		tv.item.iSelectedImage=1;
+		HTREEITEM hTempParent=TreeView_InsertItem(hVarTree,&tv);
+
+		VarList_Member(hVarTree,hTempParent,pTopOffset,objClass.GetSuperClass(),0);
+	}
+
+	TV_INSERTSTRUCT tv;
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=VarData;
+
+	foreach( Member *pMember, objClass.GetDynamicMembers() ){
+		if(bPtr){
+			lstrcpy(VarName,"->");
+			lstrcat(VarName,pMember->GetName().c_str());
+		}
+		else{
+			lstrcpy(VarName,".");
+			lstrcat(VarName,pMember->GetName().c_str());
+		}
+
+		LONG_PTR offset;
+		offset=objClass.GetMemberOffset( pMember->GetName().c_str() );
+
+		if( pMember->GetSubscripts().size() > 0 ){
+			//構造体内の配列
+			sprintf(VarData,"%s %s(&H%X)",VarName,STRING_ARRAY,pTopOffset+offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree,&tv);
+
+			VarList_Array(
+				hVarTree,
+				hParent,
+				pTopOffset + offset,
+				pMember->GetType(),
+				pMember->GetSubscripts()
+			);
+		}
+		else{
+			//メンバ変数
+			VarList_Insert(hVarTree,
+				&tv,
+				VarName,
+				pMember->GetType(),
+				pTopOffset+offset);
+		}
+	}
+}
+int VarList_Array(HWND hVarTree,HTREEITEM hParent,LONG_PTR offset,const Type &type, const Subscripts &subscripts ){
+	int i,i2,i3,ElementNum,MemCounter,UseCount[255];
+	char temporary[VN_SIZE],temp2[DIGIT_SIZE];
+
+	TV_INSERTSTRUCT tv;
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=hParent;
+	tv.item.pszText=temporary;
+
+	for(i=0;i<(int)subscripts.size();i++){
+		UseCount[i]=0;
+	}
+	UseCount[i]=-2;
+	MemCounter=0;
+	i--;
+	while(1){
+		UseCount[i]++;
+		for(ElementNum=0;subscripts[i-ElementNum]<UseCount[i-ElementNum];ElementNum++){
+			UseCount[i-ElementNum]=0;
+			if(i-ElementNum-1<0) return MemCounter;
+			UseCount[i-ElementNum-1]++;
+		}
+
+		if(MemCounter<50){
+			temporary[0]='[';
+			temporary[1]=0;
+			for(i2=0;i2<i;i2++){
+				sprintf(temp2,"%d",UseCount[i2]);
+				lstrcat(temporary,temp2);
+				lstrcat(temporary,",");
+			}
+			i3=lstrlen(temporary);
+			temporary[i3-1]=']';
+			temporary[i3]=0;
+
+			VarList_Insert(hVarTree,&tv,temporary,type,
+				offset+MemCounter*type.GetSize());
+		}
+
+		MemCounter++;
+		if(MemCounter==50){
+			lstrcpy(tv.item.pszText,"...");
+			TreeView_InsertItem(hVarTree,&tv);
+		}
+	}
+	return 0;
+}
+void RefreshGlobalVar(void){
+	extern DWORD ImageBase;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+
+	TreeView_DeleteAllItems(hVarTree_Global);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern int MemPos_RWSection;
+
+	foreach( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+
+		//スコープ外の場合は無視
+		if(pVar->GetScopeLevel()!=0){
+			if(rva_to_real(pVar->GetScopeStartAddress()) <= pobj_dti->lplpObp[0]  &&
+				pobj_dti->lplpObp[0] < rva_to_real(pVar->GetScopeEndAddress())){
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+
+		if(!pobj_nv->bShow_DefaultSystem_Var){
+			if(memcmp(pVar->GetName().c_str(),"_System_",8)==0||
+				memcmp(pVar->GetName().c_str(),"_DebugSys_",10)==0||
+				memcmp(pVar->GetName().c_str(),"_PromptSys_",11)==0) continue;
+		}
+		if(!pobj_nv->bShow_Rad_Var){
+			if(memcmp(pVar->GetName().c_str(),"_RadSys_",8)==0) continue;
+		}
+		if(!pobj_nv->bShow_GUID_Var){
+			if(memcmp(pVar->GetName().c_str(),"GUID_",5)==0||
+				memcmp(pVar->GetName().c_str(),"IID_",4)==0||
+				memcmp(pVar->GetName().c_str(),"CLSID_",6)==0) continue;
+		}
+
+		//静的メンバ
+		if(strstr(pVar->GetName().c_str(),".")) continue;
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				ImageBase+MemPos_RWSection+pVar->GetOffsetAddress());
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Global,&tv);
+
+			VarList_Array(
+				hVarTree_Global,
+				hParent,
+				(LONG_PTR)(ImageBase+MemPos_RWSection + pVar->GetOffsetAddress()),
+				pVar->GetType(),
+				pVar->GetSubscripts()
+			);
+		}
+		else{
+			VarList_Insert(hVarTree_Global,
+				&tv,
+				pVar->GetName().c_str(),
+				pVar->GetType(),
+				(LONG_PTR)(ImageBase+MemPos_RWSection+pVar->GetOffsetAddress()));
+		}
+	}
+}
+void RefreshLocalVar(void){
+	int i2;
+	char temporary[VN_SIZE];
+	TV_INSERTSTRUCT tv;
+	HTREEITEM hParent;
+	LONG_PTR offset;
+	SIZE_T accessBytes;
+	LONG_PTR lpData;
+
+	TreeView_DeleteAllItems(hVarTree_Local);
+
+	memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+	tv.hInsertAfter=TVI_LAST;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent=TVI_ROOT;
+	tv.item.pszText=temporary;
+
+	extern HANDLE hDebugProcess;
+	extern HWND hDebugWnd;
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]==0) return;
+
+	UserProc *pUserProc = NULL;
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	{
+		pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+		if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
+			pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
+			break;
+		}
+	}
+	if(!pUserProc) return;
+
+	foreach( Variable *pVar, pUserProc->GetLocalVars() ){
+
+		//スコープ外の場合は無視
+		int scopeBeginAddressRva = pUserProc->GetBeginOpAddress() + pVar->GetScopeStartAddress();
+		int scopeEndAddressRva = pUserProc->GetBeginOpAddress() + pVar->GetScopeEndAddress();
+		if(pVar->GetScopeLevel()!=0)
+		{
+			if( rva_to_real( scopeBeginAddressRva ) <= pobj_dti->lplpObp[i2]
+				&& pobj_dti->lplpObp[i2] < rva_to_real( scopeEndAddressRva ) )
+			{
+				//範囲内
+			}
+			else{
+				//範囲外
+				continue;
+			}
+		}
+
+		if(pVar->IsArray()){
+			sprintf(temporary,"%s %s(&H%X)",
+				pVar->GetName().c_str(),
+				STRING_ARRAY,
+				pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress());
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_Local,&tv);
+
+			VarList_Array(
+				hVarTree_Local,
+				hParent,
+				pobj_dti->lplpSpBase[i2] + pVar->GetOffsetAddress(),
+				pVar->GetType(),
+				pVar->GetSubscripts()
+			);
+		}
+		else{
+			offset=pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress();
+			if( pVar->IsRef() || pVar->IsByValStructParameter() )
+			{
+				ReadProcessMemory(hDebugProcess,(void *)offset,&lpData,sizeof(LONG_PTR),&accessBytes);
+				offset=lpData;
+			}
+			VarList_Insert(hVarTree_Local,&tv,
+				pVar->GetName().c_str(),
+				pVar->GetType(),
+				offset);
+		}
+	}
+
+
+
+	/////////////////////////////
+	// Thisオブジェクトのリスト
+	/////////////////////////////
+
+	TreeView_DeleteAllItems(hVarTree_This);
+	if( pUserProc->IsGlobalProcedure() ) return;
+
+	//Thisポインタを取得
+	LONG_PTR pThis;
+	const Variable *pVar = pUserProc->GetLocalVars().Find( LexicalAnalyzer::FullNameToSymbol( "_System_LocalThis" ) );
+	if( !pVar ){
+		return;
+	}
+	lpData=pobj_dti->lplpSpBase[i2]+pVar->GetOffsetAddress();
+	ReadProcessMemory(hDebugProcess,(void *)lpData,&pThis,sizeof(LONG_PTR),&accessBytes);
+
+	if( pUserProc->GetParentClassPtr()->HasSuperClass() )
+	{
+		TV_INSERTSTRUCT tv;
+
+		memset(&tv,0,sizeof(TV_INSERTSTRUCT));
+		tv.hInsertAfter=TVI_LAST;
+		tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+		tv.hParent=NULL;
+		tv.item.pszText=temporary;
+
+		// 基底クラス
+		sprintf(tv.item.pszText,"Inherits %s",pUserProc->GetParentClassPtr()->GetSuperClass().GetName().c_str());
+		tv.item.iImage=1;
+		tv.item.iSelectedImage=1;
+		HTREEITEM hTempParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+		VarList_Member(hVarTree_This,hTempParent,pThis,pUserProc->GetParentClassPtr()->GetSuperClass(),0);
+	}
+
+	foreach( Member *pMember, pUserProc->GetParentClassPtr()->GetDynamicMembers() ){
+		offset=pUserProc->GetParentClassPtr()->GetMemberOffset( pMember->GetName().c_str());
+
+		if( pMember->GetSubscripts().size() > 0 ){
+			//配列
+			sprintf(temporary,"%s %s(&H%X)",
+				pMember->GetName().c_str(),
+				STRING_ARRAY,
+				(ULONG_PTR)offset);
+			tv.item.iImage=0;
+			tv.item.iSelectedImage=0;
+			hParent=TreeView_InsertItem(hVarTree_This,&tv);
+
+			VarList_Array(
+				hVarTree_This,
+				hParent,
+				pThis + offset,
+				pMember->GetType(),
+				pMember->GetSubscripts()
+			);
+		}
+		else{
+			VarList_Insert(hVarTree_This,&tv,
+				pMember->GetName().c_str(),
+				pMember->GetType(),
+				pThis+offset);
+		}
+	}
+}
+void RefreshGlobalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+
+	//リフレッシュ
+	RefreshGlobalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+}
+void RefreshLocalVar_with_WindowLock(void){
+	extern HWND hDebugWnd;
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Local),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Local),SW_SHOW);
+}
+
+void SetCalcToWatchList(HWND hListView,int iItem,char *buffer){
+	char temporary[255],temp2[255];
+
+	//エスケープシーケンスをセット
+	SetEscapeSequenceFormat(buffer);
+
+	KillStringSpaces(buffer);
+
+	//カッコを相互チェック
+	if(!CheckParenthesis2(buffer)){
+		
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+		return;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type resultType;
+	bool isMemoryAccessError;
+	if( !StaticCalculation(true, buffer,0,&i64data,resultType,1,&isMemoryAccessError) ){
+		ListView_SetItemText(hListView,iItem,1,"式の解析に失敗");
+	}
+	else if(isMemoryAccessError){
+		ListView_SetItemText(hListView,iItem,1,"アクセスできません");
+	}
+	else{
+		if(resultType.IsReal()){
+			memcpy(&dbl,&i64data,sizeof(double));
+			sprintf(temporary,"%.15g (&H%08X)",dbl,(int)dbl);
+		}
+		else if(resultType.Is64()){
+			_i64toa(i64data,temporary,10);
+			_i64toa(i64data,temp2,16);
+			CharUpper(temp2);
+			sprintf(temporary+lstrlen(temporary)," (&H%s)",temp2);
+		}
+		else sprintf(temporary,"%d (&H%08X)",(long)i64data,(long)i64data);
+
+		ListView_SetItemText(hListView,iItem,1,temporary);
+	}
+}
+void RefreshWatchList(void){
+	extern HWND hDebugWnd;
+	HWND hListView;
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	hListView=GetDlgItem(hDebugWnd,IDC_WATCHLIST);
+	i2=ListView_GetItemCount(hListView);
+	for(i=0;i<i2-1;i++){
+		ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+
+		//演算結果を表示
+		SetCalcToWatchList(hListView,i,temporary);
+	}
+}
+
+BOOL SetDebugProcCombo(HWND hProcCombo){
+	int i2,i3;
+	char temporary[255];
+
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+
+	//行番号情報
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++)
+	{
+		extern DebugSectionCollection debugSectionCollection;
+		const SourceLines &sourceLines = debugSectionCollection.GetCurrent()._oldSourceLines;
+
+		for( i2=0; i2<static_cast<int>(sourceLines.size()-2); i2++ )
+		{
+			if((ULONG_PTR)(sourceLines[i2].GetNativeCodePos()+ImageBase+MemPos_CodeSection)<=pobj_dti->lplpObp[i3]&&
+				pobj_dti->lplpObp[i3]<=(ULONG_PTR)(sourceLines[i2+1].GetNativeCodePos()+ImageBase+MemPos_CodeSection))
+			{
+				break;
+			}
+		}
+		if( i2 == sourceLines.size() - 1 )
+		{
+			pobj_dti->lpdwCp[i3] = -1;
+		}
+		else
+		{
+			pobj_dti->lpdwCp[i3] = sourceLines[i2].GetSourceCodePosition().GetPos();
+			pobj_dti->relationalObjectModuleIndexes[i3] = sourceLines[i2].GetSourceCodePosition().GetRelationalObjectModuleIndex();
+		}
+	}
+	for(i3=0;i3<(int)pobj_dti->iProcLevel+1;i3++){
+		if(pobj_dti->lpdwCp[i3]==-1){
+			pobj_dti->iProcLevel--;
+			for(i2=i3;i2<(int)pobj_dti->iProcLevel+1;i2++){
+				pobj_dti->lplpObp[i2]=pobj_dti->lplpObp[i2+1];
+				pobj_dti->lplpSpBase[i2]=pobj_dti->lplpSpBase[i2+1];
+				pobj_dti->lpdwCp[i2]=pobj_dti->lpdwCp[i2+1];
+				pobj_dti->relationalObjectModuleIndexes[i2]=pobj_dti->relationalObjectModuleIndexes[i2+1];
+			}
+			i3--;
+			continue;
+		}
+	}
+
+	std::string dummyStr;
+	extern BasicSources sourcesLinkRelationalObjectModule;
+	if(!sourcesLinkRelationalObjectModule[pobj_dti->relationalObjectModuleIndexes[pobj_dti->iProcLevel]].GetLineInfo( pobj_dti->lpdwCp[pobj_dti->iProcLevel], i2, dummyStr )){
+		extern HWND hMainDlg;
+		//"デバッグ情報の取得に失敗"
+		MyAssertMsg( false, STRING_DEBUG_FAILED );
+		return 0;
+	}
+	ShowErrorLine(i2,dummyStr.c_str());
+
+	//プロシージャ コンボボックス
+	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
+	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
+
+		UserProc *pUserProc = NULL;
+		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+		{
+			pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+
+			if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress()))
+			{
+				lstrcpy(temporary,pUserProc->GetName().c_str());
+				break;
+			}
+		}
+		if(!pUserProc){
+			if(i2==0){
+				lstrcpy(temporary,"Global");
+				pobj_dti->lplpSpBase[i2]=0;
+			}
+			else lstrcpy(temporary,"error");
+		}
+		SendMessage(hProcCombo,CB_ADDSTRING,0,(LPARAM)temporary);
+	}
+	SendMessage(hProcCombo,CB_SETCURSEL,0,0);
+
+	return pobj_dti->iProcLevel;
+}
+
+//IDC_THREADCOMBOプロシージャ
+LRESULT CALLBACK ThreadComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldThreadComboProc;
+	int i2;
+	DWORD dwThreadID;
+	char temporary[255];
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(LPARAM)temporary);
+				sscanf(temporary+2,"%X",&dwThreadID);
+
+				extern DWORD _DebugSys_dwThreadID[256];
+				i2=0;
+				while(_DebugSys_dwThreadID[i2]!=dwThreadID) i2++;
+
+				//次回のステップ実行対象を指定
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+
+				//スレッド情報をリフレッシュ
+				pobj_dti->Reflesh(i2);
+
+				SetDebugProcCombo(GetDlgItem(GetParent(hwnd),IDC_PROCCOMBO));
+
+				SendDlgItemMessage(GetParent(hwnd),IDC_PROCCOMBO,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+			}
+			break;
+	}
+	return CallWindowProc(OldThreadComboProc,hwnd,message,wParam,lParam);
+}
+//IDC_PROCCOMBOプロシージャ
+LRESULT CALLBACK ProcComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldProcComboProc;
+	int i2,i3;
+
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				i2=(int)SendMessage(hwnd,CB_GETCURSEL,0,0);
+
+				std::string dummyStr;
+				extern BasicSources sourcesLinkRelationalObjectModule;
+				sourcesLinkRelationalObjectModule[pobj_dti->relationalObjectModuleIndexes[pobj_dti->iProcLevel]].GetLineInfo( pobj_dti->lpdwCp[pobj_dti->iProcLevel-i2], i3, dummyStr );
+				ShowErrorLine(i3,dummyStr.c_str());
+
+				RefreshLocalVar_with_WindowLock();
+			}
+			break;
+	}
+	return CallWindowProc(OldProcComboProc,hwnd,message,wParam,lParam);
+}
+void InitVarList(DWORD dwThreadId){
+	extern HWND hDebugWnd;
+	int i2,i5;
+	char temporary[255];
+
+
+	//スレッド
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_RESETCONTENT,0,0);
+	extern DWORD _DebugSys_dwThreadID[256];
+	for(i2=0;i2<256;i2++){
+		if(_DebugSys_dwThreadID[i2]){
+			sprintf(temporary,"&H%08X",_DebugSys_dwThreadID[i2]);
+			SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_ADDSTRING,0,(LPARAM)temporary);
+			if(_DebugSys_dwThreadID[i2]==dwThreadId){
+				extern int NextStepThreadNum;
+				NextStepThreadNum=i2;
+			}
+		}
+	}
+	sprintf(temporary,"&H%08X",dwThreadId);
+	i5=(int)SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_FINDSTRING,0,(LPARAM)temporary);
+	SendDlgItemMessage(hDebugWnd,IDC_THREADCOMBO,CB_SETCURSEL,i5,0);
+
+	i2=SetDebugProcCombo(GetDlgItem(hDebugWnd,IDC_PROCCOMBO));
+
+
+	///////////////////////////////////////////////
+	// 実行中のプロシージャのローカル変数をセット
+	///////////////////////////////////////////////
+
+	i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+	i2=pobj_dti->iProcLevel-i2;
+
+	if(pobj_dti->lplpSpBase[i2]){
+
+		UserProc *pUserProc = NULL;
+		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+		{
+			pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+
+			if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
+				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
+				break;
+			}
+		}
+
+		if(pUserProc){
+			compiler.StartProcedureCompile( pUserProc );
+		}
+	}
+
+
+	////////////////////////
+	// 変数リストを再表示
+	////////////////////////
+
+	//処理時間を短くするため、一時的に非表示にする
+	LockWindowUpdate(hDebugWnd);
+	ShowWindow(GetParent(hVarTree_Global),SW_HIDE);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_HIDE);
+
+	//リフレッシュ
+	RefreshLocalVar();
+	RefreshGlobalVar();
+	RefreshWatchList();
+
+	LockWindowUpdate(NULL);
+	ShowWindow(GetParent(hVarTree_Global),SW_SHOW);
+	ShowWindow(GetDlgItem(hDebugWnd,IDC_WATCHLIST),SW_SHOW);
+}
+
+
+
+
+//////////////////////////////////////
+// エディタに埋め込み表示のデバッガ
+//////////////////////////////////////
+
+BOOL CALLBACK DebuggerButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+
+	//デバッガ用ツールバー
+#define BMPNUM_DEBUGGERTOOLBAR 3
+#define BTNNUM_DEBUGGERTOOLBAR 4
+	TBBUTTON DebuggerToolBar[]={
+		{0,IDC_DEBUG_START,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0},
+		{1,IDC_DEBUG_STEPOVER,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+		{2,IDC_DEBUG_STEPIN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
+	};
+	TOOLTIPTEXT *pTipText;
+
+	static HIMAGELIST hImageList,hImageList_Disabled;
+
+	switch(message){
+		case WM_INITDIALOG:
+			//ツールバーを生成
+			extern HWND hDebuggerToolbar;
+			hDebuggerToolbar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS|WS_CLIPSIBLINGS,
+				NULL,
+				0,0,0,
+				DebuggerToolBar,
+				BTNNUM_DEBUGGERTOOLBAR,	/*アイテムの個数*/
+				0,0,16,15,sizeof(TBBUTTON));
+
+			hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETIMAGELIST, 0, (LPARAM)hImageList);
+			hImageList_Disabled = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDR_DEBUGGERTOOLBAR_DISABLED),
+				16, 0, RGB(192,192,192),IMAGE_BITMAP, LR_CREATEDIBSECTION);
+			SendMessage(hDebuggerToolbar, TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hImageList_Disabled);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_DEBUG_START:
+					DestroyWindow(GetParent(hwnd));
+					return 1;
+				case IDC_DEBUG_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_DEBUG_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			pTipText=(TOOLTIPTEXT *)lParam;
+			if(pTipText->hdr.code==TTN_NEEDTEXT){
+				//ツールチップを表示
+				switch(pTipText->hdr.idFrom){
+					case IDC_DEBUG_START:
+						pTipText->lpszText="実行";
+						break;
+					case IDC_DEBUG_STEPOVER:
+						pTipText->lpszText="ステップ アウト";
+						break;
+					case IDC_DEBUG_STEPIN:
+						pTipText->lpszText="ステップ イン";
+						break;
+				}
+			}
+			break;
+		case WM_SIZE:
+			MoveWindow(hDebuggerToolbar,0,0,LOWORD(lParam),HIWORD(lParam),1);
+			return 1;
+
+		case WM_DESTROY:
+			ImageList_Destroy(hImageList);
+			ImageList_Destroy(hImageList_Disabled);
+			return 1;
+	}
+	return 0;
+}
+
+WNDPROC OldTabProc;
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+
+	static HMENU hDummyMenu,hMenu=0;
+
+	switch(message){
+		case WM_CONTEXTMENU:
+			if(hMenu==0){
+				hDummyMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_DEBUGGER_VARLIST_MENU));
+				hMenu=GetSubMenu(hDummyMenu,0);
+			}
+
+			MENUITEMINFO mi;
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			mi.fState=MFS_CHECKED;
+
+			if(pobj_nv->bShow_DefaultSystem_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+			if(pobj_nv->bShow_Rad_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+			if(pobj_nv->bShow_GUID_Var)
+				SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+
+			TrackPopupMenu(hMenu,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+
+			break;
+		case WM_COMMAND:
+			mi.cbSize=sizeof(MENUITEMINFO);
+			mi.fMask=MIIM_STATE;
+			switch(LOWORD(wParam)){
+				case IDM_SHOW_DEFAULTSYSTEM_VAR:
+					if(pobj_nv->bShow_DefaultSystem_Var){
+						pobj_nv->bShow_DefaultSystem_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_DefaultSystem_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_DEFAULTSYSTEM_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_RAD_VAR:
+					if(pobj_nv->bShow_Rad_Var){
+						pobj_nv->bShow_Rad_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_Rad_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_RAD_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+				case IDM_SHOW_GUID_VAR:
+					if(pobj_nv->bShow_GUID_Var){
+						pobj_nv->bShow_GUID_Var=0;
+						mi.fState=MFS_UNCHECKED;
+					}
+					else{
+						pobj_nv->bShow_GUID_Var=1;
+						mi.fState=MFS_CHECKED;
+					}
+					SetMenuItemInfo(hMenu,IDM_SHOW_GUID_VAR,0,&mi);
+					RefreshGlobalVar_with_WindowLock();
+					break;
+			}
+			break;
+		case WM_DESTROY:
+			DestroyMenu(hMenu);
+			hMenu=0;
+			break;
+	}
+	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+
+INT_PTR CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	extern double width_ratio_VarList;
+	RECT rect;
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+	LV_DISPINFO *lvinfo;
+	LVITEM ListView_Item;
+
+	static POINT pos_VarList;
+	static POINT pos_WatchList;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			//変数リストの初期位置を取得
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARPOS),&rect);
+			pos_VarList.x=rect.left;
+			pos_VarList.y=rect.top;
+			ScreenToClient(hwnd,&pos_VarList);
+
+			//ウォッチリストの初期位置を取得
+			pos_WatchList.x=pos_VarList.x+(rect.right-rect.left)+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ツールバーのベースウィンドウを生成
+			static HWND hBase_ToolBar;
+			hBase_ToolBar=CreateDialog(hInst,MAKEINTRESOURCE(IDD_DEBUGGER_TOOLBARBASE),hwnd,(DLGPROC)DebuggerButtonsProc);
+			MoveWindow(hBase_ToolBar,50,0,20*BTNNUM_DEBUGGERTOOLBAR,22,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+
+			///////////////////////////
+			// タブコントロールを生成
+			///////////////////////////
+
+			static HWND hTab;
+			HFONT hFont;
+			hFont=(HFONT)SendMessage(hwnd,WM_GETFONT,0,0);
+			hTab=CreateWindow(WC_TABCONTROL,NULL,
+				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+				0,0,0,0,hwnd,0,hInst,0);
+			SendMessage(hTab,WM_SETFONT,(WPARAM)hFont,0);
+			OldTabProc=(WNDPROC)SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)TabProc);
+
+			//タブを設定
+			TC_ITEM tcItem;
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="グローバル";
+			SendMessage(hTab,TCM_INSERTITEM,0,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="ローカル";
+			SendMessage(hTab,TCM_INSERTITEM,1,(LPARAM)&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="This";
+			SendMessage(hTab,TCM_INSERTITEM,2,(LPARAM)&tcItem);
+
+			//グローバル変数リストのツリーを作成
+			hVarTree_Global=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//ローカル変数リストのツリーを作成
+			hVarTree_Local=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			//This変数リストのツリーを作成
+			hVarTree_This=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hTab,0,hInst,0);
+
+			ShowWindow(hVarTree_Global,SW_SHOW);
+
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(hVarTree_Global,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_Local,hVariOrderImageList,TVSIL_NORMAL);
+			TreeView_SetImageList(hVarTree_This,hVariOrderImageList,TVSIL_NORMAL);
+
+
+			/////////////////////////
+			// ウォッチリスト
+			/////////////////////////
+
+			//コラムの設定
+			static HWND hListView;
+			LV_COLUMN ListView_Column;
+			DWORD dwStyle;
+
+			hListView=GetDlgItem(hwnd,IDC_WATCHLIST);
+			GetClientRect(hListView,&rect);
+			dwStyle=ListView_GetExtendedListViewStyle(hListView);
+			dwStyle|=LVS_EX_FULLROWSELECT;
+			ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			extern int width_WatchColumn_Expression;
+			ListView_Column.cx=width_WatchColumn_Expression;
+			ListView_Column.pszText="ウォッチ式";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hListView,0,&ListView_Column);
+
+			extern int width_WatchColumn_Value;
+			ListView_Column.cx=width_WatchColumn_Value;
+			ListView_Column.pszText="値";
+			ListView_Column.iSubItem=1;
+			ListView_InsertColumn(hListView,1,&ListView_Column);
+
+			//アイテムの設定
+			ListView_Item.mask=LVIF_TEXT;
+			ListView_Item.iSubItem=0;
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_Item.pszText=pobj_nv->ppWatchStr[i];
+				ListView_Item.iItem=i;
+				ListView_InsertItem(hListView,&ListView_Item);
+			}
+			ListView_Item.pszText="...";
+			ListView_Item.iItem=i;
+			ListView_InsertItem(hListView,&ListView_Item);
+
+
+			///////////////////////
+			// 変数リストの初期化
+			///////////////////////
+			InitVarList((DWORD)lParam);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hTab&&hdr->code==TCN_SELCHANGE){
+				i=TabCtrl_GetCurSel(hTab);
+
+				if(i==0){
+					//グローバル変数を表示
+					ShowWindow(hVarTree_Global,SW_SHOW);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==1){
+					//ローカル変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_SHOW);
+					ShowWindow(hVarTree_This,SW_HIDE);
+				}
+				else if(i==2){
+					//This変数を表示
+					ShowWindow(hVarTree_Global,SW_HIDE);
+					ShowWindow(hVarTree_Local,SW_HIDE);
+					ShowWindow(hVarTree_This,SW_SHOW);
+				}
+			}
+
+			if(hdr->hwndFrom==hListView){
+				lvinfo=(LV_DISPINFO *)hdr;
+				if(hdr->code==NM_DBLCLK){
+					i2=ListView_GetItemCount(hListView);
+					for(i=0;i<i2;i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)) break;
+					}
+					if(i==i2) break;
+
+					ListView_EditLabel(hListView,i);
+				}
+
+				static HWND hEdit;
+				if(hdr->code==LVN_BEGINLABELEDIT){
+					hEdit=ListView_GetEditControl(hListView);
+
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(lstrcmp(temporary,"...")==0) SetWindowText(hEdit,"");
+				}
+				if(hdr->code==LVN_ENDLABELEDIT){
+					GetWindowText(hEdit,temporary,VN_SIZE);
+					if(temporary[0]=='\0'){
+						if(ListView_GetItemCount(hListView)-1==lvinfo->item.iItem) break;
+
+						//空白入力の場合はそのアイテムを削除する
+						ListView_DeleteItem(hListView,lvinfo->item.iItem);
+						break;
+					}
+					ListView_SetItemText(hListView,lvinfo->item.iItem,0,temporary);
+
+					//演算結果を表示
+					SetCalcToWatchList(hListView,lvinfo->item.iItem,temporary);
+
+					if(lvinfo->item.iItem==ListView_GetItemCount(hListView)-1){
+						//リストアイテムを追加
+						ListView_Item.mask=LVIF_TEXT;
+						ListView_Item.pszText="...";
+						ListView_Item.iItem=lvinfo->item.iItem+1;
+						ListView_Item.iSubItem=0;
+						ListView_InsertItem(hListView,&ListView_Item);
+					}
+				}
+
+				if(hdr->code==LVN_KEYDOWN){
+					LV_KEYDOWN *plvKeydown;
+					plvKeydown=(LV_KEYDOWN *)hdr;
+					if(plvKeydown->wVKey==VK_DELETE){
+						i2=ListView_GetItemCount(hListView);
+						for(i=i2-2;i>=0;i--){
+							if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+								ListView_DeleteItem(hListView,i);
+								i3=i;
+							}
+						}
+
+						ListView_SetItemState(hListView,i3,LVIS_SELECTED,LVIS_SELECTED);
+					}
+				}
+			}
+			break;
+
+		case WM_SIZE:
+			//変数リストの位置
+			int width_VarList;
+			width_VarList=
+				(int)((double)(LOWORD(lParam)-pos_VarList.x)*width_ratio_VarList);
+
+			MoveWindow(hTab,
+				pos_VarList.x,
+				pos_VarList.y,
+				width_VarList,
+				HIWORD(lParam)-pos_VarList.y,
+				1);
+
+			GetClientRect(hTab,&rect);
+			TabCtrl_AdjustRect(hTab,FALSE,&rect);
+			rect.left-=2;
+			rect.right++;
+			rect.bottom++;
+
+			MoveWindow(hVarTree_Global,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_Local,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+			MoveWindow(hVarTree_This,
+				rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+			pos_WatchList.x=pos_VarList.x+width_VarList+LEVER_THICK;
+			pos_WatchList.y=0;
+
+			//ウォッチリストの位置
+			MoveWindow(GetDlgItem(hwnd,IDC_WATCHLIST),
+				pos_WatchList.x,
+				pos_WatchList.y,
+				LOWORD(lParam)-pos_WatchList.x,
+				HIWORD(lParam)-pos_WatchList.y,
+				1);
+
+			return 1;
+
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+
+			//////////////////////////////////////////////////////////////
+			// ウォッチリストの以前の内容を破棄し、新しい内容に書き換える
+			//////////////////////////////////////////////////////////////
+
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				HeapDefaultFree(pobj_nv->ppWatchStr[i]);
+			}
+			HeapDefaultFree(pobj_nv->ppWatchStr);
+
+			pobj_nv->WatchNum=ListView_GetItemCount(hListView)-1;
+			pobj_nv->ppWatchStr=(char **)HeapAlloc(hHeap,0,pobj_nv->WatchNum*sizeof(char *)+1);
+			for(i=0;i<pobj_nv->WatchNum;i++){
+				ListView_GetItemText(hListView,i,0,temporary,VN_SIZE);
+				pobj_nv->ppWatchStr[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+				lstrcpy(pobj_nv->ppWatchStr[i],temporary);
+			}
+
+
+			//////////////////////////////
+			// デバッグダイアログを破棄
+			//////////////////////////////
+
+			hDebugWnd=0;
+
+			if( program.IsClipCompileView() ){
+				extern HWND hOwnerEditor;
+				SendMessage(hOwnerEditor,WM_DESTROYDEBUGGERVIEW,0,0);
+			}
+
+			return 1;
+
+
+
+		///////////////////////
+		// デバッグコマンド
+		///////////////////////
+
+		case WM_DEBUG_CONTINUE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_STEP_IN:
+			Debugger_StepIn();
+			return 1;
+		case WM_STEP_OVER:
+			Debugger_StepOver();
+			return 1;
+		case WM_STEP_CURSOR:
+			Debugger_StepCursor();
+			return 1;
+	}
+	return 0;
+}
+
+
+
+
+//////////////////////////////////
+// ポップアップ表示の変数リスト
+//////////////////////////////////
+
+INT_PTR CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+	extern DWORD dwStepRun;
+	RECT rect;
+	POINT pos;
+	SIZE size;
+
+	switch(message){
+		case WM_INITDIALOG:
+			extern HWND hDebugWnd;
+			hDebugWnd=hwnd;
+
+			pos.x=pobj_nv->VarDlgRect.left;
+			pos.y=pobj_nv->VarDlgRect.top;
+			size.cx=pobj_nv->VarDlgRect.right-pobj_nv->VarDlgRect.left;
+			size.cy=pobj_nv->VarDlgRect.bottom-pobj_nv->VarDlgRect.top;
+			MoveWindow(hwnd,pos.x,pos.y,size.cx,size.cy,1);
+
+			extern WNDPROC OldThreadComboProc;
+			OldThreadComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_THREADCOMBO),GWLP_WNDPROC,(LONG_PTR)ThreadComboProc);
+
+			extern WNDPROC OldProcComboProc;
+			OldProcComboProc=(WNDPROC)GetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC);
+			SetWindowLongPtr(GetDlgItem(hwnd,IDC_PROCCOMBO),GWLP_WNDPROC,(LONG_PTR)ProcComboProc);
+
+			//イメージリスト読み込み、設定
+			static HIMAGELIST hVariOrderImageList;
+			hVariOrderImageList=ImageList_Create(16,16,ILC_COLOR4|ILC_MASK,4,0);
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARARRAY)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTRUCT)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARDATA)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARSTR)));
+			ImageList_AddIcon(hVariOrderImageList,LoadIcon(hInst,MAKEINTRESOURCE(IDI_VARPTRSTRUCT)));
+			TreeView_SetImageList(GetDlgItem(hwnd,IDC_VARTREE),hVariOrderImageList,TVSIL_NORMAL);
+
+			InitVarList((DWORD)lParam);
+
+			ApplyDialogTexture(hwnd);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDCANCEL:
+					DestroyWindow(hwnd);
+					return 1;
+				case IDC_STEPIN:
+					dwStepRun=1;
+					return 1;
+				case IDC_STEPOVER:
+					dwStepRun=2;
+					return 1;
+			}
+			break;
+		case WM_SIZE:
+			GetWindowRect(GetDlgItem(hwnd,IDC_VARTREE),&rect);
+			pos.x=rect.left;
+			pos.y=rect.top;
+			ScreenToClient(hwnd,&pos);
+			MoveWindow(GetDlgItem(hwnd,IDC_VARTREE),0,pos.y,LOWORD(lParam),HIWORD(lParam)-pos.y,TRUE);
+			SetWindowPos(GetDlgItem(hwnd,IDCANCEL),0,LOWORD(lParam)-91,9,0,0,SWP_NOSIZE);
+			return 1;
+		case WM_VARLIST_CLOSE:
+			DestroyWindow(hwnd);
+			return 1;
+		case WM_DESTROY:
+			ImageList_Destroy(hVariOrderImageList);
+
+			GetWindowRect(hwnd,&pobj_nv->VarDlgRect);
+
+			hDebugWnd=0;
+
+			return 1;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.cpp	(revision 774)
@@ -0,0 +1,1217 @@
+#include "stdafx.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+using namespace ActiveBasic::Compiler;
+
+BOOL IsPtrType(int type){
+	if(type==-1) return 0;
+
+	if(PTR_LEVEL(type)||type==DEF_PTR_VOID||type==DEF_PTR_PROC||
+		(type&FLAG_PTR) ) return 1;
+
+	return 0;
+}
+BOOL IsSignedType(int type){
+	switch(type){
+		case DEF_SBYTE:
+		case DEF_INTEGER:
+		case DEF_LONG:
+		case DEF_INT64:
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+		case DEF_CHAR:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL IsNaturalWholeNumberType(int type){
+	switch(type){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_INTEGER:
+		case DEF_WORD:
+		case DEF_LONG:
+		case DEF_DWORD:
+		case DEF_INT64:
+		case DEF_QWORD:
+		case DEF_CHAR:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL IsWholeNumberType(int type){
+	return (
+		IsNaturalWholeNumberType(type)
+		|| IsPtrType(type)
+		|| type == DEF_BOOLEAN
+		);
+}
+BOOL IsRealNumberType(int type){
+	switch(type){
+		case DEF_DOUBLE:
+		case DEF_SINGLE:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
+BOOL Is64Type(int type){
+	switch(type){
+		case DEF_INT64:
+		case DEF_QWORD:
+			return 1;
+		default:
+			break;
+	}
+#ifdef _AMD64_
+	return IsPtrType(type);
+#else
+	return 0;
+#endif
+}
+int GetSignedType(int type){
+	switch(type){
+		case DEF_BYTE:
+			return DEF_SBYTE;
+		case DEF_WORD:
+			return DEF_INTEGER;
+		case DEF_DWORD:
+			return DEF_LONG;
+		case DEF_QWORD:
+			return DEF_INT64;
+		default:
+			break;
+	}
+#ifdef _AMD64_
+	if(IsPtrType(type)) return DEF_INT64;
+#else
+	if(IsPtrType(type)) return DEF_LONG;
+#endif
+	return type;
+}
+int GetUnsignedType(int type){
+	switch(type){
+		case DEF_SBYTE:
+			return DEF_BYTE;
+		case DEF_INTEGER:
+			return DEF_WORD;
+		case DEF_LONG:
+			return DEF_DWORD;
+		case DEF_INT64:
+			return DEF_QWORD;
+		case DEF_CHAR:
+			if( compiler.IsUnicode() ) return DEF_WORD;
+			return DEF_BYTE;
+	}
+	return type;
+}
+int GetPtrType(int type){
+	return MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)+1);
+}
+BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name){
+	if(PTR_LEVEL(type)){
+		//ポインタ型
+		name[0]='*';
+		return GetTypeName(MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1),lpIndex,name+1);
+	}
+
+	//整数型
+	if(type==DEF_SBYTE)				lstrcpy(name,"SByte");
+	else if(type==DEF_BYTE)			lstrcpy(name,"Byte");
+	else if(type==DEF_INTEGER)		lstrcpy(name,"Integer");
+	else if(type==DEF_WORD)			lstrcpy(name,"Word");
+	else if(type==DEF_LONG)			lstrcpy(name,"Long");
+	else if(type==DEF_DWORD)		lstrcpy(name,"DWord");
+	else if(type==DEF_INT64)		lstrcpy(name,"Int64");
+	else if(type==DEF_QWORD)		lstrcpy(name,"QWord");
+
+	//実数型
+	else if(type==DEF_SINGLE)		lstrcpy(name,"Single");
+	else if(type==DEF_DOUBLE)		lstrcpy(name,"Double");
+
+	//文字型
+	//else if(type==DEF_CHAR)				lstrcpy(name,"Char");
+
+	//bool型
+	else if(type==DEF_BOOLEAN)		lstrcpy(name,"Boolean");
+
+	//オブジェクト
+	else if(type==DEF_OBJECT || type==DEF_STRUCT){
+		if(lpIndex==0) lstrcpy(name,"non");
+		else{
+			lstrcpy(name,((CClass *)lpIndex)->GetName().c_str());
+		}
+	}
+
+	//ポインタ型
+	else if(type==DEF_PTR_VOID)		lstrcpy(name,"VoidPtr");
+
+	else if(type==DEF_PTR_PROC){
+		if(lpIndex==-1) lstrcpy(name,"VoidPtr");
+		else{
+			if( compiler.GetObjectModule().meta.GetProcPointers()[lpIndex]->ReturnType().IsNull() )
+				lstrcpy(name,"*Sub");
+			else lstrcpy(name,"*Function");
+		}
+	}
+
+	else{
+		extern int cp;
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return 0;
+	}
+	return 1;
+}
+
+Type GetStringTypeInfo(){
+	Type type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
+	return type;
+}
+
+void GetWithName(char *buffer){
+	extern WithInfos withInfos;
+	buffer[0]=0;
+	foreach( const WithInfo &withInfo, withInfos )
+	{
+		lstrcat( buffer, withInfo.name.c_str() );
+	}
+}
+
+void GetWithName(std::string& buffer){
+	extern WithInfos withInfos;
+	std::string tmp;
+	tmp.reserve(1024);
+	foreach( const WithInfo &withInfo, withInfos )
+	{
+		tmp+=withInfo.name;
+	}
+	tmp.swap(buffer);
+}
+
+void GetArrange(char *variable,char *variAnswer, Subscripts &subscripts ){
+	extern int cp;
+	int i,i2,i4;
+	double dbl;
+	_int64 i64data;
+	BOOL bBracket;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(variable[i]=='('||variable[i]=='['){
+			if(variable[i]=='[') bBracket=1;
+			else bBracket=0;
+
+			variAnswer[i]=0;
+			for(i++,i2=0;;i++,i2++){
+				if(variable[i]==','){
+					temporary[i2]=0;
+
+					Type resultType;
+					if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
+						return;
+					}
+					if(resultType.IsReal()){
+						memcpy(&dbl,&i64data,sizeof(double));
+						i64data=(_int64)dbl;
+					}
+
+					if(i64data<0)
+					{
+						//error
+						subscripts.push_back( 0 );
+					}
+					else
+					{
+						subscripts.push_back( (int)i64data );
+					}
+					i2=-1;
+					continue;
+				}
+				if(variable[i]=='('){
+					i4=GetStringInPare(temporary+i2,variable+i);
+					i2+=i4-1;
+					i+=i4-1;
+					continue;
+				}
+				if(variable[i]=='['){
+					i4=GetStringInBracket(temporary+i2,variable+i);
+					i2+=i4-1;
+					i+=i4-1;
+					continue;
+				}
+				if(variable[i]==')'&&bBracket==0||
+					variable[i]==']'&&bBracket){
+					temporary[i2]=0;
+					if(i2==0){
+						subscripts.push_back( -2 );
+						break;
+					}
+
+					Type resultType;
+					if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
+						return;
+					}
+					if(resultType.IsReal()){
+						memcpy(&dbl,&i64data,sizeof(double));
+						i64data=(_int64)dbl;
+					}
+
+					if(i64data<0){
+						//error
+						subscripts.push_back( 0 );
+					}
+					else
+					{
+						subscripts.push_back( (int)i64data );
+					}
+					break;
+				}
+				if(variable[i]=='\"'){
+					compiler.errorMessenger.Output(1,NULL,cp);
+					return;
+				}
+				temporary[i2]=variable[i];
+			}
+			break;
+		}
+		variAnswer[i]=variable[i];
+		if(variable[i]=='\0'){
+			break;
+		}
+	}
+}
+
+//対応する閉じ括弧cPare_Closeが現れるまでbufからarrayへコピーする。
+int CopyInsideBracket(char *array, const char *buf, char cPare_Open, char cPare_Close)
+{
+	bool inStr=false;
+	for(int i2=0;;i2++){
+		if(buf[i2]=='"'){
+			inStr=!inStr;
+		}
+		if(!inStr){
+			if(buf[i2]==cPare_Open){
+				int i3;
+				if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buf+i2);
+				else i3=GetStringInPare(array+i2,buf+i2);
+				i2+=i3-1;
+				continue;
+			}
+			if(buf[i2]==cPare_Close){
+				array[i2]=0;
+				return i2;
+			}
+		}
+		array[i2]=buf[i2];
+	}
+}
+
+bool GetVarFormatString( char *buffer,char *array,char *array2,char *NestMember,ReferenceKind &refType, PareOrBracket *pPareOrBracket ){
+	extern int cp;
+	int i;
+	char cPare_Open,cPare_Close;
+
+	array[0]=0;
+	array2[0]=0;
+	NestMember[0]=0;
+	for(i=0;;i++){
+		if(buffer[i]=='\"'){
+			for(i++;;i++){
+				if(IsDBCSLeadByte(buffer[i])){
+					i++;
+					continue;
+				}
+				if(buffer[i]=='\"') break;
+			}
+		}
+		if(buffer[i]=='['||buffer[i]=='('){
+			if(buffer[i]=='['){
+				cPare_Open='[';
+				cPare_Close=']';
+			}
+			else{
+				cPare_Open='(';
+				cPare_Close=')';
+			}
+
+			if( pPareOrBracket )
+			{
+				// []なのか、()なのかを伝える
+				if( cPare_Open == '[' )
+				{
+					*pPareOrBracket = Bracket;
+				}
+				else
+				{
+					*pPareOrBracket = Pare;
+				}
+			}
+
+			buffer[i]=0;
+			i++;
+			i+=CopyInsideBracket(array,buffer+i,cPare_Open,cPare_Close);
+			if(buffer[i+1]==cPare_Open){
+				i+=2;
+				for(int i2=0;;i++,i2++){
+					if(buffer[i]==cPare_Open){
+						int i3;
+						if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i);
+						else i3=GetStringInPare(array2+i2,buffer+i);
+						i+=i3-1;
+						i2+=i3-1;
+						continue;
+					}
+					if(buffer[i]==cPare_Close){
+						array2[i2]=0;
+						break;
+					}
+					array2[i2]=buffer[i];
+				}
+				if(buffer[i+1]==cPare_Open){
+					compiler.errorMessenger.Output(14,buffer,cp);
+					return false;
+				}
+			}
+			continue;
+		}
+		if(buffer[i]=='.'){
+			lstrcpy(NestMember,buffer+i+1);
+			refType = RefDot;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
+			lstrcpy(NestMember,buffer+i+2);
+			refType = RefPointer;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]=='\0') break;
+	}
+	return true;
+}
+
+void GetArrayElement( const char *buffer,char *variable,char *array_element){
+	array_element[0]=0;
+
+	if(buffer[lstrlen(buffer)-1]!=']'){
+		lstrcpy(variable,buffer);
+		return;
+	}
+
+	int i,i2;
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='['){
+			i2=GetStringInBracket(array_element,buffer+i);
+			i+=i2-1;
+			continue;
+		}
+	}
+
+	lstrcpy(variable,buffer);
+	variable[lstrlen(variable)-lstrlen(array_element)]=0;
+
+	RemoveStringBracket(array_element);
+}
+
+BOOL CheckVarNameError(char *name,int nowLine){
+	int i2;
+
+	if(!IsVariableTopChar(name[0])){
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return 0;
+	}
+	for(i2=1;;i2++){
+		if(name[i2]=='\0') break;
+		if(!IsVariableChar(name[i2])){
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return 0;
+		}
+	}
+	return 1;
+}
+
+int JumpSubScripts( const Subscripts &subscripts ){
+	//DIMで定義された並んだ配列の数だけアドレスを進める
+	int i, i2;
+	for( i=0,i2=1; i<(int)subscripts.size(); i++ ){
+		i2 *= subscripts[i] + 1;
+	}
+	return i2;
+}
+
+
+bool GetMemberType( const Type &classType, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled)
+{
+	const CClass &objClass = classType.GetClass();
+
+	extern int cp;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];		//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	ReferenceKind refType = RefNon;
+	lstrcpy(VarName,lpszMember);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
+
+	const Member *pMember = objClass.FindDynamicMember( VarName );
+	if( !pMember ){
+		if(isErrorEnabled) compiler.errorMessenger.Output(103,VarName,cp);
+		return false;
+	}
+
+	//アクセシビリティをチェック
+	if( compiler.IsCompilingClass() && &objClass == &compiler.GetCompilingClass() ){
+		//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+		if( pMember->IsNoneAccess() ){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+	}
+	else{
+		if(( bPrivateAccess==0 && pMember->IsPrivate() )||
+			pMember->IsNoneAccess() ){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+		else if( bPrivateAccess==0 && pMember->IsProtected() ){
+			if(isErrorEnabled) compiler.errorMessenger.Output(108,VarName,cp);
+			return false;
+		}
+	}
+
+	resultType = pMember->GetType();
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType );
+
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if( pMember->GetSubscripts().size() == 0 ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) compiler.errorMessenger.Output(16,lpszMember,cp);
+			return false;
+		}
+	}
+
+	if(array[0]){
+		//配列オフセット
+		if( pMember->GetSubscripts().size() <= 0 )
+		{
+			// 配列ではないメンバに配列指定をした
+			return false;
+		}
+	}
+	else if( pMember->GetSubscripts().size() > 0 ){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if( refType != RefNon ){
+		//入れ子構造の場合
+
+		return GetMemberType( pMember->GetType(),
+			NestMember,
+			resultType,
+			0,
+			isErrorEnabled);
+	}
+
+	if(lpPtrOffset[0]){
+		if( resultType.PtrLevel() ){
+			resultType.PtrLevelDown();
+		}
+		else{
+			//エラー
+			if(isErrorEnabled) compiler.errorMessenger.Output(1,NULL,cp);
+			return false;
+		}
+	}
+
+	return true;
+}
+bool GetVarType( const char *nameBuffer, Type &resultType, bool isErrorEnabled){
+	char variable[VN_SIZE];
+
+	if(nameBuffer[0]=='.'){
+		GetWithName(variable);
+		lstrcat(variable,nameBuffer);
+	}
+	else lstrcpy(variable,nameBuffer);
+
+	// 名前空間を分離
+	char namespaceStr[VN_SIZE]="", simpleName[VN_SIZE];
+	compiler.GetObjectModule().meta.GetNamespaces().SplitNamespace( variable, namespaceStr, simpleName );
+
+	// 先頭オブジェクトまたはクラス名と入れ子メンバに分割
+	ReferenceKind refType;
+	char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
+
+	// 名前空間を分離していた場合は結合
+	char VarName[VN_SIZE];
+	if( namespaceStr[0] ){
+		sprintf( VarName, "%s.%s", namespaceStr, simpleName );
+	}
+	else{
+		lstrcpy( VarName, simpleName );
+	}
+
+	const Variable *pVar = NULL;
+
+	if( compiler.IsLocalAreaCompiling() ){
+		/////////////////
+		// ローカル変数
+		/////////////////
+
+		pVar = compiler.GetCompilingUserProc().GetLocalVars().BackSearch(
+			LexicalAnalyzer::FullNameToSymbol( VarName ),
+			compiler.codeGenerator.lexicalScopes.GetNowLevel()
+		);
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+	if( compiler.IsCompilingClass() ){
+		///////////////////////
+		// クラスメンバの参照
+		///////////////////////
+
+		if(lstrcmpi(variable,"This")==0){
+			//Thisオブジェクト
+			resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+			return true;
+		}
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内の動的メンバを参照するとき（通常）
+
+			if( !compiler.GetCompilingClass().HasDynamicMember( VarName ) )
+			{
+				goto NonClassMember;
+			}
+		}
+
+		return GetMemberType(
+			Type( DEF_OBJECT, compiler.GetCompilingClass() ),
+			variable,
+			resultType,
+			1,
+			isErrorEnabled
+		);
+	}
+
+NonClassMember:
+
+	//////////////////////////
+	// 静的ローカル変数
+	// ※"Static.Object.Method.Variable"
+	//////////////////////////
+
+	char temporary[VN_SIZE];
+	if( compiler.IsLocalAreaCompiling() ){
+		GetNowStaticVarFullName(VarName,temporary);
+
+		pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temporary ) );
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+
+	//////////////////////////
+	// クラスの静的メンバ
+	//////////////////////////
+
+	if(member[0]){
+		lstrcpy(temporary,member);
+		char tempMember[VN_SIZE];
+		char tempArray[VN_SIZE];
+		{
+			ReferenceKind refType;
+			GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
+		}
+
+		const TypeDef *pTypeDef = compiler.GetObjectModule().meta.GetTypeDefs().Find( LexicalAnalyzer::FullNameToSymbol( VarName ) );
+		if( pTypeDef )
+		{
+			// TypeDef後の型名だったとき
+			lstrcpy( VarName, pTypeDef->GetBaseName().c_str() );
+		}
+
+		char temp2[VN_SIZE];
+		sprintf(temp2,"%s.%s",VarName,temporary);
+
+		pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+		if( pVar ){
+			lstrcpy(member,tempMember);
+			lstrcpy(array,tempArray);
+			goto ok;
+		}
+	}
+
+	if( compiler.IsCompilingClass() ){
+		//自身のクラスから静的メンバを参照する場合
+		char temp2[VN_SIZE];
+		sprintf(temp2,"%s.%s",compiler.GetCompilingClass().GetName().c_str(),VarName);
+
+		pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+		if( pVar ){
+			goto ok;
+		}
+	}
+
+
+	////////////////////
+	// グローバル変数
+	////////////////////
+
+	pVar = compiler.GetObjectModule().meta.GetGlobalVars().BackSearch(
+		LexicalAnalyzer::FullNameToSymbol( VarName ),
+		compiler.codeGenerator.lexicalScopes.GetNowLevel()
+	);
+	if( pVar ){
+		goto ok;
+	}
+
+	//変数として見つからなかったとき
+	if(isErrorEnabled) compiler.errorMessenger.Output(3,variable,cp);
+	return false;
+
+ok:
+
+	//ポインタ変数の場合
+	if( pVar->GetType().IsPointer() ){
+		if( !pVar->IsArray() ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) compiler.errorMessenger.Output(16,variable,cp);
+			return false;
+		}
+	}
+
+	resultType = pVar->GetType();
+
+	if(member[0]){
+		if( NATURAL_TYPE( resultType.GetBasicType() )==DEF_OBJECT
+			|| NATURAL_TYPE( resultType.GetBasicType() )==DEF_STRUCT)
+		{
+			return GetMemberType(resultType,member,resultType,0,isErrorEnabled);
+		}
+	}
+
+	if( array[0] == 0 && pVar->GetSubscripts().size() > 0 ){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(lpPtrOffset[0]){
+		if( resultType.PtrLevel() ){
+			resultType.PtrLevelDown();
+		}
+		else{
+			//エラー
+			if(isErrorEnabled) compiler.errorMessenger.Output(1,NULL,cp);
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts )
+{
+	//読み取り専用で変数へアクセス
+	return GetVarOffset(
+		true,		//エラー表示有効
+		false,		//書き込みアクセスは無し
+		NameBuffer,
+		pRelativeVar,
+		resultType,
+		pResultSubscripts
+	);
+}
+bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts )
+{
+	//読み書き両用で変数へアクセス
+	return GetVarOffset(
+		true,		//エラー表示有効
+		true,		//書き込みアクセス
+		NameBuffer,
+		pRelativeVar,
+		resultType,
+		pResultSubscripts
+	);
+}
+
+
+
+bool GetDimentionFormat( const char *buffer,
+						char *VarName,
+						Subscripts &subscripts,
+						Type &type,
+						char *InitBuf,
+						char *ConstractParameter ){
+	int i,i2,i3,IsStr;
+	char variable[VN_SIZE],temporary[8192];
+
+	for(i=0;;i++){
+		if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
+			buffer[i]=='='||
+			buffer[i]=='\0'){
+			variable[i]=0;
+			break;
+		}
+		variable[i]=buffer[i];
+	}
+
+	if(buffer[i]=='='){
+		////////////////////////////////////
+		// 初期化データが指定されいるとき
+		////////////////////////////////////
+		i++;
+
+		if( buffer[i]=='[' ){
+			// 構造初期データの場合
+
+			i3=GetStringInBracket(InitBuf,buffer+i);
+			i+=i3;
+		}
+		else{
+			// 代入初期データの場合
+
+			for(i2=0,IsStr=0;;i++,i2++){
+				if(buffer[i]=='\"') IsStr^=1;
+				if(buffer[i]=='('&&IsStr==0){
+					i3=GetStringInPare(InitBuf+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if(buffer[i]=='['&&IsStr==0){
+					i3=GetStringInBracket(InitBuf+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if((buffer[i]==','&&IsStr==0)||
+					buffer[i]=='\0'){
+					InitBuf[i2]=0;
+					break;
+				}
+				InitBuf[i2]=buffer[i];
+			}
+		}
+	}
+	else{
+		//初期化データなし
+		InitBuf[0]=0;
+	}
+
+	ConstractParameter[0]=0;
+	if(buffer[i]==1&&buffer[i+1]==ESC_AS){
+		/////////////////////////////
+		// "As ～" による型指定あり
+		/////////////////////////////
+
+		for(i+=2,i2=0;;i++,i2++){
+			if(buffer[i]=='('||buffer[i]=='\0'){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+		if(temporary[0]=='*'&&
+			temporary[1]==1&&
+			(temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
+			if(buffer[i]!='('){
+				compiler.errorMessenger.Output(10,temporary,cp);
+				return false;
+			}
+			i3=GetStringInPare(temporary+3,buffer+i);
+			i+=i3;
+			i2+=i3;
+
+			if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
+				temporary[i2++]=buffer[i++];
+				temporary[i2++]=buffer[i++];
+				for(;;i++,i2++){
+					if(!IsVariableChar(buffer[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+			}
+		}
+
+		ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType result = compiler.StringToTypeEx( temporary, type, true );
+		if( result != ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful )
+		{
+			if( result == ActiveBasic::Compiler::Error::StringToTypeErrorCode::FailedResolveGenericType )
+			{
+				compiler.errorMessenger.Output(143,temporary,cp);
+			}
+			else
+			{
+				compiler.errorMessenger.Output(3,temporary,cp);
+			}
+			return false;
+		}
+
+		if(buffer[i]=='('){
+			//コンストラクタに渡すパラメータを取得
+			i2=GetStringInPare(ConstractParameter,buffer+i);
+			i+=i2;
+			RemoveStringPare(ConstractParameter);
+
+			if( !type.IsObject() ){
+				compiler.errorMessenger.Output(112,variable,cp);
+				return false;
+			}
+		}
+	}
+	else{
+		/////////////////
+		// As指定なし
+		/////////////////
+
+		if( InitBuf[0] == '\0' ){
+			//As指定も、初期値指定もない場合
+			type.SetBasicType( Type::GetBasicTypeFromSimpleName(variable) );
+
+			i2=lstrlen(variable)-1;
+			if(i2>=0){
+				if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
+					compiler.errorMessenger.Output(-103,variable,cp);
+			}
+		}
+		else{
+			//初期値の型を判別して自動的に型情報を付加する
+			if( !NumOpe_GetType( InitBuf, GetStringTypeInfo(), type ) ){
+				// エラーの場合
+				return false;
+			}
+
+			if( IS_LITERAL( type.GetIndex() ) ){
+				type.SetIndex( -1 );
+			}
+		}
+
+	}
+
+	if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
+		//初期値とコンストラクタパラメータが同時に呼び出されているとき
+		compiler.errorMessenger.Output(132, NULL, cp);
+	}
+
+	GetArrange(variable,VarName,subscripts);
+	return true;
+}
+
+BOOL GetNowStaticVarFullName(char *VarName,char *FullName){
+	if( compiler.IsGlobalAreaCompiling() ){
+		// グローバル領域をコンパイル中のとき
+		return 0;
+	}
+
+	const UserProc &proc = compiler.GetCompilingUserProc();
+
+	//Static識別
+	lstrcpy(FullName,"Static%");
+
+	//クラス名
+	if( compiler.IsCompilingClass() ){
+		lstrcat(FullName,compiler.GetCompilingClass().GetName().c_str());
+		lstrcat(FullName,"%");
+	}
+
+	//関数（またはメソッド）名
+	lstrcat(FullName,proc.GetName().c_str());
+	lstrcat(FullName,"%");
+
+	//ID
+	char temp[255];
+	sprintf(temp,"%x",proc.GetId());
+	lstrcat(FullName,temp);
+	lstrcat(FullName,"%");
+
+	//変数名
+	lstrcat(FullName,VarName);
+
+	return 1;
+}
+
+
+void AddGlobalVariable( const char *name, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag){
+	/////////////////////////
+	// グローバル変数を追加
+	/////////////////////////
+
+	if( compiler.GetObjectModule().meta.GetGlobalVars().DuplicateCheck( LexicalAnalyzer::FullNameToSymbol( name ), compiler.codeGenerator.lexicalScopes.GetNowLevel() ) ){
+		//２重定義のエラー
+		compiler.errorMessenger.Output(15,name,cp);
+		return;
+	}
+
+	bool isConst = ( dwFlag & DIMFLAG_CONST ) ? true:false;
+
+	Variable *pVar = new Variable(
+		Symbol( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes(), name ),
+		type,
+		isConst,
+		false,
+		ConstractParameter,
+		( InitBuf[0] != 0 || dwFlag == DIMFLAG_INITDEBUGVAR )
+	);
+
+	if( subscripts.size() > 0 ){
+		//配列あり
+		pVar->SetArray( subscripts );
+	}
+
+	//レキシカルスコープ
+	pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+	pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+	pVar->isLiving = true;
+
+	//エラー用
+	pVar->source_code_address=cp;
+
+	// 変数を追加
+	compiler.GetObjectModule().meta.GetGlobalVars().Add( pVar );
+
+	if(InitBuf[0]){
+		int result = 0;
+		if( !pVar->GetType().IsObject() ){
+			result = SetInitGlobalData(pVar->GetOffsetAddress(),
+				pVar->GetType(),
+				pVar->GetSubscripts(),
+				InitBuf);
+		}
+
+		if(!result){
+			//動的な式だった場合は代入演算を行う
+
+			//初期代入時のみ、書き込みアクセスを許可する
+			if( isConst ){
+				pVar->ConstOff();
+			}
+
+			//代入
+			char temporary[8192];
+			sprintf(temporary,"%s=%s",name,InitBuf);
+			OpcodeCalc(temporary);
+
+			//アクセス制限を元に戻す
+			if( isConst ){
+				pVar->ConstOn();
+			}
+		}
+	}
+
+
+	if( type.IsObject() ){
+		//デストラクタの利用フラグをオンにする
+		const CMethod *method = type.GetClass().GetDestructorMethod();
+		if( method ){
+			method->GetUserProc().Using();
+		}
+	}
+}
+
+void dim(char *Parameter,DWORD dwFlags){
+	int i2;
+	char VarName[VN_SIZE];
+
+	i2 = 0;
+
+	if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
+		//参照型
+		compiler.errorMessenger.OutputFatalError();
+		Parameter += 2;
+	}
+
+	if(dwFlags & DIMFLAG_CONST){
+
+		//////////////////////////////////
+		// 定数変数の場合を考慮
+		//////////////////////////////////
+		for(;;i2++){
+			if(Parameter[i2] == '=' ||
+				Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
+				Parameter[i2] =='('){
+					VarName[i2] = 0;
+					break;
+			}
+			VarName[i2] = Parameter[i2];
+		}
+
+		//定数と２重定義されていないる場合は抜け出す
+		if(compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType( ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( VarName ) )){
+			return;
+		}
+
+		//定数マクロとして定義されている場合は抜け出す
+		if( compiler.GetObjectModule().meta.GetGlobalConstMacros().IsExistDuplicationKeyName( VarName ) )
+		{
+			return;
+		}
+	}
+
+
+	//構文を解析
+	Type type;
+	char InitBuf[8192];
+	char ConstractParameter[VN_SIZE];
+	Subscripts subscripts;
+	if(!GetDimentionFormat(Parameter, VarName,subscripts,type,InitBuf,ConstractParameter))
+		return;
+
+
+	//定数と２重定義されていないかを調べる
+	if(compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType( ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( VarName ) )){
+		compiler.errorMessenger.Output(15,VarName,cp);
+		return;
+	}
+
+	//定数マクロとして定義されている場合
+	if( compiler.GetObjectModule().meta.GetGlobalConstMacros().IsExistDuplicationKeyName( VarName ) ){
+		compiler.errorMessenger.Output(15,VarName,cp);
+		return;
+	}
+
+	if( type.IsObject() ){
+		if( type.GetClass().IsBlittableType() ){
+			// Blittable型のときは基本型として扱う
+			// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+			if( compiler.IsLocalAreaCompiling()
+				&& compiler.GetCompilingUserProc().HasParentClass()
+				&& compiler.GetCompilingUserProc().GetParentClass().IsBlittableType() )
+			{
+				// コンパイル中のメソッドがBlittable型クラスに属している
+			}
+			else{
+				type = type.GetClass().GetBlittableType();
+			}
+		}
+	}
+
+	if(dwFlags&DIMFLAG_STATIC)
+	{
+		if( compiler.IsGlobalAreaCompiling() )
+		{
+			compiler.errorMessenger.Output(60,NULL,cp);
+			return;
+		}
+
+		/////////////////////
+		// Static変数
+		// ※"Static.Object.Method.Variable"
+		/////////////////////
+
+		char temporary[VN_SIZE];
+		GetNowStaticVarFullName(VarName,temporary);
+
+		dim( temporary,subscripts,type,InitBuf,ConstractParameter,dwFlags );
+
+		/*
+		Note: 静的変数のコンストラクタ呼び出しは
+			_System_InitStaticLocalVariables関数内で一括して行う
+		*/
+	}
+	else{
+		dim( VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags );
+	}
+}
+void OpcodeDim(char *Parameter,DWORD dwFlags){
+	int i,i2,i3,IsStr=0;
+	char temporary[8192];
+
+	for(i=0,i2=0;;i++,i2++){
+		if(Parameter[i]=='\"') IsStr^=1;
+		if(Parameter[i]=='('&&IsStr==0){
+			i3=GetStringInPare(temporary+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		if(Parameter[i]=='['&&IsStr==0){
+			i3=GetStringInBracket(temporary+i2,Parameter+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		if( Parameter[i] == '<' && IsStr == 0 )
+		{
+			if( IsGenericTypeSourcePart( Parameter + i ) )
+			{
+				// ジェネリクス構文
+				i3=GetStringInGenericBracket(temporary+i2,Parameter+i);
+				i+=i3-1;
+				i2+=i3-1;
+				continue;
+			}
+			else
+			{
+				// 一般構文
+			}
+		}
+		if((Parameter[i]==','&&IsStr==0)||
+			Parameter[i]=='\0'){
+			temporary[i2]=0;
+
+			dim(temporary,dwFlags);
+
+			if(Parameter[i]=='\0') break;
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=Parameter[i];
+	}
+}
+
+void DebugVariable(void)
+{
+	char temporary[255];
+	if( compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( "_DebugSys_dwThreadID" ) ) == NULL )
+	{
+		// 未定義の場合は定義する
+		sprintf(temporary,"_DebugSys_dwThreadID[255]%c%cDWord",1,ESC_AS);
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+		sprintf(temporary,"_DebugSys_ProcNum[255]%c%cDWord",1,ESC_AS);
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+		sprintf(temporary,"_DebugSys_lplpObp[255]%c%c*ULONG_PTR",1,ESC_AS);
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+		sprintf(temporary,"_DebugSys_lplpSpBase[255]%c%c*ULONG_PTR",1,ESC_AS);
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/VariableOpe.h	(revision 774)
@@ -0,0 +1,40 @@
+#pragma once
+
+enum PareOrBracket
+{
+	None = 0,
+	Pare,			// (...)
+	Bracket,		// [...]
+};
+
+BOOL IsPtrType(int type);
+BOOL IsSignedType(int type);
+BOOL IsNaturalWholeNumberType(int type);
+BOOL IsWholeNumberType(int type);
+BOOL IsRealNumberType(int type);
+BOOL Is64Type(int type);
+int GetSignedType(int type);
+int GetUnsignedType(int type);
+int GetPtrType(int type);
+BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name);
+Type GetStringTypeInfo();
+void GetWithName(char *buffer);
+bool GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember, ReferenceKind &refType, PareOrBracket *pPareOrBracket = NULL );
+void GetArrayElement( const char *buffer,char *variable,char *array_element);
+BOOL CheckVarNameError(char *name,int nowLine);
+int JumpSubScripts( const Subscripts &subscripts );
+bool GetMemberType( const Type &classType, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled);
+bool GetVarType( const char *nameBuffer, Type &resultType, bool isError);
+bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
+bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
+bool GetDimentionFormat( const char *buffer,
+						char *VarName,
+						Subscripts &subscripts,
+						Type &type,
+						char *InitBuf,
+						char *ConstractParameter );
+BOOL GetNowStaticVarFullName(char *VarName,char *FullName);
+void AddGlobalVariable( const char *name, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlag);
+void dim(char *Parameter,DWORD dwFlags);
+void OpcodeDim(char *Parameter,DWORD dwFlags);
+void DebugVariable(void);
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/WatchList.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/WatchList.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/WatchList.cpp	(revision 774)
@@ -0,0 +1,554 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+//デバッグ用
+#include "debug.h"
+
+using namespace ActiveBasic::Compiler;
+
+int Debugging_GetArray( const Subscripts &subscripts,char *array,const Type &type,LONG_PTR *plpOffset);
+
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+	int i2;
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		return ImageBase+MemPos_RWSection+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(ImageBase+MemPos_RWSection+pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		return pobj_dti->lplpSpBase[i2]+pRelativeVar->offset;
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		if(pobj_dti->lplpSpBase[i2]==0) return 0;
+
+		extern HANDLE hDebugProcess;
+		LONG_PTR lpData;
+		SIZE_T accessBytes;
+		ReadProcessMemory(hDebugProcess,
+			(void *)(pobj_dti->lplpSpBase[i2]+(int)pRelativeVar->offset),
+			&lpData,
+			sizeof(LONG_PTR),
+			&accessBytes);
+
+		return lpData;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+		return pRelativeVar->offset;
+	}
+
+	return 0;
+}
+
+bool Debugging_SetRelativeOffset( Type &type,RELATIVE_VAR *pRelativeVar,char *lpPtrOffset){
+	int array_num;
+
+	_int64 i64data;
+	if( !StaticCalculation( true, lpPtrOffset, 0, &i64data, Type(), 1 ) ){
+		return false;
+	}
+	if( type.IsReal() ){
+		double dbl;
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+
+	array_num=(int)i64data;
+
+	if( type.PtrLevel() ){
+		type.PtrLevelDown();
+		array_num *= type.GetSize();
+	}
+	else{
+		//エラー
+		return false;
+	}
+
+	extern HANDLE hDebugProcess;
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+	lpData=Debugging_GetVarPtr(pRelativeVar);
+	if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+		return false;
+	}
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	pRelativeVar->offset+=array_num;
+	return true;
+}
+
+int Debugging_GetMember( const CClass &objClass,char *member,RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess){
+	int i2;
+
+	//直接参照に切り替え
+	pRelativeVar->offset=(LONG_PTR)Debugging_GetVarPtr(pRelativeVar);
+	pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	ReferenceKind refType;
+	lstrcpy(VarName,member);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember, refType ) ) return 0;
+
+
+	////////////////////////////
+	// メンバオフセットを取得
+	////////////////////////////
+
+	const Member *pMember = objClass.FindDynamicMember( VarName );
+	if( !pMember )
+	{
+		return 0;
+	}
+
+	int offset = objClass.GetMemberOffset( VarName );
+
+
+	//アクセシビリティをチェック
+	if(( bPrivateAccess==0 && pMember->IsPrivate() )||
+		pMember->IsNoneAccess() ){
+		return 0;
+	}
+	else if(bPrivateAccess==0&&pMember->IsProtected())
+		return 0;
+
+	resultType = pMember->GetType();
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if( pMember->GetSubscripts().size() == 0 ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]) return 0;
+	}
+
+	pRelativeVar->offset+=offset;
+
+	if(array[0]){
+		//配列オフセット
+		i2=Debugging_GetArray(
+			pMember->GetSubscripts(),
+			array,
+			resultType,
+			&pRelativeVar->offset);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	else if( pMember->GetSubscripts().size() > 0 ){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(NestMember[0]){
+		//入れ子構造の場合
+
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			if( refType != RefDot ) return 0;
+
+			if( resultType.IsObject() ){
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//構造体ポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				if( refType != RefDot ) return 0;
+
+				//直接参照に切り替え
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				lpPtrOffset[0]=0;
+			}
+			else{
+				if( refType != RefPointer ) return 0;
+
+				extern HANDLE hDebugProcess;
+				LONG_PTR lpData;
+				SIZE_T accessBytes;
+				lpData=Debugging_GetVarPtr(pRelativeVar);
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+		}
+
+		i2=Debugging_GetMember(pMember->GetType().GetClass(),
+			NestMember,
+			pRelativeVar,
+			resultType,
+			0);
+		if(i2==0){
+			//式エラー
+			return 0;
+		}
+		if(i2==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+
+	if(lpPtrOffset[0]){
+		Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+	}
+
+	return 1;
+}
+int Debugging_GetArray( const Subscripts &subscripts,char *array,const Type &type,LONG_PTR *plpOffset){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,array_offset;
+	char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+	for(i=0,i2=0,i3=0;;i++,i2++){
+		if(array[i]=='('){
+			i4=GetStringInPare(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]=='['){
+			i4=GetStringInBracket(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]==','||array[i]=='\0'){
+			if( i3 >= (int)subscripts.size() )
+			{
+				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+				return 0;
+			}
+
+			temporary[i2]=0;
+
+			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(pParm[i3],temporary);
+
+			i3++;
+
+			if(array[i]=='\0'){
+				if( i3 < (int)subscripts.size() )
+				{
+					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+					return 0;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=array[i];
+	}
+
+	array_offset=0;
+
+	for(i=i3-1;i>=0;i--){
+		_int64 i64data;
+		Type resultType;
+		bool isMemoryAccessError;
+		if( !StaticCalculation(true, pParm[i],0,&i64data,resultType,1, &isMemoryAccessError ) ){
+			//式エラー
+			return 0;
+		}
+		if(isMemoryAccessError){
+			//アクセスエラー
+			return -1;
+		}
+
+		if(resultType.IsReal()){
+			double dbl;
+			memcpy(&dbl,&i64data,sizeof(double));
+			i64data=(_int64)dbl;
+		}
+		i5=(int)i64data;
+
+		for(i2=i+1,i4=1;i2<i3;i2++) i4*=subscripts[i2]+1;
+
+		array_offset+=i5*i4;
+
+		HeapDefaultFree(pParm[i]);
+	}
+
+	array_offset *= type.GetSize();
+
+	*plpOffset+=array_offset;
+
+	return 1;
+}
+ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip){
+	UserProc *pUserProc = GetSubFromObp(obp_Rip);
+
+	foreach( Variable *pVar, pUserProc->GetLocalVars() ){
+		if( pVar->GetName() == "_System_LocalThis" ){
+			return pVar->GetOffsetAddress();
+		}
+	}
+	return 0;
+}
+int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, Subscripts *pResultSubscripts){
+	extern HANDLE hDebugProcess;
+	int i2,i3;
+	char member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	LONG_PTR lpData;
+	SIZE_T accessBytes;
+
+	lstrcpy(VarName,variable);
+	ReferenceKind refType;
+	GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
+
+	const Subscripts *pSubscripts;
+	bool isArray;
+
+
+	/////////////////
+	// ローカル変数
+	/////////////////
+	if( compiler.IsLocalAreaCompiling() ){
+		const Variable *pVar = compiler.GetCompilingUserProc().GetLocalVars().Find( LexicalAnalyzer::FullNameToSymbol( VarName ) );
+
+		if( pVar ){
+			//ポインタ変数の場合
+			if( pVar->GetType().IsPointer() ){
+				if( !pVar->IsArray() ){
+					lstrcpy(lpPtrOffset,array);
+					array[0]=0;
+				}
+			}
+			else{
+				if(lpPtrOffset[0]) return 0;
+			}
+
+			pRelativeVar->offset = pVar->GetOffsetAddress();
+			if( pVar->IsRef() ){
+				pRelativeVar->dwKind=VAR_REFLOCAL;
+			}
+			else{
+				pRelativeVar->dwKind=VAR_LOCAL;
+			}
+			resultType = pVar->GetType();
+			isArray = pVar->IsArray();
+			pSubscripts = &pVar->GetSubscripts();
+		}
+	}
+
+	if( compiler.IsCompilingClass() )
+	{
+		///////////////////////
+		// クラスメンバの参照
+		///////////////////////
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内の動的メンバを参照するとき（通常）
+
+			if( !compiler.GetCompilingClass().HasDynamicMember( VarName ) )
+			{
+				goto NonClassMember;
+			}
+		}
+
+		/////////////////////////////
+		// thisポインタを取得
+
+		extern HWND hDebugWnd;
+		i2=(int)SendDlgItemMessage(hDebugWnd,IDC_PROCCOMBO,CB_GETCURSEL,0,0);
+		i2=pobj_dti->iProcLevel-i2;
+
+		lpData=Debugging_GetThisPtrOffset(pobj_dti->lplpObp[i2]);
+		if(!lpData){
+			//式エラー
+			return 0;
+		}
+		lpData+=pobj_dti->lplpSpBase[i2];
+		if(!ReadProcessMemory(hDebugProcess,(void *)lpData,&pRelativeVar->offset,sizeof(LONG_PTR),&accessBytes)){
+			//メモリにアクセスできないとき
+			return -1;
+		}
+
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+		i3=Debugging_GetMember( compiler.GetCompilingClass(),variable,pRelativeVar,resultType,1);
+		if(i3==0){
+			//式エラー
+			return 0;
+		}
+		if(i3==-1){
+			//アクセスエラー
+			return -1;
+		}
+
+		return 1;
+	}
+
+NonClassMember:
+
+	{
+		///////////////////
+		// グローバル変数
+		///////////////////
+
+		const Variable *pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( VarName ) );
+		if( !pVar ){
+			//一致しないとき
+			return 0;
+		}
+
+		//ポインタ変数の場合
+		if( pVar->GetType().IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]) return 0;
+		}
+
+		pRelativeVar->offset=pVar->GetOffsetAddress();
+		if(pVar->IsRef()) pRelativeVar->dwKind=VAR_REFGLOBAL;
+		else pRelativeVar->dwKind=VAR_GLOBAL;
+		resultType = pVar->GetType();
+		isArray = pVar->IsArray();
+		pSubscripts = &pVar->GetSubscripts();
+	}
+
+
+	if(array[0]==0&&isArray){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+		if( pResultSubscripts )
+		{
+			(*pResultSubscripts) = *pSubscripts;
+		}
+		return 1;
+	}
+
+	if(array[0]){
+		i3=Debugging_GetArray( *pSubscripts, array,resultType,&pRelativeVar->offset);
+		if(i3==0){
+			//式エラー
+			return 0;
+		}
+		if(i3==-1){
+			//アクセスエラー
+			return -1;
+		}
+	}
+	if(member[0]){
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			//実態オブジェクトのメンバを参照（obj.member）
+			if( refType != RefDot ){
+				return 0;
+			}
+
+			i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+			if(i3==0){
+				//式エラー
+				return 0;
+			}
+			if(i3==-1){
+				//アクセスエラー
+				return -1;
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( refType != RefDot ) return 0;
+				Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+			else{
+				//pObj->member
+				if( refType != RefPointer ) return 0;
+
+				pRelativeVar->offset=Debugging_GetVarPtr(pRelativeVar);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				if(!ReadProcessMemory(hDebugProcess,(void *)pRelativeVar->offset,&lpData,sizeof(LONG_PTR),&accessBytes)) return -1;
+				pRelativeVar->offset=lpData;
+
+				i3=Debugging_GetMember(resultType.GetClass(),member,pRelativeVar,resultType,0);
+				if(i3==0){
+					//式エラー
+					return 0;
+				}
+				if(i3==-1){
+					//アクセスエラー
+					return -1;
+				}
+			}
+		}
+		else{
+			return 0;
+		}
+		return 1;
+	}
+
+	if(lpPtrOffset[0]){
+		if(!Debugging_SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset)) return 0;
+	}
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/calculation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/calculation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/calculation.cpp	(revision 774)
@@ -0,0 +1,1528 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+double dbl_stack[255];
+_int64 i64stack[255];
+
+bool IsNumberTopChar(const char *buffer){
+	int c = buffer[0];
+	if('0' <= c && c <= '9') return true;
+	if(c == '&' && (buffer[1] == 'h' || buffer[1] == 'H' || buffer[1] == 'o' || buffer[1] == 'O')) return true;
+
+	return false;
+}
+bool IsNumberChar(const char c){
+	if('0' <= c && c <= '9') return true;
+	if('a' <= c && c <= 'f') return true;
+	if('A' <= c && c <= 'F') return true;
+	if(c=='.' || c=='e'||c=='E') return true;
+
+	return false;
+}
+BOOL IsJudgMark(const char *Command,int p){
+	if(Command[p]==1){
+		if(Command[p+1]==ESC_AND) return 1;
+		if(Command[p+1]==ESC_OR) return 1;
+		if(Command[p+1]==ESC_XOR) return 1;
+		if(Command[p+1]==ESC_NOT) return 1;
+	}
+	return 0;
+}
+BOOL IsNumCalcMark(const char *Command,int p){
+	if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+		(Command[p]==1&&Command[p+1]==ESC_MOD)||Command[p]=='+'||Command[p]=='-'||
+		Command[p]=='='||Command[p]=='<'||Command[p]=='>'||
+		IsJudgMark(Command,p)||
+		(Command[p]==1&&Command[p+1]==ESC_AS)||
+		(Command[p]==1&&Command[p+1]==ESC_BYVAL)) return 1;
+	return 0;
+}
+BOOL IsNumCalcMark_Back(const char *Command,int p){
+	if(p==0){
+		if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+			Command[p]=='+'||Command[p]=='-'||
+			Command[p]=='='||Command[p]=='<'||Command[p]=='>') return 1;
+	}
+	else{
+		if(Command[p]=='^'||Command[p]=='*'||Command[p]=='/'||Command[p]=='\\'||
+			(Command[p-1]==1&&Command[p]==ESC_MOD)||Command[p]=='+'||Command[p]=='-'||
+			Command[p]=='='||Command[p]=='<'||Command[p]=='>'||
+			IsJudgMark(Command,p-1)||
+			(Command[p-1]==1&&Command[p]==ESC_AS)) return 1;
+	}
+	return 0;
+}
+BOOL IsStrCalcMark(const char c){
+	if(c=='+'||c=='&') return 1;
+	return 0;
+}
+BOOL IsExponent(const char *Command,int p){
+	int i,sw;
+	for(i=p-2,sw=FALSE;i>=0;i--){
+		if(Command[i]>='0'&&Command[i]<='9') sw=TRUE;
+		if(!((Command[i]>='0'&&Command[i]<='9')||Command[i]=='.')){
+			if((IsNumCalcMark(Command,i)||Command[i]=='('||Command[i]==')')&&sw) return TRUE;
+			return FALSE;
+		}
+		if(i==0&&sw) return TRUE;
+	}
+	return FALSE;
+}
+
+int CompStr(char *str1,int len1,char *str2,int len2){
+	int i,len;
+
+	if(len1<len2) len=len1;
+	else len=len2;
+
+	for(i=0;i<len;i++){
+		if((unsigned char *)str1[i]>(unsigned char *)str2[i]) return 1;
+		else if((unsigned char *)str1[i]<(unsigned char *)str2[i]) return -1;
+	}
+	if(len1>len2) return 1;
+	else if(len1<len2) return -1;
+	return 0;
+}
+void TypeErrorCheck(_int64 *stack,int sp,long calc){
+	extern int cp;
+	if(sp==0||calc==0) return;
+	if(sp==1){
+		if(stack[0]){
+			compiler.errorMessenger.Output(9,NULL,cp);
+			return;
+		}
+		return;
+	}
+	if(CALC_PE<=calc&&calc<=CALC_Q||calc==CALC_ADDITION){
+		//文字列演算が可能な演算子
+		if((stack[sp-2]&&stack[sp-1]==0)||(stack[sp-2]==0&&stack[sp-1])){
+			compiler.errorMessenger.Output(9,NULL,cp);
+			return;
+		}
+	}
+	else{
+		//文字列演算ができない演算子
+		if(stack[sp-2]||stack[sp-1]){
+			compiler.errorMessenger.Output(9,NULL,cp);
+			return;
+		}
+	}
+}
+
+
+int GetLiteralIndex(_int64 i64data){
+	if(i64data==0) return LITERAL_NULL;
+	else if(-128<=i64data&&i64data<0) return LITERAL_M128_0;
+	else if(0<i64data&&i64data<256) return LITERAL_0_255;
+	else if(-32768<=i64data&&i64data<0) return LITERAL_M32768_0;
+	else if(0<i64data&&i64data<65536) return LITERAL_0_65535;
+	else if(i64data<0) return LITERAL_OTHER_MINUS;
+	return LITERAL_OTHER_PLUS;
+}
+
+
+int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2){
+
+	if(type1==DEF_DOUBLE||type2==DEF_DOUBLE) return DEF_DOUBLE;
+	if(type1==DEF_SINGLE||type2==DEF_SINGLE) return DEF_SINGLE;
+
+	int size1,size2;
+	size1=Type(type1,index1).GetSize();
+	size2=Type(type2,index2).GetSize();
+	if(size1<size2){
+		size1=size2;
+	}
+	else if(type1==type2) return type1;
+
+	if(IsPtrType(type1)||IsPtrType(type2)){
+		if(IsPtrType(type1)) return type1;
+		else return type2;
+	}
+
+
+	/////////////////////////////
+	// 片方がリテラル値の場合
+	// ※柔軟に符号を除去する
+	/////////////////////////////
+	if(IsSignedType(type1)&&IS_POSITIVE_LITERAL(index1)&&
+		IsSignedType(type2)==0){
+		type1=GetUnsignedType(type1);
+	}
+	if(IsSignedType(type1)==0&&
+		IsSignedType(type2)&&IS_POSITIVE_LITERAL(index2)){
+		type2=GetUnsignedType(type2);
+	}
+
+
+	if(IsSignedType(type1)||IsSignedType(type2)){
+		//符号あり
+		if(size1==sizeof(char))		return DEF_SBYTE;
+		if(size1==sizeof(short))	return DEF_INTEGER;
+		if(size1==sizeof(long))		return DEF_LONG;
+		if(size1==sizeof(_int64))	return DEF_INT64;
+	}
+	else{
+		//符号なし
+		if(size1==sizeof(char))		return DEF_BYTE;
+		if(size1==sizeof(short))	return DEF_WORD;
+		if(size1==sizeof(long))		return DEF_DWORD;
+		if(size1==sizeof(_int64))	return DEF_QWORD;
+	}
+
+	extern int cp;
+	compiler.errorMessenger.Output(300,NULL,cp);
+	return 0;
+}
+
+void StaticTwoTerm(int idCalc,int *type_stack,LONG_PTR *index_stack,int *pStackPointer,int BaseType){
+	int sp,AnswerType;
+
+	sp=*pStackPointer;
+ 
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(BaseType)&&idCalc==CALC_QUOTIENT) AnswerType=BaseType;
+
+	if(IsRealNumberType(AnswerType)){
+		///////////////
+		// 実数演算
+		///////////////
+
+		if(IsWholeNumberType(type_stack[sp-2])) dbl_stack[sp-2]=(double)i64stack[sp-2];
+		if(IsWholeNumberType(type_stack[sp-1])) dbl_stack[sp-1]=(double)i64stack[sp-1];
+
+
+		//比較演算
+		if(idCalc==CALC_PE){
+			if(dbl_stack[sp-2]<=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_QE){
+			if(dbl_stack[sp-2]>=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_P){
+			if(dbl_stack[sp-2]<dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_Q){
+			if(dbl_stack[sp-2]>dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_NOTEQUAL){
+			if(dbl_stack[sp-2]!=dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_EQUAL){
+			if(dbl_stack[sp-2]==dbl_stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+
+		//論理演算
+		else if(idCalc==CALC_XOR)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]^(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_OR)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]|(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_AND)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]&(long)dbl_stack[sp-1]);
+
+		//シフト演算
+		else if(idCalc==CALC_SHL)			dbl_stack[sp-2]=(double)((DWORD)dbl_stack[sp-2]<<(DWORD)dbl_stack[sp-1]);
+		else if(idCalc==CALC_SHR)			dbl_stack[sp-2]=(double)((DWORD)dbl_stack[sp-2]>>(DWORD)dbl_stack[sp-1]);
+
+		//算術演算
+		else if(idCalc==CALC_ADDITION)		dbl_stack[sp-2]+=dbl_stack[sp-1];
+		else if(idCalc==CALC_SUBTRACTION)	dbl_stack[sp-2]-=dbl_stack[sp-1];
+		else if(idCalc==CALC_MOD)			dbl_stack[sp-2]=(double)((long)dbl_stack[sp-2]%(long)dbl_stack[sp-1]);
+		else if(idCalc==CALC_PRODUCT)		dbl_stack[sp-2]*=dbl_stack[sp-1];
+		else if(idCalc==CALC_QUOTIENT){
+			if(dbl_stack[sp-1])
+				dbl_stack[sp-2]/=dbl_stack[sp-1];
+			else{
+				//ゼロ割りエラーを検地
+				compiler.errorMessenger.Output(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_INTQUOTIENT){
+			if(dbl_stack[sp-1])
+				dbl_stack[sp-2]=(double)(long)(dbl_stack[sp-2]/dbl_stack[sp-1]);
+			else{
+				//ゼロ割りエラーを検地
+				compiler.errorMessenger.Output(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_POWER)			dbl_stack[sp-2]=pow(dbl_stack[sp-2],dbl_stack[sp-1]);
+	}
+	else{
+		///////////////
+		// 整数演算
+		///////////////
+
+		if(IsRealNumberType(type_stack[sp-2])) i64stack[sp-2]=(_int64)dbl_stack[sp-2];
+		if(IsRealNumberType(type_stack[sp-1])) i64stack[sp-1]=(_int64)dbl_stack[sp-1];
+
+
+		//比較演算
+		if(idCalc==CALC_PE){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]<=i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])<=((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_QE){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]>=i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])>=((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_P){
+			if(IsSignedType(AnswerType)){
+				if(i64stack[sp-2]<i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])<((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_Q){
+			if(IsSignedType(AnswerType)){
+				AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+				if(i64stack[sp-2]>i64stack[sp-1]) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			else{
+				if(((unsigned _int64)i64stack[sp-2])>((unsigned _int64)i64stack[sp-1])) i64stack[sp-2]=-1;
+				else i64stack[sp-2]=0;
+			}
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_NOTEQUAL){
+			if(i64stack[sp-2]!=i64stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+		else if(idCalc==CALC_EQUAL){
+			if(i64stack[sp-2]==i64stack[sp-1]) i64stack[sp-2]=-1;
+			else i64stack[sp-2]=0;
+			AnswerType=DEF_LONG;
+		}
+
+		//論理演算
+		else if(idCalc==CALC_XOR)			i64stack[sp-2]^=i64stack[sp-1];
+		else if(idCalc==CALC_OR)			i64stack[sp-2]|=i64stack[sp-1];
+		else if(idCalc==CALC_AND)			i64stack[sp-2]&=i64stack[sp-1];
+
+		//シフト演算
+		else if(idCalc==CALC_SHL){
+			i64stack[sp-2]<<=(DWORD)i64stack[sp-1];
+			if(IsSignedType(AnswerType)) AnswerType=DEF_LONG;
+			else AnswerType=DEF_DWORD;
+		}
+		else if(idCalc==CALC_SHR){
+			i64stack[sp-2]>>=(DWORD)i64stack[sp-1];
+			if(IsSignedType(AnswerType)) AnswerType=DEF_LONG;
+			else AnswerType=DEF_DWORD;
+		}
+
+		//算術演算
+		else if(idCalc==CALC_ADDITION)		i64stack[sp-2]+=i64stack[sp-1];
+		else if(idCalc==CALC_SUBTRACTION)	i64stack[sp-2]-=i64stack[sp-1];
+		else if(idCalc==CALC_MOD)			i64stack[sp-2]%=i64stack[sp-1];
+		else if(idCalc==CALC_PRODUCT)		i64stack[sp-2]*=i64stack[sp-1];
+		else if(idCalc==CALC_QUOTIENT||
+			idCalc==CALC_INTQUOTIENT){
+			if(i64stack[sp-1])
+				i64stack[sp-2]/=i64stack[sp-1];
+			else{
+				//ゼロ割りエラーを検地
+				compiler.errorMessenger.Output(56,NULL,cp);
+			}
+		}
+		else if(idCalc==CALC_POWER)			i64stack[sp-2]=(_int64)pow((double)i64stack[sp-2],(double)i64stack[sp-1]);
+
+		if(IsSignedType(AnswerType)){
+			if(AnswerType==DEF_SBYTE&&(i64stack[sp-2]<CHAR_MIN||CHAR_MAX<i64stack[sp-2])){
+				//符号有り8ビット値をはみ出したとき
+				AnswerType=DEF_INTEGER;
+			}
+			if(AnswerType==DEF_INTEGER&&(i64stack[sp-2]<SHRT_MIN||SHRT_MAX<i64stack[sp-2])){
+				//符号有り16ビット値をはみ出したとき
+				AnswerType=DEF_LONG;
+			}
+			if(i64stack[sp-2]<LONG_MIN||LONG_MAX<i64stack[sp-2]){
+				//符号有り32ビット値をはみ出したとき
+				AnswerType=DEF_INT64;
+			}
+		}
+		else{
+			if(UINT_MAX<((unsigned _int64)i64stack[sp-2])){
+				//符号無し32ビット値をはみ出したとき
+				AnswerType=DEF_QWORD;
+			}
+		}
+	}
+
+	type_stack[sp-2]=AnswerType;
+	index_stack[sp-2]=-1;
+
+	sp--;
+	*pStackPointer=sp;
+}
+
+bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList, bool *pIsMemoryAccessError){
+	extern int cp;
+	int i,i2,i3,PareNum;
+	char Parms[1024],temporary[VN_SIZE],temp2[VN_SIZE];
+
+	_int64 i64data;
+	double nums[255];
+	_int64 i64nums[255];
+	char *StrPtr[255];
+	long calc[255];
+	_int64 stack[255];
+	int type[255];
+	LONG_PTR before_index[255];
+	int sp,pnum;
+
+	if( pIsMemoryAccessError ) *pIsMemoryAccessError = false;
+
+	*pi64data=0;
+	if(Command[0]=='\0') return false;
+
+	for(i=0,i2=0,sp=0,pnum=0,PareNum=0;;i++,i2++){
+		if(Command[i]=='\"'){
+			Parms[i2]=Command[i];
+			for(i++,i2++;;i++,i2++){
+				Parms[i2]=Command[i];
+				if(Command[i]=='\"') break;
+			}
+			continue;
+		}
+		else if(Command[i]=='['){
+			i3=GetStringInBracket(Parms+i2,Command+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Command[i]=='('){
+			if(i==0){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else if(IsNumCalcMark_Back(Command,i-1)||Command[i-1]=='('){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else{
+				//配列変数の場合を考慮
+				i3=GetStringInPare(Parms+i2,Command+i);
+				i+=i3-1;
+				i2+=i3-1;
+				continue;
+			}
+		}
+		else if(Command[i]==')'){
+			PareNum--;
+			i2--;
+			continue;
+		}
+		else if(IsNumCalcMark(Command,i)||Command[i]=='\0'){
+			if((Command[i]=='+'||Command[i]=='-')&&(Command[i-1]=='e'||Command[i-1]=='E')){
+				if(IsExponent(Command,i)){
+					Parms[i2]=Command[i];
+					continue;
+				}
+			}
+			Parms[i2]=0;
+
+			if(stack[sp-1]==CALC_AS&&Command[i]=='*'){
+				for(i3=0;i3<i2;i3++){
+					if(Parms[i2]!='*') break;
+				}
+				if(i3==i2){
+					//"*"をポインタ指定文字として認識する
+					Parms[i2]=Command[i];
+					continue;
+				}
+			}
+
+			calc[pnum]=0;
+			if(i2){
+				before_index[pnum]=-1;
+
+				i3=GetCallProcName(Parms,temporary);
+				if(Parms[i3]=='('){
+					lstrcpy(temp2,Parms+i3+1);
+					temp2[lstrlen(temp2)-1]=0;
+
+					if(lstrcmpi(temporary,"SizeOf")==0){
+						//SizeOf関数
+
+						type[pnum]=DEF_LONG;
+
+						Type tempType;
+						if( !compiler.StringToType( temp2, tempType ) ){
+							if(enableerror) compiler.errorMessenger.Output(3,temp2,cp);
+							return false;
+						}
+						i64nums[pnum] = compiler.SizeOf( tempType );
+						StrPtr[pnum]=0;
+					}
+					else{
+						//定数関数
+
+						ConstMacro *pConstMacro = compiler.GetObjectModule().meta.GetGlobalConstMacros().Find(
+							ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( temporary )
+						);
+						if( !pConstMacro )
+						{
+							if(enableerror) compiler.errorMessenger.Output(3,temporary,cp);
+							return false;
+						}
+						if( !ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, temp2, Parms ) )
+						{
+							if(enableerror) compiler.errorMessenger.Output(3,temporary,cp);
+							return false;
+						}
+
+						Type tempType;
+						StaticCalculation(enableerror, Parms,BaseType,&i64data,tempType);
+						type[pnum] = tempType.GetBasicType();
+						before_index[pnum] = tempType.GetIndex();
+						if(tempType.IsReal()){
+							//実数型
+							memcpy(&nums[pnum],&i64data,sizeof(double));
+						}
+						else{
+							//整数型
+							i64nums[pnum]=i64data;
+						}
+
+						StrPtr[pnum]=0;
+					}
+				}
+				else{
+					if(Parms[0]=='\"'){
+						//文字列の場合（比較演算子を考慮）
+						RemoveStringQuotes(Parms);
+						i2=lstrlen(Parms);
+
+						nums[pnum]=i2;
+						StrPtr[pnum]=(char *)HeapAlloc(hHeap,0,i2+1);
+						memcpy(StrPtr[pnum],Parms,i2);
+						StrPtr[pnum][i2]=0;
+
+						type[pnum]=typeOfPtrChar;
+						before_index[pnum]=LITERAL_STRING;
+					}
+					else if((Parms[0]=='e'||Parms[0]=='E')&&
+						(Parms[1]=='x'||Parms[1]=='X')&&
+						Parms[2]=='\"'){
+						//拡張文字列
+						RemoveStringQuotes(Parms+2);
+						i2=FormatString_EscapeSequence(Parms+2);
+						nums[pnum]=i2;
+						StrPtr[pnum]=(char *)HeapAlloc(hHeap,0,(int)i2+1);
+						memcpy(StrPtr[pnum],Parms+2,i2);
+						StrPtr[pnum][i2]=0;
+
+						type[pnum]=typeOfPtrChar;
+						before_index[pnum]=LITERAL_STRING;
+					}
+					else if(IsVariableTopChar(Parms[0])||Parms[0]=='*'||(Parms[0]=='.'&&IsVariableTopChar(Parms[1]))){
+						if(bDebuggingWatchList){
+							//////////////////////////
+							// 変数（デバッグ時のみ）
+							//////////////////////////
+
+							RELATIVE_VAR RelativeVar;
+							void *offset;
+							DWORD dwData;
+							SIZE_T accessBytes;
+							float flt;
+
+							extern HANDLE hDebugProcess;
+
+							Type tempType;
+							i3=Debugging_GetVarOffset(Parms,&RelativeVar,tempType);
+							if(i3==0){
+								//式エラー
+								return false;
+							}
+							if(i3==-1){
+								//メモリにアクセスできないとき
+								if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+								return false;
+							}
+
+							if(i3){
+								StrPtr[pnum]=0;
+								offset=(void *)Debugging_GetVarPtr(&RelativeVar);
+
+								type[pnum]=tempType.GetBasicType();
+
+								if(tempType.IsDouble()){
+									i3=ReadProcessMemory(hDebugProcess,offset,&nums[pnum],sizeof(double),&accessBytes);
+								}
+								else if(tempType.IsSingle()){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&flt,sizeof(float),&accessBytes)){
+										nums[pnum]=(double)flt;
+									}
+								}
+								else if(tempType.IsPointer()){
+									LONG_PTR lpData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lpData,sizeof(LONG_PTR),&accessBytes)){
+										i64nums[pnum]=(_int64)lpData;
+									}
+								}
+								else if(tempType.Is64()){
+									type[pnum]=DEF_INT64;
+
+									i3=ReadProcessMemory(hDebugProcess,offset,&i64nums[pnum],sizeof(_int64),&accessBytes);
+								}
+
+								else if(tempType.IsLong()){
+									long lData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&lData,sizeof(long),&accessBytes)){
+										i64nums[pnum]=(_int64)lData;
+									}
+								}
+								else if(tempType.IsDWord()){
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&dwData,sizeof(DWORD),&accessBytes)){
+										i64nums[pnum]=(_int64)dwData;
+									}
+								}
+								else if(tempType.IsInteger()){
+									short shortData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&shortData,sizeof(short),&accessBytes)){
+										i64nums[pnum]=(_int64)shortData;
+									}
+								}
+								else if(tempType.IsWord()){
+									WORD wData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&wData,sizeof(WORD),&accessBytes)){
+										i64nums[pnum]=(_int64)wData;
+									}
+								}
+								else if(tempType.IsSByte()){
+									char charData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&charData,sizeof(char),&accessBytes)){
+										i64nums[pnum]=(_int64)charData;
+									}
+								}
+								else if(tempType.IsByte()){
+									BYTE byteData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
+										i64nums[pnum]=(_int64)byteData;
+									}
+								}
+								else if(tempType.IsBoolean()){
+									BYTE byteData;
+									if(i3=ReadProcessMemory(hDebugProcess,offset,&byteData,sizeof(BYTE),&accessBytes)){
+										i64nums[pnum]=(_int64)byteData;
+									}
+								}
+								else return false;
+
+								if(!i3){
+									//読み込みに失敗
+									if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+									return false;
+								}
+								goto JumpConst;
+							}
+						}
+
+
+						/////////
+						//定数
+						/////////
+						StrPtr[pnum]=0;
+						type[pnum] = compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType(
+							ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( Parms )
+						);
+						if(type[pnum]){
+							if(IsRealNumberType(type[pnum])){
+								//実数型
+								nums[pnum] = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(
+									ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( Parms )
+								);
+							}
+							else if(IsWholeNumberType(type[pnum])){
+								//整数
+								i64nums[pnum] = compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+									ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( Parms )
+								);
+							}
+/*							else if(type[pnum]==DEF_STRING){
+								//リテラル文字列
+
+								//バイト数
+								nums[pnum]=dbl;
+								i2=(int)dbl;
+
+								memcpy(Parms,temporary,(int)nums[pnum]);
+								goto StrLiteral;
+							}*/
+							else{
+								//エラー
+								if(enableerror) compiler.errorMessenger.Output(300,NULL,cp);
+								return 0;
+							}
+							goto JumpConst;
+						}
+
+
+						//////////////
+						// 型名の場合
+						//////////////
+
+						{
+							Type tempType;
+							if( !compiler.StringToType( Parms, tempType ) ){
+								if(bDebuggingWatchList){
+									if( pIsMemoryAccessError ) *pIsMemoryAccessError = true;
+									return false;
+								}
+								//エラー
+								if(enableerror) compiler.errorMessenger.Output(3,Parms,cp);
+								return false;
+							}
+
+							if( tempType.IsObject() ){
+								if( tempType.GetClass().IsBlittableType() ){
+									// Blittable型のときは基本型として扱う
+									tempType = tempType.GetClass().GetBlittableType();
+								}
+							}
+
+							type[pnum] = tempType.GetBasicType();
+							before_index[pnum] = tempType.GetIndex();
+						}
+
+JumpConst:;
+					}
+					else{
+						//リテラル値
+						StrPtr[pnum]=0;
+						type[pnum]=GetLiteralValue(Parms,&i64data,BaseType, enableerror);
+						if( type[pnum] == -1 )
+						{
+							// エラー
+							return false;
+						}
+						if(IsRealNumberType(type[pnum])){
+							//実数型
+							memcpy(&nums[pnum],&i64data,sizeof(double));
+						}
+						else{
+							//整数型
+							i64nums[pnum]=i64data;
+							before_index[pnum]=GetLiteralIndex(i64data);
+						}
+					}
+				}
+
+				pnum++;
+			}
+			else{
+				if(!(Command[i]=='+'||Command[i]=='-'||(Command[i]==1&&Command[i+1]==ESC_NOT))){
+					if(enableerror) compiler.errorMessenger.Output(1,NULL,cp);
+					return false;
+				}
+				if(Command[i]=='+'){
+					i2=-1;
+					continue;
+				}
+			}
+
+			if(Command[i]=='\0'){
+				for(;sp>0;pnum++){
+					sp--;
+					calc[pnum]=(int)stack[sp];
+				}
+				break;
+			}
+
+			//論理演算子
+			if(Command[i]==1&&Command[i+1]==ESC_XOR) i3=CALC_XOR;
+			else if(Command[i]==1&&Command[i+1]==ESC_OR) i3=CALC_OR;
+			else if(Command[i]==1&&Command[i+1]==ESC_AND) i3=CALC_AND;
+			else if(Command[i]==1&&Command[i+1]==ESC_NOT) i3=CALC_NOT;
+
+			//ビット演算子（優先順位は算術演算子の後部）
+			else if(Command[i]=='<'&&Command[i+1]=='<'){
+				i3=CALC_SHL;
+				i++;
+			}
+			else if(Command[i]=='>'&&Command[i+1]=='>'){
+				i3=CALC_SHR;
+				i++;
+			}
+
+			//比較演算子
+			else if(Command[i]=='<'&&Command[i+1]=='='||
+				Command[i]=='='&&Command[i+1]=='<'){
+				i3=CALC_PE;
+				i++;
+			}
+			else if(Command[i]=='>'&&Command[i+1]=='='||
+				Command[i]=='='&&Command[i+1]=='>'){
+				i3=CALC_QE;
+				i++;
+			}
+			else if(Command[i]=='<'&&Command[i+1]=='>'||
+				Command[i]=='>'&&Command[i+1]=='<'){
+				i3=CALC_NOTEQUAL;
+				i++;
+			}
+			else if(Command[i]=='=') i3=CALC_EQUAL;
+			else if(Command[i]=='<') i3=CALC_P;
+			else if(Command[i]=='>') i3=CALC_Q;
+
+			//算術演算子
+			else if(Command[i]=='+'||Command[i]=='&') i3=CALC_ADDITION;
+			else if(Command[i]=='-'&&i2) i3=CALC_SUBTRACTION;
+			else if(Command[i]==1&&Command[i+1]==ESC_MOD) i3=CALC_MOD;
+			else if(Command[i]=='*') i3=CALC_PRODUCT;
+			else if(Command[i]=='/') i3=CALC_QUOTIENT;
+			else if(Command[i]=='\\') i3=CALC_INTQUOTIENT;
+			else if(Command[i]=='-'&&i2==0) i3=CALC_MINUSMARK;
+			else if(Command[i]=='^') i3=CALC_POWER;
+			else if(Command[i]==1&&Command[i+1]==ESC_AS) i3=CALC_AS;
+			else if(Command[i]==1&&Command[i+1]==ESC_BYVAL) i3=CALC_BYVAL;
+
+			i3+=PareNum*100;
+			if(sp){
+				if(stack[sp-1]>i3-3&&
+					(!(
+					(stack[sp-1]%100==CALC_MINUSMARK||stack[sp-1]%100==CALC_NOT)&&
+					(i3%100==CALC_MINUSMARK||i3%100==CALC_NOT)
+					))
+					){
+					for(;sp>0;){
+						sp--;
+						calc[pnum]=(int)stack[sp];
+						pnum++;
+						if(!(stack[sp-1]>i3-3)) break;
+					}
+				}
+			}
+			stack[sp]=i3;
+			sp++;
+
+			if(Command[i]==1) i++;
+			i2=-1;
+			continue;
+		}
+		Parms[i2]=Command[i];
+	}
+
+	int type_stack[255];
+	LONG_PTR index_stack[255];
+	int idCalc;
+	for(i=0,sp=0;i<pnum;i++){
+
+		if( enableerror ){
+			//型チェック（正常でない場合はエラーにする）
+			TypeErrorCheck(stack,sp,calc[i]%100);
+		}
+
+		idCalc=calc[i]%100;
+
+		switch(idCalc){
+			//数値
+			case 0:
+				dbl_stack[sp]=nums[i];
+				i64stack[sp]=i64nums[i];
+				type_stack[sp]=type[i];
+				index_stack[sp]=before_index[i];
+
+				stack[sp]=(_int64)StrPtr[i];
+				sp++;
+				break;
+
+			//論理演算
+			case CALC_NOT:
+				if(IsRealNumberType(type_stack[sp-1])){
+					//実数演算
+					dbl_stack[sp-1]=(double)(~(long)dbl_stack[sp-1]);
+				}
+				else{
+					//整数演算
+					i64stack[sp-1]=~i64stack[sp-1];
+				}
+				break;
+
+			//比較演算
+			case CALC_PE:
+			case CALC_QE:
+			case CALC_P:
+			case CALC_Q:
+			case CALC_NOTEQUAL:
+			case CALC_EQUAL:
+
+			//論理演算
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+
+			//シフト演算
+			case CALC_SHL:
+			case CALC_SHR:
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_MOD:
+			case CALC_PRODUCT:
+			case CALC_QUOTIENT:
+			case CALC_INTQUOTIENT:
+			case CALC_POWER:
+				StaticTwoTerm(idCalc,type_stack,index_stack,&sp,BaseType);
+				break;
+
+			case CALC_MINUSMARK:
+				if(IsRealNumberType(type_stack[sp-1])){
+					//実数演算
+					dbl_stack[sp-1]=-dbl_stack[sp-1];
+				}
+				else{
+					//整数演算
+					i64stack[sp-1]=-i64stack[sp-1];
+				}
+				break;
+			case CALC_AS:
+				if(IsWholeNumberType(type_stack[sp-2])){
+					if(IsRealNumberType(type_stack[sp-1])){
+						dbl_stack[sp-2]=(double)i64stack[sp-2];
+					}
+				}
+				if(IsRealNumberType(type_stack[sp-2])){
+					if(IsWholeNumberType(type_stack[sp-1])){
+						i64stack[sp-2]=(_int64)dbl_stack[sp-2];
+					}
+				}
+
+				if( type_stack[sp-1] == DEF_OBJECT || type_stack[sp-1] == DEF_STRUCT ){
+					// リテラル値ではないため抜け出す
+					return false;
+				}
+
+				type_stack[sp-2]=type_stack[sp-1];
+				index_stack[sp-2]=index_stack[sp-1];
+				sp--;
+				break;
+			case CALC_BYVAL:
+				//エラー
+				break;
+		}
+	}
+	if(stack[0]){
+		//文字列ポインタ
+		*pi64data=(_int64)stack[0];
+		resultType.SetType( type_stack[0], index_stack[0] );
+		return true;
+	}
+
+	if(IsRealNumberType(type_stack[0])){
+		//実数
+		memcpy(pi64data,&dbl_stack[0],sizeof(double));
+		resultType.SetType( type_stack[0], index_stack[0] );
+		return true;
+	}
+
+	//整数
+	*pi64data=i64stack[0];
+
+	if(index_stack[0]==-1){
+		if(Is64Type(type_stack[0])==0&&IsRealNumberType(type_stack[0])==0){
+			//整数（符号有り/無し）
+			i64data=*pi64data;
+
+			resultType.SetIndex( GetLiteralIndex(i64data) );
+		}
+	}
+	else{
+		resultType.SetIndex( index_stack[0] );
+	}
+
+	resultType.SetBasicType( type_stack[0] );
+	return true;
+}
+
+#pragma optimize("", off)
+#pragma warning(disable : 4748)
+DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType, bool isNotifyError ){
+	extern HANDLE hHeap;
+	extern int cp;
+	int i,i2,i3,sw1,sw2,bDbl;
+	double dbl;
+	char temporary[255];
+
+	if(value[0]=='&'){
+		_int64 i64temp;
+		lstrcpy(temporary,value);
+
+		if(temporary[1]=='o'||temporary[1]=='O'){
+			for(i=2;;i++){
+				i3=temporary[i]-0x30;
+				if(i3<0||7<i3) break;
+				temporary[i]=i3;
+			}
+			if(temporary[i]){
+				if( !isNotifyError )
+				{
+					return -1;
+				}
+				compiler.errorMessenger.Output(57,NULL,cp);
+				return DEF_BYTE;
+			}
+
+			i64temp=1;
+			*pi64=0;
+			for(i--;i>=2;i--){
+				*pi64=(*pi64)+(_int64)(i64temp*temporary[i]);
+				i64temp*=8;
+			}
+		}
+		else if(temporary[1]=='h'||temporary[1]=='H'){
+			CharUpper(temporary+2);
+			for(i=2;;i++){
+				i3=temporary[i]-0x30;
+				if(i3<0||9<i3){
+					i3=temporary[i]-0x41+10;
+					if(i3<0xA||0xF<i3) break;
+				}
+				temporary[i]=i3;
+			}
+			if(temporary[i]){
+				if( !isNotifyError )
+				{
+					return -1;
+				}
+				compiler.errorMessenger.Output(58,NULL,cp);
+				return DEF_BYTE;
+			}
+
+			i64temp=1;
+			*pi64=0;
+			for(i--;i>=2;i--){
+				*pi64=(*pi64)+(_int64)(i64temp*temporary[i]);
+				i64temp*=0x10;
+			}
+		}
+		else{
+			if( !isNotifyError )
+			{
+				return -1;
+			}
+			compiler.errorMessenger.Output(12,"&",cp);
+			return DEF_BYTE;
+		}
+
+		if(BaseType==DEF_INT64||BaseType==DEF_QWORD) return DEF_QWORD;
+
+		if(((unsigned _int64)*pi64)<=UCHAR_MAX){
+			// 符号無し8ビット整数のリテラル値
+			return DEF_BYTE;
+		}
+		else if(((unsigned _int64)*pi64)<=USHRT_MAX){
+			// 符号無し16ビット整数のリテラル値
+			return DEF_WORD;
+		}
+		else if(((unsigned _int64)*pi64)<=UINT_MAX){
+			// 符号無し32ビット整数のリテラル値
+			return DEF_DWORD;
+		}
+		else{
+			// 符号無し64ビット整数のリテラル値
+			return DEF_QWORD;
+		}
+	}
+	else if((value[0]>='0'&&value[0]<='9')||value[0]=='+'||value[0]=='-'||(value[0]=='.'&&(!IsVariableTopChar(value[1])))){
+		for(i=0;;i++){
+			if(value[i]!='-') break;
+		}
+		if(value[i]=='.'){
+			SlideString(value+i,1);
+			value[i]='0';
+		}
+
+		//エラーチェック
+		bDbl=0;
+		sw1=0;
+		sw2=0;
+		for(i2=i;;i2++){
+			if(value[i2]=='\0') break;
+			if(value[i2]=='.') bDbl=1;
+			if(!((value[i2]>='0'&&value[i2]<='9')||value[i2]=='.')){
+				if((value[i2]=='e'||value[i2]=='E')&&sw1==0){
+					bDbl=1;
+					sw1=1;
+				}
+				else if((value[i2]=='+'||value[i2]=='-')&&sw1==1&&sw2==0) sw2=1;
+				else{
+					if( debugger.IsRunning() )
+					{
+						return DEF_DOUBLE;
+					}
+
+					if( !isNotifyError )
+					{
+						return -1;
+					}
+
+					compiler.errorMessenger.Output(3,value,cp);
+					return DEF_DOUBLE;
+				}
+			}
+		}
+
+		if(bDbl){
+			//実数のリテラル値
+			if(i%2) dbl=-atof(value+i);
+			else dbl=atof(value+i);
+
+			memcpy(pi64,&dbl,sizeof(double));
+
+			if(BaseType==DEF_SINGLE) return DEF_SINGLE;
+
+			return DEF_DOUBLE;
+		}
+		else{
+			*pi64=_atoi64(value+i);
+			if(i%2) *pi64=-(*pi64);
+
+			if(BaseType==DEF_INT64||BaseType==DEF_QWORD) return BaseType;
+
+			if(LONG_MIN<=*pi64&&*pi64<=LONG_MAX){
+				//符号有り32ビット整数のリテラル値
+				return DEF_LONG;
+			}
+			else if(*pi64<=UINT_MAX){
+				//符号無し32ビット整数のリテラル値
+				return DEF_DWORD;
+			}
+			else{
+				//符号有り64ビット整数のリテラル値
+				return DEF_INT64;
+			}
+		}
+	}
+
+	if( debugger.IsRunning() )
+	{
+		return DEF_DOUBLE;
+	}
+
+	if( !isNotifyError )
+	{
+		return -1;
+	}
+
+	compiler.errorMessenger.Output(33,NULL,cp);
+	return DEF_DOUBLE;
+}
+#pragma optimize("", on)
+
+int IsStrCalculation(const char *Command){
+	int i,i2,i3,i4,PareNum;
+	char temporary[VN_SIZE],temp2[8192];
+
+	for(i=0,i2=0;;i++){
+		if(Command[i]=='('){
+			for(i++,PareNum=1;;i++){
+				if(Command[i]=='(') PareNum++;
+				else if(Command[i]==')'){
+					PareNum--;
+					if(PareNum==0) break;
+				}
+			}
+			continue;
+		}
+		if(Command[i]=='['){
+			for(i++,PareNum=1;;i++){
+				if(Command[i]=='[') PareNum++;
+				else if(Command[i]==']'){
+					PareNum--;
+					if(PareNum==0) break;
+				}
+			}
+			continue;
+		}
+		if(Command[i]=='\"'){
+			i++;
+			while(Command[i]!='\"') i++;
+			continue;
+		}
+		if(Command[i]=='\0'){
+			if(IsVariableTopChar(Command[i2])||
+				Command[i2]=='.'&&IsVariableTopChar(Command[i2+1])){
+
+				if((Command[i2]=='e'||Command[i2]=='E')&&
+					(Command[i2+1]=='x'||Command[i2+1]=='X')&&
+					Command[i2+2]=='\"'){
+					//拡張文字列
+					return 1;
+				}
+
+				for(i3=0;;i3++){
+					if(Command[i2+i3]=='('){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=Command[i2+i3];
+					if(Command[i2+i3]=='\0') break;
+				}
+				if(Command[i2+i3]=='('){
+
+					//DLL関数の場合
+					DllProc *pDllProc;
+					pDllProc=GetDeclareHash(temporary);
+					if(pDllProc){
+						if( pDllProc->ReturnType().IsStringClass() ){
+							return 1;
+						}
+						return 0;
+					}
+
+					//ユーザー定義関数
+					const UserProc *pUserProc = GetSubHash(temporary);
+					if(pUserProc){
+						if( pUserProc->ReturnType().IsStringClass() ){
+							return 1;
+						}
+						return 0;
+					}
+
+					//組み込み関数
+					i4=GetFunctionFromName(temporary);
+					if(i4){
+						//組み込み関数は文字列を返さない
+						return 0;
+					}
+
+					//定数
+					ConstMacro *pConstMacro = compiler.GetObjectModule().meta.GetGlobalConstMacros().Find(
+						ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( temporary )
+					);
+					if(pConstMacro){
+						//マクロ関数の場合
+						GetStringInPare_RemovePare(temporary,Command+i2+i3+1);
+						ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, temporary, temp2 );
+						return IsStrCalculation(temp2);
+					}
+				}
+
+				//定数
+				i3 = compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType(
+					ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( Command+i2 )
+				);
+				if(i3==DEF_STRING) return 1;	//文字列
+				if(i3) return 0;			//数値
+
+				//変数
+				Type varType;
+				if( !GetVarType(Command+i2,varType,1) ){
+					//エラー
+					return -1;
+				}
+				if( varType.IsStringClass() ){
+					return 1;
+				}
+			}
+			else if(Command[i2]=='\"') return 1;
+			break;
+		}
+		if(IsNumCalcMark(Command,i)||IsStrCalcMark(Command[i])){
+			if(IsStrCalcMark(Command[i])){
+
+				//&H、&O表記の場合を考慮
+				if(i==0) continue;
+				if(IsNumCalcMark(Command,i-1)) continue;
+
+				if(Command[i+1]=='(') break;
+				i2=i+1;
+				continue;
+			}
+			break;
+		}
+	}
+	return 0;
+}
+
+BYTE GetCalcId(const char *Command,int *pi){
+	*pi=0;
+
+	if(Command[0]==1) *pi=1;
+
+	//論理演算子
+	if(Command[0]==1&&Command[1]==ESC_XOR) return CALC_XOR;
+	else if(Command[0]==1&&Command[1]==ESC_OR) return CALC_OR;
+	else if(Command[0]==1&&Command[1]==ESC_AND) return CALC_AND;
+	else if(Command[0]==1&&Command[1]==ESC_NOT) return CALC_NOT;
+
+	//ビット演算子（優先順位は算術演算子の後部）
+	else if(Command[0]=='<'&&Command[1]=='<'){
+		*pi=1;
+		return CALC_SHL;
+	}
+	else if(Command[0]=='>'&&Command[1]=='>'){
+		*pi=1;
+		return CALC_SHR;
+	}
+
+	//比較演算子
+	else if(Command[0]=='<'&&Command[1]=='='||
+		Command[0]=='='&&Command[1]=='<'){
+		*pi=1;
+		return CALC_PE;
+	}
+	else if(Command[0]=='>'&&Command[1]=='='||
+		Command[0]=='='&&Command[1]=='>'){
+		*pi=1;
+		return CALC_QE;
+	}
+	else if(Command[0]=='<'&&Command[1]=='>'||
+		Command[0]=='>'&&Command[1]=='<'){
+		*pi=1;
+		return CALC_NOTEQUAL;
+	}
+	else if(Command[0]=='=') return CALC_EQUAL;
+	else if(Command[0]=='<') return CALC_P;
+	else if(Command[0]=='>') return CALC_Q;
+
+	//算術演算子
+	else if(Command[0]=='+') return CALC_ADDITION;
+	else if(Command[0]=='-') return CALC_SUBTRACTION;
+	else if(Command[0]=='&') return CALC_STRPLUS;
+	else if(Command[0]==1&&Command[1]==ESC_MOD) return CALC_MOD;
+	else if(Command[0]=='*') return CALC_PRODUCT;
+	else if(Command[0]=='/') return CALC_QUOTIENT;
+	else if(Command[0]=='\\') return CALC_INTQUOTIENT;
+	else if(Command[0]=='^') return CALC_POWER;
+	else if(Command[0]==1&&Command[1]==ESC_AS) return CALC_AS;
+	else if(Command[0]==1&&Command[1]==ESC_BYVAL) return CALC_BYVAL;
+
+	return 0;
+}
+BOOL GetNumOpeElements(const char *Command,int *pnum,
+					   char *values[255],long calc[255],long stack[255]){
+	extern int cp;
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,PareNum,sp;
+	char temporary[1024];
+
+	for(i=0,i2=0,sp=0,*pnum=0,PareNum=0;;i++,i2++){
+		if(Command[i]=='\"'){
+			temporary[i2]=Command[i];
+			for(i++,i2++;;i++,i2++){
+				temporary[i2]=Command[i];
+				if(Command[i]=='\"') break;
+			}
+			continue;
+		}
+		else if(Command[i]=='['){
+			i3=GetStringInBracket(temporary+i2,Command+i);
+			i+=i3-1;
+			i2+=i3-1;
+			continue;
+		}
+		else if(Command[i]=='('){
+			if(i==0){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else if(IsNumCalcMark_Back(Command,i-1)||Command[i-1]=='('){
+				PareNum++;
+				i2=-1;
+				continue;
+			}
+			else{
+				//配列変数の場合を考慮
+				i3=GetStringInPare(temporary+i2,Command+i);
+				i+=i3-1;
+				i2+=i3-1;
+				continue;
+			}
+		}
+		else if(Command[i]==')'){
+			PareNum--;
+			i2--;
+			continue;
+		}
+		else if(IsNumCalcMark(Command,i)||(Command[i]=='&'&&i2!=0)){
+			if((Command[i]=='+'||Command[i]=='-')&&(Command[i-1]=='e'||Command[i-1]=='E')){
+				if(IsExponent(Command,i)){
+					temporary[i2]=Command[i];
+					continue;
+				}
+			}
+			temporary[i2]=0;
+
+			if( sp > 0 && (stack[sp-1]%100) == CALC_AS )
+			{
+				if( Command[i] == '*' )
+				{
+					for(i3=0;i3<i2;i3++){
+						if(temporary[i2]!='*') break;
+					}
+					if(i3==i2){
+						//"*"をポインタ指定文字として認識する
+						temporary[i2]=Command[i];
+						continue;
+					}
+				}
+				else if( Command[i] == '<' )
+				{
+					Type type;
+					if( compiler.StringToType( temporary, type ) )
+					{
+						if( type.HasMember() && type.GetClass().IsGeneric() )
+						{
+							char temp2[1024];
+							int i5 = 1;
+							for( i3=i, i4=0; ; i3++, i4++ )
+							{
+								if( Command[i3] == '<' )
+								{
+									i5++;
+								}
+								if( Command[i3] == '>' )
+								{
+									i5--;
+									if( i5 == 0 )
+									{
+										temp2[i4] = 0;
+										break;
+									}
+								}
+								temp2[i4] = Command[i3];
+								if( Command[i3] == '\0' )
+								{
+									break;
+								}
+							}
+							if( Command[i] )
+							{
+								i = i3;
+								i2 += i4;
+								lstrcat( temporary, temp2 );
+							}
+
+							if( Command[i] == '\0' )
+							{
+								goto FinishLoop;
+							}
+						}
+					}
+				}
+			}
+
+			calc[*pnum]=0;
+			if(i2){
+				values[*pnum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+255);
+				lstrcpy(values[*pnum],temporary);
+				(*pnum)++;
+			}
+			else{
+				if(!(
+						Command[i]=='+'||
+						Command[i]=='-'||
+						(Command[i]==1&&Command[i+1]==ESC_NOT)||
+						(Command[i]==1&&Command[i+1]==ESC_BYVAL)
+					)){
+						compiler.errorMessenger.Output(1,NULL,cp);
+						return 0;
+				}
+				if(Command[i]=='+'){
+					i2=-1;
+					continue;
+				}
+			}
+
+			if(Command[i]=='-'&&i2==0){
+				i3=CALC_MINUSMARK;
+			}
+			else{
+				i3=GetCalcId(Command+i,&i4);
+				i+=i4;
+				if(!i3){
+					compiler.errorMessenger.Output(1,NULL,cp);
+					return 0;
+				}
+			}
+
+			i3+=PareNum*100;
+			if(sp){
+				if(stack[sp-1]>i3-3&&
+					(!(
+					(stack[sp-1]%100==CALC_MINUSMARK || stack[sp-1]%100==CALC_NOT || stack[sp-1]%100==CALC_POWER)&&
+					(i3%100==CALC_MINUSMARK || i3%100==CALC_NOT)
+					))
+					){
+					for(;sp>0;){
+						sp--;
+						calc[*pnum]=stack[sp];
+						values[*pnum]=0;
+						(*pnum)++;
+						if(!(stack[sp-1]>i3-3)) break;
+					}
+				}
+			}
+			stack[sp]=i3;
+			sp++;
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=Command[i];
+		if(Command[i]=='\0'){
+FinishLoop:
+			calc[*pnum]=0;
+
+			values[*pnum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+255);
+			lstrcpy(values[*pnum],temporary);
+			(*pnum)++;
+
+			for(;sp>0;(*pnum)++){
+				sp--;
+				calc[*pnum]=stack[sp];
+				values[*pnum]=0;
+			}
+			break;
+		}
+	}
+
+	calc[*pnum]=0;
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/common.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/common.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/common.h	(revision 774)
@@ -0,0 +1,390 @@
+#pragma once
+
+//#define _CRT_SECURE_NO_DEPRECATE
+#pragma warning(disable : 4996)
+
+#include <option.h>
+
+#ifdef _AMD64_
+#include "../compiler_x64/resource.h"
+#include "../compiler_x64/CommandValue.h"
+#define OPCODE_H_PATH "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/resource.h"
+#include "../compiler_x86/CommandValue.h"
+#define OPCODE_H_PATH "../compiler_x86/opcode.h"
+#endif
+
+#include "../BasicCompiler_Common/NonVolatile.h"
+#include "../BasicCompiler_Common/psapi.h"
+
+
+
+#if defined(JPN)
+//日本語
+#include "common_msg_jpn.h"
+#else
+//英語
+#include "common_msg_eng.h"
+#endif
+
+
+#define OBJECT_HEAD_SIZE PTR_SIZE*4
+
+#define MAX_LEN			65535
+#define DIGIT_SIZE		128
+#define MAX_PARMS		64
+#define MAX_ARRAYDIM	16
+#define MAX_HASH		32761
+
+
+#ifdef _AMD64_
+	#define PLATFORM	64
+#else
+#define PLATFORM	32
+	#ifndef LONG_PTR
+		typedef long LONG_PTR;
+		typedef DWORD ULONG_PTR;
+	#endif
+#endif
+
+
+//未定義の定数情報
+#ifndef IMAGE_FILE_MACHINE_AMD64
+	#define IMAGE_FILE_MACHINE_AMD64 0x8664
+#endif
+
+#ifdef _AMD64_
+	#ifndef IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
+		#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER    240
+	#endif
+#else
+	#ifndef IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
+		#define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER    224
+	#endif
+#endif
+
+
+extern HWND hOwnerEditor;
+extern HANDLE hHeap;
+extern int cp;
+extern int typeOfPtrChar;
+extern int typeOfPtrUChar;
+
+
+
+//////////////////////////////////////////
+// BasicCompiler、ProjectEditor共通の定数
+//////////////////////////////////////////
+
+//サイズ変更枠の太さ
+#define LEVER_THICK 5
+
+#define WM_SHOWERROR			WM_USER+70	//エラー表示メッセージ
+
+#define WM_SETCOMPILEVIEW		WM_USER+71	//コンパイラウィンドウが表示されたとき
+#define WM_DESTROYCOMPILEVIEW	WM_USER+72	//コンパイラウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERBASE		WM_USER+73	//デバッガベースウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERBASE	WM_USER+74	//デバッガベースウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERVIEW		WM_USER+75	//デバッガウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERVIEW	WM_USER+76	//デバッガウィンドウが表示されたとき
+
+///////////////////////////////////////////
+
+
+#define WM_SHOWVARLIST			WM_USER+80
+#define WM_VARLIST_CLOSE		WM_USER+81	//変数リストの終了メッセージ（破棄のみ、解放なし）
+
+
+
+///////////////////////////////////////////
+// デバッグ コマンド
+
+#define WM_DEBUG_CONTINUE	WM_USER+200
+#define WM_STEP_IN			WM_USER+201
+#define WM_STEP_OVER		WM_USER+202
+#define WM_STEP_CURSOR		WM_USER+203
+#define WM_DEBUG_STOP		WM_USER+204
+#define WM_DEBUG_PAUSE		WM_USER+205
+#define WM_CLOSE_DEBUGGER	WM_USER+206
+
+///////////////////////////////////////////
+
+
+
+
+#define FILE_ALIGNMENT	0x1000
+#define MEM_ALIGNMENT	0x1000
+#define EXE_HEADER_SIZE	0x1000
+
+
+
+struct ERRORINFO{
+	char *FileName;
+	int line;
+};
+
+//変数の相対情報
+struct RELATIVE_VAR{
+	DWORD dwKind;
+	LONG_PTR offset;
+	BOOL bOffsetOffset;
+};
+
+
+struct RESOURCEDATAINFO{
+	DWORD dwId;
+	char FileName[MAX_PATH];
+};
+
+
+//////////////////////////////////////////
+// リソース ヘッダ（アイコン、カーソル用）
+typedef struct{
+	WORD idReserved;
+	WORD idType;
+	WORD idCount;
+}ICONDIR,CURSORDIR;
+
+
+/////////////////////////////
+// .curファイルのヘッダ情報
+struct CURSORDIRENTRY{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wXHotspot;
+	WORD wYHotspot;
+	DWORD dwBytesInRes;
+	DWORD dwImageOffset;
+};
+struct CURSORDIRENTRY_RES{
+	WORD wWidth;
+	WORD wHeight;
+	WORD wXHotspot;
+	WORD wYHotspot;
+	DWORD dwBytesInRes;
+	WORD wCursorNum;
+};
+
+
+////////////////////////////
+//.icoファイルのヘッダ情報
+struct ICONDIRENTRY{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wPlanes;
+	WORD wBitCount;
+	DWORD dwBytesInRes;
+	DWORD dwImageOffset;
+};
+struct ICONDIRENTRY_RES{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wPlanes;
+	WORD wBitCount;
+	DWORD dwBytesInRes;
+	WORD wIconNum;
+};
+
+
+
+#include "../BasicCompiler_Common/PESchedule.h"
+#include "../BasicCompiler_Common/StrOperation.h"
+#include "../BasicCompiler_Common/VariableOpe.h"
+
+
+
+bool StaticCalculation(bool enableerror, const char *Command,int BaseType,_int64 *pi64data,Type &resultType,BOOL bDebuggingWatchList=0, bool *pIsMemoryAccessError=NULL);
+
+
+//BasicCompiler.cpp
+void HeapDefaultFree(LPVOID lpMem);
+void ts(int i = 0);
+void ts(int i,int i2);
+void ts(const char *msg);
+void ts(const char *msg,const char *title);
+void ts(const std::string msg);
+void epi_check();
+void GetRelationalPath(char *path,char *dir);
+void GetFullPath( char *path, const std::string &baseDirPath );
+void ShowErrorLine(int LineNum,const char *FileName);
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,BOOL bOpen);
+void MakeMessageText(char *buffer,char *msg,int flag);
+
+//hash.cpp
+int hash_default(const char *name);
+DllProc *GetDeclareHash(const char *name);
+void GetOverloadSubHash( const char *lpszName, std::vector<const UserProc *> &subs );
+const UserProc *GetSubHash(const char *name,BOOL bError=0);
+const UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError=0);
+const UserProc *GetClassMethod( const char *className, const char *methodName );
+
+//Object.cpp
+void CallConstructor( const char *ObjectName,const Subscripts &subscripts, const Type &type,const char *Parameter);
+bool Operator_New( const char *expression, const Type &baseType, Type &resultType );
+
+//Overload.sbp
+class Parameters;
+const UserProc *OverloadSolutionWithStrParam(
+	const char *name,
+	std::vector<const UserProc *> &subs,
+	const char *Parameter,
+	const char *ObjectName);
+const UserProc *OverloadSolution(
+	const char *name,
+	std::vector<const UserProc *> &subs,
+	const Parameters &params,
+	const Type &returnType,
+	const Type &leftType );
+
+//Debug.cpp
+void Debugger_StepIn(void);
+void Debugger_StepOver(void);
+void Debugger_StepCursor(void);
+void Debugger_Stop(void);
+void Debugger_Pause(void);
+ULONG_PTR rva_to_real(DWORD p);
+UserProc *GetSubFromObp(ULONG_PTR pos);
+void ReadOpBuffer();
+void DebugProgram(void);
+
+//VarList.cpp
+void InitVarList(DWORD dwThreadId);
+INT_PTR CALLBACK DlgDebugger(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+INT_PTR CALLBACK DlgVarList(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//WatchList.cpp
+ULONG_PTR Debugging_GetVarPtr(RELATIVE_VAR *pRelativeVar);
+ULONG_PTR Debugging_GetThisPtrOffset(LONG_PTR obp_Rip);
+int Debugging_GetVarOffset( char *variable,RELATIVE_VAR *pRelativeVar, Type &resultType, Subscripts *pResultSubscripts = NULL );
+
+//MakeExe.cpp
+void StepCompileProgress(void);
+void MakeMiddleCode( char *buffer );
+void AddSourceCode(const char *buffer);
+void Build();
+void MainThread(void *dummy);
+
+//Intermediate_Step1.cpp
+void ChangeReturnCode(char *buffer);
+void DeleteComment(char *buffer);
+void KillReturnCode(char *buffer);
+void CheckParenthesis(char *buffer);
+BOOL CheckParenthesis2(char *buffer);
+void DirectiveCheck(void);
+void NextCommandFormat(char *buffer);
+void SetEscapeSequenceFormat(char *buffer);
+void DefCommandFormat(char *buffer);
+void IfCommandFormat(char *buffer);
+void CheckPareCommand(void);
+
+//Intermediate_Step2.cpp
+void ChangeCommandToCode(char *buffer);
+
+//preprocessor.cpp
+char *OpenBasicFile(char *FileName);
+
+//CommandFormat.cpp
+void ComOpen(char *Parameter,char *buffer,int nowLine);
+void ComClose(char *Parameter,char *buffer);
+void ComField(char *Parameter,char *buffer);
+void ComLine(char *Parameter,char *buffer,int nowLine);
+void ComCircle(char *Parameter,char *buffer,int nowLine);
+void ComPSet(char *Parameter,char *buffer,int nowLine);
+void ComPaint(char *Parameter,char *buffer,int nowLine);
+
+// StrOperation.cpp
+void KillSpaces(char *str1,char *str2);
+void KillStringSpaces(char *str);
+BOOL RemoveStringQuotes(char *str);
+bool RemoveStringQuotes( std::string &str );
+void RemoveStringPare(char *str);
+void RemoveStringBracket(char *str);
+void SetStringQuotes(char *str);
+int FormatString_EscapeSequence(char *buffer);
+void SlideString(char *str,int slide);
+void SlideBuffer(char *buffer,int length,int slide);
+int GetSourceCodeIndexFromLine( const char *source, int LineNum );
+char GetEndXXXCommand(char es);
+void GetDefaultNameFromES(char es,char *name);
+const std::string &FormatEscapeSequenceStringToDefaultString( const std::string &source );
+bool IsFileExist(const char *path);
+BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath);
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle);
+void ShortPathToLongPath(const char *ShortPath,char *LongPath);
+
+//calculation.cpp
+bool IsNumberTopChar(const char *buffer);
+bool IsNumberChar(const char c);
+BOOL IsNumCalcMark(const char *Command,int p);
+BOOL IsNumCalcMark_Back(const char *Command,int p);
+BOOL IsStrCalcMark(const char c);
+BOOL IsExponent(const char *Command,int p);
+int GetLiteralIndex(_int64 i64data);
+int NeutralizationType(int type1,LONG_PTR index1,int type2,LONG_PTR index2);
+DWORD GetLiteralValue(char *value,_int64 *pi64,int BaseType, bool isNotifyError = true );
+int IsStrCalculation(const char *Command);
+BYTE GetCalcId(const char *Command,int *pi);
+BOOL GetNumOpeElements(const char *Command,int *pnum,
+					   char *values[255],long calc[255],long stack[255]);
+
+//NumOpe_GetType.cpp
+int AutoBigCast(int BaseType,int CalcType);
+BOOL CheckCalcType(int idCalc,int *type,int sp);
+bool GetTermType( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL, bool *pIsVariable = NULL );
+bool GetTermType( const char *term, Type &resultType );
+bool GetTermTypeOnlyVariable( const char *term, Type &resultType );
+bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType, bool *pIsLiteralCalculation = NULL );
+
+//Subroutine.cpp
+int GetCallProcName(const char *buffer,char *name);
+int GetProc(char *name,void **ppInfo);
+void SplitObjectName(const char *name,char *ObjectName, ReferenceKind &referenceFind );
+bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, const Type &baseType, Type &resultType, bool isCallOn = true, int dwCallProcFlags = 0 );
+bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType);
+bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType );
+bool GetReturnTypeOfIndexerGetterProc( const Type &classType, Type &resultType );
+int AddProcPtrInfo( const std::string &typeExpression, int nowLine );
+bool IsNeedProcCompile();
+void CompileLocal();
+
+//OldStatement.cpp
+void Opcode_Input(const char *Parameter);
+void Opcode_Print(const char *Parameter,BOOL bWrite);
+
+//error.cpp
+bool CheckDifferentType( const Type &varType,const Type &calcType,const char *pszFuncName,const int ParmNum);
+
+//Compile.cpp
+void GetIdentifierToken( char *token, const char *source, int &pos );
+void GetCommandToken( char *token, const char *source, int &pos );
+void GetCustomToken( char *token, const char *source, int &pos, char delimitation, bool isEscapeSequence );
+void SplitGenericClassInstance( const char *fullName, char *className, Jenga::Common::Strings &typeParameters, bool isDefiningClass = false, Jenga::Common::Strings *pTypeParameterBaseClassNames = NULL );
+int JumpStatement(const char *source, int &pos);
+void MakeExe();
+
+//Diagnose.cpp
+void Diagnose();
+
+//gc.cpp
+void InitGCVariables(void);
+
+
+
+#ifdef _DEBUG
+/*Debug*/
+/*
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
+LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
+*/
+#endif
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_eng.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_eng.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_eng.h	(revision 774)
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 英語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_COMPILE			"Compile"
+#define STRING_STOP				"Stop"
+#define STRING_CLOSE			"Close"
+#define STRING_CONTINUE			"Continue"
+#define STRING_NOERROR			"No Error"
+#define STRING_NODEBUGMSG		"No Debug Message"
+#define STRING_OBJECT			"object"
+#define STRING_POINTEROFOBJECT	"pointer of object"
+#define STRING_ARRAY			"array"
+#define STRING_CANNOTACCESS		"cannot access"
+
+#define STRING_PARENTHESIS	"parenthesis \'( )\'"
+
+
+/////////////////////////////////////
+// コンパイラ及びデバッガ メッセージ
+/////////////////////////////////////
+#define STRING_COMPILE_CHECK_CODECONDOTION	"Checking code condition..."
+#define STRING_COMPILE_OPTIMIZING			"Optimizing..."
+#define STRING_COMPILE_INTERMEDIATE			"Creating intermediate code..."
+#define STRING_COMPILE_COMPILING			"Compiling..."
+
+#define STRING_COMPILE_STOP					"Compiling was stopped."
+#define STRING_COMPILE_SUCCESS				"Compiling was successful."
+#define STRING_COMPILE_ERROR				"Compile Error（Number of Errors:%d）"
+
+#define STRING_DEBUGGING					"Debugging the program."
+#define STRING_DEBUG_FINISH					"Debugging was finished."
+#define STRING_DEBUG_THREADFINISH			"Thread(&H%X) exited with code &H%X.\r\n"
+#define STRING_DEBUG_PROCESSFINISH			"Program exited with code &H%X.\r\n"
+#define STRING_DEBUG_THREAD_INVALID_HANDLE	"Handle violation.   Thread=&H%X   EIP=&H%08X\r\n"
+#define STRING_DEBUG_THREAD_ACCESSVIOLATION	"Access violation.   Thread=&H%X   EIP=&H%08X\r\n"
+#define STRING_DEBUG_BREAKPOINT				"Breakpoint.         Thread=&H%X   EIP=&H%08X/ESP=&H%08X\r\n"
+#define STRING_DEBUG_DIVIDE_BY_ZERO			"Divided by zero.    Thread=&H%X   EIP=&H%08X\r\n"
+#define STRING_DEBUG_ERROR					"Unknown error.\ncode:%X"
+#define STRING_DEBUG_FAILED					"Failed to read the debug information."
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_jpn.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_jpn.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/common_msg_jpn.h	(revision 774)
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 日本語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_COMPILE			"コンパイル"
+#define STRING_STOP				"中断"
+#define STRING_CLOSE			"閉じる"
+#define STRING_CONTINUE			"継続"
+#define STRING_NOERROR			"エラー無し"
+#define STRING_NODEBUGMSG		"デバッグ情報無し"
+#define STRING_OBJECT			"オブジェクト"
+#define STRING_POINTEROFOBJECT	"オブジェクト ポインタ"
+#define STRING_ARRAY			"配列"
+#define STRING_CANNOTACCESS		"アクセスできません"
+
+#define STRING_PARENTHESIS	"カッコ \'( )\'"
+
+
+/////////////////////////////////////
+// コンパイラ及びデバッガ メッセージ
+/////////////////////////////////////
+#define STRING_COMPILE_OPTIMIZING			"ソースコード及びライブラリをロード中..."
+#define STRING_ANALYZING_META_INFO			"メタ情報を解析中..."
+#define STRING_COMPILE_COMPILING			"コンパイル中..."
+
+#define STRING_COMPILE_STOP					"コンパイルはユーザーにより中断されました。"
+#define STRING_COMPILE_SUCCESS				"コンパイルは正常に完了しました（エラー:%d、警告:%d、所要時間:%.2fsec）。"
+#define STRING_COMPILE_ERROR				"コンパイルは中断されました（エラー:%d、警告:%d）。"
+
+#define STRING_DEBUGGING					"プログラムを実行しています（デバッグ中）。"
+#define STRING_DEBUG_FINISH					"デバッグは正常に終了しました。"
+#define STRING_DEBUG_THREADFINISH			"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+#define STRING_DEBUG_PROCESSFINISH			"プログラムはコード &H%X で終了しました。\r\n"
+#define STRING_DEBUG_THREAD_INVALID_HANDLE	"スレッド(&H%X)でハンドル違反がありました(EIP=&H%08X)。\r\n"
+#define STRING_DEBUG_THREAD_ACCESSVIOLATION	"スレッド(&H%X)でアクセス違反がありました(EIP=&H%08X/ESP=&H%08X)。\r\n"
+#define STRING_DEBUG_BREAKPOINT				"スレッド(&H%X)のブレーク ポイント(EIP=&H%08X/ESP=&H%08X)。\r\n"
+#define STRING_DEBUG_DIVIDE_BY_ZERO			"0による除算が行われました。スレッド(&H%X) ブレーク ポイント(EIP=&H%08X)。\r\n"
+#define STRING_DEBUG_DIVIDE_NO_MEMORY		"メモリ不足、またはヒープが壊れていることが原因で、メモリの割り当てに失敗しました。スレッド(&H%X) ブレーク ポイント(EIP=&H%08X)。\r\n"
+#define STRING_DEBUG_ERROR					"例外処理(code:&H%08X)\r\n"
+#define STRING_DEBUG_FAILED					"デバッグ情報の取得に失敗"
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/debug.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/debug.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/debug.h	(revision 774)
@@ -0,0 +1,37 @@
+
+class CDebugThreadInfo{
+public:
+	//ソースコードポインタ
+	DWORD *lpdwCp;
+	std::vector<int> relationalObjectModuleIndexes;
+
+	//ネイティブコードポインタ
+	ULONG_PTR *lplpObp;
+
+	//スタックフレームベースポインタ
+	ULONG_PTR *lplpSpBase;
+
+	//プロシージャ呼び出し階層
+	int iProcLevel;
+
+	CDebugThreadInfo();
+	~CDebugThreadInfo();
+
+	BOOL Reflesh(int ThreadNum);
+	void Free();
+};
+
+extern CDebugThreadInfo *pobj_dti;
+
+#define MAX_DEBUG_THREAD 256
+extern DWORD _DebugSys_dwThreadID[MAX_DEBUG_THREAD];
+extern HANDLE array_hDebugThread[MAX_DEBUG_THREAD];
+
+
+#ifdef _AMD64_
+#define EIP_RIP(Context) (Context).Rip
+#define SP_BASE(Context) (Context).Rsp
+#else
+#define EIP_RIP(Context) (Context).Eip
+#define SP_BASE(Context) (Context).Ebp
+#endif
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/error.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/error.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/error.cpp	(revision 774)
@@ -0,0 +1,213 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+
+#define STRING_SYSTEM_DECLAREHANDLE "*_System_DeclareHandle_"
+void DifferentTypeError( const Type &varType, const Type &calcFormalType, const int iWarning,const char *pszFuncName,const int ParmNum){
+	//////////////////////////
+	// キャストに関する警告
+	//////////////////////////
+	char temporary[255];
+	Type calcType( calcFormalType );
+
+	if(IS_LITERAL(calcType.GetIndex()))
+	{
+		calcType.SetIndex( -1 );
+	}
+
+	if(pszFuncName)
+		sprintf(temporary,"\"%s\"の第%dパラメータが、",pszFuncName,ParmNum+1);
+	else temporary[0]=0;
+
+	std::string varTypeName = compiler.TypeToString( varType );
+	if(memcmp( varTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
+	{
+		varTypeName = varTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
+	}
+
+	std::string calcTypeName = compiler.TypeToString( calcType );
+	if(memcmp( calcTypeName.c_str(),STRING_SYSTEM_DECLAREHANDLE,lstrlen(STRING_SYSTEM_DECLAREHANDLE))==0)
+	{
+		calcTypeName = calcTypeName.substr( lstrlen(STRING_SYSTEM_DECLAREHANDLE) );
+	}
+	sprintf(temporary+lstrlen(temporary),"%sから%s",calcTypeName.c_str(),varTypeName.c_str());
+
+	extern int cp;
+	if(iWarning==1) compiler.errorMessenger.Output(-101,temporary,cp);
+ 	else if(iWarning==2) compiler.errorMessenger.Output(-102,temporary,cp);
+ 	else if(iWarning==3) compiler.errorMessenger.Output(50,temporary,cp);
+}
+
+bool CheckDifferentType( const Type &varType,const Type &calcFormalType,const char *pszFuncName,const int ParmNum)
+{
+	Type calcType( calcFormalType );
+
+	if( varType.IsStruct() || calcType.IsStruct() )
+	{
+		//いずれかが構造体場合
+		if( !varType.Equals( calcType ) )
+		{
+			DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+			return false;
+		}
+	}
+
+	if( varType.IsObject() || calcType.IsObject() )
+	{
+		//いずれかがオブジェクトではない場合
+		if( (!varType.IsObject()) || (!calcType.IsObject()) )
+		{
+			DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+			return false;
+		}
+
+		if( varType.IsDelegate() && calcType.IsDelegate() )
+		{
+			// デリゲート同士の比較の場合
+			// ※共変戻り値及び反辺引数をサポートすること
+			const ::Delegate *pVarDelegate = &compiler.GetObjectModule().meta.ToDelegate( varType.GetClass() );
+			const ::Delegate *pCalcDelegate = &compiler.GetObjectModule().meta.ToDelegate( calcType.GetClass() );
+			if( !pVarDelegate->IsSimilar( *pCalcDelegate ) )
+			{
+				// 等しいと見なされないとき
+				DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+				return false;
+			}
+		}
+		else
+		{
+			// 一般的なクラスの比較の場合
+
+			if( !varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
+			{
+				//等しくなく、派生クラスでもないとき
+				DifferentTypeError( varType, calcType,3,pszFuncName,ParmNum);
+				return false;
+			}
+		}
+	}
+
+	if( calcType.GetBasicType() & FLAG_PTR )
+	{
+		//配列先頭フラグがたっている場合は、ポインタ型として扱う
+		calcType.SetBasicType( MAKE_PTR_TYPE(NATURAL_TYPE(calcType.GetBasicType()),PTR_LEVEL(calcType.GetBasicType())+1) );
+	}
+
+	if( varType.IsPointer() || calcType.IsPointer() )
+	{
+		/* 右辺及び左辺のいずれかがポインタ型の場合は、
+			型チェックを行う。
+		・同一の種類のポインタ型以外はエラーとする */
+
+		if( varType.IsPointer() && calcType.GetIndex() == LITERAL_NULL )
+		{
+			//リテラルNULL値の場合
+			return true;
+		}
+
+		if( varType.IsVoidPtr() )
+		{
+			//左辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
+			if( calcType.IsPointer() )
+			{
+				return true;
+			}
+		}
+
+		if( calcType.IsVoidPtr() )
+		{
+			//右辺がVoidPtr型の場合は、ポインタ型すべてを受け入れる
+			if( varType.IsPointer() )
+			{
+				return true;
+			}
+		}
+
+		if( varType.GetBasicType() != calcType.GetBasicType() )
+		{
+			DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
+			return true;
+		}
+
+		if( varType.IsObjectPtr() )
+		{
+			//双方がオブジェクトポインタ型の場合
+			if( varType.GetIndex() != calcType.GetIndex() )
+			{
+				const CClass *pobj_tempClass = &calcType.GetClass();
+				while(pobj_tempClass&&(!IS_LITERAL((LONG_PTR)pobj_tempClass))){
+					pobj_tempClass=&pobj_tempClass->GetSuperClass();
+
+					if( &varType.GetClass() == pobj_tempClass )
+					{
+						//継承先が等しいとき
+						return true;
+					}
+				}
+				DifferentTypeError( varType, calcType, 2,pszFuncName,ParmNum);
+				return true;
+			}
+		}
+	}
+
+	if( varType.IsDouble() )
+	{
+		if( calcType.Is64() )
+		{
+			//64ビット整数値の場合は警告を出す
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+	else if( varType.IsSingle() )
+	{
+		if( calcType.Is64() || calcType.IsDouble() )
+		{
+			//64ビット整数値、またはDouble型の場合は警告を出す
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+	else if( varType.GetSize() == sizeof(char) )
+	{
+		if( calcType.GetSize() > sizeof(char)
+			&& calcType.GetIndex() != LITERAL_NULL
+			&& calcType.GetIndex() != LITERAL_M128_0
+			&& calcType.GetIndex() != LITERAL_0_255 )
+		{
+			//8ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+	else if( varType.GetSize() == sizeof(short) )
+	{
+		if( calcType.GetSize() > sizeof(short)
+			&& calcType.GetIndex() != LITERAL_NULL
+			&& calcType.GetIndex() != LITERAL_M128_0
+			&& calcType.GetIndex() != LITERAL_0_255
+			&& calcType.GetIndex() != LITERAL_M32768_0
+			&& calcType.GetIndex() != LITERAL_0_65535 )
+		{
+			//16ビット整数値より大きな型で、リテラル値でもない場合は警告を出す
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+	else if( varType.GetSize() == sizeof(long) )
+	{
+		if( calcType.IsReal()
+			|| ( calcType.IsWhole() && calcType.GetSize() > sizeof(long) && calcType.GetIndex() != LITERAL_NULL ) )
+		{
+			/* 32ビット整数値より大きな型、または実数、
+					またはリテラル値でもない場合は警告を出す */
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+	else if( varType.GetSize() == sizeof(_int64) )
+	{
+		if( calcType.IsReal() )
+		{
+			//実数の場合は警告を出す
+			DifferentTypeError( varType, calcType, 1,pszFuncName,ParmNum);
+		}
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/gc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/gc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/gc.cpp	(revision 774)
@@ -0,0 +1,37 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+using namespace ActiveBasic::Compiler;
+
+void InitGCVariables(void){
+	char temporary[255];
+	Type type;
+	RELATIVE_VAR RelativeVar;
+
+
+	///////////////////////////////
+	// スタックフレームの開始位置
+	///////////////////////////////
+
+	if( compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( "_System_gc_StackRoot_StartPtr" ) ) == NULL )
+	{
+		// 未定義の場合は定義する
+		sprintf(temporary,"_System_gc_StackRoot_StartPtr%c%c*LONG_PTR",1,ESC_AS);
+		OpcodeDim(temporary,0);
+	}
+
+	GetVarOffsetReadWrite("_System_gc_StackRoot_StartPtr",&RelativeVar,type);
+
+	//mov rax,rsp
+	compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RSP);
+
+	//mov ptr[offset],rax/eax
+	compiler.codeGenerator.op_mov_MR(PTR_SIZE,REG_RAX,0,(int)RelativeVar.offset,MOD_DISP32, Schedule::GlobalVar );
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp	(revision 774)
@@ -0,0 +1,180 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+
+#ifdef _AMD64_
+#include "../compiler_x64/opcode.h"
+#else
+#include "../compiler_x86/opcode.h"
+#endif
+
+using namespace ActiveBasic::Compiler;
+
+int hash_default(const char *name){
+	int key;
+
+	for(key=0;*name!='\0';name++){
+		key=((key<<8)+ *name )%MAX_HASH;
+	}
+
+	return key;
+}
+
+DllProc *GetDeclareHash(const char *fullName){
+	char namespaceStr[VN_SIZE];		//オブジェクト変数
+	char simpleName[VN_SIZE];	//入れ子メンバ
+	bool isObjectMember = SplitMemberName( fullName, namespaceStr, simpleName );
+
+	///////////////////////////
+	// グローバル関数を検索
+	///////////////////////////
+
+	// ハッシュ値を取得
+	DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().GetHashArrayElement( simpleName );
+	while(pDllProc){
+		if( pDllProc->IsEqualSymbol( LexicalAnalyzer::FullNameToSymbol( fullName ) ) ){
+			return pDllProc;
+		}
+
+		pDllProc=pDllProc->GetChainNext();
+	}
+
+	return NULL;
+}
+
+void GetOverloadSubHash( const char *lpszName, std::vector<const UserProc *> &subs ){
+	char name[VN_SIZE];
+
+	if(lpszName[0]=='.'){
+		GetWithName(name);
+		lstrcat(name,lpszName);
+	}
+	else lstrcpy(name,lpszName);
+
+	char ObjName[VN_SIZE];		//オブジェクト変数
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	bool isObjectMember = SplitMemberName( name, ObjName, NestMember );
+
+	if(isObjectMember){
+		//オブジェクトのメンバ関数の場合
+
+		bool isStatic = false;
+		const CClass *pobj_c = NULL;
+		if(lstrcmpi(ObjName,"Super")==0)
+		{
+			//クラスメンバ関数内から基底クラスの呼び出し
+			pobj_c=&compiler.GetCompilingClass().GetSuperClass();
+		}
+		else
+		{
+			//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+			Type type;
+			if( GetTermType(ObjName,type) )
+			{
+				if( type.IsObject() )
+				{
+					pobj_c = &type.GetClass();
+				}
+			}
+
+			if( !pobj_c )
+			{
+				pobj_c = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+					LexicalAnalyzer::FullNameToSymbol( ObjName )
+				);
+				if( pobj_c ){
+					isStatic = true;
+				}
+			}
+		}
+
+		if( pobj_c && pobj_c != (CClass *)-1 ){
+			if( isStatic ){
+				// 静的メソッドから列挙
+				pobj_c->GetStaticMethods().Enum( NestMember, subs );
+			}
+			else{
+				//動的メソッドから列挙
+				pobj_c->EnumDynamicMethodsOrInterfaceMethods( NestMember, subs );
+			}
+
+			return;
+		}
+	}
+
+
+	if( compiler.IsCompilingClass() ){
+		//自身のオブジェクトのメンバ関数を検索
+
+		// 静的メソッド
+		compiler.GetCompilingClass().GetStaticMethods().Enum( name, subs );
+
+		// 動的メソッド
+		compiler.GetCompilingClass().EnumDynamicMethodsOrInterfaceMethods( name, subs );
+	}
+
+
+	// グローバル関数を検索
+	compiler.GetObjectModule().meta.GetUserProcs().EnumGlobalProcs( NestMember, LexicalAnalyzer::FullNameToSymbol( name ), subs );
+}
+
+//オーバーロードされていない関数を取得（昔のコンパイラソースコードとの互換性保持）
+const UserProc *GetSubHash(const char *lpszName,BOOL bError){
+	std::vector<const UserProc *> subs;
+	GetOverloadSubHash(lpszName,subs);
+
+	//関数が存在しないとき
+	if(subs.size() == 0){
+		if(bError){
+			compiler.errorMessenger.Output(3,lpszName,cp);
+		}
+		return 0;
+	}
+
+	//一つ以上の関数が存在するときは内部エラー（デバッグ用）
+	if(subs.size() > 1){
+		if(bError) compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	const UserProc *pUserProc = subs[0];
+
+	return pUserProc;
+}
+const UserProc *GetMethodHash(const char *ObjectName,const char *MethodName,const char *Parameter,BOOL bError){
+	char temporary[VN_SIZE];
+	sprintf(temporary,"%s.%s",ObjectName,MethodName);
+
+	std::vector<const UserProc *> subs;
+	GetOverloadSubHash(temporary,subs);
+
+	//関数が存在しないとき
+	if(subs.size() == 0){
+		return 0;
+	}
+
+	//オーバーロードを解決
+	const UserProc *pUserProc = OverloadSolutionWithStrParam(temporary,subs,Parameter,ObjectName);
+
+	return pUserProc;
+}
+
+const UserProc *GetClassMethod( const char *className, const char *methodName ){
+	const CClass *pClass = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+		LexicalAnalyzer::FullNameToSymbol( className )
+	);
+	if( pClass ){
+		std::vector<const UserProc *> userProcs;
+		pClass->EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
+		if( userProcs.size() == 1 ){
+			return userProcs[0];
+		}
+	}
+
+	char temporary[VN_SIZE];
+	sprintf( temporary, "%s.%s", className, methodName );
+	compiler.errorMessenger.Output(3, temporary, -1 );
+
+	return NULL;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/BreakPoint.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/BreakPoint.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/BreakPoint.h	(revision 774)
@@ -0,0 +1,32 @@
+
+
+class BreakPointsPerFile
+{
+public:
+	std::string filename;
+	std::vector<int> lines;
+
+	BreakPointsPerFile(const char *lpszFileName,int iLineNum);
+
+	void add(int iLineNum);
+	void remove(int iLineNum);
+
+	void update( char *nativeCodeBuffer, const SourceLines &sourceLines );
+};
+typedef std::vector<BreakPointsPerFile> BreakPointsPerFiles;
+
+class BreakPointManager
+{
+	BreakPointsPerFiles breakpointsPerFiles;
+
+public:
+	BreakPointManager();
+
+	void insert(const char *lpszFileName,int iLineNum);
+	void remove(const char *lpszFileName,int iLineNum);
+
+	char *update( char *nativeCodeBuffer, int SizeOf_CodeSection, const SourceLines &sourceLines );
+};
+
+
+extern BreakPointManager *pobj_DBBreakPoint;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/CodeGenerator.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/CodeGenerator.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/CodeGenerator.h	(revision 774)
@@ -0,0 +1,536 @@
+#pragma once
+
+#include <LexicalScope.h>
+
+#ifdef _AMD64_
+#include "../../compiler_x64/MachineFixed.h"
+#else
+#include "../../compiler_x86/MachineFixed.h"
+#endif
+
+// コード生成時の部分的なスケジューリング
+class PertialSchedule
+{
+	int codePos;	// バッファ位置
+	int typeSize;	// 対象サイズ（一般的には8bit/32bit）
+
+public:
+	PertialSchedule( int codePos, int typeSize )
+		: codePos( codePos )
+		, typeSize( typeSize )
+	{
+	}
+	~PertialSchedule()
+	{
+	}
+
+	int GetCodePos() const
+	{
+		return codePos;
+	}
+	int GetTypeSize() const
+	{
+		return typeSize;
+	}
+};
+typedef std::vector<const PertialSchedule *> PertialSchedules;
+
+//Goto未知ラベル
+class GotoLabelSchedule : public PertialSchedule
+{
+	std::string name;
+	int line;
+	int sourceCodePos;
+public:
+	GotoLabelSchedule( const std::string &name, int nativeCodePos, int sourceCodePos )
+		: PertialSchedule( nativeCodePos, sizeof(long) )
+		, name( name )
+		, line( -1 )
+		, sourceCodePos( sourceCodePos )
+	{
+	}
+	GotoLabelSchedule( int line, int nativeCodePos, int sourceCodePos )
+		: PertialSchedule( nativeCodePos, sizeof(long) )
+		, line( line )
+		, sourceCodePos( sourceCodePos )
+	{
+	}
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	int GetLineNum() const
+	{
+		return line;
+	}
+	int GetSourceCodePos() const
+	{
+		return sourceCodePos;
+	}
+};
+typedef std::vector<const GotoLabelSchedule *> GotoLabelSchedules;
+
+//ラベルアドレス
+class GotoLabel
+{
+public:
+	std::string name;
+	int line;
+	DWORD address;
+
+	GotoLabel( const std::string &name, long nativeCodePos )
+		: name( name )
+		, line( -1 )
+		, address( nativeCodePos )
+	{
+	}
+	GotoLabel( int line, long nativeCodePos )
+		: name( "" )
+		, line( line )
+		, address( nativeCodePos )
+	{
+	}
+};
+typedef std::vector<GotoLabel> GotoLabels;
+
+class LexicalScope
+{
+public:
+	enum SCOPE_TYPE{
+		// ベース
+		SCOPE_TYPE_BASE,
+
+		// 分岐
+		SCOPE_TYPE_IF,
+
+		// ループ
+		SCOPE_TYPE_DO,
+		SCOPE_TYPE_FOR,
+		SCOPE_TYPE_WHILE,
+
+		// ケース分け
+		SCOPE_TYPE_SELECT,
+
+		// 例外処理
+		SCOPE_TRY,
+		SCOPE_CATCH,
+		SCOPE_FINALLY,
+	};
+
+private:
+	int level;
+	int StartAddress;
+	SCOPE_TYPE TypeOfStatement;
+
+	PertialSchedules breakPertialSchedules;
+
+public:
+	LexicalScope( int level, int addr, SCOPE_TYPE TypeOfStatement )
+		: level( level )
+		, StartAddress( addr )
+		, TypeOfStatement( TypeOfStatement )
+	{
+	}
+	~LexicalScope()
+	{
+	}
+
+	int GetStartAddress()
+	{
+		return StartAddress;
+	}
+	SCOPE_TYPE GetTypeOfStatement()
+	{
+		return TypeOfStatement;
+	}
+
+	void Break();
+	void RunScheduleOfBreak();
+};
+
+class LexicalScopes
+{
+	LexicalScope **ppScopes;
+	int level;
+
+public:
+
+	LexicalScopes(){
+		ppScopes = (LexicalScope **)malloc( 1 );
+		level=0;
+	}
+	~LexicalScopes(){
+		free( ppScopes );
+	}
+
+	//初期化（関数コンパイルの開始時に呼び出される）
+	void Init(int addr);
+
+	// スコープを開始
+	void Start( int addr, LexicalScope::SCOPE_TYPE TypeOfStatement );
+
+	// スコープを検索
+	LexicalScope *SearchScope( LexicalScope::SCOPE_TYPE TypeOfStatement );
+
+	int GetNowLevel(void);
+	void SetNowLevel( int level );
+	int GetStartAddress(void);
+
+	void End();
+
+	//スコープ終了時のデストラクタ呼び出し
+	void CallDestructorsOfScopeEnd();
+
+	//Returnステートメント用のデストラクタ呼び出し
+	void CallDestructorsOfReturn( int BaseLevel = 0 );
+};
+
+class CodeGenerator
+{
+	NativeCode *pNativeCode;
+
+private:
+	// 部分スケジュールの管理
+	PertialSchedules pertialSchedules;
+
+	// Continue用のコード位置情報の管理
+	std::vector<long> continueCodePositions;
+
+	// コンパイル中のステップにおいて、構造体の一時オブジェクトの解放が必要かどうか
+	bool isNeedFreeTempStructureInCurrentStep;
+
+public:
+
+	// ローカル変数用スケジュールの管理
+	PertialSchedules localVarPertialSchedules;
+
+	// Exit Subスケジュールの管理
+	std::vector<long> exitSubCodePositions;
+
+	// Gotoスケジュールの管理
+	GotoLabels gotoLabels;
+	GotoLabelSchedules gotoLabelSchedules;
+
+	// レキシカルスコープの管理
+	LexicalScopes lexicalScopes;
+
+	CodeGenerator()
+		: pNativeCode( 0 )
+		, isNeedFreeTempStructureInCurrentStep( false )
+	{
+	}
+	~CodeGenerator()
+	{
+		if( pNativeCode )
+		{
+			CheckUnresolveSchedule();
+		}
+	}
+
+	void Select( NativeCode &nativeCode )
+	{
+		if( pNativeCode )
+		{
+			CheckUnresolveSchedule();
+		}
+		pNativeCode = &nativeCode;
+	}
+	long GetNativeCodeSize() const
+	{
+		return pNativeCode->GetSize();
+	}
+
+	void NextSourceLine( const SourceCodePosition &sourceCodePosition, bool isInSystemProc )
+	{
+		pNativeCode->NextSourceLine( sourceCodePosition, isInSystemProc );
+	}
+
+	long GetContinueCodePos() const
+	{
+		if( continueCodePositions.size() == 0 )
+		{
+			return -1;
+		}
+		return continueCodePositions[continueCodePositions.size()-1];
+	}
+	void ClearContinueArea()
+	{
+		continueCodePositions.clear();
+	}
+	void ContinueAreaBegin()
+	{
+		continueCodePositions.push_back( pNativeCode->GetSize() );
+	}
+	void ContinueAreaEnd()
+	{
+		continueCodePositions.pop_back();
+	}
+
+	void PutWithSchedule( long l, Schedule::Type scheduleType );
+
+	void ResolveExitSubSchedule();
+
+	void CheckUnresolveSchedule();
+
+	void opfix( const PertialSchedule *pPertialSchedule, _int64 newValue );
+	void opfix_offset( const PertialSchedule *pPertialSchedule, long offset );
+	void opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule );
+
+
+	/////////////////////////////////////////////////////////////////
+	// 32bit/64bit共通 機械語生成
+	/////////////////////////////////////////////////////////////////
+
+private:
+	const PertialSchedule *__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+public:
+	const PertialSchedule *op_jle( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jbe( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jge( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jae( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jl( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jb( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jg( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_ja( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jne( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_je( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	const PertialSchedule *op_jmp( long offset, int op_size = sizeof(char), bool isPertialSchedule = false, bool isSelfOpcodeOffset = false );
+	void op_jmp_continue();
+	void op_jmp_exitsub();
+	void op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos );
+	void op_AddNeedFreeTempStructure( int reg );
+	void op_FreeTempStructure();
+
+
+#ifdef _AMD64_
+	/////////////////////////////////////////////////////////////////
+	// 64ビット機械語生成
+	/////////////////////////////////////////////////////////////////
+private:
+	void set_rex(int op_size,int reg,int index_reg,int base_reg);
+	const PertialSchedule *set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *__op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+public:
+	const PertialSchedule *op_mov_RV		(int op_size,int reg,long i32data, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_RV64		( int reg, _int64 i64data, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_RM		(int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_RM_ex		(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_MR		(int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_MR_ex		(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_MV		(int op_size,int base_reg,int offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, BOOL bUseOffset,long i32data);
+	void op_mov_RR					(int reg1,int reg2);
+	void op_movsxd					(int reg64,int reg32);
+	void op_movsx64_FromReg16		(int reg64,int reg16);
+	void op_movsx64_FromReg8		(int reg64,int reg8);
+	void op_movsx32_FromReg16		(int reg32,int reg16);
+	void op_movsx32_FromReg8		(int reg32,int reg8);
+	void op_movsx16_FromReg8		(int reg32,int reg8);
+	void op_cqo						();
+	void op_inc						(int reg);
+	void op_dec						(int reg);
+	const PertialSchedule *op_add_RM		(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_add_RV		(int reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_add_RR				(int reg1,int reg2);
+	void op_add32_reg				(int reg1,int reg2);
+	void op_sub_RV					(int op_size,int reg,long i32data);
+	void op_sub64_reg				(int reg1,int reg2);
+	void op_sub32_reg				(int reg1,int reg2);
+	void op_sbb_RR					( int op_size, int reg1, int reg2 );
+	void op_imul_RR					(int op_size,int reg1,int reg2);
+	void op_imul_RV					(int op_size,int reg,long i32data);
+	void op_div64_reg				(int reg);
+	void op_idiv64_reg				(int reg);
+	void op_shl_reg					(int op_size,int reg);
+	void op_sar_reg					(int op_size,int reg);
+	void op_shr_reg					(int op_size,int reg);
+	void op_and_reg					(int op_size,int reg1,int reg2);
+	void op_and64_value				(int reg,long offset);
+	void op_and32_value				(int reg,long offset);
+	void op_or_reg					(int op_size,int reg1,int reg2);
+	void op_xor_reg					(int op_size,int reg1,int reg2);
+	void op_not_reg					(int op_size,int reg);
+	void op_neg						( int reg );
+	void op_test					(int reg1,int reg2);
+	void op_cmp_reg					(int op_size,int reg1,int reg2);
+	void op_cmp_value				(int op_size,int reg,char byte_data);
+	void op_setne					(int reg);
+	const PertialSchedule *op_movlpd_MR		(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_movlpd_RM		(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_movsd_RR				(int xmm_reg1,int xmm_reg2);
+	const PertialSchedule *op_movsd_MR		(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_movss_RR				(int xmm_reg1,int xmm_reg2);
+	const PertialSchedule *op_movss_RM		(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_movss_MR		(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_movd_RX					(int reg,int xmm_reg);
+	void op_cvtsd2ss				(int xmm_reg1,int xmm_reg2);
+	void op_cvtss2sd				(int xmm_reg1,int xmm_reg2);
+	void op_cvttsd2si_xmm			(int op_size,int reg,int xmm_reg);
+	void op_cvttss2si_xmm			(int op_size,int reg,int xmm_reg);
+	void op_cvtsi2sd_reg			(int op_size,int xmm_reg,int reg);
+	void op_cvtsi2ss_reg			(int op_size,int xmm_reg,int reg);
+	void op_comisd					(int xmm_reg1,int xmm_reg2);
+	void op_comiss					(int xmm_reg1,int xmm_reg2);
+	void op_rep_movs				(int op_size);
+	void op_add_rsp(long num);
+	const PertialSchedule *op_sub_rsp( long num, bool isPertialSchedule = false );
+	void op_fld_ptr_esp(int type);
+	void op_zero_reg(int reg);
+
+	void op_call( const UserProc *pUserProc );
+	void op_call( const DllProc *pDllProc );
+	void op_ret();
+	void op_addressof( int reg, const UserProc *pUserProc );
+	void op_mov_RV_com_vtbl( int reg, const CClass *pClass );
+	void op_mov_RV_vtbl( int reg, const CClass *pClass );
+
+#else
+	/////////////////////////////////////////////////////////////////
+	// 32ビット機械語生成
+	/////////////////////////////////////////////////////////////////
+private:
+	const PertialSchedule *set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType, bool isPertialSchedule );
+	void __op_format(char op_prefix,char opcode,int reg);
+	const PertialSchedule *__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+public:
+	const PertialSchedule *op_mov_MV		( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, long value, Schedule::Type valueScheduleType = Schedule::None );
+	const PertialSchedule *op_mov_RV		( int reg, long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_mov_RR							( int reg1,int reg2);
+	const PertialSchedule *op_mov_RM		( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_RM_ex		( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_MR		( int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_mov_MR_ex		( int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_movsx_R32R16					( int reg32,int reg16 = REG_NON);
+	void op_movsx_R32R8						( int reg32,int reg8 = REG_NON);
+	void op_movsx_R16R8						( int reg16,int reg8 = REG_NON);
+	const PertialSchedule *op_lea_RM		( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_inc								(int reg);
+	void op_dec								(int reg);
+	void op_add_RV8							(int reg,char cValue);
+	const PertialSchedule *op_add_RV		( int reg, long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_add_RR							( int reg1, int reg2 );
+	const PertialSchedule *op_add_RM		(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_adc_RV8			(int reg,char cValue);
+	void op_adc_RR			( int reg1, int reg2 );
+	void op_sub_RV8			(int reg,char cValue);
+	void op_sub_RR			( int reg1, int reg2 );
+	void op_sbb_RV8			(int reg,char cValue);
+	void op_sbb_RR			( int reg1, int reg2 );
+	void op_imul_RR			(int reg1,int reg2);
+	void op_imul_RV			(int reg,long i32data);
+	void op_imul_RV8		(int reg,char cValue);
+	void op_div_R			( int reg );
+	void op_idiv_R			( int reg );
+	void op_and_RV			(int reg,long value);
+	void op_and_RR			( int reg1, int reg2 );
+	void op_or_RR			( int op_size, int reg1, int reg2 );
+	void op_xor_RR			( int reg1, int reg2 = REG_NON );
+	void op_neg				( int reg );
+	void op_cdq				();
+
+	void op_rep_movs		(int op_size);
+
+	void op_push(int reg);
+	void op_push_V( long data, Schedule::Type scheduleType = Schedule::None );
+	void op_push_M( int base_reg );
+	const PertialSchedule *op_push_M( int base_reg, long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_pop(int reg = REG_NON);
+	void op_add_esp(long num);
+	const PertialSchedule *op_sub_esp( long num, bool isPertialSchedule = false );
+	void op_cmp_RR( int reg1, int reg2 );
+	void op_cmp_value(int op_size,int reg,char byte_data);
+	void op_setne( int reg );
+	void op_test(int reg1,int reg2);
+	void op_test_ah( char cValue );
+	void op_fld_ptr_esp(int type);
+	void op_fld_basereg			(int type,int base_reg);
+	const PertialSchedule *op_fld_base_offset		(int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_fld_base_offset_ex	(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_fstp_basereg		(int type,int base_reg);
+	const PertialSchedule *op_fstp_base_offset		(int type,int base_reg,long offset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	const PertialSchedule *op_fstp_base_offset_ex	(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType = Schedule::None, bool isPertialSchedule = false );
+	void op_fistp_ptr_esp		( int typeSize );
+	void op_fstp_push			( Type &type );
+	void op_fcompp();
+	void op_fnstsw_ax();
+	void op_zero_reg(int reg);
+	void fpu_cast();
+	void fpu_cast_end();
+
+	void op_call_R( int reg );
+	void op_call(const UserProc *pUserProc);
+	void op_call(const DllProc *pDllProc);
+	void op_ret();
+	void op_ret( short stackFrameSize );
+	void op_addressof( int reg, const UserProc *pUserProc );
+	void op_mov_RV_com_vtbl( int reg, const CClass *pClass );
+	void op_mov_RV_vtbl( int reg, const CClass *pClass );
+#endif
+
+
+
+	void PutOld( long l, Schedule::Type scheduleType )
+	{
+		this->PutWithSchedule( l, scheduleType );
+	}
+	const PertialSchedule *PutOld( long l, bool isPertialSchedule )
+	{
+		const PertialSchedule *pPertialSchedule;
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		pNativeCode->Put( l );
+		return pPertialSchedule;
+	}
+	void PutOld( const NativeCode &nativeCode )
+	{
+		pNativeCode->PutEx( nativeCode );
+	}
+	void PutOld( char c )
+	{
+		pNativeCode->Put( c );
+	}
+	void PutOld( char c1, char c2 )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+	}
+	void PutOld( char c1, char c2, char c3 )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+		pNativeCode->Put( c3 );
+	}
+	void PutOld( char c1, char c2, char c3, char c4 )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+		pNativeCode->Put( c3 );
+		pNativeCode->Put( c4 );
+	}
+	void PutOld( char c1, char c2, char c3, long l )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+		pNativeCode->Put( c3 );
+		pNativeCode->Put( l );
+	}
+	void PutOld( char c1, char c2, char c3, char c4, char c5 )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+		pNativeCode->Put( c3 );
+		pNativeCode->Put( c4 );
+		pNativeCode->Put( c5 );
+	}
+	void PutOld( char c1, char c2, char c3, char c4, char c5, char c6 )
+	{
+		pNativeCode->Put( c1 );
+		pNativeCode->Put( c2 );
+		pNativeCode->Put( c3 );
+		pNativeCode->Put( c4 );
+		pNativeCode->Put( c5 );
+		pNativeCode->Put( c6 );
+	}
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Compiler.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Compiler.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Compiler.h	(revision 774)
@@ -0,0 +1,213 @@
+#pragma once
+
+class Compiler
+{
+	// ビルド成功のフラグ
+	bool isBuildSuccessful;
+
+	// モジュール名
+	std::string moduleName;
+
+	// モジュール タイプ
+	ActiveBasic::Common::TargetModuleType::EnumType targetModuleType;
+
+	// デバッグ ビルドかどうか
+	bool isDebug;
+
+	// Unicode対応モジュールかどうか
+	bool isUnicode;
+
+	// 名前空間サポート
+	NamespaceSupporter namespaceSupporter;
+
+	// コンパイル中のUserProc/CClass
+	const UserProc *pCompilingUserProc;
+	const CClass *pCompilingClass;
+
+	// 現在参照したいソースコードのオブジェクト モジュール インデックス
+	int currentRelationalObjectModuleIndexForSource;
+
+
+
+public:
+
+	Compiler();
+	~Compiler();
+
+	// 静的リンクの準備を行う（オブジェクトモジュール同士の名前リストの結合など、前処理を行う）
+	void PreStaticLink( const ObjectModules &staticLibraries );
+
+	// 静的リンクを行う
+	void StaticLink( ObjectModules &staticLibraries );
+
+	// ビルド成功のフラグ
+	bool IsBuildSuccessful() const
+	{
+		return isBuildSuccessful;
+	}
+	void BuildSuccessful()
+	{
+		isBuildSuccessful = true;
+	}
+
+	// モジュール名
+	void SetModuleName( const std::string &moduleName )
+	{
+		this->moduleName = moduleName;
+	}
+	const std::string &GetModuleName() const
+	{
+		return moduleName;
+	}
+
+	// 名前空間サポート
+	NamespaceSupporter &GetNamespaceSupporter()
+	{
+		return namespaceSupporter;
+	}
+
+	// メッセンジャー
+	Messenger messenger;
+	ErrorMessenger errorMessenger;
+
+	// コード生成機構
+	CodeGenerator codeGenerator;
+
+	// リンカ
+	Linker linker;
+
+	// リソースマネージャ
+	ActiveBasic::Common::ResourceManager resourceManager;
+
+	// 静的リンクするオブジェクトファイル
+	std::vector<std::string> staticLibraryFilePaths;
+
+	// 静的リンクするオブジェクトモジュール
+	ObjectModules staticLibraries;
+
+	ObjectModule *pSelectedObjectModule;
+
+	// オブジェクトモジュール
+	ObjectModule &GetObjectModule()
+	{
+		return *pSelectedObjectModule;
+	}
+
+	void SelectObjectModule( ObjectModule *pObjectModule )
+	{
+		this->pSelectedObjectModule = pObjectModule;
+	}
+
+	// 現在参照すべきソースコード
+	const BasicSource &GetCurrentSource()
+	{
+		return staticLibraries[currentRelationalObjectModuleIndexForSource]->GetSource();
+	}
+
+	// 現在参照すべきソースコードを格納するオブジェクトモジュールのインデックス
+	int GetCurrentRelationalObjectModuleIndexForSource() const
+	{
+		return currentRelationalObjectModuleIndexForSource;
+	}
+	void SetCurrentRelationalObjectModuleIndexForSource( int currentRelationalObjectModuleIndexForSource )
+	{
+		this->currentRelationalObjectModuleIndexForSource = currentRelationalObjectModuleIndexForSource;
+	}
+
+	bool IsExe() const
+	{
+		if( targetModuleType == ActiveBasic::Common::TargetModuleType::Exe )
+		{
+			return true;
+		}
+		return false;
+	}
+	bool IsDll() const
+	{
+		if( targetModuleType == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			return true;
+		}
+		return false;
+	}
+
+	// スタティック リンク ライブラリをビルドする？
+	bool IsSll() const
+	{
+		if( targetModuleType == ActiveBasic::Common::TargetModuleType::Sll )
+		{
+			return true;
+		}
+		return false;
+	}
+
+	void SetTargetModuleType( ActiveBasic::Common::TargetModuleType::EnumType targetModuleType )
+	{
+		this->targetModuleType = targetModuleType;
+	}
+
+	void SetDebugMark( bool isDebug )
+	{
+		this->isDebug = isDebug;
+	}
+	bool IsDebug() const
+	{
+		return isDebug;
+	}
+
+	void SetUnicodeMark( bool isUnicode )
+	{
+		this->isUnicode = isUnicode;
+	}
+	bool IsUnicode()
+	{
+		return isUnicode;
+	}
+
+	int AddStringToDataTable( const std::string &text );
+
+
+	// コアモジュールかどうか
+	bool isCore;
+	void SetCoreMark( bool isCore )
+	{
+		this->isCore = isCore;
+	}
+	bool IsCore() const
+	{
+		return isCore;
+	}
+
+	// グローバルエリアが置かれる関数名
+	const std::string &GetGlobalAreaProcName() const;
+
+	// 列挙型
+	EnumInfoCollection enumInfoCollection;
+
+
+private:
+	ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType StringToGenericTypeEx( const std::string &typeName, Type &type );
+public:
+	ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType StringToTypeEx( const std::string &typeName, Type &type, bool isResolveGenerics = false );
+	bool StringToType( const std::string &typeName, Type &type );
+	const std::string TypeToString( const Type &type );
+
+	// ジェネリック型の型パラメータ解決をサポートした上でSizeOf関数の戻り値を取得する
+	int SizeOf( const Type &type );
+
+	void ClearCompilingUserProcAndClass();
+	void StartGlobalAreaCompile();
+	void FinishGlobalAreaCompile();
+	void SetCompilingClass( const CClass *pClass );
+	void SetCompilingUserProc( const UserProc *pUserProc );
+	void StartProcedureCompile( const UserProc *pUserProc );
+	void FinishProcedureCompile();
+
+	bool IsGlobalAreaCompiling();
+	bool IsLocalAreaCompiling();
+	const UserProc &GetCompilingUserProc();
+	bool IsCompilingClass();
+	const CClass &GetCompilingClass();
+};
+
+extern Compiler compiler;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Configuration.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Configuration.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Configuration.h	(revision 774)
@@ -0,0 +1,29 @@
+#pragma once
+
+class Configuration
+	: public Jenga::Common::BoostSerializationSupport<Configuration>
+{
+	std::string abdevRootRelativePath;
+
+public:
+	Configuration()
+	{
+	}
+
+	const std::string &GetAbdevRootRelativePath() const
+	{
+		return abdevRootRelativePath;
+	}
+
+	// XMLシリアライズ用
+private:
+	virtual const char *RootTagName() const
+	{
+		return "configuration";
+	}
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( abdevRootRelativePath );
+	}
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/DataTableGenerator.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/DataTableGenerator.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/DataTableGenerator.h	(revision 774)
@@ -0,0 +1,22 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Compiler{
+
+
+class DataTableGenerator
+{
+	static int lastMadeConstObjectDataTableOffset;
+public:
+	static bool MakeConstObjectToProcessStaticBuffer( DataTable &dataTable, const CClass &objClass, const Jenga::Common::Strings &initMemberValues, int &dataTableOffset );
+	static bool MakeConstObjectToProcessStaticBuffer( DataTable &dataTable, const char *expression, Type &resultType, int &dataTableOffset );
+	static int MakeConstStringObjectToProcessStaticBuffer( DataTable &dataTable, const char *str );
+	static bool MakeLiteralArrayBuffer( DataTable &dataTable, const char *expression, const Type &baseType, int &dataTableOffset );
+	static int GetLastMadeConstObjectDataTableOffset()
+	{
+		return lastMadeConstObjectDataTableOffset;
+	}
+
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Debugger.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Debugger.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Debugger.h	(revision 774)
@@ -0,0 +1,28 @@
+#pragma once
+
+class Debugger
+{
+	bool isRunning;
+
+public:
+	Debugger()
+		: isRunning( false )
+	{
+	}
+
+	void DebugStart()
+	{
+		isRunning = true;
+	}
+	void FinishDebug()
+	{
+		isRunning = false;
+	}
+
+	bool IsRunning() const
+	{
+		return isRunning;
+	}
+};
+
+static Debugger debugger;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Enum.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Enum.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Enum.h	(revision 774)
@@ -0,0 +1,82 @@
+#pragma once
+
+class EnumMember
+{
+	std::string name;
+	std::string value;
+	int sourceIndex;
+public:
+	EnumMember( const std::string &name, const std::string &value, int sourceIndex )
+		: name( name )
+		, value( value )
+		, sourceIndex( sourceIndex )
+	{
+	}
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	const std::string &GetValueStr() const
+	{
+		return value;
+	}
+	int GetSourceIndex() const
+	{
+		return sourceIndex;
+	}
+};
+
+class EnumInfo
+	: public Symbol
+{
+
+	BOOL bConst;
+
+	std::vector<EnumMember> members;
+public:
+
+	EnumInfo( const NamespaceScopes &namespaceScopes, const std::string &name )
+		: Symbol( namespaceScopes, name )
+	{
+	}
+
+	const std::vector<EnumMember> &GetMembers() const
+	{
+		return members;
+	}
+
+	const EnumMember &GetEnumMember( const std::string &memberName ) const
+	{
+		foreach( const EnumMember &member, members )
+		{
+			if( member.GetName() == memberName )
+			{
+				return member;
+			}
+		}
+		throw;
+	}
+
+	std::vector<EnumMember> &GetEnumMembers()
+	{
+		return members;
+	}
+};
+
+class EnumInfoCollection
+	: public std::vector<EnumInfo>
+{
+public:
+	const EnumInfo *Find( const Symbol &symbol ) const
+	{
+		const EnumInfoCollection &thisEnumInfoCollection = *this;
+		foreach( const EnumInfo &enumInfo, thisEnumInfoCollection )
+		{
+			if( enumInfo.IsEqualSymbol( symbol ) )
+			{
+				return &enumInfo;
+			}
+		}
+		return NULL;
+	};
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ErrorCode.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ErrorCode.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ErrorCode.h	(revision 774)
@@ -0,0 +1,18 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Compiler{ namespace Error{
+
+
+struct StringToTypeErrorCode
+{
+	enum EnumType
+	{
+		Successful = 0,				// 成功
+		FailedResolveGenericType,	// ジェネリック型の型解決に失敗
+		NotfoundGenericClass,		// ジェネリッククラスを発見できなかった
+		NotfoundType,				// 型を発見できなかった
+	};
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Exception.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Exception.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Exception.h	(revision 774)
@@ -0,0 +1,17 @@
+#pragma once
+
+namespace Exception{
+
+	void TryCommand();
+	void CatchCommand( const char *parameter );
+	void FinallyCommand();
+	void EndTryCommand( bool isNoWarning = false );
+
+	// Tryスコープを検証する
+	void InspectTryScope();
+
+	void ThrowCommand( const char *Parameter );
+
+	void Opcode_Func_System_GetNowScopeCatchAddress();
+	void Opcode_Func_System_GetNowScopeFinallyAddress();
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalAnalyzer.h	(revision 774)
@@ -0,0 +1,67 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Compiler{
+
+
+class LexicalAnalyzer
+{
+public:
+
+	// 名前空間を収集
+	static bool CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection );
+
+	// フルネーム識別子をシンボルに変換する
+	static Symbol FullNameToSymbol( const char *fullName );
+	static Symbol FullNameToSymbol( const std::string &fullName );
+
+	// 列挙型を収集
+	static void CollectEnumMembers( EnumInfo &enumInfo, const char *buffer, int nowLine );
+	static void CollectEnums( const char *source, EnumInfoCollection &enums );
+	static std::string GenerateEnumsSourceCode( const EnumInfoCollection &enums );
+
+	// クラスの名前情報を収集する
+	static void CollectClassesForNameOnly( const char *source, Classes &classes );
+
+	// TypeDefを収集する
+	static void AddTypeDef( TypeDefCollection &typeDefs, const NamespaceScopes &namespaceScopes, const std::string &expression, int nowLine );
+	static void CollectTypeDefs( const char *source, TypeDefCollection &typeDefs );
+
+	// 定数を収集する
+	static void AddConstEnum( Consts &consts, const NamespaceScopes &namespaceScopes, const char *buffer );
+	static void CollectConsts( const char *source, Consts &consts, ConstMacros &constMacros );
+	static bool ConstMacroToExpression( const ConstMacro &constMacro, const char *parameterStr, char *dest );
+
+	// クラスを収集する
+	static Member *CreateMember( const CClass &_class, Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine );
+	static void AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
+		bool isVirtual, bool isOverride, bool isEnableOverrideCheck, const char *interfaceName, bool isAutoGeneration, int nowLine);
+	static bool Inherits( CClass &_class, const char *inheritNames, int nowLine );
+	static void Implements( CClass &_class, Interface *pInterface );
+	static bool Implements( CClass &_class, const char *interfaceNames, int nowLine );
+	static void LookaheadClass( const std::string &className, Classes &classes );
+	static bool LoopRefCheck( const CClass &objClass );
+	static void CollectClasses( const char *source, Classes &classes );
+
+	// テンプレート展開
+	static Type LexicalAnalyzer::TemplateExpand_ResolveType( const Type &baseType, const Types &actualTypes );
+	static void TemplateExpand_ResolveMethod( const CMethod *pBaseMethod, const Types &actualTypes, CClass *pNewClass );
+	static const CClass *TemplateExpand( CClass &_class, const Types &actualTypes );
+
+	// グローバルプロシージャを収集する
+	static bool ExtractParameterVarNames( const char *sourceOfParams, Jenga::Common::Strings &paramVarNames, int nowLine );
+	static bool AnalyzeParameter( Parameters &params, const Jenga::Common::Strings &parameterStrings, int nowLine );
+	static bool SetParamsAndReturnTypeForUserProc( UserProc &userProc, const char *sourceOfParams, int nowLine, bool isStatic );
+	static bool SetParamsAndReturnType( Procedure *pProc, const char *sourceOfParams, bool isSupportEllipse, int nowLine );
+	static UserProc* ParseUserProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic, char *interfaceName = NULL );
+	static DllProc *ParseDllProc(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine);
+	static void CollectProcedures( const char *source, UserProcs &userProcs, DllProcs &dllProcs );
+
+	// デリゲートを収集する
+	static void CollectDelegates( const char *source, Delegates &delegates );
+	static std::string GenerateDelegatesSourceCode( const Delegates &delegates );
+	static void RefleshDelegateParameterAndReturnType( Delegate &dg );
+	static void RefleshDelegatesParameterAndReturnType( Delegates &delegates );
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalScope.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalScope.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/LexicalScope.h	(revision 774)
@@ -0,0 +1,3 @@
+#pragma once
+
+
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Linker.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Linker.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Linker.h	(revision 774)
@@ -0,0 +1,56 @@
+#pragma once
+
+class Linker
+{
+	NativeCode nativeCode;
+	DataTable dataTable;
+	DWORD imageBase;
+
+public:
+
+	Linker()
+	{
+	}
+
+	const NativeCode &GetNativeCode() const
+	{
+		return nativeCode;
+	}
+
+	const DataTable &GetDataTable() const
+	{
+		return dataTable;
+	}
+
+	void SetImageBase( DWORD imageBase )
+	{
+		this->imageBase = imageBase;
+	}
+
+	// データテーブルスケジュール
+	void ResolveDataTableSchedules( long dataSectionBaseOffset );
+
+	// Catchアドレス スケジュール
+	void ResolveCatchAddressSchedules( long codeSectionBaseOffset );
+
+	// DLL関数スケジュール
+	void ResolveDllProcSchedules( long codeSectionBaseOffset, long importSectionBaseOffset, long lookupSize, long hintSize );
+
+	// ユーザ定義関数スケジュール
+	void ResolveUserProcSchedules( long codeSectionBaseOffset );
+
+	// グローバル変数スケジュール
+	void ResolveGlobalVarSchedules( long rwSectionBaseOffset );
+
+	// vtblスケジュール
+	void ResolveVtblSchedule( long dataSectionBaseOffset );
+
+	// TypeInfoスケジュール
+	void ResolveTypeInfoSchedule( long dataSectionBaseOffset );
+
+	// リンク
+	void Link( ObjectModule &masterObjectModule );
+
+	// データテーブルをセット
+	void SetDataTable( DataTable &dataTable );
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Messenger.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Messenger.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Messenger.h	(revision 774)
@@ -0,0 +1,76 @@
+
+class Messenger
+{
+public:
+	void Output( const std::string &message );
+	int GetNextErrorLine();
+};
+
+class ErrorInfo
+{
+	int errorCode;
+	std::string keyword;
+	std::string sourceFilePath;
+	int sourceLineNum;
+	int errorLineNum;
+
+public:
+	ErrorInfo( int errorCode, const std::string &keyword, const std::string &sourceFilePath, int sourceLineNum )
+		: errorCode( errorCode )
+		, keyword( keyword )
+		, sourceFilePath( sourceFilePath )
+		, sourceLineNum( sourceLineNum )
+	{
+	}
+	ErrorInfo( int errorCode, const std::string &keyword, int sourceIndex );
+
+	int GetErrorCode() const
+	{
+		return errorCode;
+	}
+	bool IsWarning() const
+	{
+		return ( errorCode < -100 );
+	}
+	const std::string &GetKeyword() const
+	{
+		return keyword;
+	}
+	const std::string &GetSourceFilePath() const
+	{
+		return sourceFilePath;
+	}
+	int GetSourceLineNum() const
+	{
+		return sourceLineNum;
+	}
+	int GetErrorLineNum() const
+	{
+		return errorLineNum;
+	}
+
+	std::string GetMessageString() const;
+	std::string GetFullMessageString() const;
+};
+typedef std::vector<ErrorInfo> ErrorInfos;
+
+class ErrorMessenger
+	: public Messenger
+{
+	ErrorInfos errorInfos;
+	Jenga::Common::Strings synonymKeyWords;
+
+public:
+	void Output( const ErrorInfo &errorInfo );
+	void Output( int errorCode, const std::string &keyword, int sourceIndex = -1 );
+	void Output( int errorCode, const char *keyword, int sourceIndex = -1 );
+	void OutputFatalError();
+
+	void ClearSynonymKeyWords();
+
+	int GetErrorCount() const;
+	bool HasError() const;
+	int GetWarningCount() const;
+
+	void ShowErrorLine( int errorLineNum );
+};
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ProcedureGenerator.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ProcedureGenerator.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ProcedureGenerator.h	(revision 774)
@@ -0,0 +1,16 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Compiler{
+
+
+class ProcedureGenerator
+{
+public:
+	static void Generate_InitStaticMember( const Classes &classes );
+	static void Generate_System_InitializeUserTypes( const Classes &classes );
+	static std::string GetStaticDefiningStringAsMemberTypeInfoNames( const CClass &_class );
+	static void Generate_System_InitializeUserTypesForBaseType( const Classes &classes );
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Program.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Program.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/Program.h	(revision 774)
@@ -0,0 +1,100 @@
+#pragma once
+
+class Program
+{
+	std::string sourceFilePath;
+	std::string outputFilePath;
+
+	bool isKickedFromEditor;
+	bool isShowDlg;
+	bool isDebugRun;
+	bool isAttach;
+	DWORD attachProcessId;
+	bool isClipCompileView;
+	std::string includeDir;
+
+public:
+	static Jenga::Common::Logger logger;
+
+	Program()
+		: isKickedFromEditor( false )
+		, isShowDlg( false )
+		, isDebugRun( false )
+		, isAttach( false )
+		, attachProcessId( 0 )
+		, isClipCompileView( false )
+	{
+	}
+
+	void Configurate();
+
+	bool AnalysisCommandLines();
+
+	// ユーザデータ格納用のディレクトリを取得
+	static const std::string GetAbcUserAppDir();
+
+	const std::string &GetSourceFilePath() const
+	{
+		return sourceFilePath;
+	}
+	void SetSourceFilePath( const std::string &sourceFilePath )
+	{
+		this->sourceFilePath = sourceFilePath;
+	}
+	const std::string &GetOutputFilePath() const
+	{
+		return outputFilePath;
+	}
+	const std::string GetOutputFileName() const
+	{
+		Jenga::Common::Path path( outputFilePath );
+		return path.GetFileName() + path.GetExt();
+	}
+	void SetOutputFilePath( const std::string &outputFilePath )
+	{
+		this->outputFilePath = outputFilePath;
+	}
+
+	bool IsKickedFromEditor() const
+	{
+		return isKickedFromEditor;
+	}
+
+	bool IsShowDlg() const
+	{
+		return isShowDlg;
+	}
+
+	bool IsDebugRun() const
+	{
+		return isDebugRun;
+	}
+
+	bool IsAttach() const
+	{
+		return isAttach;
+	}
+
+	DWORD GetAttachProcessId() const
+	{
+		return attachProcessId;
+	}
+
+	bool IsClipCompileView() const
+	{
+		return isClipCompileView;
+	}
+
+	const std::string &GetIncludeDir() const
+	{
+		return includeDir;
+	}
+	void SetIncludeDir( const std::string &includeDir )
+	{
+		this->includeDir = includeDir;
+	}
+
+	int GetExitCode() const;
+};
+
+extern Program program;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/VtblGenerator.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/VtblGenerator.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/VtblGenerator.h	(revision 774)
@@ -0,0 +1,20 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Compiler{
+
+
+class VtblGenerator
+{
+public:
+	// vtblを一時的に生成
+	static int GenerateVTablePart( const Methods &methods );
+	static void GenerateFullVTables( CClass &_class );
+	static void GenerateVTablesForAllClasses( Classes &classes );
+
+	// vtblのを正規のオフセットで再構築
+	static void ActionVtblSchedule( CClass &_class, LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
+	static void ActionVtblScheduleForAllClasses( Classes &classes, LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection );
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/logger.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/logger.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/logger.h	(revision 774)
@@ -0,0 +1,123 @@
+#pragma once
+
+#define STDX_DSTREAM_BUFFERING
+
+namespace Jenga{
+namespace Common{
+
+
+class LoggerSetting : public BoostSerializationSupport<LoggerSetting>
+{
+public:
+	int stopStep;
+
+	LoggerSetting()
+		: stopStep( -1 )
+	{
+	}
+
+	// XMLシリアライズ用
+private:
+	virtual const char *RootTagName() const
+	{
+		return "loggerSetting";
+	}
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( stopStep );
+	}
+};
+
+
+// VC++ で STLport だと using std::char_traits; みたいなのが必要かも
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
+class basic_dbg_streambuf: public std::basic_stringbuf<Ch_T, Tr_T>
+{
+protected:
+	std::string saveFilePath;
+	int count;
+	LoggerSetting setting;
+
+public:
+	basic_dbg_streambuf( const std::string &saveFilePath, bool isOptionEnabled )
+		: saveFilePath( saveFilePath )
+		, count( 0 )
+	{
+#ifndef STDX_DSTREAM_BUFFERING
+		setbuf(0,0);
+#endif
+
+		if( isOptionEnabled )
+		{
+			// 設定ファイルを読み込む
+			char temporary[MAX_PATH];
+			char temp2[MAX_PATH];
+			char temp3[MAX_PATH];
+			_splitpath(saveFilePath.c_str(),temporary,temp2,temp3,NULL);
+
+			std::string settingXmlPath = (std::string)temporary + temp2 + temp3 + ".setting.xml";
+			if( Jenga::Common::Path( settingXmlPath ).IsExistFile() )
+			{
+				setting.ReadXml( settingXmlPath, false );
+			}
+		}
+	}
+
+	virtual ~basic_dbg_streambuf()
+	{
+		sync();
+	}
+
+protected:
+	int sync(void)
+	{
+		dbg_out(str().c_str());
+		pbump(static_cast<int>(pbase() - pptr()));
+		return 0;
+	}
+
+	void dbg_out(const Ch_T*);
+};
+
+template <>
+inline void basic_dbg_streambuf<char>::dbg_out(const char *str)
+{
+	std::ofstream ofs( ( saveFilePath ).c_str(), std::ios_base::app );
+	ofs << "[" << (count++) << "] " << str ;
+	ofs.close();
+
+	OutputDebugString( str );
+
+	if( (count-1) == setting.stopStep )
+	{
+		DebugBreak();
+	}
+}
+
+template <typename Ch_T, typename Tr_T = std::char_traits<Ch_T> >
+class basic_dbg_ostream: public std::basic_ostream<Ch_T, Tr_T>
+{
+public:
+	basic_dbg_ostream( const std::string &saveFilePath, bool isOptionEnabled )
+		: std::basic_ostream<Ch_T, Tr_T>(new basic_dbg_streambuf<Ch_T, Tr_T>(saveFilePath,isOptionEnabled))
+	{
+		std::ofstream ofs( ( saveFilePath ).c_str(), std::ios_base::trunc );
+		ofs.close();
+	}
+
+
+	virtual ~basic_dbg_ostream()
+	{
+		// flush(); // 不要らしい．http://www.tietew.jp/cppll/archive/607
+		delete rdbuf();
+	}
+};
+
+
+typedef basic_dbg_ostream<_TCHAR>  Logger;
+
+
+}}
+
+BOOST_CLASS_IMPLEMENTATION(Jenga::Common::LoggerSetting, boost::serialization::object_serializable);
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/option.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/option.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/option.h	(revision 774)
@@ -0,0 +1,66 @@
+/////////////////////////////////////////////////////////////////////
+// コンパイル オプション
+/////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////
+// ここから
+
+
+// ログ関係
+
+// ログ生成しない場合はこの下の行をコメントアウトする
+#ifdef _DEBUG
+	#define USE_TRACE
+#else
+	//#define USE_TRACE
+#endif
+
+#ifdef USE_TRACE
+	// オーバーロードに関するログを生成する
+	#define USE_TRACE_FOR_OVERLOAD
+
+	// モジュールサイズに関するログを生成する
+	//#define USE_TRACE_FOR_SIZE
+
+	// XMLシリアライズに関するログを生成する
+	//#define USE_TRACE_FOR_SERIALIZE
+
+	// ソースコードステップに関するログを生成する
+	#define USE_TRACE_FOR_SOURCECODESTEP
+#endif
+
+
+// ここまで
+/////////////////////////////
+
+
+#ifdef USE_TRACE
+#define trace(s) Program::logger << s << std::endl
+#else
+#define trace(s)
+#endif
+
+#ifdef USE_TRACE_FOR_OVERLOAD
+#define trace_for_overload(s) trace(s)
+#else
+#define trace_for_overload(s)
+#endif
+
+#ifdef USE_TRACE_FOR_SIZE
+#define trace_for_size(s) trace(s)
+#else
+#define trace_for_size(s)
+#endif
+
+#ifdef USE_TRACE_FOR_SERIALIZE
+#define trace_for_serialize(s) trace(s)
+#else
+#define trace_for_serialize(s)
+#endif
+
+#ifdef USE_TRACE_FOR_SOURCECODESTEP
+#define trace_for_sourcecodestep(s) trace( "[source code step] " << s)
+#else
+#define trace_for_sourcecodestep(s)
+#endif
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ver.h
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ver.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/include/ver.h	(revision 774)
@@ -0,0 +1,11 @@
+// バージョン
+#define MAJOR_VER		5
+#define MINOR_VER		00
+#define REVISION_VER	00
+
+// バージョン付加文字列
+#ifdef _AMD64_
+#define VER_INFO		"(x64)"
+#else
+#define VER_INFO		""
+#endif
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BoostSerializationSupport.cpp	(revision 774)
@@ -0,0 +1,504 @@
+#pragma warning(disable : 4996)
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <iomanip>
+#include <ios>
+#include <streambuf>
+#include <sstream>
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <process.h>
+#include <fcntl.h>
+#include <io.h>
+#include <shlwapi.h>
+#include <tchar.h>
+#include <stdarg.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/vector.hpp>
+#include <boost/serialization/map.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/is_abstract.hpp>
+
+#include <jenga/include/jenga.h>
+
+#include <abdev/ab_common/include/libs.h>
+
+using namespace Jenga::Common;
+
+template<class T_xml_schema> void BoostSerializationSupport<T_xml_schema>::echo( const char *msg ) const
+{
+	MessageBox( NULL, msg, "XMLシリアライズの例外", MB_OK );
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXml( std::istream& ifs, bool isShowExceptionMessage )
+{
+	bool isSuccessful = false;
+
+	try{
+		boost::archive::xml_iarchive ia(ifs);
+
+		// ファイルから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXml( std::ostream& ofs, bool isShowExceptionMessage ) const
+{
+	bool isSuccessful = false;
+
+	try{
+		boost::archive::xml_oarchive oa(ofs);
+
+		// ファイルに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXml( const std::string &xmlFilePath, bool isShowExceptionMessage )
+{
+	// 入力アーカイブの作成
+	std::ifstream ifs( xmlFilePath.c_str() );
+	
+	bool result = ReadXml(ifs,isShowExceptionMessage);
+
+	// 入力を閉じる
+	ifs.close();
+
+	return result;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXml( const std::string &xmlFilePath, bool isShowExceptionMessage ) const
+{
+	// 出力アーカイブの作成
+	std::ofstream ofs( xmlFilePath.c_str() );
+
+	bool result = WriteXml(ofs,isShowExceptionMessage);
+
+	// 出力を閉じる
+	ofs.close();
+
+	return result;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXmlString( const std::string &xmlString )
+{
+	bool isSuccessful = false;
+
+	// 入力アーカイブの作成
+	std::istringstream iss( xmlString );
+
+	try{
+		boost::archive::xml_iarchive ia(iss);
+
+		// 文字列ストリームから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch(...){
+		// 失敗
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteXmlString( std::string &xmlString ) const
+{
+	// 出力アーカイブの作成
+	std::ostringstream oss;
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::xml_oarchive oa(oss);
+
+		// 文字列ストリームに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		echo( e.what() );
+	}
+	catch(...){
+		echo( "archive_exception以外の不明な例外" );
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	xmlString = oss.str();
+
+	return true;
+}
+
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryFile( const std::string &filePath, bool isShowExceptionMessage )
+{
+	// 入力アーカイブの作成
+	std::ifstream ifs( filePath.c_str(), std::ios::in | std::ios::binary );
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::binary_iarchive ia(ifs);
+
+		// ファイルから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	// 入力を閉じる
+	ifs.close();
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryFile( const std::string &filePath, bool isShowExceptionMessage ) const
+{
+	// 出力アーカイブの作成
+	std::ofstream ofs( filePath.c_str(), std::ios::out | std::ios::binary );
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::binary_oarchive oa(ofs);
+
+		// ファイルに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	// 出力を閉じる
+	ofs.close();
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadBinaryString( const std::string &binaryString )
+{
+	bool isSuccessful = false;
+
+	// 入力アーカイブの作成
+	std::istringstream iss( binaryString, std::ios::in | std::ios::binary );
+
+	try{
+		boost::archive::binary_iarchive ia(iss);
+
+		// 文字列ストリームから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		echo( e.what() );
+	}
+	catch(...){
+		echo( "archive_exception以外の不明な例外" );
+	}
+
+	return isSuccessful;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteBinaryString( std::string &binaryString ) const
+{
+	// 出力アーカイブの作成
+	std::ostringstream oss( "", std::ios::out | std::ios::binary );
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::binary_oarchive oa(oss);
+
+		// 文字列ストリームに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		echo( e.what() );
+	}
+	catch(...){
+		echo( "archive_exception以外の不明な例外" );
+	}
+
+	binaryString = oss.str();
+
+	return isSuccessful;
+}
+
+/*
+ビルドに時間がかかるので外しておく
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadText( const std::string &filePath, bool isShowExceptionMessage )
+{
+	// 入力アーカイブの作成
+	std::ifstream ifs( filePath.c_str() );
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::text_iarchive ia(ifs);
+
+		// ファイルから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	// 入力を閉じる
+	ifs.close();
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteText( const std::string &filePath, bool isShowExceptionMessage ) const
+{
+	// 出力アーカイブの作成
+	std::ofstream ofs( filePath.c_str() );
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::text_oarchive oa(ofs);
+
+		// ファイルに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		if( isShowExceptionMessage )
+		{
+			echo( e.what() );
+		}
+	}
+	catch(...){
+		if( isShowExceptionMessage )
+		{
+			echo( "archive_exception以外の不明な例外" );
+		}
+	}
+
+	// 出力を閉じる
+	ofs.close();
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadTextString( const std::string &textString )
+{
+	bool isSuccessful = false;
+
+	// 入力アーカイブの作成
+	std::istringstream iss( textString );
+
+	try{
+		boost::archive::text_iarchive ia(iss);
+
+		// 文字列ストリームから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch(...){
+		// 失敗
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::WriteTextString( std::string &textString ) const
+{
+	// 出力アーカイブの作成
+	std::ostringstream oss;
+
+	bool isSuccessful = false;
+	try{
+		boost::archive::text_oarchive oa(oss);
+
+		// 文字列ストリームに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception e )
+	{
+		echo( e.what() );
+	}
+	catch(...){
+		echo( "archive_exception以外の不明な例外" );
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	textString = oss.str();
+
+	return true;
+}
+
+template<class T_xml_schema> bool BoostSerializationSupport<T_xml_schema>::ReadXmlFromString( const std::string &textString )
+{
+	bool isSuccessful = false;
+
+	// 入力アーカイブの作成
+	std::istringstream iss( textString );
+
+	try{
+		boost::archive::xml_iarchive ia(iss);
+
+		// 文字列ストリームから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *(T_xml_schema *)this );
+
+		isSuccessful = true;
+	}
+	catch(...){
+		// 失敗
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+*/
+
+
+#include <logger.h>
+#include <Configuration.h>
+#include <abdev/ab_common/include/Lexical/Source.h>
+
+template class Jenga::Common::BoostSerializationSupport<LoggerSetting>;
+template class Jenga::Common::BoostSerializationSupport<Configuration>;
+template class Jenga::Common::BoostSerializationSupport<BasicSources>;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BreakPoint.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BreakPoint.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/BreakPoint.cpp	(revision 774)
@@ -0,0 +1,211 @@
+#include "stdafx.h"
+
+#include "../../BasicCompiler_Common/DebugSection.h"
+
+//////////////////////////
+// ブレークポイント
+//////////////////////////
+
+BreakPointManager *pobj_DBBreakPoint;
+
+BreakPointsPerFile::BreakPointsPerFile(const char *lpszFileName,int iLineNum){
+	this->filename = lpszFileName;
+
+	lines.clear();
+	lines.push_back( iLineNum );
+}
+void BreakPointsPerFile::add(int iLineNum){
+	lines.push_back( iLineNum );
+}
+void BreakPointsPerFile::remove( int iLineNum )
+{
+	for( int i=0; i<static_cast<int>(this->lines.size()); i++ )
+	{
+		if( iLineNum == this->lines[i] )
+		{
+			Jenga::Common::EraseVectorItem<std::vector<int>>( this->lines, i );
+			break;
+		}
+	}
+}
+
+void BreakPointsPerFile::update( char *nativeCodeBuffer, const SourceLines &sourceLines )
+{
+	int FileNum;
+	const IncludedFilesRelation *pIncludedFilesRelation = NULL;
+	const BasicSource *pNowSource = NULL;
+
+	extern BasicSources sourcesLinkRelationalObjectModule;
+	foreach( const BasicSource &source, sourcesLinkRelationalObjectModule )
+	{
+		pIncludedFilesRelation = &source.GetIncludedFilesRelation();
+
+		for(FileNum=0;FileNum<pIncludedFilesRelation->GetFileCounts();FileNum++)
+		{
+			if(lstrcmpi(pIncludedFilesRelation->GetFilePathFromFileNumber(FileNum).c_str(),this->filename.c_str())==0)
+			{
+				pNowSource = &source;
+				break;
+			}
+		}
+		if( FileNum == pIncludedFilesRelation->GetFileCounts() )
+		{
+			pIncludedFilesRelation = NULL;
+		}
+		else
+		{
+			break;
+		}
+	}
+
+	if( !pIncludedFilesRelation )
+	{
+		Jenga::Throw( "BreakPointsPerFile::update内で不正な処理" );
+		return;
+	}
+
+	int i;
+	for(i=0;;i++){
+		if( pIncludedFilesRelation->GetFileNumber( i ) == FileNum
+			|| pIncludedFilesRelation->GetFileNumber( i ) == -1 )
+		{
+			break;
+		}
+	}
+	if( pIncludedFilesRelation->GetFileNumber( i ) == -1 )
+	{
+		return;
+	}
+
+	int FileBaseLine;
+	FileBaseLine=i;
+
+	int i2,nCount=0;
+	for(i2=0;;i2++){
+		if( pIncludedFilesRelation->GetFileNumber( FileBaseLine+i2 ) == -1 )
+		{
+			//ソースコードの終端行
+			break;
+		}
+
+		if(i2==this->lines[nCount]){
+loop:
+			int tempCp = GetSourceCodeIndexFromLine( pNowSource->GetBuffer(), FileBaseLine+i2 );
+
+			int i3;
+			for( i3=0; i3<static_cast<int>(sourceLines.size()-1); i3++ )
+			{
+				if( sourceLines[i3].GetSourceCodePosition().GetPos() == tempCp )
+				{
+					break;
+				}
+			}
+			if( i3 == sourceLines.size() - 1 )
+			{
+				i2--;
+				goto loop;
+			}
+
+			nativeCodeBuffer[sourceLines[i3].GetNativeCodePos()] = (char)0xCC;
+
+			nCount++;
+			if( nCount >= static_cast<int>(this->lines.size()) )
+			{
+				break;
+			}
+		}
+	}
+}
+
+
+BreakPointManager::BreakPointManager()
+{
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,65535);
+
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+	lstrcat(temporary,"ab_breakpoint.tmp");
+
+	HANDLE hFile=CreateFile(
+		temporary,
+		GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile!=INVALID_HANDLE_VALUE)
+	{
+		DWORD dwAccBytes;
+		ReadFile(hFile,buffer,MAX_PATH,&dwAccBytes,NULL);
+		CloseHandle(hFile);
+		buffer[dwAccBytes]=0;
+	}
+	else
+	{
+		buffer[0]=0;
+	}
+
+	int i=0,i2;
+	char szFilePath[MAX_PATH];
+	while(buffer[i]){
+		//ファイルパス
+		i=GetOneParameter(buffer,i,szFilePath);
+		RemoveStringQuotes(szFilePath);
+
+		while(buffer[i]!='\n'&&buffer[i]!='\0'){
+			//行番号
+			char temporary[1024];
+			i=GetOneParameter(buffer,i,temporary);
+			i2=atoi(temporary);
+
+			insert(szFilePath,i2);
+		}
+
+		while(buffer[i]=='\n') i++;
+
+		if(buffer[i]=='\0') break;
+	}
+
+	HeapDefaultFree(buffer);
+}
+void BreakPointManager::insert(const char *lpszFileName,int iLineNum)
+{
+	BOOST_FOREACH( BreakPointsPerFile &breakpointsPerFile, breakpointsPerFiles )
+	{
+		if(lstrcmpi(breakpointsPerFile.filename.c_str(),lpszFileName)==0)
+		{
+			breakpointsPerFile.add( iLineNum );
+			return;
+		}
+	}
+
+	this->breakpointsPerFiles.push_back( BreakPointsPerFile( lpszFileName, iLineNum ) );
+}
+void BreakPointManager::remove(const char *lpszFileName,int iLineNum)
+{
+	for( int i=0; i<static_cast<int>(this->breakpointsPerFiles.size()); i++ )
+	{
+		BreakPointsPerFile *pBreakpointsPerFile = &breakpointsPerFiles[i];
+		if(lstrcmpi(pBreakpointsPerFile->filename.c_str(),lpszFileName)==0)
+		{
+			pBreakpointsPerFile->remove( iLineNum );
+			if( pBreakpointsPerFile->lines.empty() )
+			{
+				Jenga::Common::EraseVectorItem<BreakPointsPerFiles>( this->breakpointsPerFiles, i );
+			}
+			break;
+		}
+	}
+}
+
+char *BreakPointManager::update( char *nativeCodeBuffer, int SizeOf_CodeSection, const SourceLines &sourceLines )
+{
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,SizeOf_CodeSection);
+	memcpy(buffer,nativeCodeBuffer,SizeOf_CodeSection);
+
+	BOOST_FOREACH( BreakPointsPerFile &breakpointsPerFile, breakpointsPerFiles )
+	{
+		breakpointsPerFile.update( buffer, sourceLines );
+	}
+
+	return buffer;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CodeGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CodeGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CodeGenerator.cpp	(revision 774)
@@ -0,0 +1,3 @@
+#include "stdafx.h"
+
+int GlobalOpBufferSize;
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/CommonCodeGenerator.cpp	(revision 774)
@@ -0,0 +1,379 @@
+#include "stdafx.h"
+
+#include <CodeGenerator.h>
+
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+
+void CodeGenerator::PutWithSchedule( long l, Schedule::Type scheduleType )
+{
+	if( scheduleType == Schedule::CatchAddress )
+	{
+		const UserProc *pCurrentUserProc = compiler.IsGlobalAreaCompiling()
+			? UserProc::pGlobalProc
+			: &compiler.GetCompilingUserProc();
+
+		this->pNativeCode->PutCatchAddressSchedule( pCurrentUserProc, l );
+	}
+	else
+	{
+		this->pNativeCode->PutEx( l, scheduleType );
+	}
+}
+
+void CodeGenerator::ResolveExitSubSchedule()
+{
+	foreach( long exitSubCodePosition, exitSubCodePositions )
+	{
+		pNativeCode->Overwrite( exitSubCodePosition, (long)( pNativeCode->GetSize()-(exitSubCodePosition+sizeof(long)) ) );
+	}
+}
+
+void CodeGenerator::CheckUnresolveSchedule()
+{
+	if( pertialSchedules.size() > 0 )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+
+void CodeGenerator::opfix( const PertialSchedule *pPertialSchedule, _int64 newValue )
+{
+	bool isSuccessful = false;
+
+	PertialSchedules::iterator it = pertialSchedules.begin();
+	while( it != pertialSchedules.end() )
+	{
+		if( (*it) == pPertialSchedule )
+		{
+			if( pPertialSchedule->GetTypeSize() == sizeof(char) )
+			{
+				if( newValue < -128 || 127 < newValue )
+				{
+					// 範囲外
+					compiler.errorMessenger.OutputFatalError();
+				}
+
+				pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)newValue );
+			}
+			else if( pPertialSchedule->GetTypeSize() == sizeof(long) )
+			{
+				pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), static_cast<long>(newValue) );
+			}
+			else if( pPertialSchedule->GetTypeSize() == sizeof(_int64) )
+			{
+				pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), newValue );
+			}
+			else
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			it = pertialSchedules.erase( it );
+			delete pPertialSchedule;
+
+			isSuccessful = true;
+			break;
+		}
+		else
+		{
+			it++;
+		}
+	}
+
+	if( isSuccessful == false )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+
+void CodeGenerator::opfix_offset( const PertialSchedule *pPertialSchedule, long offset )
+{
+	bool isSuccessful = false;
+
+	PertialSchedules::iterator it = pertialSchedules.begin();
+	while( it != pertialSchedules.end() )
+	{
+		if( (*it) == pPertialSchedule )
+		{
+			if( pPertialSchedule->GetTypeSize() == sizeof(long) )
+			{
+				pNativeCode->Overwrite(
+					pPertialSchedule->GetCodePos(),
+					pNativeCode->GetLong(pPertialSchedule->GetCodePos()) + offset
+				);
+			}
+			else
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			it = pertialSchedules.erase( it );
+			delete pPertialSchedule;
+
+			isSuccessful = true;
+			break;
+		}
+		else
+		{
+			it++;
+		}
+	}
+
+	if( isSuccessful == false )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+
+
+// 分岐関連
+void CodeGenerator::opfix_JmpPertialSchedule( const PertialSchedule *pPertialSchedule )
+{
+	bool isSuccessful = false;
+
+	PertialSchedules::iterator it = pertialSchedules.begin();
+	while( it != pertialSchedules.end() )
+	{
+		if( (*it) == pPertialSchedule )
+		{
+			long newValue = pNativeCode->GetSize() - (pPertialSchedule->GetCodePos()+pPertialSchedule->GetTypeSize());
+
+			if( pPertialSchedule->GetTypeSize() == sizeof(char) )
+			{
+				if( newValue < -128 || 127 < newValue )
+				{
+					// 範囲外
+					compiler.errorMessenger.OutputFatalError();
+				}
+
+				pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), (char)newValue );
+			}
+			else if( pPertialSchedule->GetTypeSize() == sizeof(long) )
+			{
+				pNativeCode->Overwrite( pPertialSchedule->GetCodePos(), newValue );
+			}
+			else
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			it = pertialSchedules.erase( it );
+			delete pPertialSchedule;
+
+			isSuccessful = true;
+		}
+		else
+		{
+			it++;
+		}
+	}
+
+	if( isSuccessful == false )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+const PertialSchedule *CodeGenerator::__jmp_op_format( char opcode, long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	long beginCodePos = pNativeCode->GetSize();
+
+	if( opcode == (char)0xEB )
+	{
+		// jmp命令のとき
+		if( op_size == sizeof(char) )
+		{
+			pNativeCode->Put( (char)opcode );
+		}
+		else if( op_size == sizeof(long) )
+		{
+			pNativeCode->Put( (char)0xE9 );
+		}
+		else
+		{
+			compiler.errorMessenger.OutputFatalError();
+		}
+	}
+	else
+	{
+		if( op_size == sizeof(char) )
+		{
+			pNativeCode->Put( (char)((char)0x70 | opcode) );
+		}
+		else if( op_size == sizeof(long) )
+		{
+			pNativeCode->Put( (char)0x0F );
+			pNativeCode->Put( (char)((char)0x80 | opcode) );
+		}
+		else
+		{
+			compiler.errorMessenger.OutputFatalError();
+		}
+	}
+
+	const PertialSchedule *pPertialSchedule = NULL;
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), op_size ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+
+	if( isSelfOpcodeOffset )
+	{
+		// 自分自身の命令サイズを考慮する場合
+		offset -= ( pNativeCode->GetSize() - beginCodePos ) + op_size;
+	}
+
+	if( op_size == sizeof(char) )
+	{
+		pNativeCode->Put( (char)offset );
+	}
+	else if( op_size == sizeof(long) )
+	{
+		pNativeCode->Put( offset );
+	}
+	else
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_jle( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x0E, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jbe( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x06, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jge( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x0D, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jae( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x03, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jl( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x0C, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jb( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x02, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jg( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x0F, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_ja( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x07, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jne( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x05, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_je( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0x04, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+const PertialSchedule *CodeGenerator::op_jmp( long offset, int op_size, bool isPertialSchedule, bool isSelfOpcodeOffset )
+{
+	return __jmp_op_format( (char)0xEB, offset, op_size, isPertialSchedule, isSelfOpcodeOffset );
+}
+void CodeGenerator::op_jmp_continue()
+{
+	if( GetContinueCodePos() == -1 )
+	{
+		compiler.errorMessenger.Output(12,"Continue",cp);
+		return;
+	}
+	op_jmp( GetContinueCodePos() - pNativeCode->GetSize(), sizeof(long), false, true );
+}
+void CodeGenerator::op_jmp_exitsub()
+{
+	// オペコード
+	pNativeCode->Put( (char)0xE9 );
+
+	exitSubCodePositions.push_back( pNativeCode->GetSize() );
+
+	pNativeCode->Put( (long)0 );
+}
+void CodeGenerator::op_jmp_goto_schedule( const std::string &name, int lineNum, int sourceCodePos )
+{
+	// オペコード
+	pNativeCode->Put( (char)0xE9 );
+
+	const GotoLabelSchedule *pGotoLabelSchedule = NULL;
+	if( name.size() == 0 )
+	{
+		pGotoLabelSchedule = new GotoLabelSchedule( name, pNativeCode->GetSize(), sourceCodePos );
+	}
+	else
+	{
+		pGotoLabelSchedule = new GotoLabelSchedule( name, pNativeCode->GetSize(), sourceCodePos );
+	}
+	gotoLabelSchedules.push_back( pGotoLabelSchedule );
+
+	pertialSchedules.push_back( pGotoLabelSchedule );
+
+	pNativeCode->Put( (long)0 );
+}
+
+void CodeGenerator::op_AddNeedFreeTempStructure( int reg )
+{
+#ifdef _AMD64_
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		//mov rcx,reg
+		op_mov_RR( REG_RCX, reg );
+
+		//call _System_AddNeedFreeTempStructure
+		extern const UserProc *pSub_System_AddNeedFreeTempStructure;
+		op_call( pSub_System_AddNeedFreeTempStructure );
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+#else
+
+	//push useReg（引き続き利用するため、退避しておく）
+	compiler.codeGenerator.op_push( reg );
+
+	//push useReg
+	compiler.codeGenerator.op_push( reg );
+
+	//call _System_AddNeedFreeTempStructure
+	extern const UserProc *pSub_System_AddNeedFreeTempStructure;
+	compiler.codeGenerator.op_call( pSub_System_AddNeedFreeTempStructure );
+
+	//pop useReg（復元する）
+	compiler.codeGenerator.op_pop( reg );
+#endif
+
+	isNeedFreeTempStructureInCurrentStep = true;
+}
+void CodeGenerator::op_FreeTempStructure()
+{
+	if( !isNeedFreeTempStructureInCurrentStep )
+	{
+		// 解放の必要はない
+		return;
+	}
+
+	// call _System_FreeTempStructure
+	extern const UserProc *pSub_System_FreeTempStructure;
+	op_call( pSub_System_FreeTempStructure );
+
+	isNeedFreeTempStructureInCurrentStep = false;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Compiler.cpp	(revision 774)
@@ -0,0 +1,520 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+Compiler compiler;
+
+Compiler::Compiler()
+	: isBuildSuccessful( false )
+	, targetModuleType( ActiveBasic::Common::TargetModuleType::Exe )
+	, isDebug( false )
+	, isUnicode( false )
+	, isCore( false )
+	, currentRelationalObjectModuleIndexForSource( 0 )
+{
+	// 生成先のオブジェクトモジュールを登録
+	ObjectModule *pObjectModule = new ObjectModule();
+	staticLibraries.push_back( pObjectModule );
+	SelectObjectModule( pObjectModule );
+
+	namespaceSupporter.RegistAllNamespaceScopesCollection( &GetObjectModule().meta.GetNamespaces() );
+
+	Symbol::RegistNamespaceSupporter( &namespaceSupporter );
+}
+Compiler::~Compiler()
+{
+	foreach( ObjectModule *pStaticLibrary, staticLibraries )
+	{
+		delete pStaticLibrary;
+	}
+	staticLibraries.clear();
+}
+
+void Compiler::PreStaticLink( const ObjectModules &staticLibraries )
+{
+	foreach( const ObjectModule *pStaticLibrary, staticLibraries )
+	{
+		// 関連オブジェクトモジュールの名前リスト
+		this->GetObjectModule().relationalObjectModuleNames.push_back( pStaticLibrary->GetName() );
+	}
+}
+void Compiler::StaticLink( ObjectModules &staticLibraries )
+{
+	foreach( ObjectModule *pStaticLibrary, staticLibraries )
+	{
+		if( &this->GetObjectModule() == pStaticLibrary )
+		{
+			// 自分自身の場合はリンクしない
+			continue;
+		}
+
+		// メタ情報
+		this->GetObjectModule().StaticLink( *pStaticLibrary, this->IsSll() );
+	}
+}
+
+const std::string &Compiler::GetGlobalAreaProcName() const
+{
+	static std::string globalAreaProcName;
+
+	if( globalAreaProcName.empty() )
+	{
+		// 初期化
+		_ASSERTE( !this->GetModuleName().empty() );
+
+		std::string originalName = this->GetModuleName();
+
+		// モジュール名がシンボル名として使えない場合があるので、16進数文字列に変換する
+		char temporary[VN_SIZE*2] = "";
+		for( int i=0; i<static_cast<int>(originalName.size()); i++ )
+		{
+			sprintf( temporary + strlen(temporary), "%2x", originalName[i] );
+		}
+
+		globalAreaProcName = (std::string)"_GlobalArea_" + temporary;
+	}
+
+	return globalAreaProcName;
+}
+
+int Compiler::AddStringToDataTable( const std::string &text )
+{
+	if( this->IsUnicode() )
+	{
+		return this->GetObjectModule().dataTable.AddWString( Jenga::Common::ToWString( text ) );
+	}
+	else
+	{
+		return this->GetObjectModule().dataTable.AddString( text );
+	}
+}
+
+ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToGenericTypeEx( const std::string &typeName, Type &type )
+{
+	// ジェネリッククラスをインスタンス化した型の場合
+	int i = 0;
+	char className[VN_SIZE];
+	GetIdentifierToken( className, typeName.c_str(), i );
+
+	// ジェネリクスクラスを取得
+	const CClass *pGenericClass = this->GetObjectModule().meta.FindClassSupportedTypeDef( 
+		LexicalAnalyzer::FullNameToSymbol( className )
+	);
+
+	if( !pGenericClass )
+	{
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundGenericClass;
+	}
+
+	if( typeName[i] != '<' )
+	{
+		Jenga::Throw( "StringToType内でジェネリクス構文の解析に失敗" );
+	}
+
+	GenericTypes genericTypes;
+	bool isValueType = false;
+	while( true )
+	{
+		i++;
+
+		char typeParameterStr[VN_SIZE];
+		GetIdentifierToken( typeParameterStr, typeName.c_str(), i );
+
+		// 型パラメータの型情報を取得
+		Type typeParameterType;
+		StringToType( typeParameterStr, typeParameterType );
+
+		if( this->IsCompilingClass() )
+		{
+			if( this->pCompilingClass->IsExpanded() && typeParameterType.IsTypeParameter() )
+			{
+				// 現在コンパイル中のクラスがテンプレート展開済みのクラスで、
+				// 尚且つターゲットとなる型が型パラメータだったとき
+
+				// テンプレート展開情報を用いて型解決を行う
+				this->pCompilingClass->ResolveExpandedClassActualTypeParameter( typeParameterType );
+			}
+		}
+
+		genericTypes.push_back( GenericType( "(non support)", typeParameterType ) );
+
+		if( typeParameterType.IsValueType() )
+		{
+			// 値型の場合
+			isValueType = true;
+		}
+
+		if( typeName[i] != ',' )
+		{
+			break;
+		}
+	}
+
+	// 基本型をセット
+	type.SetBasicType( DEF_OBJECT );
+
+	if( isValueType )
+	{
+		// 型パラメータに値型が指定された場合
+
+		// 仮型パラメータを実型パラメータに変換
+		Types actualTypes;
+		foreach( const GenericType &genericType, genericTypes )
+		{
+			actualTypes.push_back( genericType.GetType() );
+		}
+
+		// テンプレートとしてクラスを展開する
+		const CClass *pExpandedClass = LexicalAnalyzer::TemplateExpand( *const_cast<CClass *>(pGenericClass), actualTypes );
+
+		if( pExpandedClass )
+		{
+			// 拡張情報をセット
+			type.SetClassPtr( pExpandedClass );
+		}
+		else
+		{
+			// TODO: 消す
+			goto Generic;
+		}
+	}
+	else
+	{
+Generic:
+		// 型パラメータにクラス型が指定された場合
+
+		// ジェネリック クラスとして利用する
+
+		// 拡張情報をセット
+		type.SetClassPtr( pGenericClass );
+		type.SetActualGenericTypes( genericTypes );
+	}
+
+	return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+}
+ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType Compiler::StringToTypeEx( const std::string &typeName, Type &type, bool isResolveGenerics )
+{
+	type.SetIndex( -1 );
+
+
+	/////////////////////////////////////////////////////////
+	// ☆★☆ ジェネリクスサポート ☆★☆
+
+	if( strstr( typeName.c_str(), "<" ) )
+	{
+		return StringToGenericTypeEx( typeName, type );
+	}
+
+	//
+	/////////////////////////////////////////////////////////
+
+
+	if( typeName[0] == '*' ){
+		if( typeName.size() >= 3
+			&& typeName[1] == 1 && ( typeName[2] == ESC_FUNCTION || typeName[2] == ESC_SUB ) )
+		{
+			// 関数ポインタを追加する
+			{
+				DWORD dwProcType = (DWORD)typeName[2];
+				const std::string &paramStr = typeName.substr( 3 );
+
+				Procedure::Kind kind = ( dwProcType == ESC_FUNCTION )
+					? Procedure::Function
+					: Procedure::Sub;
+
+				ProcPointer *pProcPointer = new ProcPointer( kind );
+
+				//buffer[0]は'('となっている
+				extern int cp;
+				ActiveBasic::Compiler::LexicalAnalyzer::SetParamsAndReturnType( pProcPointer, paramStr.c_str(), false, cp );
+
+				this->GetObjectModule().meta.GetProcPointers().push_back( pProcPointer );
+			}
+
+			//関数ポインタ（*Function）
+			type.SetBasicType( DEF_PTR_PROC );
+			type.SetIndex( this->GetObjectModule().meta.GetProcPointers().size() - 1 );
+			return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+		}
+
+		const std::string &nextTypeName = typeName.substr( 1 );
+
+		ActiveBasic::Compiler::Error::StringToTypeErrorCode::EnumType result = StringToTypeEx( nextTypeName, type, isResolveGenerics );
+		if( result != ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful )
+		{
+			return result;
+		}
+
+		type.PtrLevelUp();
+
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+	{
+		int basicType;
+		if( Type::StringToBasicType( typeName, basicType ) )
+		{
+			// 基本型だったとき
+			type.SetBasicType( basicType );
+			return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+		}
+	}
+
+	// Object型だったとき
+	if( typeName == "Object" )
+	{
+		type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetObjectClassPtr() );
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+	// String型だったとき
+	if( typeName == "String" )
+	{
+		type.SetType( DEF_OBJECT, this->GetObjectModule().meta.GetClasses().GetStringClassPtr() );
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+
+	////////////////////
+	// TypeDefされた型
+	////////////////////
+	const TypeDef *pTypeDef = this->GetObjectModule().meta.GetTypeDefs().Find( LexicalAnalyzer::FullNameToSymbol( typeName ) );
+	if( pTypeDef )
+	{
+		type = pTypeDef->GetBaseType();
+
+		if( type.IsObject() )
+		{
+			if( isResolveGenerics && type.GetClass().IsGeneric() && !type.HasActualGenericType() )
+			{
+				// ジェネリッククラスの場合
+				trace( "型解決されていない" );
+				return ActiveBasic::Compiler::Error::StringToTypeErrorCode::FailedResolveGenericType;
+			}
+		}
+
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+	//クラス
+	const CClass *pobj_c = this->GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( typeName ) );
+	if(pobj_c)
+	{
+		if( isResolveGenerics && pobj_c->IsGeneric() )
+		{
+			// ジェネリッククラスの場合
+			trace( "型解決されていない" );
+			return ActiveBasic::Compiler::Error::StringToTypeErrorCode::FailedResolveGenericType;
+		}
+
+		if( pobj_c->IsStructure() )
+		{
+			type.SetBasicType( DEF_STRUCT );
+		}
+		else
+		{
+			type.SetBasicType( DEF_OBJECT );
+		}
+		type.SetClassPtr( pobj_c );
+		return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+	}
+
+
+	/////////////////////////////////////////////////////////
+	// ☆★☆ ジェネリクスサポート ☆★☆
+
+	// 型パラメータ
+	if( this->IsCompilingClass() )
+	{
+		// クラスに属するメソッドをコンパイルしているとき
+		int formalTypeIndex = this->GetCompilingClass().GetFormalGenericTypeParameterIndex( typeName );
+		if( formalTypeIndex != -1 )
+		{
+			// コンパイル中クラスにおけるジェネリクス用の型パラメータのとき
+			type.SetBasicType( DEF_TYPE_PARAMETER );
+			type.SetClassPtr( &this->GetCompilingClass().GetFormalGenericTypes()[formalTypeIndex].GetType().GetClass() );
+			type.SetFormalTypeName( typeName );
+			type.SetFormalTypeIndex( formalTypeIndex );
+			return ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful;
+		}
+	}
+
+	//
+	/////////////////////////////////////////////////////////
+
+	return ActiveBasic::Compiler::Error::StringToTypeErrorCode::NotfoundType;
+}
+
+bool Compiler::StringToType( const std::string &typeName, Type &type )
+{
+	return ( StringToTypeEx( typeName, type, false ) == ActiveBasic::Compiler::Error::StringToTypeErrorCode::Successful );
+}
+
+const std::string Compiler::TypeToString( const Type &type )
+{
+	if( PTR_LEVEL( type.GetBasicType() ) ){
+		//ポインタレベルが1以上の場合
+		Type tempType( type );
+		tempType.PtrLevelDown();
+
+		return '*' + TypeToString( tempType );
+	}
+	else if( type.IsObject() || type.IsStruct() )
+	{
+		//オブジェクトまたは構造体
+
+		if( !( type.GetIndex() == 0 || type.GetIndex() == -1 ) )
+		{
+			std::string result = type.GetClass().GetName();
+			if( type.GetClass().GetNamespaceScopes().size() >= 1 )
+			{
+				result = type.GetClass().GetNamespaceScopes().ToString()
+					+ "."
+					+ result;
+			}
+
+			if( type.GetClass().IsExpanded() )
+			{
+				// テンプレート展開済みのクラスの場合
+				std::string actualGenericTypesName;
+				foreach( const Type &typeParameter, type.GetClass().expandedClassActualTypeParameters )
+				{
+					if( actualGenericTypesName.size() )
+					{
+						actualGenericTypesName += ',';
+					}
+					actualGenericTypesName += typeParameter.ToString();
+				}
+
+				result += '<' + actualGenericTypesName + '>';
+			}
+
+			return result;
+		}
+	}
+	else if( type.IsProcPtr() ){
+		if( type.GetIndex() == 0 || type.GetIndex() == -1 ){
+			return "VoidPtr";
+		}
+		else{
+			if( this->GetObjectModule().meta.GetProcPointers()[type.GetIndex()]->ReturnType().IsNull() ){
+				return "*Sub";
+			}
+			return "*Function";
+		}
+	}
+	else{
+		// 基本型
+		const char *lpszTypeName = Type::BasicTypeToCharPtr( type );
+		if( lpszTypeName )
+		{
+			return (const std::string)lpszTypeName;
+		}
+	}
+
+	compiler.errorMessenger.Output(1, NULL, cp);
+
+	return (std::string)"(null)";
+}
+
+int Compiler::SizeOf( const Type &type )
+{
+	Type tempType( type );
+	if( this->IsCompilingClass() )
+	{
+		if( this->pCompilingClass->IsExpanded() && tempType.IsTypeParameter() )
+		{
+			// 現在コンパイル中のクラスがテンプレート展開済みのクラスで、
+			// 尚且つターゲットとなる型が型パラメータだったとき
+
+			// テンプレート展開情報を用いて型解決を行う
+			this->pCompilingClass->ResolveExpandedClassActualTypeParameter( tempType );
+		}
+	}
+	return tempType.GetSize();
+}
+
+void Compiler::ClearCompilingUserProcAndClass()
+{
+	this->pCompilingUserProc = NULL;
+	this->pCompilingClass = NULL;
+}
+
+void Compiler::SetCompilingClass( const CClass *pClass )
+{
+	this->pCompilingClass = pClass;
+}
+
+void Compiler::SetCompilingUserProc( const UserProc *pUserProc )
+{
+	this->pCompilingUserProc = pUserProc;
+
+	this->SetCompilingClass( pUserProc->GetParentClassPtr() );
+}
+
+void Compiler::StartGlobalAreaCompile()
+{
+	ClearCompilingUserProcAndClass();
+}
+
+void Compiler::StartProcedureCompile( const UserProc *pUserProc )
+{
+	//コンパイル中の関数
+	this->SetCompilingUserProc( pUserProc );
+
+	if( pUserProc->HasParentClass() )
+	{
+		// クラスの使用チェック
+		pUserProc->GetParentClass().Using();
+	}
+
+	// コンパイル中の関数が属する名前空間
+	this->GetNamespaceSupporter().SetLivingNamespaceScopes( pUserProc->GetNamespaceScopes() );
+
+	// コンパイル中の関数でImportsされている名前空間
+	this->GetNamespaceSupporter().SetImportedNamespaces( pUserProc->GetImportedNamespaces() );
+
+	// コード生成対象を選択
+	this->codeGenerator.Select( (const_cast<UserProc *>(pUserProc))->GetNativeCode() );
+}
+void Compiler::FinishProcedureCompile()
+{
+	this->pCompilingUserProc = NULL;
+	this->pCompilingClass = NULL;
+}
+
+bool Compiler::IsGlobalAreaCompiling()
+{
+	if( pCompilingUserProc == NULL )
+	{
+		return true;
+	}
+	return ( pCompilingUserProc->GetName() == this->GetGlobalAreaProcName() );
+}
+bool Compiler::IsLocalAreaCompiling()
+{
+	return !IsGlobalAreaCompiling();
+}
+const UserProc &Compiler::GetCompilingUserProc()
+{
+	if( pCompilingUserProc == NULL )
+	{
+		_ASSERTE( false );
+		throw;
+	}
+	return *pCompilingUserProc;
+}
+
+bool Compiler::IsCompilingClass()
+{
+	return ( pCompilingClass != NULL );
+}
+const CClass &Compiler::GetCompilingClass()
+{
+	if( this->IsCompilingClass() )
+	{
+		return *pCompilingClass;
+	}
+
+	throw;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/DataTableGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/DataTableGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/DataTableGenerator.cpp	(revision 774)
@@ -0,0 +1,291 @@
+#include "stdafx.h"
+#include <boost/scoped_array.hpp>
+
+using namespace ActiveBasic::Compiler;
+
+int DataTableGenerator::lastMadeConstObjectDataTableOffset = 0;
+
+bool DataTableGenerator::MakeConstObjectToProcessStaticBuffer( DataTable &dataTable, const CClass &objClass, const Jenga::Common::Strings &initMemberValues, int &dataTableOffset )
+{
+	// クラスに必要なバッファサイズを取得
+	int size = objClass.GetSize();
+
+	// クラスのバッファイメージを作成
+	BYTE *buffer = (BYTE *)calloc( size, 1 );
+
+	// クラスのバッファイメージをデータ領域へ追加
+	dataTableOffset = dataTable.AddBinary( buffer, size );
+
+	DataTableGenerator::lastMadeConstObjectDataTableOffset = dataTableOffset;
+
+	// com_vtblスケジュール
+	dataTable.schedules.push_back( Schedule( Schedule::ComVtbl, &objClass, dataTableOffset ) );
+
+	// vtblスケジュール
+	dataTable.schedules.push_back( Schedule( Schedule::Vtbl, &objClass, dataTableOffset + PTR_SIZE ) );
+
+	// TypeInfoスケジュール
+	int offsetForTypeInfo = objClass.GetMemberOffset( "_system_object_member_typeInfo" );
+	//dataTable.schedules.push_back( Schedule( Schedule::TypeInfo, &objClass, dataTableOffset + offsetForTypeInfo ) );
+
+	foreach( const std::string &initMemberValue, initMemberValues )
+	{
+		int i = 0;
+
+		// メンバ名
+		char memberName[VN_SIZE];
+		for( i=0; ; i++ )
+		{
+			if( initMemberValue[i] == '\0' )
+			{
+				// エラー
+				compiler.errorMessenger.OutputFatalError();
+				return false;
+			}
+			if( initMemberValue[i] == '=' )
+			{
+				memberName[i] = 0;
+				break;
+			}
+			memberName[i] = initMemberValue[i];
+		}
+
+		// 初期値
+		const char *initValue = initMemberValue.c_str() + i + 1;
+
+		// メンバを取得
+		const Member *member = objClass.FindDynamicMember( memberName );
+
+		// メンバオフセットを取得
+		int memberOffset = objClass.GetMemberOffset( member->GetName().c_str() );
+
+		if( member->GetType().IsPointer() && initValue[0] == '[' )
+		{
+			// ポインタ型でバッファ指定のとき
+			int memberDataTableOffset;
+			if( !MakeLiteralArrayBuffer( dataTable, initValue, member->GetType(),memberDataTableOffset ) )
+			{
+				return false;
+			}
+
+			dataTable.Overwrite( dataTableOffset + memberOffset, memberDataTableOffset );
+			dataTable.schedules.push_back( Schedule( Schedule::DataTable, dataTableOffset + memberOffset ) );
+		}
+		else if( member->GetType().IsWhole() )
+		{
+			// 整数
+			Type resultType;
+			_int64 i64data;
+			if( !StaticCalculation( true, initValue, member->GetType().GetBasicType(), &i64data, resultType ) ){
+				return false;
+			}
+
+			dataTable.Overwrite( dataTableOffset + memberOffset, static_cast<long>(i64data) );
+		}
+		else if( member->GetType().IsStringClass() )
+		{
+			// 文字列型
+			char temporary[VN_SIZE];
+			lstrcpy( temporary, initValue );
+			RemoveStringQuotes( temporary );
+			int memberDataTableOffset = MakeConstStringObjectToProcessStaticBuffer( dataTable, temporary );
+			dataTable.Overwrite( dataTableOffset + memberOffset, memberDataTableOffset );
+			dataTable.schedules.push_back( Schedule( Schedule::DataTable, dataTableOffset + memberOffset ) );
+		}
+	}
+
+	return true;
+}
+bool DataTableGenerator::MakeConstObjectToProcessStaticBuffer( DataTable &dataTable, const char *expression, Type &resultType, int &dataTableOffset )
+{
+	char CreateParameter[VN_SIZE];
+	int i,i2;
+
+	i=0;
+
+	// クラス名を取得
+	char typeName[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(expression[i]=='['){
+			typeName[i2]=0;
+
+			// メンバの初期値を取得
+			i2=GetStringInBracket(CreateParameter,expression+i);
+			RemoveStringBracket(CreateParameter);
+			i+=i2;
+			if(expression[i]!='\0'){
+				compiler.errorMessenger.Output(42,NULL,cp);
+				return false;
+			}
+			break;
+		}
+		typeName[i2]=expression[i];
+		if(expression[i]=='\0'){
+			CreateParameter[0]=0;
+			break;
+		}
+	}
+
+	// パラメータを取得
+	Jenga::Common::Strings initMemberValues;
+	SplitParameter( CreateParameter, initMemberValues );
+
+	if( !compiler.StringToType( typeName, resultType ) ){
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return false;
+	}
+
+	if( !resultType.IsObject() ){
+		////////////////////////
+		// 通常のデータ型の場合
+		////////////////////////
+
+		compiler.errorMessenger.Output(121,NULL,cp);
+		return false;
+	}
+
+	return MakeConstObjectToProcessStaticBuffer( dataTable, resultType.GetClass(), initMemberValues, dataTableOffset );
+}
+
+namespace
+{
+
+//仕様通りのStringオブジェクトにするため、strには\0終端の文字列を渡すこと。
+int MakeConstStringObjectToProcessStaticBufferImpl( DataTable &dataTable, const void *str, int len, int charSize )
+{
+	const CClass &strClass = *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+
+	// クラスに必要なバッファサイズを取得
+	int size = strClass.GetSize();
+
+	// メンバ位置を取得
+	int offsetForTypeInfo = strClass.GetMemberOffset( "_system_object_member_typeInfo" );
+	int offsetForLength = strClass.GetMemberOffset( "m_Length" );
+	int offsetForChars = strClass.GetMemberOffset( "Chars" );
+
+	// 現在のデータ領域のヘッダ位置を取得
+	int headOffset = dataTable.GetSize();
+
+	// クラスのバッファイメージを作成
+	boost::scoped_array<BYTE> buffer(new BYTE[size]);
+	*(long *)&buffer[offsetForLength] = len;
+	*(LONG_PTR *)&buffer[offsetForChars] = headOffset + size;
+
+	// クラスのバッファイメージをデータ領域へ追加
+	int dataTableOffset = dataTable.AddBinary( &buffer[0], size );
+
+	// スケジューリング
+	dataTable.schedules.push_back( Schedule( Schedule::ComVtbl, &strClass, headOffset ) );
+	dataTable.schedules.push_back( Schedule( Schedule::Vtbl, &strClass, headOffset + PTR_SIZE ) );
+	dataTable.schedules.push_back( Schedule( Schedule::TypeInfo, &strClass, headOffset + offsetForTypeInfo ) );
+	dataTable.schedules.push_back( Schedule( Schedule::DataTable, headOffset + offsetForChars ) );
+
+	// 文字列バッファをデータ領域へ追加
+	dataTable.AddBinary( str, (len + 1) * charSize );
+
+	return dataTableOffset;
+}
+
+}
+
+int DataTableGenerator::MakeConstStringObjectToProcessStaticBuffer( DataTable &dataTable, const char *str )
+{
+	if ( compiler.IsUnicode() )
+	{
+		std::wstring ws = Jenga::Common::ToWString( str );
+		return MakeConstStringObjectToProcessStaticBufferImpl(
+			dataTable, ws.c_str(), static_cast<int>(ws.size()), sizeof (wchar_t) );
+	}
+	else
+	{
+		int len = (int)strlen( str );
+		return MakeConstStringObjectToProcessStaticBufferImpl( dataTable, str, len, sizeof (char) );
+	}
+}
+
+bool DataTableGenerator::MakeLiteralArrayBuffer( DataTable &dataTable, const char *expression, const Type &baseType, int &dataTableOffset )
+{
+	if( !baseType.IsPointer() ){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return false;
+	}
+	Type tempBaseType( baseType );
+	tempBaseType.PtrLevelDown();
+
+	char *buffer = (char *)malloc( lstrlen( expression ) + 1 );
+	lstrcpy( buffer, expression );
+	RemoveStringBracket( buffer );
+
+	Jenga::Common::Strings parameters;
+	SplitParameter( buffer, parameters );
+
+	// アラインメント
+	dataTable.AddAlignment( tempBaseType.GetSize() );
+
+	// データテーブルに空間を確保
+	dataTableOffset = dataTable.AddSpace( static_cast<int>(tempBaseType.GetSize() * parameters.size()) );
+
+	bool isSuccessful = true;
+	int i = 0;
+	foreach( const std::string &paramStr, parameters )
+	{
+		if( paramStr.size() == 0 )
+		{
+			throw;
+		}
+		if( paramStr[0] == '\"' )
+		{
+			// 文字列
+			std::string tempParamStr = paramStr;
+			if( !RemoveStringQuotes( tempParamStr ) )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			// 文字列を追加
+			_int64 strOffset;
+			if( tempBaseType.IsStringClass() )
+			{
+				// Stringクラス
+				strOffset = MakeConstStringObjectToProcessStaticBuffer( dataTable, tempParamStr.c_str() );
+			}
+			else
+			{
+				// Charポインタ
+				strOffset = compiler.AddStringToDataTable( tempParamStr );
+			}
+
+			// ポインタ値を上書き
+			int tempOffset = dataTableOffset + i * tempBaseType.GetSize();
+			dataTable.OverwriteBinary( tempOffset, &strOffset, tempBaseType.GetSize() );
+
+			// DataTableスケジュール
+			dataTable.schedules.push_back( Schedule( Schedule::DataTable, tempOffset  ) );
+		}
+		else
+		{
+			// 数値
+			Type resultType;
+			_int64 i64data;
+			if( !StaticCalculation( true, paramStr.c_str(), tempBaseType.GetBasicType(), &i64data, resultType ) ){
+				isSuccessful = false;
+				break;
+			}
+			if( !resultType.IsWhole() ){
+				// TODO: 実数に未対応
+				compiler.errorMessenger.OutputFatalError();
+				isSuccessful = false;
+				break;
+			}
+
+			// 上書き
+			dataTable.OverwriteBinary( dataTableOffset + i * tempBaseType.GetSize(), &i64data, tempBaseType.GetSize() );
+		}
+
+		i++;
+	}
+
+	free( buffer );
+
+	return isSuccessful;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Exception.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Exception.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Exception.cpp	(revision 774)
@@ -0,0 +1,452 @@
+#include "stdafx.h"
+
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+namespace Exception{
+
+class CatchScope
+{
+	Type paramType;
+	long codePos;
+public:
+	CatchScope( const Type &paramType, long codePos )
+		: paramType( paramType )
+		, codePos( codePos )
+	{
+	}
+	~CatchScope()
+	{
+	}
+
+	const Type &GetParamType() const
+	{
+		return paramType;
+	}
+	long GetCodePos() const
+	{
+		return codePos;
+	}
+};
+typedef std::vector<CatchScope> CatchScopes;
+
+class TryScope
+{
+	int sourceCodePos;
+	bool isDefinedFinally;
+
+	CatchScopes catchScopes;
+
+	std::vector<const PertialSchedule *> finallySchedules;
+	void JmpFinally()
+	{
+		finallySchedules.push_back(
+			compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+		);
+	}
+	void ResolveJmpFinally()
+	{
+		foreach( const PertialSchedule *pPertialSchedule, finallySchedules )
+		{
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pPertialSchedule );
+		}
+	}
+
+	const PertialSchedule *pPertialScheduleForCatchAddress;
+	const PertialSchedule *pPertialScheduleForFinallyAddress;
+
+public:
+	TryScope( int sourceCodePos )
+		: sourceCodePos( sourceCodePos )
+		, isDefinedFinally( false )
+	{
+	}
+	~TryScope()
+	{
+	}
+
+	int GetSourceCodePos() const
+	{
+		return sourceCodePos;
+	}
+	const CatchScopes &GetCatchScopes() const
+	{
+		return catchScopes;
+	}
+	bool IsCatched() const
+	{
+		return ( catchScopes.size() != 0 );
+	}
+	bool IsDefinedFinally() const
+	{
+		return isDefinedFinally;
+	}
+
+	void RegistPertialScheduleForCatchAddress( const PertialSchedule *pPertialScheduleForCatchAddress )
+	{
+		this->pPertialScheduleForCatchAddress = pPertialScheduleForCatchAddress;
+	}
+	const PertialSchedule *GetPertialScheduleForCatchAddress() const
+	{
+		return pPertialScheduleForCatchAddress;
+	}
+	void RegistPertialScheduleForFinallyAddress( const PertialSchedule *pPertialScheduleForFinallyAddress )
+	{
+		this->pPertialScheduleForFinallyAddress = pPertialScheduleForFinallyAddress;
+	}
+	const PertialSchedule *GetPertialScheduleForFinallyAddress() const
+	{
+		return pPertialScheduleForFinallyAddress;
+	}
+	
+	
+
+	void Try()
+	{
+		// レキシカルスコープをレベルアップ
+		compiler.codeGenerator.lexicalScopes.Start(
+			compiler.codeGenerator.GetNativeCodeSize(),
+			LexicalScope::SCOPE_TRY
+		);
+	}
+
+	void Catch( Type &paramType )
+	{
+		if( isDefinedFinally )
+		{
+			compiler.errorMessenger.Output(71,NULL,cp);
+			return;
+		}
+
+		if( catchScopes.size() )
+		{
+			// 既に1回以上のCatchが存在するとき
+
+			// レキシカルスコープをレベルダウン
+			compiler.codeGenerator.lexicalScopes.End();
+		}
+
+		JmpFinally();
+
+		catchScopes.push_back( CatchScope( paramType, compiler.codeGenerator.GetNativeCodeSize() ) );
+
+		// レキシカルスコープをレベルアップ
+		compiler.codeGenerator.lexicalScopes.Start(
+			compiler.codeGenerator.GetNativeCodeSize(),
+			LexicalScope::SCOPE_CATCH
+		);
+	}
+	void Finally()
+	{
+		if( isDefinedFinally )
+		{
+			compiler.errorMessenger.Output(70,NULL,cp);
+			return;
+		}
+
+		if( catchScopes.size() )
+		{
+			// 既に1回以上のCatchが存在するとき
+
+			// レキシカルスコープをレベルダウン
+			compiler.codeGenerator.lexicalScopes.End();
+		}
+
+		isDefinedFinally = true;
+
+		ResolveJmpFinally();
+
+		// レキシカルスコープをレベルアップ
+		compiler.codeGenerator.lexicalScopes.Start(
+			compiler.codeGenerator.GetNativeCodeSize(),
+			LexicalScope::SCOPE_FINALLY
+		);
+	}
+
+	void EndTry()
+	{
+		if( !isDefinedFinally )
+		{
+			compiler.errorMessenger.OutputFatalError();
+		}
+
+		if( catchScopes.size() || isDefinedFinally )
+		{
+			// 既に1回以上のCatch、またはFinallyが存在するとき
+
+			// レキシカルスコープをレベルダウン
+			compiler.codeGenerator.lexicalScopes.End();
+		}
+
+		// レキシカルスコープをレベルダウン
+		compiler.codeGenerator.lexicalScopes.End();
+	}
+
+	int GenerateCatchTable()
+	{
+		int size = static_cast<int>(( (catchScopes.size()+1)*2 ) * sizeof(LONG_PTR));
+		BYTE *buffer = (BYTE *)calloc( size, 1 );
+
+		int pos = 0;
+		foreach( const CatchScope &catchScope, catchScopes )
+		{
+			// パラメータのクラス名
+			char paramName[VN_SIZE] = "";
+			if( catchScope.GetParamType().IsObject() )
+			{
+				lstrcpy( paramName, catchScope.GetParamType().GetClass().GetFullName().c_str() );
+			}
+			int paramNameDataTableOffset = compiler.AddStringToDataTable( paramName );
+			*((LONG_PTR *)(buffer+pos)) = paramNameDataTableOffset;
+			pos += sizeof(LONG_PTR);
+
+			// Catchアドレス
+			*((LONG_PTR *)(buffer+pos)) = catchScope.GetCodePos();
+			pos += sizeof(LONG_PTR);
+		}
+
+		int dataTableOffset = compiler.GetObjectModule().dataTable.AddBinary( buffer, size );
+
+		free( buffer );
+
+		pos = 0;
+		foreach( const CatchScope &catchScope, catchScopes )
+		{
+			// パラメータのクラス名
+			compiler.GetObjectModule().dataTable.schedules.push_back( Schedule( Schedule::DataTable, dataTableOffset + pos ) );
+			pos += sizeof(LONG_PTR);
+
+			// Catchアドレス
+			const UserProc *pUserProc = &compiler.GetCompilingUserProc();
+			if( compiler.IsGlobalAreaCompiling() )
+			{
+				pUserProc = UserProc::pGlobalProc;
+			}
+			compiler.GetObjectModule().dataTable.schedules.push_back(
+				Schedule( Schedule::CatchAddress, pUserProc, dataTableOffset + pos )
+			);
+			pos += sizeof(LONG_PTR);
+		}
+
+		return dataTableOffset;
+	}
+};
+typedef std::vector<TryScope> TryScopes;
+
+TryScopes tryScopes;
+
+void TryCommand()
+{
+	tryScopes.push_back( TryScope( cp ) );
+	tryScopes.back().Try();
+
+	int backCp = cp;
+
+	char temporary[1024];
+	lstrcpy( temporary, "ExceptionService.BeginTryScope( _System_GetNowScopeCatchAddresses() As VoidPtr, _System_GetNowScopeFinallyAddresses() As VoidPtr, _System_GetBp() As LONG_PTR, _System_GetSp() As LONG_PTR )" );
+	MakeMiddleCode( temporary );
+	ChangeOpcode( temporary );
+
+	cp = backCp;
+}
+void CatchCommand( const char *parameter )
+{
+	if( tryScopes.size() == 0 )
+	{
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	char varName[VN_SIZE];
+	Type paramType;
+	if( parameter[0] )
+	{
+		char typeName[VN_SIZE];
+		SplitSyntacticForAs( parameter, varName, typeName );
+		if( !typeName[0] )
+		{
+			compiler.errorMessenger.Output(72,NULL,cp);
+		}
+		else
+		{
+			if( !compiler.StringToType( typeName, paramType ) )
+			{
+				compiler.errorMessenger.Output(74,typeName,cp);
+			}
+			else
+			{
+				if( !paramType.IsObject() )
+				{
+					compiler.errorMessenger.Output(73,typeName,cp);
+				}
+			}
+		}
+	}
+
+	tryScopes.back().Catch( paramType );
+
+	int backCp = cp;
+
+	char temporary[1024];
+	if( paramType.IsObject() )
+	{
+		sprintf( temporary, "Dim %s = System.Threading.Thread.CurrentThread().__GetThrowintParamObject() As %s", varName, paramType.GetClass().GetFullName().c_str() );
+		MakeMiddleCode( temporary );
+		ChangeOpcode( temporary );
+	}
+	lstrcpy( temporary, "System.Threading.Thread.CurrentThread().__Catched()" );
+	MakeMiddleCode( temporary );
+	ChangeOpcode( temporary );
+
+	cp = backCp;
+}
+void FinallyCommand()
+{
+	tryScopes.back().Finally();
+
+	int backCp = cp;
+
+	char temporary[1024];
+	lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->FinishFinally()" );
+	MakeMiddleCode( temporary );
+	ChangeOpcode( temporary );
+
+	cp = backCp;
+
+	//Tryスコープに入るときに引き渡されるパラメータ値を解決
+	compiler.codeGenerator.opfix( tryScopes.back().GetPertialScheduleForFinallyAddress(), compiler.codeGenerator.GetNativeCodeSize() );
+}
+void EndTryCommand( bool isNoWarning )
+{
+	if( tryScopes.size() == 0 )
+	{
+		compiler.errorMessenger.Output(12,"End Try",cp);
+		return;
+	}
+
+	if( !isNoWarning && !tryScopes.back().IsDefinedFinally() && !tryScopes.back().IsCatched() )
+	{
+		// CatchもFinallyも存在しないとき
+		compiler.errorMessenger.Output(-108,NULL,tryScopes.back().GetSourceCodePos() );
+	}
+
+	int dataTableOffset = tryScopes.back().GenerateCatchTable();
+
+	// _System_GetNowScopeCatchAddressesを解決
+	compiler.codeGenerator.opfix( tryScopes.back().GetPertialScheduleForCatchAddress(), dataTableOffset );
+
+	if( !tryScopes.back().IsDefinedFinally() )
+	{
+		// Finallyが定義されていないときは空のFinallyを定義しておく
+		FinallyCommand();
+	}
+
+	int backCp = cp;
+
+	char temporary[1024];
+	lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->EndTryScope()" );
+	MakeMiddleCode( temporary );
+	ChangeOpcode( temporary );
+
+	cp = backCp;
+
+	tryScopes.back().EndTry();
+	tryScopes.pop_back();
+}
+
+void InspectTryScope()
+{
+	while( tryScopes.size() > 0 )
+	{
+		compiler.errorMessenger.Output(22, "Try", tryScopes.back().GetSourceCodePos() );
+
+		EndTryCommand( true );
+	}
+}
+
+void ThrowCommand( const char *Parameter )
+{
+	int backCp = cp;
+
+	char temporary[1024];
+	if( Parameter[0] )
+	{
+		sprintf( temporary, "_System_pobj_AllThreads->GetCurrentException()->_ThrowWithParam(%s)", Parameter );
+	}
+	else
+	{
+		lstrcpy( temporary, "_System_pobj_AllThreads->GetCurrentException()->_ThrowNoneParam()" );
+	}
+	MakeMiddleCode( temporary );
+	ChangeOpcode( temporary );
+
+	cp = backCp;
+}
+
+void Opcode_Func_System_GetNowScopeCatchAddress()
+{
+	if( tryScopes.size() == 0 )
+	{
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+#ifdef _WIN64
+	//mov rax,catchAddress
+	const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( sizeof(long), REG_RAX, 0, Schedule::DataTable, true );
+#else
+	//mov eax,catchAddress
+	const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( REG_EAX, 0, Schedule::DataTable, true );
+#endif
+
+	tryScopes.back().RegistPertialScheduleForCatchAddress( pPertialSchedule );
+
+	/*
+	int dataTableOffset = compiler.GetObjectModule().dataTable.Add( static_cast<LONG_PTR>(0) );
+
+#ifdef _WIN64
+	//mov rax,dataTableOffset
+	compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, dataTableOffset, Schedule::DataTable);
+#else
+	//mov eax,dataTableOffset
+	compiler.codeGenerator.op_mov_RV( REG_EAX, dataTableOffset, Schedule::DataTable);
+#endif
+	*/
+}
+
+void Opcode_Func_System_GetNowScopeFinallyAddress()
+{
+	if( tryScopes.size() == 0 )
+	{
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+#ifdef _WIN64
+	//mov rax,finallyAddress
+	const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( sizeof(long), REG_RAX, 0, Schedule::CatchAddress, true );
+#else
+	//mov eax,finallyAddress
+	const PertialSchedule *pPertialSchedule = compiler.codeGenerator.op_mov_RV( REG_EAX, 0, Schedule::CatchAddress, true );
+#endif
+
+	tryScopes.back().RegistPertialScheduleForFinallyAddress( pPertialSchedule );
+
+	/*
+	int dataTableOffset = compiler.GetObjectModule().dataTable.Add( static_cast<LONG_PTR>(0) );
+
+#ifdef _WIN64
+	//mov rax,dataTableOffset
+	compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, dataTableOffset, Schedule::DataTable);
+#else
+	//mov eax,dataTableOffset
+	compiler.codeGenerator.op_mov_RV( REG_EAX, dataTableOffset, Schedule::DataTable);
+#endif
+	*/
+}
+
+
+}	// Exception
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer.cpp	(revision 774)
@@ -0,0 +1,68 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+bool LexicalAnalyzer::CollectNamespaces( const char *source, NamespaceScopesCollection &namespaceScopesCollection )
+{
+	int i, i2;
+	char temporary[1024];
+
+	bool isSuccessful = true;
+
+	// 名前空間管理
+	NamespaceScopes namespaceScopes;
+
+	for(i=0;;i++){
+		if(source[i]=='\0') break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			if( !namespaceScopesCollection.IsExist( namespaceScopes ) ){
+				namespaceScopesCollection.push_back( namespaceScopes );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output( 12, "End Namespace", i );
+				isSuccessful = false;
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+	}
+
+	if( namespaceScopes.size() > 0 ){
+		compiler.errorMessenger.Output( 63, NULL, cp );
+		isSuccessful = false;
+	}
+
+	return isSuccessful;
+}
+
+Symbol LexicalAnalyzer::FullNameToSymbol( const char *fullName )
+{
+	char areaName[VN_SIZE] = "";		//オブジェクト変数
+	char nestName[VN_SIZE] = "";		//入れ子メンバ
+	bool isNest = SplitMemberName( fullName, areaName, nestName );
+
+	return Symbol( NamespaceScopes( areaName ), nestName );
+}
+
+Symbol LexicalAnalyzer::FullNameToSymbol( const std::string &fullName )
+{
+	return FullNameToSymbol( fullName.c_str() );
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 774)
@@ -0,0 +1,1565 @@
+#include "stdafx.h"
+
+#include "../common.h"
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+#include <hash_set>
+
+using namespace ActiveBasic::Compiler;
+
+
+void LexicalAnalyzer::CollectClassesForNameOnly( const char *source, Classes &classes )
+{
+	int i, i2;
+	char temporary[VN_SIZE];
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Imports情報のクリア
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	for(i=0;;i++){
+		if(source[i]=='\0') break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,i );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED )
+		{
+			// Imports情報のクリア
+			compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+			continue;
+		}
+
+		if(source[i]==1&&(
+			source[i+1]==ESC_CLASS||
+			source[i+1]==ESC_TYPE||
+			source[i+1]==ESC_INTERFACE
+			))
+		{
+			int nowLine = i;
+			i += 2;
+
+			Type blittableType;
+			if(memicmp(source+i,"Align(",6)==0){
+				//アラインメント修飾子
+				i+=6;
+				i=JumpStringInPare(source,i)+1;
+			}
+			else if( memicmp( source + i, "Blittable(", 10 ) == 0 ){
+				// Blittable修飾子
+				i+=10;
+				i+=GetStringInPare_RemovePare(temporary,source+i)+1;
+				compiler.StringToType( temporary, blittableType );
+			}
+
+			bool isEnum = false;
+			bool isDelegate = false;
+			if( source[i] == 1 && source[i+1] == ESC_ENUM ){
+				// 列挙型の場合
+				isEnum = true;
+
+				i += 2;
+			}
+			else if( source[i] == 1 && source[i+1] == ESC_DELEGATE )
+			{
+				// デリゲートの場合
+				isDelegate = true;
+
+				i += 2;
+			}
+
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(source[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+
+			//クラスを追加
+			CClass *pClass = new CClass( Symbol( namespaceScopes, temporary ), compiler.GetNamespaceSupporter().GetImportedNamespaces() );
+			if( classes.IsExist( pClass ) )
+			{
+				// 既に存在している
+				compiler.errorMessenger.Output(15,pClass->GetName(), nowLine);
+
+				delete pClass;
+
+				continue;
+			}
+
+			classes.Put( pClass );
+
+			if( source[nowLine+1] == ESC_CLASS )
+			{
+				if( isEnum )
+				{
+					pClass->SetClassType( CClass::Enum );
+				}
+				else if( isDelegate )
+				{
+					pClass->SetClassType( CClass::Delegate );
+				}
+				else{
+					pClass->SetClassType( CClass::Class );
+				}
+			}
+			else if( source[nowLine+1] == ESC_INTERFACE )
+			{
+				pClass->SetClassType( CClass::Interface );
+			}
+			else
+			{
+				pClass->SetClassType( CClass::Structure );
+			}
+
+			// Blittable型の場合
+			if( !blittableType.IsNull() ){
+				pClass->SetBlittableType( blittableType );
+
+				// Blittable型として登録
+				compiler.GetObjectModule().meta.GetBlittableTypes().push_back( BlittableType( blittableType, pClass ) );
+			}
+		}
+	}
+}
+
+
+class CLoopRefCheck{
+	stdext::hash_set<std::string> names;
+
+public:
+	CLoopRefCheck()
+	{
+	}
+	~CLoopRefCheck()
+	{
+	}
+	void add(const std::string &lpszInheritsClass)
+	{
+		names.insert(lpszInheritsClass);
+	}
+	void del(const std::string &lpszInheritsClass)
+	{
+		names.erase(lpszInheritsClass);
+	}
+	bool check(const CClass &inheritsClass) const
+	{
+		//ループ継承チェック
+		return names.find(inheritsClass.GetName()) != names.end();
+	}
+private:
+	CLoopRefCheck(const CLoopRefCheck&);
+	CLoopRefCheck& operator =(const CLoopRefCheck&);
+};
+CLoopRefCheck *pobj_LoopRefCheck;
+
+bool MemberVar_LoopRefCheck(const CClass &objClass){
+	if( objClass.HasSuperClass() )
+	{
+		// 基底クラスをチェック
+		if( MemberVar_LoopRefCheck( objClass.GetSuperClass() ) == false )
+		{
+			return false;
+		}
+	}
+
+	bool result = true;
+	foreach( Member *pMember, objClass.GetDynamicMembers() ){
+		if(pMember->GetType().IsStruct()){
+			//循環参照でないかをチェック
+			if(pobj_LoopRefCheck->check(pMember->GetType().GetClass())){
+				extern int cp;
+				compiler.errorMessenger.Output(124,pMember->GetType().GetClass().GetName(),cp);
+				return false;
+			}
+
+			pobj_LoopRefCheck->add(objClass.GetName());
+
+			bool tempResult = MemberVar_LoopRefCheck(pMember->GetType().GetClass());
+			if( result )
+			{
+				result = tempResult;
+			}
+
+			pobj_LoopRefCheck->del(objClass.GetName());
+		}
+	}
+
+	return result;
+}
+
+void OverrideErrorCheck( const DynamicMethod::OverrideResult &result )
+{
+	switch( result.enumType )
+	{
+	case DynamicMethod::OverrideResult::Successful:
+		break;
+	case DynamicMethod::OverrideResult::NotVirtual:
+		compiler.errorMessenger.Output(136, result.pMethod->GetUserProc().GetName(), cp);
+		break;
+	case DynamicMethod::OverrideResult::NotUseOverrideModifier:
+		compiler.errorMessenger.Output(127, result.pMethod->GetUserProc().GetName(), cp);
+		break;
+	case DynamicMethod::OverrideResult::DifferentAccesibility:
+		compiler.errorMessenger.Output(128, result.pMethod->GetUserProc().GetName(), cp);
+		break;
+	default:
+		throw;
+	}
+}
+
+Member *LexicalAnalyzer::CreateMember( const CClass &_class, Prototype::Accessibility accessibility, bool isConst, bool isRef, char *buffer, int nowLine )
+{
+	extern int cp;
+
+	//構文を解析
+	char VarName[VN_SIZE];
+	char initBuffer[VN_SIZE];
+	char lpszConstructParameter[VN_SIZE];
+	Subscripts subscripts;
+	Type type;
+	if( !GetDimentionFormat(buffer,VarName,subscripts,type,initBuffer,lpszConstructParameter) )
+	{
+		return NULL;
+	}
+
+	//重複チェック
+	if( _class.DupliCheckAll( VarName ) ){
+		compiler.errorMessenger.Output(15,VarName,cp);
+	}
+
+	Member *pMember = new Member( accessibility, VarName, type, isConst, subscripts, initBuffer, lpszConstructParameter );
+	pMember->source_code_address = nowLine;
+	return pMember;
+}
+
+void LexicalAnalyzer::AddMethod(CClass *pobj_c, UserProc *pUserProc, Prototype::Accessibility accessibility, BOOL bStatic, bool isConst, bool isAbstract,
+	bool isVirtual, bool isOverride, bool isEnableOverrideCheck, const char *interfaceName, bool isAutoGeneration, int nowLine)
+{
+	if( isAutoGeneration )
+	{
+		// コード自動生成
+		pUserProc->ThisIsAutoGenerationProc();
+	}
+
+
+	////////////////////////////////////////////////////////////
+	// コンストラクタ、デストラクタの場合の処理
+	////////////////////////////////////////////////////////////
+	BOOL fConstructor=0,bDestructor=0;
+
+	if( pUserProc->GetName() == pobj_c->GetName() ){
+		//コンストラクタの場合
+
+		//標準コンストラクタ（引数なし）
+		if(pUserProc->Params().size()==0) fConstructor=1;
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+	else if(pUserProc->GetName()[0]=='~'){
+		//デストラクタの場合はその名前が正しいかチェックを行う
+		if(lstrcmp(pUserProc->GetName().c_str()+1,pobj_c->GetName().c_str())!=0)
+			compiler.errorMessenger.Output(117,NULL,nowLine);
+		else
+			bDestructor=1;
+	}
+	if(fConstructor||bDestructor){
+		// コンストラクタ、デストラクタのアクセシビリティをチェック
+
+		//強制的にConst修飾子をつける
+		isConst = true;
+	}
+
+	if( fConstructor == 1 )
+		pobj_c->SetConstructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
+	else if( bDestructor )
+		pobj_c->SetDestructorMemberSubIndex( (int)pobj_c->GetDynamicMethods().size() );
+
+
+
+	//////////////////
+	// 重複チェック
+	//////////////////
+
+	if(pobj_c->DupliCheckMember( pUserProc->GetName().c_str() )){
+		compiler.errorMessenger.Output(15,pUserProc->GetName(),nowLine);
+		return;
+	}
+
+	//メソッド
+	foreach( const CMethod *pMethod, pobj_c->GetDynamicMethods() )
+	{
+		//基底クラスと重複する場合はオーバーライドを行う
+		if( pMethod->GetInheritsClassPtr() ) continue;
+
+		if( pMethod->GetUserProc().IsEqualForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc ) )
+		{
+			//関数名、パラメータ、戻り値が合致したとき
+			compiler.errorMessenger.Output(15,pUserProc->GetName().c_str(),nowLine);
+			return;
+		}
+	}
+
+	//仮想関数の場合
+	if( isAbstract ) pUserProc->CompleteCompile();
+
+	// メソッドのオーバーライド
+	DynamicMethod *pMethodForOverride = pobj_c->GetDynamicMethods().FindForOverride( pobj_c->GetSuperClassActualTypeParameters(), pUserProc );
+	if( pMethodForOverride )
+	{
+		DynamicMethod::OverrideResult result;
+		result.enumType = pMethodForOverride->Override( pUserProc, accessibility, isEnableOverrideCheck ? isOverride : true );
+		result.pMethod = pMethodForOverride;
+		OverrideErrorCheck( result );
+
+		pUserProc->SetMethod( pMethodForOverride );
+		return;
+	}
+	else
+	{
+		// インターフェイス メソッドのオーバーライド
+		foreach( ::Interface *pInterface, pobj_c->GetInterfaces() )
+		{
+			if( interfaceName[0] )
+			{
+				if( pInterface->GetClass().GetName() != interfaceName )
+				{
+					// 指定されたインターフェイス名と整合しないとき
+					continue;
+				}
+			}
+
+			if( !pInterface->GetClass().IsReady() ){
+				// インターフェイスが未解析のとき
+				LexicalAnalyzer::LookaheadClass(
+					pInterface->GetClass().GetName(),
+					compiler.GetObjectModule().meta.GetClasses()
+				);
+			}
+
+			DynamicMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), pUserProc );
+			if( pMethodForOverride )
+			{
+				DynamicMethod::OverrideResult result;
+				result.enumType = pMethodForOverride->Override( pUserProc, accessibility, isOverride );
+				result.pMethod = pMethodForOverride;
+				OverrideErrorCheck( result );
+
+				pUserProc->SetMethod( pMethodForOverride );
+				return;
+			}
+		}
+	}
+
+	if( interfaceName[0] )
+	{
+		compiler.errorMessenger.Output(139,interfaceName,nowLine);
+	}
+
+	if( isVirtual ){
+		pobj_c->AddVtblNum( 1 );
+	}
+
+	if( isOverride ){
+		compiler.errorMessenger.Output(12,"Override",nowLine);
+	}
+
+	if(bStatic){
+		pobj_c->GetStaticMethods().AddStatic( pUserProc, accessibility );
+	}
+	else{
+		pobj_c->GetDynamicMethods().Add(pUserProc, accessibility, isConst, isAbstract, isVirtual);
+	}
+}
+
+bool LexicalAnalyzer::Inherits( CClass &_class, const char *inheritNames, int nowLine ){
+	int i = 0;
+	bool isInheritsClass = false;
+	while( true ){
+
+		char temporary[VN_SIZE];
+		for( int i2=0;; i++, i2++ ){
+			if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){
+				temporary[i2] = 0;
+				break;
+			}
+			temporary[i2] = inheritNames[i];
+		}
+
+		// ジェネリクス構文を分解
+		char className[VN_SIZE];
+		Jenga::Common::Strings typeParameterStrings;
+		SplitGenericClassInstance( temporary, className, typeParameterStrings );
+
+		// 型パラメータ文字列から型データを取得
+		Types actualTypeParameters;
+		foreach( const std::string &typeParameterStr, typeParameterStrings )
+		{
+			Type type;
+			compiler.StringToType( typeParameterStr, type );
+			actualTypeParameters.push_back( type );
+		}
+
+		//継承元クラスを取得
+		const CClass *pInheritsClass = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+			LexicalAnalyzer::FullNameToSymbol( className )
+		);
+		if( !pInheritsClass ){
+			compiler.errorMessenger.Output(106,className,nowLine);
+			return false;
+		}
+
+		if( pInheritsClass->IsClass() ){
+			// クラスを継承する
+			isInheritsClass = true;
+
+			//ループ継承でないかをチェック
+			if( !LexicalAnalyzer::LoopRefCheck(*pInheritsClass) )
+			{
+				compiler.errorMessenger.Output(123,pInheritsClass->GetName(),nowLine);
+				return false;
+			}
+
+			if( !pInheritsClass->IsReady() ){
+				//継承先が読み取られていないとき
+				LexicalAnalyzer::LookaheadClass(
+					pInheritsClass->GetName(),
+					compiler.GetObjectModule().meta.GetClasses()
+				);
+			}
+
+			if( !_class.InheritsClass( *pInheritsClass, actualTypeParameters, nowLine ) ){
+				return false;
+			}
+		}
+		else{
+			compiler.errorMessenger.Output(135,pInheritsClass->GetFullName().c_str(),nowLine);
+			return false;
+		}
+
+		if( inheritNames[i] == '\0' ){
+			break;
+		}
+		i++;
+	}
+
+	if( !isInheritsClass ){
+		const CClass *pObjectClass = compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr();
+		//ループ継承でないかをチェック
+		if( !LexicalAnalyzer::LoopRefCheck( *pObjectClass ) )
+		{
+			compiler.errorMessenger.Output(123,pObjectClass->GetName(),nowLine);
+			return false;
+		}
+
+		if( !pObjectClass->IsReady() ){
+			//継承先が読み取られていないとき
+			LexicalAnalyzer::LookaheadClass(
+				pObjectClass->GetName(),
+				compiler.GetObjectModule().meta.GetClasses()
+			);
+		}
+
+		// クラスを一つも継承していないとき
+		if( !_class.InheritsClass( *pObjectClass, Types(), nowLine ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+
+void LexicalAnalyzer::Implements( CClass &_class, Interface *pInterface )
+{
+	// まずは継承されたインターフェイスを実装する
+	foreach( ::Interface *pInheritsInterface, pInterface->GetClass().GetInterfaces() )
+	{
+		// TODO: actualTypeParametersの引渡し
+		Implements(
+			_class,
+			new ::Interface( &pInheritsInterface->GetClass(), pInterface->GetActualTypeParameters() )
+		);
+	}
+
+	_class.AddInterface( pInterface );
+
+
+	/////////////////////////////////////////////////////////////////
+	// 基底クラスのメソッドからインターフェイスメソッドを再実装する
+	/////////////////////////////////////////////////////////////////
+	foreach( CMethod *pMethod, _class.GetDynamicMethods() )
+	{
+		DynamicMethod *pMethodForOverride = pInterface->GetDynamicMethods().FindForOverride( pInterface->GetActualTypeParameters(), &pMethod->GetUserProc() );
+		if( pMethodForOverride )
+		{
+			DynamicMethod::OverrideResult result;
+			result.enumType = pMethodForOverride->Override( &pMethod->GetUserProc(), pMethod->GetAccessibility(), false );
+			result.pMethod = pMethod;
+
+			OverrideErrorCheck( result );
+
+			// 実装元になるメソッドは呼び出し不可にしておく（オーバーロードの解決から除外する）
+			pMethod->SetNotUseMark( true );
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// キャストメソッドを追加（内部コードは自動生成すること）
+	// ※COMインターフェイスは除外すること
+	/////////////////////////////////////////////////////////////////
+	if( pInterface->GetClass().IsInterface() )
+	{
+		// Function Operator() As ITest
+
+		char methodName[255] = { 1, ESC_OPERATOR, CALC_AS, '\0' };
+
+		//関数ハッシュへ登録
+		UserProc *pUserProc = new UserProc(
+			Symbol( NamespaceScopes(), methodName ),
+			NamespaceScopesCollection(),
+			Procedure::Function,
+			false,
+			false,
+			false );
+		pUserProc->SetParentClass( &_class );
+
+		Parameters params;
+		params.push_back( new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
+		pUserProc->SetRealParams( params );
+
+		pUserProc->SetReturnType( Type( DEF_OBJECT, pInterface->GetClass() ) );
+		pUserProc->_paramStr = "";
+		pUserProc->Using();
+
+		// 関数を追加
+		if( compiler.GetObjectModule().meta.GetUserProcs().IsExist( pUserProc ) )
+		{
+			// 既に存在している
+			compiler.errorMessenger.Output(15,pUserProc->GetName(),-1);
+
+			delete pUserProc;
+		}
+		else
+		{
+			compiler.GetObjectModule().meta.GetUserProcs().Put( pUserProc );
+		}
+
+		LexicalAnalyzer::AddMethod(
+			&_class,
+			pUserProc,
+			Prototype::Public,
+			0,
+			false,			// isConst
+			false,			// isAbstract
+			false,			// isVirtual
+			false,			// isOverride
+			true,			// Override修飾子チェック
+			"",
+			true,			// isAutoGeneration
+			-1
+		);
+	}
+}
+
+bool LexicalAnalyzer::Implements( CClass &_class, const char *interfaceNames, int nowLine )
+{
+	Jenga::Common::Strings paramStrs;
+	SplitParameter( interfaceNames, paramStrs );
+	
+	foreach( const std::string &paramStr, paramStrs )
+	{
+		char className[VN_SIZE];
+		Jenga::Common::Strings typeParameterStrings;
+		SplitGenericClassInstance( paramStr.c_str(), className, typeParameterStrings );
+
+		Types actualTypeParameters;
+		foreach( const std::string &typeParameterStr, typeParameterStrings )
+		{
+			Type type;
+			compiler.StringToType( typeParameterStr, type );
+			actualTypeParameters.push_back( type );
+		}
+
+		//継承元クラスを取得
+		const CClass *pInterfaceClass = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+			LexicalAnalyzer::FullNameToSymbol( className )
+		);
+		if( !pInterfaceClass ){
+			compiler.errorMessenger.Output(106,paramStr.c_str(),nowLine);
+			continue;
+		}
+
+		if( !pInterfaceClass->IsReady() ){
+			// インターフェイスが未解析のとき
+			LexicalAnalyzer::LookaheadClass(
+				pInterfaceClass->GetName(),
+				compiler.GetObjectModule().meta.GetClasses()
+			);
+		}
+
+		if( pInterfaceClass->IsInterface() || pInterfaceClass->IsComInterface() )
+		{
+			// インターフェイスを実装する
+			{
+				Implements(
+					_class,
+					new ::Interface( pInterfaceClass, actualTypeParameters )
+				);
+			}
+		}
+		else
+		{
+			// インターフェイスではないとき
+			compiler.errorMessenger.Output(138,pInterfaceClass->GetName().c_str(),nowLine );
+		}
+	}
+
+	return true;
+}
+
+void GetClass_recur( const char *lpszInheritsClass, Classes &classes )
+{
+	extern char *basbuf;
+	int i,i2,i3,sub_address,top_pos;
+	char temporary[8192];
+
+	// 名前空間管理
+	NamespaceScopes backupNamespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Importsされた名前空間の管理
+	NamespaceScopesCollection backupImportedNamespaces = compiler.GetNamespaceSupporter().GetImportedNamespaces();
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	// 呼び出し元でコンパイル中のクラスポインタをバックアップ
+	const CClass *pBackCompilingClass = compiler.IsCompilingClass()
+		? &compiler.GetCompilingClass()
+		: NULL;
+
+	for(i=0;;i++){
+		if(basbuf[i]=='\0') break;
+
+
+		// 名前空間
+		if( basbuf[i] == 1 && basbuf[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( basbuf[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( basbuf[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,i );
+			}
+
+			continue;
+		}
+		else if( basbuf[i] == 1 && basbuf[i+1] == ESC_CLEARNAMESPACEIMPORTED )
+		{
+			// Imports情報のクリア
+			compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+			continue;
+		}
+
+
+
+		if(basbuf[i]==1&&basbuf[i+1]==ESC_INTERFACE){
+			//////////////////////////
+			// インターフェイス
+			//////////////////////////
+
+			top_pos=i;
+
+			i+=2;
+
+			//インターフェイス名を取得
+			GetCommandToken( temporary, basbuf, i );
+
+			char className[VN_SIZE];
+			Jenga::Common::Strings typeParameters;
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
+
+			CClass *pobj_c = const_cast<CClass *>( classes.FindEx( Symbol( namespaceScopes, className ) ) );
+			if(!pobj_c) continue;
+
+			compiler.SetCompilingClass( pobj_c );
+
+			if(lpszInheritsClass){
+				if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
+			}
+			/////////////////////////////////////////////////////////
+
+			pobj_c->Readed();
+
+			pobj_c->SetConstructorMemberSubIndex( -1 );
+			pobj_c->SetDestructorMemberSubIndex( -1 );
+
+			if( memcmp( basbuf+i+1, "__COM", 5 ) == 0 && IsCommandDelimitation( basbuf[i+1+5] ) )
+			{
+				// COMインターフェイス
+				pobj_c->SetClassType( CClass::ComInterface );
+
+				i += 6;
+			}
+
+			if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS){
+				//継承を行う場合
+				for(i+=3,i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+
+				// ジェネリクス構文を分解
+				char className[VN_SIZE];
+				Jenga::Common::Strings typeParameterStrings;
+				SplitGenericClassInstance( temporary, className, typeParameterStrings );
+
+				// 型パラメータ文字列から型データを取得
+				Types actualTypeParameters;
+				foreach( const std::string &typeParameterStr, typeParameterStrings )
+				{
+					Type type;
+					compiler.StringToType( typeParameterStr, type );
+					actualTypeParameters.push_back( type );
+				}
+
+				if(lstrcmpi(className,pobj_c->GetName().c_str())==0){
+					compiler.errorMessenger.Output(105,className,i);
+					goto Interface_InheritsError;
+				}
+
+				//継承元クラスを取得
+				const CClass *pInheritsClass = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+					LexicalAnalyzer::FullNameToSymbol( className )
+				);
+				if( !pInheritsClass ){
+					compiler.errorMessenger.Output(106,className,i);
+					goto Interface_InheritsError;
+				}
+
+				//ループ継承でないかをチェック
+				if( !LexicalAnalyzer::LoopRefCheck( *pInheritsClass ) )
+				{
+					compiler.errorMessenger.Output(123,pInheritsClass->GetName(),i);
+					goto Interface_InheritsError;
+				}
+
+				//継承させる
+				if( !pobj_c->InheritsInterface( *pInheritsClass, actualTypeParameters, i ) ){
+					goto Interface_InheritsError;
+				}
+			}
+			else{
+				//継承無し
+				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
+				{
+					// TODO: ここに来ないことが実証できたらこの分岐は消す
+					Jenga::Throw( "GetClass_recur内の例外" );
+				}
+			}
+Interface_InheritsError:
+
+			//メンバ変数、関数を取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE||basbuf[i+1]==ESC_INTERFACE)){
+					compiler.errorMessenger.Output(22,"Interface",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					compiler.errorMessenger.Output(111,NULL,i);
+					break;
+				}
+				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
+				{
+					compiler.errorMessenger.Output(137, NULL, i );
+					break;
+				}
+
+				sub_address=i;
+
+				for(i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+				if(temporary[0]=='\0'){
+					if(basbuf[i]=='\0'){
+						i--;
+						compiler.errorMessenger.Output(22,"Interface",top_pos);
+						break;
+					}
+					continue;
+				}
+
+				//End Interface記述の場合
+				if(temporary[0]==1&&temporary[1]==ESC_ENDINTERFACE) break;
+
+				if(!(temporary[0]==1&&(
+					temporary[1]==ESC_SUB||temporary[1]==ESC_FUNCTION
+					))){
+					compiler.errorMessenger.Output(1,NULL,i);
+					break;
+				}
+
+				//関数ハッシュへ登録
+				char interfaceName[VN_SIZE] = "";
+				UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,true,pobj_c, false, interfaceName );
+				if( pUserProc )
+				{
+					// 関数を追加
+					if( compiler.GetObjectModule().meta.GetUserProcs().IsExist( pUserProc ) )
+					{
+						// 既に存在している
+						compiler.errorMessenger.Output(15,pUserProc->GetName(),i);
+
+						delete pUserProc;
+					}
+					else
+					{
+						compiler.GetObjectModule().meta.GetUserProcs().Put( pUserProc );
+					}
+
+					//メンバ関数を追加
+					LexicalAnalyzer::AddMethod(pobj_c,
+						pUserProc,
+						Prototype::Public,	//Publicアクセス権
+						0,					// bStatic
+						false,				// isConst
+						true,				// isAbstract
+						true,				// isVirtual
+						false,				// isOverride
+						true,				// Override修飾子チェック
+						interfaceName,
+						false,				// isAutoGeneration
+						sub_address
+						);
+				}
+			}
+		}
+
+		if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
+			//////////////////////////
+			// クラス
+			//////////////////////////
+
+			top_pos=i;
+
+			const DWORD dwClassType=basbuf[i+1];
+
+			i+=2;
+
+			int iAlign=0;
+			if(memicmp(basbuf+i,"Align(",6)==0){
+				//アラインメント修飾子
+				i+=6;
+				i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
+				iAlign=atoi(temporary);
+
+				if( dwClassType != ESC_TYPE )
+				{
+					compiler.errorMessenger.Output(140,NULL,i);
+				}
+
+				if(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
+					compiler.errorMessenger.Output(51,NULL,i);
+			}
+			else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+				// Blittable修飾子
+				i+=10;
+				i=JumpStringInPare(basbuf,i)+1;
+
+				if( dwClassType != ESC_CLASS )
+				{
+					compiler.errorMessenger.Output(141,NULL,i);
+				}
+			}
+
+			if( basbuf[i] == 1 && basbuf[i+1] == ESC_ENUM )
+			{
+				// 列挙型の場合
+				i += 2;
+			}
+			else if( basbuf[i] == 1 && basbuf[i+1] == ESC_DELEGATE )
+			{
+				// デリゲートの場合
+				i += 2;
+			}
+
+			//クラス名を取得
+			GetCommandToken( temporary, basbuf, i );
+
+			char className[VN_SIZE];
+			Jenga::Common::Strings typeParameters;
+			Jenga::Common::Strings typeParameterBaseClassNames;
+			SplitGenericClassInstance( temporary, className, typeParameters, true, &typeParameterBaseClassNames );
+
+			CClass *pobj_c =  const_cast<CClass *>( classes.FindEx( Symbol( namespaceScopes, className ) ) );
+			if(!pobj_c) continue;
+
+			compiler.SetCompilingClass( pobj_c );
+
+			if(lpszInheritsClass){
+				if( pobj_c->GetName() != lpszInheritsClass ){
+					//継承先先読み用
+					continue;
+				}
+			}
+
+			if(pobj_c->IsReady()){
+				//既に先読みされているとき
+				continue;
+			}
+
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+			for( i2=0; i2<static_cast<int>(typeParameters.size()); i2++ )
+			{
+				Type baseType( DEF_OBJECT, *classes.GetObjectClassPtr() );
+				if( typeParameterBaseClassNames[i2].size() )
+				{
+					if( !compiler.StringToType( typeParameterBaseClassNames[i2], baseType ) )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+					else if( !baseType.IsObject() )
+					{
+						compiler.errorMessenger.Output(106,typeParameterBaseClassNames[i2],i);
+					}
+				}
+
+				pobj_c->AddFormalGenericType( GenericType( typeParameters[i2], baseType ) );
+			}
+			/////////////////////////////////////////////////////////
+
+
+			pobj_c->SetFixedAlignment( iAlign );
+
+			pobj_c->Readed();
+
+			pobj_c->SetConstructorMemberSubIndex( -1 );
+			pobj_c->SetDestructorMemberSubIndex( -1 );
+
+			//アクセス制限の初期値をセット
+			Prototype::Accessibility accessibility;
+			if(dwClassType==ESC_CLASS){
+				accessibility = Prototype::Private;
+			}
+			else{
+				accessibility = Prototype::Public;
+			}
+
+			if( pobj_c->GetName() == "Object"
+				|| dwClassType == ESC_TYPE )
+			{
+				// 何も継承しない
+
+				if( &pobj_c->GetSuperClass() || pobj_c->GetVtblNum() )
+				{
+					// TODO: ここに来ないことが実証できたらこの分岐は消す
+					Jenga::Throw( "GetClass_recur内の例外" );
+				}
+			}
+			else{
+				if(basbuf[i+1]==1&&basbuf[i+2]==ESC_INHERITS)
+				{
+					// クラス継承先が指定されているとき
+					i += 3;
+					GetCommandToken( temporary, basbuf, i );
+
+					if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){
+						compiler.errorMessenger.Output(105,temporary,i);
+						goto InheritsError;
+					}
+				}
+				else
+				{
+					// 何の指定もないときはObjectクラスを継承する
+					lstrcpy( temporary, "Object" );
+				}
+				LexicalAnalyzer::Inherits( *pobj_c, temporary, i );
+
+				if( basbuf[i+1] == 1 && basbuf[i+2] == ESC_IMPLEMENTS )
+				{
+					// インターフェイス実装を行う場合
+					i += 3;
+					GetCommandToken( temporary, basbuf, i );
+
+					LexicalAnalyzer::Implements( *pobj_c, temporary, i );
+				}
+			}
+InheritsError:
+
+			//メンバとメソッドを取得
+			while(1){
+				i++;
+
+				//エラー
+				if(basbuf[i]==1&&(basbuf[i+1]==ESC_CLASS||basbuf[i+1]==ESC_TYPE)){
+					compiler.errorMessenger.Output(22,"Class",i);
+					i--;
+					break;
+				}
+
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_INHERITS){
+					compiler.errorMessenger.Output(111,NULL,i);
+					break;
+				}
+				else if( basbuf[i] == 1 && basbuf[i+1] == ESC_IMPLEMENTS )
+				{
+					compiler.errorMessenger.Output(137, NULL, i );
+					break;
+				}
+
+				//Static修飾子
+				BOOL bStatic;
+				if(basbuf[i]==1&&basbuf[i+1]==ESC_STATIC){
+					bStatic=1;
+					i+=2;
+				}
+				else bStatic=0;
+
+				//Const修飾子
+				bool isConst = false;
+				if( basbuf[i] == 1 && basbuf[i + 1] == ESC_CONST ){
+					isConst = true;
+					i += 2;
+				}
+
+				if(basbuf[i]==1&&(
+					basbuf[i+1]==ESC_ABSTRACT||basbuf[i+1]==ESC_VIRTUAL||basbuf[i+1]==ESC_OVERRIDE||
+					basbuf[i+1]==ESC_SUB||basbuf[i+1]==ESC_FUNCTION
+					)){
+					i3=basbuf[i+1];
+					sub_address=i;
+				}
+				else i3=0;
+
+				bool isVirtual = false, isAbstract = false, isOverride = false;
+				if(i3==ESC_ABSTRACT){
+					isAbstract=1;
+					isVirtual=1;
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+				else if(i3==ESC_VIRTUAL){
+					isAbstract=0;
+					isVirtual=1;
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+				else if(i3==ESC_OVERRIDE){
+					isOverride=1;
+					isVirtual=1;
+
+					i+=2;
+
+					i3=basbuf[i+1];
+				}
+
+				for(i2=0;;i++,i2++){
+					if(IsCommandDelimitation(basbuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=basbuf[i];
+				}
+				if(temporary[0]=='\0'){
+					if(basbuf[i]=='\0'){
+
+						if(dwClassType==ESC_CLASS)
+							compiler.errorMessenger.Output(22,"Class",top_pos);
+						else
+							compiler.errorMessenger.Output(22,"Type",top_pos);
+
+						i--;
+						break;
+					}
+					continue;
+				}
+
+				//End Class記述の場合
+				if(temporary[0]==1&&temporary[1]==ESC_ENDCLASS&&dwClassType==ESC_CLASS) break;
+				if(temporary[0]==1&&temporary[1]==ESC_ENDTYPE&&dwClassType==ESC_TYPE) break;
+
+				//アクセスを変更
+				if(lstrcmpi(temporary,"Private")==0){
+					accessibility = Prototype::Private;
+					continue;
+				}
+				if(lstrcmpi(temporary,"Public")==0){
+					accessibility = Prototype::Public;
+					continue;
+				}
+				if(lstrcmpi(temporary,"Protected")==0){
+					accessibility = Prototype::Protected;
+					continue;
+				}
+
+				extern int cp;
+				if(i3==0){
+					cp=i;	//エラー用
+					Member *pMember = LexicalAnalyzer::CreateMember( *pobj_c, accessibility, isConst, false, temporary, i );
+					if( pMember )
+					{
+						if(bStatic)
+						{
+							//静的メンバを追加
+							pobj_c->AddStaticMember( pMember );
+						}
+						else
+						{
+							//メンバを追加
+							pobj_c->AddDynamicMember( pMember );
+
+
+							if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
+								if( !pobj_c->GetDynamicMembers().back()->GetType().GetClass().IsReady() ){
+									//参照先が読み取られていないとき
+									GetClass_recur( pobj_c->GetDynamicMembers().back()->GetType().GetClass().GetName().c_str(), classes );
+								}
+							}
+
+
+							if(pobj_c->GetDynamicMembers().back()->GetType().IsStruct()){
+								//循環参照のチェック
+								pobj_LoopRefCheck->add(pobj_c->GetName());
+								if(!MemberVar_LoopRefCheck(pobj_c->GetDynamicMembers().back()->GetType().GetClass())){
+									//エラー回避
+									Type &type = const_cast<Type &>(pobj_c->GetDynamicMembers().back()->GetType());
+									type.SetBasicType( DEF_PTR_VOID );
+								}
+								pobj_LoopRefCheck->del(pobj_c->GetName());
+							}
+						}
+					}
+				}
+				else{
+					//関数ハッシュへ登録
+					char interfaceName[VN_SIZE] = "";
+					UserProc *pUserProc = LexicalAnalyzer::ParseUserProc( NamespaceScopes(), NamespaceScopesCollection(), temporary,sub_address,isVirtual,pobj_c, (bStatic!=0), interfaceName );
+					if( pUserProc )
+					{
+						// 関数を追加
+						if( compiler.GetObjectModule().meta.GetUserProcs().IsExist( pUserProc ) )
+						{
+							// 既に存在している
+							compiler.errorMessenger.Output(15,pUserProc->GetName(),i);
+
+							delete pUserProc;
+						}
+						else
+						{
+							compiler.GetObjectModule().meta.GetUserProcs().Put( pUserProc );
+						}
+
+						//メソッドを追加
+						cp=i;	//エラー用
+						LexicalAnalyzer::AddMethod(pobj_c,
+							pUserProc,
+							accessibility,
+							bStatic,
+							isConst,
+							isAbstract,
+							isVirtual,
+							isOverride,
+							true,				// Override修飾子チェック
+							interfaceName,
+							false,
+							sub_address);
+					}
+
+					if( isAbstract ) continue;
+
+					for(;;i++){
+						if(basbuf[i]=='\0'){
+							i--;
+							break;
+						}
+						if(basbuf[i-1]!='*'&&
+							basbuf[i]==1&&(
+							basbuf[i+1]==ESC_SUB||
+							basbuf[i+1]==ESC_FUNCTION||
+							basbuf[i+1]==ESC_MACRO||
+							basbuf[i+1]==ESC_TYPE||
+							basbuf[i+1]==ESC_CLASS||
+							basbuf[i+1]==ESC_INTERFACE||
+							basbuf[i+1]==ESC_ENUM)){
+							GetDefaultNameFromES(i3,temporary);
+							compiler.errorMessenger.Output(22,temporary,i);
+						}
+						if(basbuf[i]==1&&basbuf[i+1]==GetEndXXXCommand((char)i3)){
+							i+=2;
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// 呼び出し元でコンパイル中のクラスポインタを元に戻す
+	compiler.SetCompilingClass( pBackCompilingClass );
+
+	// 名前空間を元に戻す
+	compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = backupNamespaceScopes;
+
+	// インポートされた名前空間を元に戻す
+	compiler.GetNamespaceSupporter().SetImportedNamespaces( backupImportedNamespaces );
+}
+
+void LexicalAnalyzer::LookaheadClass( const std::string &className, Classes &classes )
+{
+	pobj_LoopRefCheck->add( className );
+	GetClass_recur( className.c_str(), classes );
+	pobj_LoopRefCheck->del( className );
+}
+
+bool LexicalAnalyzer::LoopRefCheck( const CClass &objClass )
+{
+	if( pobj_LoopRefCheck->check( objClass ) )
+	{
+		return false;
+	}
+
+	return true;
+}
+
+void LexicalAnalyzer::CollectClasses( const char *source, Classes &classes ){
+	//ループ継承チェック用のクラス
+	pobj_LoopRefCheck=new CLoopRefCheck();
+
+	//クラスを取得
+	GetClass_recur( 0, classes );
+
+	delete pobj_LoopRefCheck;
+	pobj_LoopRefCheck=0;
+
+	// イテレータの準備
+	classes.Iterator_Init();
+}
+
+Type LexicalAnalyzer::TemplateExpand_ResolveType( const Type &baseType, const Types &actualTypes )
+{
+	if( baseType.IsNull() )
+	{
+		return baseType;
+	}
+
+	Type resultType( baseType );
+	if( resultType.IsTypeParameter() )
+	{
+		// 型パラメータだったとき
+		resultType = actualTypes[baseType.GetFormalTypeIndex()];
+	}
+	else if( resultType.IsObject() || resultType.IsInterface() )
+	{
+		// クラス・インターフェイスだったとき
+		const CClass *pExpandedClass = TemplateExpand( *const_cast<CClass *>(&baseType.GetClass()), actualTypes );
+		resultType.SetClassPtr( pExpandedClass );
+	}
+
+	resultType.SetPtrLevel( baseType.PtrLevel() );
+
+	return resultType;
+}
+
+void LexicalAnalyzer::TemplateExpand_ResolveMethod( const CMethod *pBaseMethod, const Types &actualTypes, CClass *pNewClass )
+{
+	UserProc *pUserProc = new UserProc(
+		pBaseMethod->GetUserProc(),
+		pNewClass
+	);
+	pUserProc->Using();
+	pUserProc->GetParameters().clear();
+	pUserProc->RealParams().clear();
+
+	// パラメータのジェネリック型を解決
+	foreach( const Parameter *pParam, pBaseMethod->GetUserProc().Params() )
+	{
+		Type type = pParam->IsTypeParameter()
+			? actualTypes[pParam->GetFormalTypeIndex()]
+			: *pParam;
+		type.SetPtrLevel( pParam->PtrLevel() );
+
+		pUserProc->GetParameters().push_back( new Parameter( *pParam, type ) );
+	}
+	foreach( const Parameter *pParam, pBaseMethod->GetUserProc().RealParams() )
+	{
+		Type type = pParam->IsTypeParameter()
+			? actualTypes[pParam->GetFormalTypeIndex()]
+			: *pParam;
+		type.SetPtrLevel( pParam->PtrLevel() );
+
+		pUserProc->RealParams().push_back( new Parameter( *pParam, type ) );
+	}
+
+	// 戻り値のジェネリック型を解決
+	pUserProc->SetReturnType( TemplateExpand_ResolveType( pUserProc->ReturnType(), actualTypes ) );
+
+	compiler.GetObjectModule().meta.GetUserProcs().Put( pUserProc );
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
+
+	LexicalAnalyzer::AddMethod(
+		pNewClass,
+		pUserProc,
+		pBaseMethod->GetAccessibility(),
+		pBaseMethod->IsStatic(),
+		pBaseMethod->IsConst(),
+		pBaseMethod->IsAbstract(),
+		pBaseMethod->IsVirtual(),
+		false,						// isOverride
+		false,						// Override修飾子チェック
+		"",
+		false,
+		-1
+	);
+}
+
+const CClass *LexicalAnalyzer::TemplateExpand( CClass &_class, const Types &actualTypes )
+{
+	// そもそもジェネリック型ではないとき
+	if( !_class.IsGeneric() )
+	{
+		return &_class;
+	}
+
+	// 実型パラメータに値型が含まれないとき
+	bool isValueType = false;
+	foreach( const Type &actualType, actualTypes )
+	{
+		if( actualType.IsValueType() )
+		{
+			isValueType = true;
+		}
+	}
+	if( !isValueType )
+	{
+		return &_class;
+	}
+
+	// 展開済みのクラスがあればそれを返す
+	foreach( const ExpandedTemplateClass *pExpandedTemplateClass, _class.expandedTemplateClasses )
+	{
+		if( pExpandedTemplateClass->GetActualTypes().IsEquals( actualTypes ) )
+		{
+			return &pExpandedTemplateClass->GetClass();
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// 未展開の場合は新たに展開する
+	/////////////////////////////////////////////////////////////////
+
+	// クラスをコピー
+	CClass *pNewClass = new CClass(
+		_class,
+		_class.GetImportedNamespaces(),
+		_class.GetClassType(),
+		_class.GetFormalGenericTypes(),
+		_class.GetSuperClassActualTypeParameters(),
+		_class.GetConstructorMemberSubIndex(),
+		_class.GetDestructorMemberSubIndex(),
+		0,
+		_class.GetFixedAlignment(),
+		actualTypes
+	);
+
+	// 展開済みクラスとして登録
+	_class.expandedTemplateClasses.push_back( new ExpandedTemplateClass( pNewClass, actualTypes ) );
+
+	// 基底クラス
+	if( _class.HasSuperClass() )
+	{
+		Types expandedSuperClassActualTypes;
+		foreach( const Type &superClassActualType, _class.GetSuperClassActualTypeParameters() )
+		{
+			expandedSuperClassActualTypes.push_back( TemplateExpand_ResolveType( superClassActualType, actualTypes ) );
+		}
+
+		const CClass *pExpandedSuperClass = TemplateExpand( *const_cast<CClass *>(&_class.GetSuperClass()), expandedSuperClassActualTypes );
+		pNewClass->InheritsClass( *pExpandedSuperClass, expandedSuperClassActualTypes, -1 );
+	}
+
+	// インターフェイスのジェネリック型を解決
+	foreach( const ::Interface *pInterface, _class.GetInterfaces() )
+	{
+		const CClass *pExpandedInterfaceClass = TemplateExpand( *const_cast<CClass *>(&pInterface->GetClass()), actualTypes );
+		Interface *pExpandedInterface = new ::Interface( pExpandedInterfaceClass, actualTypes );
+		pNewClass->AddInterface( pExpandedInterface );
+
+		// インターフェイス メソッドのジェネリック型を解決
+		foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() )
+		{
+			if( pMethod->GetUserProc().GetParentClassPtr() == &_class )
+			{
+				// ターゲットクラス内で実装されるメソッドの場合
+				TemplateExpand_ResolveMethod( pMethod, actualTypes, pNewClass );
+			}
+		}
+
+		/////////////////////////////////
+		// オーバーライドチェック
+		/////////////////////////////////
+		if( pExpandedInterface->GetDynamicMethods().size() != pInterface->GetDynamicMethods().size() )
+		{
+			Jenga::Throw( "インターフェイス メソッドのジェネリック型の解決に失敗している" );
+		}
+		else
+		{
+			for( int i=0; i<pInterface->GetDynamicMethods().size(); i++ )
+			{
+				if( pInterface->GetDynamicMethods()[i]->IsAbstract() != pExpandedInterface->GetDynamicMethods()[i]->IsAbstract() )
+				{
+					Jenga::Throw( "テンプレート展開時のオーバーライドに失敗している … " + pInterface->GetDynamicMethods()[i]->GetUserProc().GetFullName() );
+				}
+			}
+		}
+	}
+
+	// メンバのジェネリック型を解決
+	foreach( const Member *pMember, _class.GetDynamicMembers() )
+	{
+		Type type = pMember->GetType();
+		if( type.IsTypeParameter() )
+		{
+			// ジェネリック型だったときは値型に変換
+			type = actualTypes[type.GetFormalTypeIndex()];
+			type.SetPtrLevel( pMember->GetType().PtrLevel() );
+		}
+
+		pNewClass->GetDynamicMembers().push_back(
+			new Member( *pMember, type )
+		);
+	}
+
+	// クラス メソッドのジェネリック型を解決
+	foreach( const CMethod *pMethod, _class.GetDynamicMethods() )
+	{
+		if( pMethod->GetUserProc().GetParentClassPtr() == &_class )
+		{
+			// ターゲットクラス内で実装されるメソッドの場合のみ（その他のメソッドはInheritsClassで継承されているはず）
+			TemplateExpand_ResolveMethod( pMethod, actualTypes, pNewClass );
+		}
+	}
+
+	pNewClass->SetVtblNum( _class.GetVtblNum() );
+
+	pNewClass->Readed();
+
+	return pNewClass;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp	(revision 774)
@@ -0,0 +1,286 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+void LexicalAnalyzer::AddConstEnum( Consts &consts, const NamespaceScopes &namespaceScopes, const char *buffer )
+{
+	extern int cp;
+	int i=0,i2;
+
+	if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return;
+	i+=2;
+
+	//列挙体の名前を取得
+	char temporary[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(IsCommandDelimitation(buffer[i])){
+			temporary[i2]=0;
+			break;
+		}
+		if(!IsVariableChar(buffer[i])){
+			compiler.errorMessenger.Output(1,NULL,i);
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	if(buffer[i]=='\0'){
+		compiler.errorMessenger.Output(22,"Enum",cp);
+		return;
+	}
+
+	int NextValue=0;
+	while(1){
+		i++;
+
+		if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break;
+
+		for(i2=0;;i2++,i++){
+			if(IsCommandDelimitation(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			if(buffer[i]=='='){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+		if(temporary[0]=='\0'){
+			if(buffer[i]=='\0'){
+				compiler.errorMessenger.Output(22,"Enum",cp);
+				break;
+			}
+			continue;
+		}
+
+		if(buffer[i]!='='){
+			NextValue++;
+		}
+		else{
+			char temp2[VN_SIZE];
+			for(i++,i2=0;;i2++,i++){
+				if(IsCommandDelimitation(buffer[i])){
+					temp2[i2]=0;
+					break;
+				}
+				temp2[i2]=buffer[i];
+			}
+
+			_int64 i64data;
+			StaticCalculation(true, temp2,DEF_LONG,&i64data,Type());
+			NextValue=(int)i64data;
+		}
+
+		//定数を追加
+		consts.Add( Symbol( namespaceScopes, temporary ), NextValue);
+	}
+}
+
+void LexicalAnalyzer::CollectConsts( const char *source, Consts &consts, ConstMacros &constMacros )
+{
+	////////////////////////////////////////////
+	// Const命令の情報を取得
+	////////////////////////////////////////////
+
+	int i2;
+	char temporary[1024];
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	for(int i=0;;i++){
+		if( source[i] == '\0' ) break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		if( source[i] == 1 ){
+			if(source[i]==1&&source[i+1]==ESC_CONST){
+				i+=2;
+
+				extern int cp;
+				cp=i;	//エラー用
+
+
+				if(source[i]==1&&source[i+1]==ESC_ENUM){
+					AddConstEnum( consts, namespaceScopes, source+i);
+					continue;
+				}
+
+				for(i2=0;;i++,i2++){
+					if(source[i]=='\"'){
+						temporary[i2]=source[i];
+						for(i++,i2++;;i++,i2++){
+							temporary[i2]=source[i];
+							if(source[i]=='\"') break;
+						}
+						continue;
+					}
+					if(IsCommandDelimitation(source[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=source[i];
+				}
+
+				//名前を取得
+				char name[VN_SIZE];
+				for(i2=0;;i2++){
+					if(temporary[i2]=='\0'){
+						compiler.errorMessenger.Output(10,"Const",cp);
+						return;
+					}
+					if(temporary[i2]=='='||temporary[i2]=='('){
+						name[i2]=0;
+						break;
+					}
+					name[i2]=temporary[i2];
+				}
+
+				//重複チェック
+				if( compiler.GetObjectModule().meta.GetGlobalConstMacros().IsExistDuplicationKeyName( name )
+					|| compiler.GetObjectModule().meta.GetGlobalConsts().IsExistDuplicationKeyName( name ) )
+				{
+					compiler.errorMessenger.Output(15,name,cp);
+					return;
+				}
+
+				if( temporary[i2] == '=' )
+				{
+					// 定数
+					const char *expression = temporary + i2 + 1;
+
+					_int64 i64data;
+					Type resultType;
+					if( StaticCalculation(false, expression, 0, &i64data, resultType) )
+					{
+						consts.Add( Symbol( namespaceScopes, name ), i64data, resultType );
+					}
+				}
+				else
+				{
+					// 定数マクロ
+					const char *params = temporary + i2;
+					if( !constMacros.Add( Symbol( namespaceScopes, name ), params ) )
+					{
+						compiler.errorMessenger.Output( 1, NULL, i );
+					}
+				}
+
+				if(source[i]=='\0') break;
+			}
+			else{
+				int result = JumpStatement( source, i );
+				if( result == -1 ){
+					//エラー
+					return;
+				}
+				else if( result == 1 ){
+					//ジャンプした場合
+					i--;
+				}
+			}
+		}
+	}
+
+	// イテレータを初期化
+	compiler.GetObjectModule().meta.GetGlobalConsts().Iterator_Init();
+	compiler.GetObjectModule().meta.GetGlobalConstMacros().Iterator_Init();
+}
+
+bool LexicalAnalyzer::ConstMacroToExpression( const ConstMacro &constMacro, const char *parameterStr, char *dest )
+{
+	extern HANDLE hHeap;
+	int i2,i3,i4,num;
+	char temporary[VN_SIZE];
+	char *pParms[MAX_PARMS];
+	num=0;
+	i2=0;
+	while(1){
+		i2=GetOneParameter(parameterStr,i2,temporary);
+
+		pParms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(pParms[num],temporary);
+
+		num++;
+		if(parameterStr[i2]=='\0') break;
+	}
+	if( num != constMacro.GetParameters().size() ){
+		extern int cp;
+		for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
+		compiler.errorMessenger.Output(10,constMacro.GetName().c_str(),cp);
+		lstrcpy(dest,"0");
+		return true;
+	}
+
+	i2=0;
+	i4=0;
+	while(1){
+
+		//数式内の項を取得
+		for(i3=0;;i2++,i3++){
+			if(!IsVariableChar( constMacro.GetExpression()[i2] )){
+				temporary[i3]=0;
+				break;
+			}
+			temporary[i3] = constMacro.GetExpression()[i2];
+		}
+
+		//パラメータと照合する
+		for( i3=0; i3<(int)constMacro.GetParameters().size(); i3++ ){
+			if( constMacro.GetParameters()[i3] == temporary ) break;
+		}
+
+		if( i3 == (int)constMacro.GetParameters().size() ){
+			//パラメータでないとき
+			lstrcpy(dest+i4,temporary);
+			i4+=lstrlen(temporary);
+		}
+		else{
+			//パラメータのとき
+			lstrcpy(dest+i4,pParms[i3]);
+			i4+=lstrlen(pParms[i3]);
+		}
+
+		//演算子をコピー
+		for(;;i2++,i4++){
+			if( constMacro.GetExpression()[i2] == 1 ){
+				dest[i4++] = constMacro.GetExpression()[i2++];
+				dest[i4] = constMacro.GetExpression()[i2];
+				continue;
+			}
+			if(IsVariableTopChar( constMacro.GetExpression()[i2] )) break;
+			dest[i4] = constMacro.GetExpression()[i2];
+			if( constMacro.GetExpression()[i2] == '\0' ) break;
+		}
+
+		if( constMacro.GetExpression()[i2] == '\0' ) break;
+	}
+
+	for(i2=0;i2<num;i2++) HeapDefaultFree(pParms[i2]);
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp	(revision 774)
@@ -0,0 +1,271 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+void LexicalAnalyzer::CollectDelegates( const char *source, Delegates &delegates )
+{
+	int i2;
+	char temporary[VN_SIZE];
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Imports情報のクリア
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	int length = lstrlen( source );
+	for( int i=0; i<length; i++ )
+	{
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,i );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED )
+		{
+			// Imports情報のクリア
+			compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+			continue;
+		}
+
+		else if( source[i] == 1 && source[i+1] == ESC_DELEGATE )
+		{
+			int nowLine = i;
+
+			i += 2;
+			if( !( source[i] == 1 && ( source[i+1] == ESC_SUB || source[i+1] == ESC_FUNCTION ) ) )
+			{
+				compiler.errorMessenger.Output(1,NULL,i);
+				continue;
+			}
+
+			Procedure::Kind procKind = Procedure::Sub;
+			if( source[i+1] == ESC_FUNCTION )
+			{
+				procKind = Procedure::Function;
+			}
+			i += 2;
+
+			// 名前
+			char name[VN_SIZE];
+			GetIdentifierToken( name, source, i );
+
+			if( source[i] != '(' )
+			{
+				compiler.errorMessenger.Output(1,NULL,nowLine);
+				continue;
+			}
+
+			// パラメータ文字列
+			char paramStr[8192];
+			i += GetStringInPare( paramStr, source + i, true );
+
+			// 戻り値の型の文字列
+			char returnTypeName[VN_SIZE] = "";
+			if( source[i] == 1 && source[i+1] == ESC_AS )
+			{
+				i += 2;
+				GetCommandToken( returnTypeName, source, i );
+
+				if( procKind != Procedure::Function )
+				{
+					compiler.errorMessenger.Output(38,name,nowLine);
+				}
+			}
+			else
+			{
+				if( procKind == Procedure::Function )
+				{
+					compiler.errorMessenger.Output(-104,name,nowLine);
+					lstrcpy( returnTypeName, "Double" );
+				}
+			}
+
+			delegates.Put( new Delegate( Symbol( namespaceScopes, name ), compiler.GetNamespaceSupporter().GetImportedNamespaces(), procKind, paramStr, returnTypeName, nowLine ) );
+		}
+	}
+}
+
+std::string LexicalAnalyzer::GenerateDelegatesSourceCode( const Delegates &delegates )
+{
+	std::string destSource = "";
+
+	Jenga::Common::SourceTemplate sourceTemplate( ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\templates\\delegate_class.tab" );
+
+	delegates.Iterator_Reset();
+	while( delegates.Iterator_HasNext() )
+	{
+		const Delegate &dg = *delegates.Iterator_GetNext();
+
+		if( dg.IsExternal() )
+		{
+			// 静的リンクライブラリの場合は飛ばす（既にインスタンスが定義済みであるため）
+			continue;
+		}
+
+		std::map<std::string,std::string> values;
+
+		if( dg.GetNamespaceScopes().size() )
+		{
+			std::string namespaceScopesCommandStr;
+			std::string endNamespaceScopesCommandStr;
+			foreach( const std::string &namespaceStr, dg.GetNamespaceScopes() )
+			{
+				if( namespaceScopesCommandStr.size() )
+				{
+					namespaceScopesCommandStr += ':';
+					endNamespaceScopesCommandStr += ':';
+				}
+				namespaceScopesCommandStr += "Namespace " + namespaceStr;
+				endNamespaceScopesCommandStr += "End Namespace";
+			}
+
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#namespace_begin#",
+				namespaceScopesCommandStr
+			) );
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#namespace_end#",
+				endNamespaceScopesCommandStr
+			) );
+		}
+		else
+		{
+			values.insert( std::map<std::string,std::string>::value_type( "#namespace_begin#", "" ) );
+			values.insert( std::map<std::string,std::string>::value_type( "#namespace_end#", "" ) );
+		}
+
+		values.insert( std::map<std::string,std::string>::value_type( "#name#", dg.GetName() ) );
+
+		if( dg.IsFunction() )
+		{
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#call_method_begin#",
+				(std::string)"Function Call(" + dg.GetParamStr() + ") As " + dg.GetReturnTypeName()
+			) );
+
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#call_method_end#",
+				"End Function"
+			) );
+
+			values.insert( std::map<std::string,std::string>::value_type( "#result#", "Call=" ) );
+		}
+		else
+		{
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#call_method_begin#",
+				(std::string)"Sub Call(" + dg.GetParamStr() + ")"
+			) );
+
+			values.insert( std::map<std::string,std::string>::value_type(
+				"#call_method_end#",
+				"End Sub"
+			) );
+
+			values.insert( std::map<std::string,std::string>::value_type( "#result#", "" ) );
+		}
+
+		// 呼び出し側の実引数文字列を作成
+		Jenga::Common::Strings paramVarNames;
+		LexicalAnalyzer::ExtractParameterVarNames( dg.GetParamStr().c_str(), paramVarNames, dg.GetSourceIndex() );
+		std::string tempParamStrForCall;
+		foreach( const std::string &varName, paramVarNames )
+		{
+			if( !tempParamStrForCall.empty() )
+			{
+				tempParamStrForCall += ",";
+			}
+			tempParamStrForCall += varName;
+		}
+		values.insert( std::map<std::string,std::string>::value_type( "#params#", tempParamStrForCall ) );
+
+		destSource += sourceTemplate.GetResult( values );
+	}
+/*
+	std::ofstream ofs( ( Jenga::Common::Environment::GetAppDir() + "\\generated_delegate_code.log" ).c_str() );
+	ofs << destSource;
+	ofs.close();
+	*/
+
+	return destSource;
+}
+
+void LexicalAnalyzer::RefleshDelegateParameterAndReturnType( Delegate &dg )
+{
+	if( dg.IsExternal() )
+	{
+		// 外部参照の場合はリフレッシュが不要
+		return;
+	}
+
+	compiler.GetNamespaceSupporter().SetImportedNamespaces( dg.GetImportedNamespaces() );
+	compiler.GetNamespaceSupporter().SetLivingNamespaceScopes( dg.GetNamespaceScopes() );
+
+	// パラメータを解析
+	Jenga::Common::Strings parameterStrings;
+	SplitParameter( dg.GetParamStr(), parameterStrings );
+	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( dg.GetParameters(), parameterStrings, dg.GetSourceIndex() );
+
+	// 動的パラメータを作る
+	dg.GetDynamicParams() = dg.GetParameters();
+	dg.GetDynamicParams().insert( dg.GetDynamicParams().begin(), new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
+
+	if( dg.IsFunction() )
+	{
+		// 戻り値を取得
+		Type returnType;
+		if( !compiler.StringToType( dg.GetReturnTypeName(), returnType ) )
+		{
+			compiler.errorMessenger.Output(3,dg.GetReturnTypeName(),dg.GetSourceIndex());
+		}
+		else
+		{
+			dg.SetReturnType( returnType );
+		}
+	}
+}
+
+void LexicalAnalyzer::RefleshDelegatesParameterAndReturnType( Delegates &delegates )
+{
+	delegates.Iterator_Reset();
+	while( delegates.Iterator_HasNext() )
+	{
+		Delegate &dg = *delegates.Iterator_GetNext();
+		RefleshDelegateParameterAndReturnType( dg );
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Enum.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Enum.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Enum.cpp	(revision 774)
@@ -0,0 +1,203 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+void LexicalAnalyzer::CollectEnumMembers( EnumInfo &enumInfo, const char *source, int nowLine )
+{
+	enumInfo.GetEnumMembers().clear();
+
+	int i=nowLine,i2;
+
+	if(!(source[i]==1&&source[i+1]==ESC_ENUM)) return;
+	i+=2;
+
+	//列挙体の名前を取得
+	char temporary[VN_SIZE];
+	for(i2=0;;i++,i2++){
+		if(IsCommandDelimitation(source[i])){
+			temporary[i2]=0;
+			break;
+		}
+		if(!IsVariableChar(source[i])){
+			compiler.errorMessenger.Output(1,NULL,i);
+			break;
+		}
+		temporary[i2]=source[i];
+	}
+
+	if(source[i]=='\0'){
+		compiler.errorMessenger.Output(22,"Enum",nowLine);
+		return;
+	}
+
+	int currentValue = 0;
+	bool isUseCurrentValue = true;
+	std::string currentValueStr;
+	std::string lastMemberName;
+	char temp2[VN_SIZE];
+	while(1){
+		i++;
+
+		if(source[i]==1&&source[i+1]==ESC_ENDENUM) break;
+
+		for(i2=0;;i2++,i++){
+			if(IsCommandDelimitation(source[i])){
+				temporary[i2]=0;
+				break;
+			}
+			if(source[i]=='='){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=source[i];
+		}
+		if(temporary[0]=='\0'){
+			if(source[i]=='\0'){
+				compiler.errorMessenger.Output(22,"Enum",nowLine);
+				break;
+			}
+			continue;
+		}
+
+		if( source[i] != '=' )
+		{
+			if( isUseCurrentValue )
+			{
+				currentValue++;
+
+				sprintf( temp2, "%d", currentValue );
+				currentValueStr = temp2;
+			}
+			else
+			{
+				currentValueStr = lastMemberName + "+1";
+			}
+		}
+		else
+		{
+			i++;
+			GetCommandToken( temp2, source, i );
+
+			_int64 i64data;
+			if( StaticCalculation( false, temp2, 0, &i64data, Type() ) )
+			{
+				currentValue = static_cast<int>(i64data);
+
+				sprintf( temp2, "%d", currentValue );
+				currentValueStr = temp2;
+			}
+			else
+			{
+				// 取得できなかった（なんらかの識別子を含む可能性あり）
+				isUseCurrentValue = false;
+
+				currentValueStr = temp2;
+			}
+		}
+
+		//メンバを追加
+		enumInfo.GetEnumMembers().push_back( EnumMember( temporary, currentValueStr, i ) );
+
+		lastMemberName = temporary;
+	}
+}
+void LexicalAnalyzer::CollectEnums( const char *source, EnumInfoCollection &enums )
+{
+	enums.clear();
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	int i2;
+	char temporary[VN_SIZE];
+	for(int i=0;;i++){
+		if(source[i]=='\0') break;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+
+		if(source[i]==1&&source[i+1]==ESC_ENUM){
+			if(i>=2){
+				if(source[i-2]==1&&source[i-1]==ESC_CONST) continue;
+			}
+
+			i2 = i + 2;
+			GetCommandToken( temporary, source, i2 );
+
+			// 追加
+			enums.push_back( EnumInfo( namespaceScopes, temporary ) );
+
+			// 収集
+			CollectEnumMembers( enums.back(), source, i );
+		}
+	}
+}
+std::string LexicalAnalyzer::GenerateEnumsSourceCode( const EnumInfoCollection &enums )
+{
+	std::string buffer;
+	buffer.reserve(65536);
+
+	foreach( const EnumInfo &enumInfo, enums )
+	{
+		foreach( const std::string &namespaceStr, enumInfo.GetNamespaceScopes() ){
+			buffer.append("Namespace ").append(namespaceStr) += '\n';
+		}
+
+		buffer.append("Class Enum ").append(enumInfo.GetName()) += '\n';
+		buffer.append("\tInherits EnumBase<").append(enumInfo.GetName()).append(">\n");
+		buffer.append("\tSub ").append(enumInfo.GetName()).append("(value As Long,lpszName As LPCTSTR)\n");
+		buffer.append("\t\tEnumBase(value,lpszName)\n"
+			"\tEnd Sub\n"
+			"Public\n");
+		buffer.append("\tSub ").append(enumInfo.GetName()).append("()\n");
+		if( !enumInfo.GetMembers().empty() ){
+			buffer.append("\t\tEnumBase(").append(enumInfo.GetMembers().front().GetName())
+				.append(")\n");
+		}
+		buffer.append("\tEnd Sub\n");
+
+		foreach( const EnumMember &member, enumInfo.GetMembers() )
+		{
+			buffer.append("\tStatic ")
+				.append(member.GetName()).append(" As ")
+				.append(enumInfo.GetName()).append("((")
+				.append(member.GetValueStr()).append(") As Long,\"")
+				.append(member.GetName()).append("\")\n");
+		}
+
+		buffer.append("End Class\n");
+
+		foreach( const std::string &namespaceStr, enumInfo.GetNamespaceScopes() ){
+			buffer.append("End Namespace\n");
+		}
+	}
+
+#ifdef _DEBUG
+	// ログを生成
+	Jenga::Common::Logger logger( Jenga::Common::Environment::GetAppDir() + "\\enum_generated.log", false );
+	logger << buffer << std::endl;
+#endif
+	return buffer;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp	(revision 774)
@@ -0,0 +1,1044 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+bool LexicalAnalyzer::ExtractParameterVarNames( const char *sourceOfParams, Jenga::Common::Strings &paramVarNames, int nowLine )
+{
+	int i = 0;
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	while(1){
+		if(sourceOfParams[i]=='\0') break;
+
+		//ByRef
+		bool isRef;
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		Subscripts subscripts;
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(sourceOfParams[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(sourceOfParams[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(sourceOfParams[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=sourceOfParams[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false ) compiler.errorMessenger.Output(29,NULL,nowLine);
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']'))
+			{
+				subscripts.push_back( LONG_MAX );
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subscripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		paramVarNames.push_back( name );
+
+		//型
+		Type type( DEF_NON );
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS)
+		{
+			i+=2;
+
+			i2=0;
+			while(sourceOfParams[i]=='*'){
+				temporary[i2]=sourceOfParams[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(sourceOfParams[i], true)){
+					if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+						temporary[i2++]=sourceOfParams[i++];
+						temporary[i2]=sourceOfParams[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=sourceOfParams[i];
+			}
+		}
+
+		if(sourceOfParams[i]==','){
+			i++;
+			continue;
+		}
+		else if(sourceOfParams[i]=='\0') break;
+		else{
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			break;
+		}
+	}
+
+	return true;
+}
+
+bool LexicalAnalyzer::AnalyzeParameter( Parameters &params, const Jenga::Common::Strings &parameterStrings, int nowLine )
+{
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	//パラメータ
+	foreach( const std::string &paramStr, parameterStrings )
+	{
+		int i = 0;
+
+		if( paramStr[i] == '\0' )
+		{
+			break;
+		}
+
+		//ByRef
+		bool isRef;
+		if(paramStr[i]==1&&paramStr[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(paramStr[i]==1&&paramStr[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		Subscripts subscripts;
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(paramStr[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,paramStr.c_str()+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(paramStr[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,paramStr.c_str()+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(paramStr[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=paramStr[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false )
+			{
+				compiler.errorMessenger.Output(29,NULL,nowLine);
+			}
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']'))
+			{
+				subscripts.push_back( LONG_MAX );
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subscripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		Type type( DEF_NON );
+		char initValue[8192] = "";
+		if( paramStr[i] == '=' ){
+			i++;
+			i = GetOneParameter( paramStr.c_str(), i, initValue );
+
+			// TODO: エラー用 fix me!!!
+			//cp = nowLine;
+
+			NumOpe_GetType( initValue, GetStringTypeInfo(), type );
+			
+			if( IS_LITERAL(type.GetIndex()) )
+			{
+				type.SetIndex( -1 );
+			}
+		}
+		else if(paramStr[i]==1&&paramStr[i+1]==ESC_AS){
+			// As指定
+			i+=2;
+
+			i2=0;
+			while(paramStr[i]=='*'){
+				temporary[i2]=paramStr[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(paramStr[i], true)){
+					if(paramStr[i]==1&&(paramStr[i+1]==ESC_FUNCTION||paramStr[i+1]==ESC_SUB)){
+						temporary[i2++]=paramStr[i++];
+						temporary[i2]=paramStr[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=paramStr[i];
+			}
+
+			compiler.StringToType( temporary, type );
+
+			if( type.IsNull() ){
+				compiler.errorMessenger.Output(3,temporary,nowLine);
+				type.SetBasicType( DEF_PTR_VOID );
+			}
+
+			if( type.IsObject() ){
+				if( type.GetClass().IsBlittableType() ){
+					// Blittable型のときは基本型として扱う
+					type = type.GetClass().GetBlittableType();
+				}
+			}
+		}
+		else{
+			type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
+			compiler.errorMessenger.Output(-103,temporary,nowLine);
+		}
+
+		Parameter *pParam = new Parameter( name, type, isRef, initValue );
+		if( isArray ){
+			pParam->SetArray( subscripts );
+		}
+
+		//パラメータを追加
+		params.push_back( pParam );
+	}
+
+	return true;
+}
+
+bool LexicalAnalyzer::SetParamsAndReturnTypeForUserProc( UserProc &userProc, const char *sourceOfParams, int nowLine, bool isStatic )
+{
+	int i = 0;
+
+	//ソースコードの位置
+	userProc.SetSourceCodePosition( SourceCodePosition( compiler.GetCurrentRelationalObjectModuleIndexForSource(), nowLine ) );
+
+	//パラメータ
+	if(sourceOfParams[i]!='('){
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return false;
+	}
+	if(sourceOfParams[i + 1]!=')'&& userProc.HasParentClass() ){
+		//クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
+		if(userProc.GetName()[0]=='~'){
+			compiler.errorMessenger.Output(114,NULL,nowLine);
+			return false;
+		}
+	}
+
+	// カッコ内のパラメータ文字列を取得
+	char parametersStr1[8192];
+	char parametersStr2[8192] = "";
+	i += GetStringInPare( parametersStr1, sourceOfParams + i, true );
+	if( sourceOfParams[i] == '(' )
+	{
+		i += GetStringInPare( parametersStr2, sourceOfParams + i, true );
+	}
+
+	// 戻り値文字列を取得
+	char returnTypeStr[VN_SIZE] = "";
+	if( sourceOfParams[i] )
+	{
+		if( sourceOfParams[i] == 1 && sourceOfParams[i+1] == ESC_AS )
+		{
+			if( !userProc.IsFunction() ){
+				// Sub/Macroの場合
+				compiler.errorMessenger.Output(38,userProc.GetName(),nowLine);
+			}
+
+			lstrcpy( returnTypeStr, sourceOfParams + i + 2 );
+		}
+		else
+		{
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return false;
+		}
+	}
+
+	Jenga::Common::Strings parameters;
+
+	// パラメータ
+	SplitParameter( parametersStr1, parameters );
+	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( userProc.GetParameters(), parameters, nowLine );
+
+	// 省略可能パラメータ（古い仕様。非推奨）
+	userProc.SetSecondParmNum( (int)userProc.GetParameters().size() );
+	SplitParameter( parametersStr2, parameters );
+	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( userProc.GetParameters(), parameters, nowLine );
+
+
+	if(returnTypeStr[0]){
+		///////////////////
+		// 戻り値を取得
+		///////////////////
+
+		if( !userProc.IsFunction() ){
+			// Sub/Macroの場合
+			compiler.errorMessenger.Output(38,userProc.GetName(),nowLine);
+		}
+
+		if( userProc.HasParentClass() ){
+			if( userProc.GetName() == userProc.GetParentClassPtr()->GetName() ||
+				userProc.GetName()[0]=='~'){
+				//クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
+				compiler.errorMessenger.Output(115,NULL,nowLine);
+			}
+		}
+
+		compiler.StringToType( returnTypeStr, userProc.ReturnType() );
+		if( userProc.ReturnType().IsNull() )
+		{
+			compiler.errorMessenger.Output(3,returnTypeStr,nowLine);
+		}
+	}
+	else{
+		if( userProc.IsFunction() )
+		{
+			// Function定義なのに、戻り値の型がセットされていない
+			compiler.errorMessenger.Output(-104,userProc.GetName().c_str(),nowLine);
+
+			userProc.ReturnType().SetBasicType( DEF_DOUBLE );
+		}
+		else
+		{
+			//戻り値なしのSub定義
+			userProc.ReturnType().SetNull();
+		}
+	}
+
+	//リアルパラメータ領域を取得（_System_LocalThisを考慮して2つだけ多く確保する場合がある）
+
+	if( userProc.HasParentClass() && isStatic == false ){
+		//オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
+		std::string name = "_System_LocalThis";
+		Type type( DEF_PTR_VOID );
+		userProc.RealParams().push_back( new Parameter( name, type ) );
+	}
+
+	if( userProc.ReturnType().IsStruct() ){
+		//構造体を戻り値として持つ場合
+		//※第一パラメータ（Thisポインタありの場合は第二パラメータ）を戻り値用の参照宣言にする
+
+		std::string name = userProc.GetName();
+		if(name[0]==1&&name[1]==ESC_OPERATOR){
+			name="_System_ReturnValue";
+		}
+		Type type( DEF_STRUCT, userProc.ReturnType().GetIndex() );
+		userProc.RealParams().push_back( new Parameter( name, type, true ) );
+	}
+
+	//パラメータをコピー
+	foreach( Parameter *pParam, userProc.GetParameters() ){
+		userProc.RealParams().push_back( new Parameter( *pParam ) );
+	}
+
+	return true;
+}
+
+bool LexicalAnalyzer::SetParamsAndReturnType( Procedure *pProc, const char *sourceOfParams, bool isSupportEllipse, int nowLine ){
+	int i = 0;
+	int i2,i3,sw;
+	char temporary[8192],temp2[VN_SIZE];
+
+	//ソースコードの位置
+	pProc->SetSourceCodePosition( SourceCodePosition( compiler.GetCurrentRelationalObjectModuleIndexForSource(), nowLine ) );
+
+	//パラメータ
+	if(sourceOfParams[i]!='('){
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return 0;
+	}
+	i++;
+	while(1){
+		if(sourceOfParams[i]==')') break;
+
+		//ByRef
+		bool isRef;
+		if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYVAL){
+			isRef = false;
+			i+=2;
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_BYREF){
+			isRef = true;
+			i+=2;
+		}
+		else isRef = false;
+
+		//パラメータ名
+		bool isArray = false;
+		Subscripts subscripts;
+		char name[VN_SIZE];
+		sw=0;
+		for(i2=0;;i++,i2++){
+			if(sourceOfParams[i]=='('){
+				if(!sw) sw=1;
+
+				i3=GetStringInPare(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(sourceOfParams[i]=='['){
+				if(!sw) sw=1;
+
+				i3=GetStringInBracket(name+i2,sourceOfParams+i);
+				i2+=i3-1;
+				i+=i3-1;
+				continue;
+			}
+			if(!IsVariableChar(sourceOfParams[i])){
+				name[i2]=0;
+				break;
+			}
+			name[i2]=sourceOfParams[i];
+		}
+		if(sw){
+			//配列パラメータ
+			if( isRef == false ) compiler.errorMessenger.Output(29,NULL,nowLine);
+			isArray = true;
+
+			if((name[i2-2]=='('&&name[i2-1]==')')||
+				(name[i2-2]=='['&&name[i2-1]==']'))
+			{
+				subscripts.push_back( LONG_MAX );
+
+				name[i2-2]=0;
+			}
+			else{
+				GetArrange(name,temp2,subscripts);
+				lstrcpy(name,temp2);
+			}
+
+			i2=lstrlen(name);
+		}
+
+		//型
+		Type type( DEF_NON );
+		if( isSupportEllipse && lstrcmp(name,"...")==0 )
+		{
+			type.SetBasicType( DEF_ELLIPSE );
+		}
+		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS)
+		{
+			i+=2;
+
+			i2=0;
+			while(sourceOfParams[i]=='*'){
+				temporary[i2]=sourceOfParams[i];
+				i++;
+				i2++;
+			}
+			for(;;i++,i2++){
+				if(!IsVariableChar(sourceOfParams[i], true)){
+					if(sourceOfParams[i]==1&&(sourceOfParams[i+1]==ESC_FUNCTION||sourceOfParams[i+1]==ESC_SUB)){
+						temporary[i2++]=sourceOfParams[i++];
+						temporary[i2]=sourceOfParams[i];
+						continue;
+					}
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=sourceOfParams[i];
+			}
+
+			compiler.StringToType( temporary, type );
+
+			if( type.IsNull() ){
+				compiler.errorMessenger.Output(3,temporary,nowLine);
+				type.SetBasicType( DEF_PTR_VOID );
+			}
+		}
+		else{
+			type.SetBasicType( Type::GetBasicTypeFromSimpleName(temporary) );
+			compiler.errorMessenger.Output(-103,temporary,nowLine);
+		}
+
+		Parameter *pParam = new Parameter( name, type, isRef );
+		if( isArray ){
+			pParam->SetArray( subscripts );
+		}
+
+		//パラメータを追加
+		pProc->GetParameters().push_back( pParam );
+
+		if(sourceOfParams[i]==','){
+			i++;
+			continue;
+		}
+		else if(sourceOfParams[i]==')') continue;
+		else{
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			break;
+		}
+	}
+	i++;
+
+	if(sourceOfParams[i]){
+		///////////////////
+		// 戻り値を取得
+		///////////////////
+
+		i2=lstrlen(sourceOfParams)-2;
+
+		int sw_as=0;
+		for(;i2>0;i2--){
+			if(sourceOfParams[i2]==')') break;
+
+			if(sourceOfParams[i2]==1&&sourceOfParams[i2+1]==ESC_AS){
+				i2+=2;
+				i3=0;
+				while(sourceOfParams[i2]=='*') temporary[i3++]=sourceOfParams[i2++];
+				for(;;i2++,i3++){
+					if(!IsVariableChar(sourceOfParams[i2], true)){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=sourceOfParams[i2];
+				}
+				compiler.StringToType( temporary, pProc->ReturnType() );
+				if( pProc->ReturnType().IsNull() ) compiler.errorMessenger.Output(3,temporary,nowLine);
+
+				sw_as=1;
+				break;
+			}
+		}
+	}
+	else{
+		//戻り値なしのSub定義
+		pProc->ReturnType().SetNull();
+	}
+
+	//戻り値のエラーチェック
+	if( pProc->IsFunction() ){
+		// Function定義
+
+		if( pProc->ReturnType().IsNull() ){
+			// 戻り値がない
+			compiler.errorMessenger.Output(26,pProc->GetName(),nowLine);
+		}
+	}
+	else{
+		if( !pProc->ReturnType().IsNull() ){
+			// Sub定義なのに、戻り値がある
+			compiler.errorMessenger.Output(38,pProc->GetName(),nowLine);
+		}
+	}
+
+	return true;
+}
+
+UserProc* LexicalAnalyzer::ParseUserProc( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, char *buffer,int nowLine,bool isVirtual,CClass *pobj_c, bool isStatic, char *interfaceName )
+{
+	int i2,i3;
+	char temporary[8192];
+
+	int i=1;
+
+	Procedure::Kind kind = Procedure::Sub;
+	bool isMacro = false;
+	if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function;
+	if(buffer[i]==ESC_MACRO){
+		isMacro = true;
+	}
+
+	i++;
+
+	bool isCdecl = false;
+	bool isExport = false;
+	while(1){
+		if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){
+			isCdecl = true;
+
+			i+=2;
+		}
+		else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){
+			isExport = true;
+
+			i+=2;
+		}
+		else break;
+	}
+
+	i2=0;
+	if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){
+		if(!pobj_c){
+			compiler.errorMessenger.Output(126,NULL,nowLine);
+			return 0;
+		}
+
+		//オペレータの場合
+		temporary[i2++]=buffer[i++];
+		temporary[i2++]=buffer[i++];
+
+		int iCalcId;
+		if(buffer[i]=='='&&buffer[i+1]=='='){
+			iCalcId=CALC_EQUAL;
+			i3=2;
+		}
+		else if(buffer[i]=='='){
+			iCalcId=CALC_SUBSITUATION;
+			i3=1;
+		}
+		else if(buffer[i]=='('){
+			iCalcId=CALC_AS;
+			i3=0;
+		}
+		else if(buffer[i]=='['&&buffer[i+1]==']'&&buffer[i+2]=='='){
+			iCalcId=CALC_ARRAY_SET;
+			i3=3;
+		}
+		else if(buffer[i]=='['&&buffer[i+1]==']'){
+			iCalcId=CALC_ARRAY_GET;
+			i3=2;
+		}
+		else{
+			iCalcId=GetCalcId(buffer+i,&i3);
+			i3++;
+		}
+		if(!iCalcId){
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return 0;
+		}
+		temporary[i2++]=iCalcId;
+		temporary[i2]=0;
+
+		i+=i3;
+	}
+	else{
+		if(pobj_c){
+			//クラスメンバの場合、デストラクタには~が付くことを考慮
+			if(buffer[i]=='~'){
+				temporary[i2]='~';
+				i++;
+				i2++;
+			}
+		}
+
+		for(;;i++,i2++){
+			if(!IsVariableChar(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+
+		char parentName[VN_SIZE], memberName[VN_SIZE];
+		ReferenceKind refKind;
+		if( SplitMemberName( temporary, parentName, memberName, refKind ) )
+		{
+			if( pobj_c )
+			{
+				if( interfaceName )
+				{
+					lstrcpy( interfaceName, parentName );
+				}
+				else
+				{
+					compiler.errorMessenger.OutputFatalError();
+					return NULL;
+				}
+
+				char dummyMemberName[VN_SIZE];
+				if( SplitMemberName( memberName, parentName, dummyMemberName, refKind ) )
+				{
+					compiler.errorMessenger.Output(69,temporary,nowLine);
+					return NULL;
+				}
+			}
+			else
+			{
+				compiler.errorMessenger.Output(68,temporary,nowLine);
+				return NULL;
+			}
+
+			lstrcpy( temporary, memberName );
+		}
+	}
+
+	if( isMacro ){
+		//大文字に変換
+		CharUpper(temporary);
+	}
+
+	if(!pobj_c){
+		//クラスメンバ以外の場合のみ
+		//重複チェック
+
+		if(GetDeclareHash(temporary)){
+			compiler.errorMessenger.Output(15,temporary,nowLine);
+			return 0;
+		}
+	}
+
+	UserProc *pUserProc = new UserProc( Symbol( namespaceScopes, temporary ), importedNamespaces, kind, isMacro, isCdecl, isExport );
+	pUserProc->SetParentClass( pobj_c );
+
+	// 親インターフェイスをセット
+	if( interfaceName && interfaceName[0] )
+	{
+		::Interface *pTargetInterface = NULL;
+		foreach( ::Interface *pInterface, pobj_c->GetInterfaces() )
+		{
+			if( pInterface->GetClass().GetName() == interfaceName )
+			{
+				pTargetInterface = pInterface;
+				break;
+			}
+		}
+		pUserProc->SetInterface( pTargetInterface );
+	}
+
+	if(isExport){
+		pUserProc->Using();
+	}
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	SetParamsAndReturnTypeForUserProc( *pUserProc, buffer + i, nowLine, isStatic );
+
+	pUserProc->_paramStr = buffer + i;
+
+	return pUserProc;
+}
+
+DllProc *LexicalAnalyzer::ParseDllProc(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine)
+{
+	int i2;
+
+	int i=0;
+
+	//Sub/Function
+	Procedure::Kind kind = Procedure::Sub;
+	if(buffer[i]==ESC_SUB){
+	}
+	else if(buffer[i]==ESC_FUNCTION){
+		kind = Procedure::Function;
+	}
+	else{
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return NULL;
+	}
+	i++;
+
+	//プロシージャ名
+	char procName[VN_SIZE];
+	bool isCdecl = false;
+	for(i2=0;;i++,i2++){
+		if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
+			isCdecl = true;
+
+			i+=2;
+			procName[i2]=0;
+			break;
+		}
+		if(buffer[i]==','){
+			procName[i2]=0;
+			break;
+		}
+		if(buffer[i]=='\0'){
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return NULL;
+		}
+		procName[i2]=buffer[i];
+	}
+	i++;
+
+	//ユーザー定義関数との重複チェック
+	if(GetSubHash(procName)){
+		compiler.errorMessenger.Output(15,procName,nowLine);
+		return NULL;
+	}
+
+
+	//ライブラリ
+	char dllFileName[MAX_PATH];
+	i = GetOneParameter( buffer, i, dllFileName );
+	Type resultType;
+	_int64 i64data;
+	if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
+		return NULL;
+	}
+	if( resultType.GetBasicType() != typeOfPtrChar ){
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return NULL;
+	}
+	lstrcpy( dllFileName, (char *)i64data );
+	CharUpper(dllFileName);
+	if(!strstr(dllFileName,".")){
+		lstrcat(dllFileName,".DLL");
+		if(lstrlen(dllFileName)>=16){
+			compiler.errorMessenger.Output(7,NULL,nowLine);
+			return NULL;
+		}
+	}
+
+	//エイリアス
+	char alias[VN_SIZE];
+	i = GetOneParameter( buffer, i, alias );
+	if( alias[0] ){
+		if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
+			return NULL;
+		}
+		if( resultType.GetBasicType() != typeOfPtrChar ){
+			compiler.errorMessenger.Output(1,NULL,nowLine);
+			return NULL;
+		}
+		lstrcpy( alias, (char *)i64data );
+	}
+	else{
+		//省略されたときは関数名
+		lstrcpy( alias, procName );
+	}
+
+
+	// オブジェクトを生成
+	DllProc *pDllProc = new DllProc( Symbol( namespaceScopes, procName ), kind, isCdecl, dllFileName, alias );
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	LexicalAnalyzer::SetParamsAndReturnType( pDllProc, buffer + i, true, nowLine );
+
+	// パラメータのエラーチェック
+	foreach( const Parameter *pParam, pDllProc->Params() ){
+		if( pParam->IsObject() ){
+			compiler.errorMessenger.Output(25,pParam->GetVarName(),nowLine);
+		}
+		if( !pParam->IsRef() ){
+			if( pParam->IsStruct() ){
+				compiler.errorMessenger.Output(28,pParam->GetVarName(),nowLine);
+			}
+		}
+	}
+
+	//戻り値のエラーチェック
+	if( pDllProc->IsFunction() ){
+		// Function定義
+
+		if( pDllProc->ReturnType().IsObject() ){
+			// DLL関数ではオブジェクトを戻り値にできない
+			compiler.errorMessenger.Output(40,pDllProc->GetName(),nowLine);
+		}
+	}
+
+	return pDllProc;
+}
+
+void LexicalAnalyzer::CollectProcedures( const char *source, UserProcs &userProcs, DllProcs &dllProcs )
+{
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char temporary[8192];
+
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Imports情報のクリア
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	i=-1;
+	while(1){
+		i++;
+
+		if(source[i]==1&&(source[i+1]==ESC_CLASS||source[i+1]==ESC_INTERFACE)){
+			/*	Class ～ End Class
+				Interface ～ End Interface
+				を飛び越す			*/
+			i3=GetEndXXXCommand(source[i+1]);
+			for(i+=2,i2=0;;i++,i2++){
+				if(source[i]=='\0') break;
+				if(source[i]==1&&source[i+1]==(char)i3){
+					i++;
+					break;
+				}
+			}
+			if(source[i]=='\0') break;
+			continue;
+		}
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,cp );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED )
+		{
+			// Imports情報のクリア
+			compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+			continue;
+		}
+
+		if(source[i]==1&&source[i+1]==ESC_DECLARE){
+			for(i+=2,i2=0;;i2++,i++){
+				if(source[i]=='\n'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+				if(source[i]=='\0') break;
+			}
+			DllProc *pDllProc = ParseDllProc( namespaceScopes, temporary, i );
+			dllProcs.Put( pDllProc );
+
+			continue;
+		}
+		if(source[i]==1&&(source[i+1]==ESC_SUB||source[i+1]==ESC_FUNCTION||source[i+1]==ESC_MACRO)){
+			char statementChar = source[i+1];
+
+			for(i2=0;;i2++,i++){
+				if(IsCommandDelimitation(source[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+				if(source[i]=='\0') break;
+			}
+
+			UserProc *pUserProc = ParseUserProc( namespaceScopes, compiler.GetNamespaceSupporter().GetImportedNamespaces(), temporary, i, false, NULL, false );
+
+			// 関数を追加
+			if( userProcs.IsExist( pUserProc ) )
+			{
+				// 既に存在している
+				compiler.errorMessenger.Output(15,pUserProc->GetName(),i);
+
+				delete pUserProc;
+			}
+			else
+			{
+				userProcs.Put( pUserProc );
+			}
+
+			/*	Sub ～ End Sub
+				Function ～ End Function
+				Macro ～ End Macro
+				を飛び越す			*/
+			char endStatementChar = GetEndXXXCommand( statementChar );
+			for(i2=0;;i++,i2++){
+				if( source[i] == '\0' ) break;
+				if( source[i] == 1 && source[i+1] == endStatementChar ){
+					i++;
+					break;
+				}
+			}
+			if(source[i]=='\0') break;
+			continue;
+		}
+
+		//次の行
+		for(;;i++){
+			if(IsCommandDelimitation(source[i])) break;
+		}
+		if(source[i]=='\0') break;
+	}
+
+	////////////
+	// 特殊関数
+	////////////
+	namespaceScopes.clear();
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	sprintf(temporary,"%c%c%s()",1,ESC_SUB,compiler.GetGlobalAreaProcName().c_str());
+	UserProc *pUserProc = ParseUserProc( namespaceScopes, compiler.GetNamespaceSupporter().GetImportedNamespaces(), temporary, 0, false, NULL, false );
+
+	// 関数を追加
+	if( userProcs.IsExist( pUserProc ) )
+	{
+		// 既に存在している
+		compiler.errorMessenger.Output(15,pUserProc->GetName(),i);
+
+		delete pUserProc;
+	}
+	else
+	{
+		userProcs.Put( pUserProc );
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_TypeDef.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_TypeDef.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_TypeDef.cpp	(revision 774)
@@ -0,0 +1,192 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+void LexicalAnalyzer::AddTypeDef( TypeDefCollection &typeDefs, const NamespaceScopes &namespaceScopes, const std::string &expression, int nowLine )
+{
+	int i;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(expression[i]=='='||expression[i]=='\0'){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=expression[i];
+	}
+
+	if(expression[i]!='='){
+		compiler.errorMessenger.Output(10,"TypeDef",nowLine);
+		return;
+	}
+
+	const char *pTemp=expression.c_str()+i+1;
+
+	//識別文字のエラーチェック（新しい型）
+	i=0;
+	for(;;i++){
+		if(temporary[i]=='\0') break;
+		if( !( IsVariableChar( temporary[i], true) ) ){
+			compiler.errorMessenger.Output(10,"TypeDef",nowLine);
+			return;
+		}
+	}
+
+	//識別文字のエラーチェック（コピー元の型）
+	if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
+		//関数ポインタ
+		if(pTemp[3]!='('){
+			compiler.errorMessenger.Output(10,"TypeDef",nowLine);
+			return;
+		}
+	}
+	else{
+		i=0;
+		while(pTemp[i]=='*') i++;
+		for(;;i++){
+			if(pTemp[i]=='\0') break;
+			if( !( IsVariableChar( pTemp[i], true) ) )
+			{
+				compiler.errorMessenger.Output(10,"TypeDef",nowLine);
+				return;
+			}
+		}
+	}
+
+	//識別子が重複している場合はエラーにする
+	if(lstrcmp(temporary,pTemp)==0){
+		compiler.errorMessenger.Output(1,NULL,nowLine);
+		return;
+	}
+
+
+
+	//////////////////////////
+	// TypeDef情報を追加
+	//////////////////////////
+
+	Type baseType;
+	if( !compiler.StringToType( pTemp, baseType ) )
+	{
+		compiler.errorMessenger.Output(3, pTemp, nowLine );
+		return;
+	}
+
+	typeDefs.push_back(
+		TypeDef(
+			Symbol( namespaceScopes, temporary ),
+			pTemp,
+			baseType
+		)
+	);
+}
+void LexicalAnalyzer::CollectTypeDefs( const char *source, TypeDefCollection &typeDefs )
+{
+	// 名前空間管理
+	NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
+	namespaceScopes.clear();
+
+	// Imports情報のクリア
+	compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+
+	int i=-1, i2;
+	char temporary[VN_SIZE];
+	while(1){
+
+		i++;
+
+		if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			namespaceScopes.push_back( temporary );
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
+			if( namespaceScopes.size() <= 0 ){
+				compiler.errorMessenger.Output(12, "End Namespace", i );
+			}
+			else{
+				namespaceScopes.pop_back();
+			}
+
+			i += 2;
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
+			for(i+=2,i2=0;;i2++,i++){
+				if( IsCommandDelimitation( source[i] ) ){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=source[i];
+			}
+			if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
+			{
+				compiler.errorMessenger.Output(64,temporary,i );
+			}
+
+			continue;
+		}
+		else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED )
+		{
+			// Imports情報のクリア
+			compiler.GetNamespaceSupporter().ClearImportedNamespaces();
+			continue;
+		}
+
+		if( source[i]==1 ){
+			char temporary[VN_SIZE];
+			if(source[i+1]==ESC_TYPEDEF){
+				int i2 = 0;
+				for(i+=2;;i2++,i++){
+					if(source[i]=='\n'){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=source[i];
+					if(source[i]=='\0') break;
+				}
+				AddTypeDef( typeDefs, namespaceScopes, temporary, i );
+
+				continue;
+			}
+			else if( source[i+1] == ESC_CONST && source[i+2] == 1 && source[i+3] == ESC_ENUM ){
+				int i2 = 0;
+				for(i+=4;;i2++,i++){
+					if(!IsVariableChar(source[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=source[i];
+					if(source[i]=='\0') break;
+				}
+
+				Type baseType;
+				if( !compiler.StringToType( "Long", baseType ) )
+				{
+					throw;
+				}
+
+				typeDefs.push_back(
+					TypeDef(
+						Symbol( namespaceScopes, temporary ),
+						"Long",
+						baseType
+					)
+				);
+			}
+		}
+
+		//次の行
+		for(;;i++){
+			if(IsCommandDelimitation(source[i])) break;
+		}
+		if(source[i]=='\0') break;
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalScope.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalScope.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalScope.cpp	(revision 774)
@@ -0,0 +1,183 @@
+#include "stdafx.h"
+
+#include <LexicalScope.h>
+#include <Compiler.h>
+
+#include "../common.h"
+
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+
+void LexicalScope::Break(){
+	//未解放のローカルオブジェクトを解放する
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn( level );
+
+	//jmp ...(Next addr)
+	breakPertialSchedules.push_back(
+		compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+	);
+}
+void LexicalScope::RunScheduleOfBreak(){
+	foreach( const PertialSchedule *pBreakPertialSchedule, breakPertialSchedules )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pBreakPertialSchedule );
+	}
+}
+
+
+
+LexicalScope *LexicalScopes::SearchScope( LexicalScope::SCOPE_TYPE TypeOfStatement ){
+	for( int i = level; i>=0; i-- ){
+		if( ppScopes[i]->GetTypeOfStatement() == TypeOfStatement ){
+			return ppScopes[i];
+		}
+	}
+	return NULL;
+}
+
+void LexicalScopes::Init(int addr){
+	// TODO: エラーチェック
+
+	level = -1;
+	Start( addr, LexicalScope::SCOPE_TYPE_BASE );
+}
+void LexicalScopes::Start( int addr, LexicalScope::SCOPE_TYPE TypeOfStatement ){
+	level++;
+	ppScopes = (LexicalScope **)realloc( ppScopes, ( level + 1 ) * sizeof( LexicalScope * ) );
+	ppScopes[level] = new LexicalScope( level, addr, TypeOfStatement );
+}
+
+int LexicalScopes::GetNowLevel(){
+	return level;
+}
+void LexicalScopes::SetNowLevel( int level ){
+	this->level = level;
+}
+int LexicalScopes::GetStartAddress(){
+	return ppScopes[level]->GetStartAddress();
+}
+
+void LexicalScopes::End(){
+	if( level <= 0 ){
+		compiler.errorMessenger.OutputFatalError();
+		return;
+	}
+
+	//デストラクタを呼ぶ
+	CallDestructorsOfScopeEnd();
+
+	Variables *pVars = compiler.IsGlobalAreaCompiling() ?
+		&compiler.GetObjectModule().meta.GetGlobalVars() :
+		&compiler.GetCompilingUserProc().GetLocalVars();
+
+	//使用済みローカル変数の生存チェックを外す
+	foreach( Variable *pVar, (*pVars) )
+	{
+		if( pVar->isLiving && pVar->GetScopeLevel() == level )
+		{
+			pVar->isLiving = false;
+			pVar->SetScopeEndAddress( compiler.codeGenerator.GetNativeCodeSize() );
+		}
+	}
+
+
+	//スコープ抜け出しスケジュール
+	ppScopes[level]->RunScheduleOfBreak();
+
+
+	//スコープレベルを下げる
+	delete ppScopes[level];
+	level--;
+}
+
+// スコープ終了時のデストラクタ呼び出し
+void LexicalScopes::CallDestructorsOfScopeEnd(){
+
+	Variables *pVariabls = compiler.IsGlobalAreaCompiling() ?
+		&compiler.GetObjectModule().meta.GetGlobalVars() :
+		&compiler.GetCompilingUserProc().GetLocalVars();
+
+
+	int i3;
+	int indexSystemGC=-1;
+	for( i3 = (int)pVariabls->size() - 1; i3 >= 0; i3-- ){		//確保したのと逆順序で解放するため、バックサーチにする
+
+		Variable *pVar = (*pVariabls)[i3];
+
+		if( compiler.IsGlobalAreaCompiling() && GetNowLevel() == 0 ){
+			if( pVar->GetName() == "_System_GC" ){
+				indexSystemGC=i3;
+				continue;
+			}
+		}
+
+		//同一レベルのレキシカルスコープのみを検知
+		if( !pVar->isLiving ) continue;
+		if( pVar->GetScopeLevel() != GetNowLevel() ) continue;
+
+		if( pVar->IsByValStructParameter() ){
+			//構造体パラメータを持つとき
+
+			//メモリを解放する
+
+#ifdef _AMD64_
+			//x64ビットコード
+
+			//mov rcx,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,
+				-pVar->GetOffsetAddress(),
+				MOD_BASE_DISP32,
+				Schedule::None, true)
+			);
+#else
+			//x86コード
+
+			//mov ecx,dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar->GetOffsetAddress(),MOD_BASE_DISP32, Schedule::None, true )
+			);
+
+			//push ecx
+			compiler.codeGenerator.op_push(REG_ECX);
+#endif
+
+			//call free
+			extern const UserProc *pSub_free;
+			compiler.codeGenerator.op_call(pSub_free);
+
+
+			if( compiler.IsGlobalAreaCompiling() ){
+				//ここには来ないハズ
+				compiler.errorMessenger.Output(300,NULL,cp);
+			}
+		}
+	}
+
+	if(indexSystemGC!=-1){
+		//_System_GCオブジェクトのデストラクタの呼び出し処理
+		const CMethod *method = (*pVariabls)[indexSystemGC]->GetType().GetClass().GetDestructorMethod();
+		if( method ){
+			Opcode_CallProc("",&method->GetUserProc(),0,(*pVariabls)[indexSystemGC]->GetName().c_str());
+		}
+	}
+}
+
+// Returnステートメントで発行されるデストラクタを生成
+void LexicalScopes::CallDestructorsOfReturn( int BaseLevel ){
+	//現在のスコープレベルを退避
+	int backupScopeLevel = GetNowLevel();
+
+	for( int i = GetNowLevel(); i >= BaseLevel; i-- ){
+		SetNowLevel( i );
+
+		CallDestructorsOfScopeEnd();
+	}
+
+	//現在のスコープレベルを復元
+	SetNowLevel( backupScopeLevel );
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 774)
@@ -0,0 +1,285 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+
+// データテーブルスケジュール
+void Linker::ResolveDataTableSchedules( long dataSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+			nativeCode.Overwrite(
+				schedule.GetOffset(),
+				static_cast<long>( nativeCode.GetLong( schedule.GetOffset() ) + imageBase + dataSectionBaseOffset )
+			);
+		}
+	}
+
+	foreach( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				dataTable.GetInt64( schedule.GetOffset() ) + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				dataTable.GetLong( schedule.GetOffset() ) + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
+
+// Catchアドレス スケジュール
+void Linker::ResolveCatchAddressSchedules( long codeSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::CatchAddress )
+		{
+			if( nativeCode.GetLong( schedule.GetOffset() ) != 0 )
+			{
+				// 置き換える値が0の場合を除く
+				nativeCode.Overwrite(
+					schedule.GetOffset(),
+					static_cast<long>( nativeCode.GetLong( schedule.GetOffset() ) + schedule.GetUserProc().GetBeginOpAddress() + imageBase + codeSectionBaseOffset )
+				);
+			}
+		}
+	}
+
+	foreach( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::CatchAddress )
+		{
+			if( dataTable.GetLong( schedule.GetOffset() ) != 0 )
+			{
+				// 置き換える値が0の場合を除く
+#ifdef _WIN64
+				dataTable.OverwriteInt64(
+					schedule.GetOffset(),
+					dataTable.GetInt64( schedule.GetOffset() ) + schedule.GetUserProc().GetBeginOpAddress() + imageBase + codeSectionBaseOffset
+				);
+#else
+				dataTable.Overwrite(
+					schedule.GetOffset(),
+					dataTable.GetLong( schedule.GetOffset() ) + schedule.GetUserProc().GetBeginOpAddress() + imageBase + codeSectionBaseOffset
+				);
+#endif
+			}
+		}
+	}
+}
+
+// DLL関数スケジュール
+void Linker::ResolveDllProcSchedules( long codeSectionBaseOffset, long importSectionBaseOffset, long lookupSize, long hintSize )
+{
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::DllProc )
+		{
+#ifdef _AMD64_
+			nativeCode.Overwrite(
+				schedule.GetOffset(),
+				static_cast<long>( importSectionBaseOffset + schedule.GetDllProc().GetLookupAddress()
+					- ( codeSectionBaseOffset + schedule.GetOffset() + sizeof(long) ) )
+			);
+#else
+			nativeCode.Overwrite(
+				schedule.GetOffset(),
+				static_cast<long>( imageBase + importSectionBaseOffset + lookupSize + hintSize
+					+ schedule.GetDllProc().GetLookupAddress() )
+			);
+#endif
+		}
+	}
+}
+
+// ユーザ定義関数スケジュール
+void Linker::ResolveUserProcSchedules( long codeSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::UserProc
+			|| schedule.GetType() == Schedule::AddressOf )
+		{
+			if( schedule.GetUserProc().GetBeginOpAddress() == 0
+				&& schedule.GetUserProc().GetEndOpAddress() == 0 )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			if( schedule.GetType() == Schedule::UserProc )
+			{
+				nativeCode.Overwrite(
+					schedule.GetOffset(),
+					static_cast<long>( schedule.GetUserProc().GetBeginOpAddress() - ( schedule.GetOffset() + sizeof(long) ) )
+				);
+			}
+			else if( schedule.GetType() == Schedule::AddressOf )
+			{
+				nativeCode.Overwrite(
+					schedule.GetOffset(),
+					static_cast<long>( schedule.GetUserProc().GetBeginOpAddress() + imageBase + codeSectionBaseOffset )
+				);
+			}
+		}
+	}
+}
+
+// グローバル変数スケジュール
+void Linker::ResolveGlobalVarSchedules( long rwSectionBaseOffset )
+{
+	int allInitVarSize = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize();
+
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::GlobalVar )
+		{
+			if( nativeCode.GetLong( schedule.GetOffset() ) & 0x80000000 )
+			{
+				nativeCode.Overwrite(
+					schedule.GetOffset(),
+					static_cast<long>( allInitVarSize + (nativeCode.GetLong( schedule.GetOffset() ) & 0x7FFFFFFF) + imageBase + rwSectionBaseOffset )
+				);
+			}
+			else
+			{
+				nativeCode.Overwrite(
+					schedule.GetOffset(),
+					static_cast<long>( nativeCode.GetLong( schedule.GetOffset() ) + imageBase + rwSectionBaseOffset )
+				);
+			}
+		}
+	}
+}
+
+void Linker::ResolveVtblSchedule( long dataSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, nativeCode.GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::ComVtbl )
+		{
+			LONG_PTR vtblOffset = schedule.GetClass().GetComVtblOffset();
+
+			nativeCode.Overwrite(
+				schedule.GetOffset(),
+				static_cast<long>( vtblOffset + imageBase + dataSectionBaseOffset )
+			);
+		}
+
+		if( schedule.GetType() == Schedule::Vtbl )
+		{
+			LONG_PTR vtblMasterListOffset = schedule.GetClass().GetVtblMasterListOffset();
+
+			nativeCode.Overwrite(
+				schedule.GetOffset(),
+				static_cast<long>( vtblMasterListOffset + imageBase + dataSectionBaseOffset )
+			);
+		}
+	}
+
+	foreach( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::ComVtbl )
+		{
+			LONG_PTR vtblOffset = schedule.GetClass().GetComVtblOffset();
+
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				vtblOffset + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				vtblOffset + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+
+		if( schedule.GetType() == Schedule::Vtbl )
+		{
+			LONG_PTR vtblMasterListOffset = schedule.GetClass().GetVtblMasterListOffset();
+
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				vtblMasterListOffset + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				vtblMasterListOffset + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
+
+void Linker::ResolveTypeInfoSchedule( long dataSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, dataTable.schedules )
+	{
+		if( schedule.GetType() == Schedule::TypeInfo )
+		{
+			LONG_PTR typeInfoDataTableOffset = schedule.GetClass().GetTypeInfoDataTableOffset();
+
+#ifdef _WIN64
+			dataTable.OverwriteInt64(
+				schedule.GetOffset(),
+				typeInfoDataTableOffset + imageBase + dataSectionBaseOffset
+			);
+#else
+			dataTable.Overwrite(
+				schedule.GetOffset(),
+				typeInfoDataTableOffset + imageBase + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
+
+void Linker::Link( ObjectModule &masterObjectModule )
+{
+	// nativeCodeは初期状態でなければならない
+	if( nativeCode.GetSize() > 0 )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	nativeCode.PutEx( masterObjectModule.globalNativeCode );
+
+	masterObjectModule.meta.GetUserProcs().Iterator_Reset();
+	while( masterObjectModule.meta.GetUserProcs().Iterator_HasNext() )
+	{
+		const UserProc *pUserProc = masterObjectModule.meta.GetUserProcs().Iterator_GetNext();
+
+		if( pUserProc->GetNativeCode().GetSize() > 0 )
+		{
+			// 関数の開始位置（コードセクションからのオフセット）
+			int beginCodePos = nativeCode.GetSize();
+
+			// コードセクションに関数のネイティブコードを追加
+			nativeCode.PutEx( pUserProc->GetNativeCode() );
+
+			// 関数の終了位置（コードセクションからのオフセット）
+			int endCodePos = nativeCode.GetSize();
+
+			// コードセクション内の関数の範囲を設定
+			pUserProc->SetBeginOpAddress( beginCodePos );
+			pUserProc->SetEndOpAddress( endCodePos );
+		}
+	}
+}
+
+void Linker::SetDataTable( DataTable &dataTable )
+{
+	this->dataTable.Add( dataTable );
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Messenger.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Messenger.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Messenger.cpp	(revision 774)
@@ -0,0 +1,491 @@
+#include "stdafx.h"
+
+void Messenger::Output( const std::string &message )
+{
+	////////////////////////////////////////////////////////////////////
+	// エディットコントロールに出力
+	////////////////////////////////////////////////////////////////////
+	extern HWND hMainDlg;
+
+	// 出力先のエディットコントロールが無効化されていたときはクリアして有効化する
+	if( !IsWindowEnabled( GetDlgItem(hMainDlg,IDC_ERRORLIST) ) )
+	{
+		SetDlgItemText( hMainDlg, IDC_ERRORLIST, "" );
+		EnableWindow( GetDlgItem( hMainDlg, IDC_ERRORLIST ), TRUE );
+	}
+
+	// エディットコントロールに出力
+	int i2 = GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
+	SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_SETSEL,i2,i2);
+	SendDlgItemMessage(hMainDlg,IDC_ERRORLIST,EM_REPLACESEL,0,(LPARAM)(message + "\r\n").c_str());
+
+
+	// ログに出力
+	trace( message );
+
+	// 標準出力
+	std::cout << message << std::endl;
+}
+int Messenger::GetNextErrorLine()
+{
+	extern HWND hMainDlg;
+	int index = GetWindowTextLength(GetDlgItem(hMainDlg,IDC_ERRORLIST));
+	return static_cast<int>(SendMessage(GetDlgItem(hMainDlg,IDC_ERRORLIST),EM_LINEFROMCHAR,index,0));
+}
+
+ErrorInfo::ErrorInfo( int errorCode, const std::string &keyword, int sourceIndex )
+	: errorCode( errorCode )
+	, keyword( keyword )
+	, sourceFilePath( "" )
+	, sourceLineNum( -1 )
+{
+	if( sourceIndex != -1 )
+	{
+		compiler.GetCurrentSource().GetLineInfo( sourceIndex, sourceLineNum, sourceFilePath );
+	}
+
+	errorLineNum = compiler.messenger.GetNextErrorLine();
+}
+
+std::string ErrorInfo::GetMessageString() const
+{
+	extern HANDLE hHeap;
+	int i2;
+	char temporary[64];
+
+	char tempKeyWord[1024];
+	lstrcpy(tempKeyWord,keyword.c_str());
+	for(i2=0;;i2++){
+		if(tempKeyWord[i2]=='\0') break;
+		if(tempKeyWord[i2]==1){
+			GetDefaultNameFromES(tempKeyWord[i2+1],temporary);
+			SlideString(tempKeyWord+i2+2,lstrlen(temporary)-2);
+			memcpy(tempKeyWord+i2,temporary,lstrlen(temporary));
+		}
+	}
+
+	if( errorCode == -1 || errorCode == -2 )
+	{
+		// 部分エラー
+		return keyword;
+	}
+
+	char msg[1024];
+	if(errorCode==3)
+	{
+		for( int i3=0; ; i3++ )
+		{
+			if( !IsVariableChar( tempKeyWord[i3] ) )
+			{
+				temporary[i3] = 0;
+				break;
+			}
+			temporary[i3] = tempKeyWord[i3];
+		}
+
+#if defined(JPN)
+		//日本語
+		sprintf(msg,"\"%s\" 無効な識別子です",temporary);
+#else
+		//英語
+		sprintf(msg,"\"%s\" Invalid identifier.",temporary);
+#endif
+
+	}
+	if(errorCode==30){
+#if defined(JPN)
+		//日本語
+		if(temporary[0]) sprintf(msg,"\"%s\" の使い方が不正です",tempKeyWord);
+		else lstrcpy(msg,"文法が間違っています");
+#else
+		//英語
+		if(temporary[0]) sprintf(msg,"How to use the \"%s\" is wrong.",tempKeyWord);
+		else lstrcpy(msg,"Syntax Error.");
+#endif
+	}
+
+
+	/////////////////////
+	// ワーニングエラー
+	/////////////////////
+#if defined(JPN)
+	////////////////////
+	//日本語
+	////////////////////
+	if(errorCode==-101) sprintf(msg,"[警告] %sに強制変換されています。データが失われる可能性があります。",tempKeyWord);
+	if(errorCode==-102) sprintf(msg,"[警告] %sに強制変換されています。",tempKeyWord);
+	if(errorCode==-103) sprintf(msg,"[警告] \"%s\" 型が指定されていません。Double型として扱います。",tempKeyWord);
+	if(errorCode==-104) sprintf(msg,"[警告] \"%s\" 戻り値の型が指定されていません。Double型として扱います。",tempKeyWord);
+	if(errorCode==-105) sprintf(msg,"[警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。",tempKeyWord);
+	if(errorCode==-106) sprintf(msg,"[警告] DLLファイル \"%s\" が見つかりません。",tempKeyWord);
+	if(errorCode==-107) sprintf(msg,"[警告] DLL関数 \"%s\" を参照できません。",tempKeyWord);
+	if(errorCode==-108) lstrcpy(msg,"[警告] Catch節、Finally節を持たない意味のないTryスコープです。");
+	if(errorCode==-120) sprintf(msg,"[警告] VarPtr関数の引数にオブジェクト インスタンスが指定されました。オブジェクトの先頭アドレスを取得したいときはObjPtr関数に切り替えをお願いします。m(__)m（この警告はVarPtr→ObjPtrへの切り替えが完了したら消します（切り替えは \"適材箇所に限り\" ですので、ご注意ください！））",tempKeyWord);
+#else
+#endif
+
+
+	///////////////
+	// 一般エラー
+	///////////////
+
+#if defined(JPN)
+	////////////////////
+	//日本語
+	////////////////////
+	if(errorCode==1) lstrcpy(msg,"文法が間違っています。");
+	if(errorCode==2) sprintf(msg,"左のオペランドが、左辺値になっていません。");
+	//errorCode==3は予約されています
+	if(errorCode==4) sprintf(msg,"%sの相互関係が一致しません。",tempKeyWord);
+	if(errorCode==5) sprintf(msg,"ダブルクォートの数が一致しません。");
+	if(errorCode==6) sprintf(msg,"\"%s\" ジャンプ先が不正です。",tempKeyWord);
+	if(errorCode==7) lstrcpy(msg,"DLL名が長すぎます（拡張子を含め、16文字以下にして下さい）。");
+	if(errorCode==8) lstrcpy(msg,"コンパイラが認識できない文字コードが含まれています。");
+	if(errorCode==9) sprintf(msg,"型が違います。");
+	if(errorCode==10) sprintf(msg,"\"%s\" のパラメータ指定が間違っています。",tempKeyWord);
+	if(errorCode==11) sprintf(msg,"\"%s\" 型が違います。",tempKeyWord);
+	if(errorCode==12) sprintf(msg,"%s の使い方が不正です。",tempKeyWord);
+	if(errorCode==13) sprintf(msg,"\"%s\" を参照できません。",tempKeyWord);
+	if(errorCode==14) sprintf(msg,"\"%s\" 配列指定が不正です。",tempKeyWord);
+	if(errorCode==15) sprintf(msg,"\"%s\" はすでに定義されています。",tempKeyWord);
+	if(errorCode==16) sprintf(msg,"\"%s\" 配列、またはポインタ以外の変数に添え字が指定されています。",tempKeyWord);
+	if(errorCode==17) sprintf(msg,"リソース データが不正です。");
+	if(errorCode==18) sprintf(msg,"\"%s\"はポインタ変数型です。文字列演算を指定することはできません。",tempKeyWord);
+	if(errorCode==19) sprintf(msg,"\"%s\"は値参照型です。ByVal指定することはできません。",tempKeyWord);
+	if(errorCode==20) lstrcpy(msg,"全角スペースが含まれています（全角スペースはコンパイラが認識できないので、半角スペースまたはタブ文字にしてください）。");
+	if(errorCode==21) sprintf(msg,"If制御のブロック指定が不正です。");
+	if(errorCode==22) sprintf(msg,"%s に対する End %s が見つかりません。",tempKeyWord,tempKeyWord);
+	if(errorCode==23) sprintf(msg,"リソース ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
+	if(errorCode==24) lstrcpy(msg,"Export指定の関数のパラメータには実体オブジェクトを利用することはできません（BytePtr型などを利用して下さい）。");
+	if(errorCode==25) sprintf(msg,"DLL関数にオブジェクトを引き渡すことはできません(%s)。",tempKeyWord);
+	if(errorCode==26) sprintf(msg,"\"%s\" 戻り値の型が指定されていません。",tempKeyWord);
+	if(errorCode==27) sprintf(msg,"\"%s\" は定義されていません。",tempKeyWord);
+	if(errorCode==28) sprintf(msg,"構造体パラメータは参照渡しにしてください(%s)。",tempKeyWord);
+	if(errorCode==29) sprintf(msg,"配列ポインタを要素と同時に引渡すときは、ポインタ参照（ByRef）にしてください。");
+	//errorCode==30は予約されています
+	if(errorCode==31) sprintf(msg,"\"%s\" は構造体です（メンバの参照はピリオド \".\" で区切ってください）。",tempKeyWord);
+	if(errorCode==32) sprintf(msg,"\"%s\" は構造体ポインタです（メンバの参照は \"->\" で区切ってください）。",tempKeyWord);
+	if(errorCode==33) sprintf(msg,"定数式にリテラル値、または定数以外のものが含まれています。");
+	if(errorCode==34) sprintf(msg,"定数はモジュールレベルで宣言して下さい。");
+	if(errorCode==35) sprintf(msg,"インクルードファイル \"%s\" をオープンできません",tempKeyWord);
+	if(errorCode==38) sprintf(msg,"\"%s\" 戻り値が存在しないプロシージャです。",tempKeyWord);
+	if(errorCode==39) sprintf(msg,"\"%s\" はオブジェクトポインタではありません（\"->\" 参照はできません）。",tempKeyWord);
+	if(errorCode==40) lstrcpy(msg,"DLL関数の戻り値としてオブジェクトを受け取ることはできません。");
+	if(errorCode==41) lstrcpy(msg,"初期データが不正です。");
+	if(errorCode==42) lstrcpy(msg,"閉じカッコ \")\" の後に不正な文字が含まれています。");
+	if(errorCode==43) lstrcpy(msg,"ダブルクォートの後に不正な文字が含まれています。");
+	if(errorCode==45) sprintf(msg,"実数に対して \"%s\" 演算子は利用できません。",tempKeyWord);
+	if(errorCode==46) lstrcpy(msg,"配列の添え字に整数以外の値が与えられています。");
+	if(errorCode==47) lstrcpy(msg,"As演算子の右辺値に型名以外の識別子が指定されています。");
+	if(errorCode==48) sprintf(msg,"%s演算子に対して型名が指定されています。",tempKeyWord);
+	if(errorCode==49) lstrcpy(msg,"添え字に整数以外の型が指定されています。");
+	if(errorCode==50) sprintf(msg,"%sに変換できません。",tempKeyWord);
+	if(errorCode==51) lstrcpy(msg,"オブジェクト、構造体のアラインメント値は 1, 2, 4, 8, 16 のいずれかでなければなりません。");
+	if(errorCode==52) sprintf(msg,"\"%s\" オーバーロードを解決できません。",tempKeyWord);
+	if(errorCode==53) sprintf(msg,"\"%s\" 出力ファイルの書き込みに失敗しました。実行されている可能性があります。",tempKeyWord);
+	if(errorCode==54) sprintf(msg,"対応する%sが存在しません。",tempKeyWord);
+	if(errorCode==55) sprintf(msg,"\"%s\" は対応するForステートメントで利用されるカウンタ変数ではありません。",tempKeyWord);
+	if(errorCode==56) lstrcpy(msg,"ゼロ割りが行われました。");
+	if(errorCode==57) lstrcpy(msg,"8進数のリテラル表記が不正です。");
+	if(errorCode==58) lstrcpy(msg,"16進数のリテラル表記が不正です。");
+	if(errorCode==59) sprintf(msg,"マニフェスト ファイル \"%s\" の読み込みに失敗。",tempKeyWord);
+	if(errorCode==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。");
+	if(errorCode==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",tempKeyWord);
+	if(errorCode==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",tempKeyWord);
+	if(errorCode==63) lstrcpy(msg,"名前空間が正しく閉じられていません。");
+	if(errorCode==64) sprintf(msg,"\"%s\" 無効な名前空間です。",tempKeyWord);
+	if(errorCode==65) sprintf(msg,"ローカル領域で%sは使用できません。",tempKeyWord);
+	if(errorCode==66) sprintf(msg,"%s 要求されている関数ポインタのパラメータまたは戻り値が一致しません。", tempKeyWord );
+	if(errorCode==67) sprintf(msg,"%s 要求されているデリゲートのパラメータまたは戻り値が一致しません。", tempKeyWord );
+	if(errorCode==68) sprintf(msg,"\"%s\" 不正な関数名です。", tempKeyWord);
+	if(errorCode==69) sprintf(msg,"\"%s\" 不正なメソッド名です。", tempKeyWord);
+	if(errorCode==70) lstrcpy(msg,"一つのTryに対して複数のFinallyを記述できません。");
+	if(errorCode==71) lstrcpy(msg,"Finallyの後ろにCatchを記述することはできません。");
+	if(errorCode==72) lstrcpy(msg,"Catchのパラメータの型が指定されていません。");
+	if(errorCode==73) lstrcpy(msg,"\"%s\" Catchのパラメータの型はクラス型でなければなりません。");
+	if(errorCode==74) sprintf(msg,"\"%s\" 型として認識できません。",tempKeyWord);
+
+
+	//オブジェクト関連
+	if(errorCode==102) sprintf(msg,"\"%s\" オブジェクトは定義されていません。",tempKeyWord);
+	if(errorCode==103) sprintf(msg,"\"%s\" メンバは定義されていません。",tempKeyWord);
+	if(errorCode==104) sprintf(msg,"\"%s\" 参照方法が違います。",tempKeyWord);
+	if(errorCode==105) sprintf(msg,"\"%s\" 自身のクラスを継承することはできません。",tempKeyWord);
+	if(errorCode==106) sprintf(msg,"\"%s\" 存在しないクラスです。",tempKeyWord);
+	if(errorCode==107) sprintf(msg,"Privateメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
+	if(errorCode==108) sprintf(msg,"Protectedメンバ \"%s\" にアクセスすることはできません。",tempKeyWord);
+	if(errorCode==109) sprintf(msg,"Privateメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
+	if(errorCode==110) sprintf(msg,"Protectedメンバ関数 \"%s\" を呼び出すことはできません。",tempKeyWord);
+	if(errorCode==111) lstrcpy(msg,"InheritsはClass定義内の先頭に記述する必要があります。");
+	if(errorCode==112) sprintf(msg,"\"%s\" はクラス型ではないため、初期パラメータを指定することはできません。",tempKeyWord);
+	if(errorCode==113) sprintf(msg,"\"%s\" コンストラクタへ渡すパラメータが不正です。",tempKeyWord);
+	if(errorCode==114) lstrcpy(msg,"デストラクタはパラメータを持てません。");
+	if(errorCode==115) lstrcpy(msg,"コンストラクタ及びデストラクタは戻り値を持てません。");
+	//if(errorCode==116) lstrcpy(msg,"コンストラクタ及びデストラクタはパブリックアクセスにしなければなりません。");
+	if(errorCode==117) lstrcpy(msg,"デストラクタの名前が \"~クラス名\" になっていません。");
+	if(errorCode==118) lstrcpy(msg,"参照する基底クラスが存在しません。");
+	if(errorCode==119) sprintf(msg,"\"%s\" メンバは基底クラスで定義されていません。",tempKeyWord);
+	if(errorCode==120) lstrcpy(msg,"デストラクトするオブジェクトの型が不明です。");
+	if(errorCode==121) lstrcpy(msg,"New演算子にはクラス以外の型を指定できません。");
+	if(errorCode==122) lstrcpy(msg,"Delete演算子にポインタ以外の型が指定されています。");
+	if(errorCode==123) lstrcpy(msg,"ループ継承が行われました。");
+	if(errorCode==124) lstrcpy(msg,"循環参照が行われました。");
+	if(errorCode==125) sprintf(msg,"\"%s\" は抽象クラスです。インスタンス化することはできません。",tempKeyWord);
+	if(errorCode==126) lstrcpy(msg,"オペレータのオーバーロードをクラスの外で行うことはできません。");
+	if(errorCode==127) lstrcpy(msg,"Override修飾子の指定が無い状況でオーバーライドを行うことはできません。");
+	if(errorCode==128) lstrcpy(msg,"オーバーライドを行うときはアクセシビリティを同一にしなければなりません。");
+	if(errorCode==129) sprintf(msg,"静的メンバ \"%s\" は定義されていません。",tempKeyWord);
+	if(errorCode==130) sprintf(msg,"\"%s\" はオブジェクト定数です。書き込みアクセスはできません。",tempKeyWord);
+	if(errorCode==131) lstrcpy(msg,"Const定義されたメソッド内でクラスメンバへの書き込みアクセスはできません。");
+	if(errorCode==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
+	if(errorCode==133) lstrcpy(msg,"Thisに代入はできません。");
+	if(errorCode==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
+	if(errorCode==135) lstrcpy( msg, "クラス以外の型を継承元として指定することはできません。" );
+	if(errorCode==136) sprintf( msg, "\"%s\" 非仮想関数に対してオーバーライドしようとしました。", tempKeyWord );
+	if(errorCode==137) lstrcpy(msg,"ImplementsはClass定義内の先頭に記述する必要があります。");
+	if(errorCode==138) sprintf(msg,"%s はインターフェイスではありません。Implementsできるのはインターフェイスに限ります。",tempKeyWord);
+	if(errorCode==139) sprintf(msg,"%s はインターフェイスではありません。",tempKeyWord);
+	if(errorCode==140) lstrcpy(msg,"Align修飾子を構造体以外の型に指定することはできません。");
+	if(errorCode==141) lstrcpy(msg,"Blittable修飾子をクラス以外の型に指定することはできません。");
+	if(errorCode==142) lstrcpy(msg,"不正なThis参照です。");
+	if(errorCode==143) sprintf(msg,"\"%s\" ジェネリクス型に型パラメータが指定されていません。",tempKeyWord);
+	if(errorCode==144) sprintf(msg,"Thisの変数ポインタを取得することはできません。",tempKeyWord);
+	if(errorCode==145) sprintf(msg,"コンストラクタを直接呼び出すことはできません。。",tempKeyWord);
+	if(errorCode==146) sprintf(msg,"デストラクタを直接呼び出すことはできません。。",tempKeyWord);
+
+	//Enum関連
+	if(errorCode==150) sprintf(msg,"\"%s\" 値が定義されていません。",tempKeyWord);
+	if(errorCode==151) sprintf(msg,"\"%s\" 列挙リストに登録されていません。",tempKeyWord);
+
+	//リンカ
+	if(errorCode==200) sprintf(msg,"\"%s\" 未解決です (リンク エラー)。",tempKeyWord);
+	if(errorCode==201) sprintf(msg,"\"%s\" の読み込みに失敗。",tempKeyWord);
+	if(errorCode==202) sprintf(msg,"\"%s\" は存在しません。",tempKeyWord);
+	if(errorCode==203) sprintf(msg,"\"%s\" は存在しますが、読み込めません（古いバージョンのコンパイラでビルドされた可能性があります）。",tempKeyWord);
+
+	//原因不明
+	if(errorCode==300) lstrcpy(msg,"内部エラー");
+
+	// ベースライブラリ不整合
+	if( errorCode == 400 )	sprintf( msg, "\"%s\" が存在しません。標準ライブラリの内容が古い可能性があります。", tempKeyWord );
+
+#else
+	////////////////////
+	//英語
+	////////////////////
+	if(errorCode==1) lstrcpy(msg,"Syntax Error.");
+	if(errorCode==2) sprintf(msg,"Left operand must be l-value.");
+	//errorCode==3は予約されています
+	if(errorCode==4) sprintf(msg,"Correlation of %s is wrong.",tempKeyWord);
+	if(errorCode==5) sprintf(msg,"Correlation of double quotes is wrong.");
+	if(errorCode==6) sprintf(msg,"\"%s\" Label not found.",tempKeyWord);
+	if(errorCode==7) lstrcpy(msg,"The DLL name is too long. Must be 16 characters or less.");
+	if(errorCode==8) lstrcpy(msg,"The inaccurate characters are contained.");
+	if(errorCode==9) sprintf(msg,"Type is wrong.");
+	if(errorCode==10) sprintf(msg,"\"%s\" Rule of parameter is wrong.",tempKeyWord);
+	if(errorCode==11) sprintf(msg,"\"%s\" Type is wrong.",tempKeyWord);
+	if(errorCode==12) sprintf(msg,"\"%s\" Not a valid use.",tempKeyWord);
+	if(errorCode==13) sprintf(msg,"Cannot refer to \"%s\".",tempKeyWord);
+	if(errorCode==14) sprintf(msg,"\"%s\" Array argument(s) out of bound.",tempKeyWord);
+	if(errorCode==15) sprintf(msg,"\"%s\" is already defined.",tempKeyWord);
+	if(errorCode==16) sprintf(msg,"\"%s\" Argument(s) following variable which is not pointer or array.",tempKeyWord);
+	if(errorCode==17) sprintf(msg,"Invalid resource data.");
+	if(errorCode==18) sprintf(msg,"\"%s\" Invalid operation on a pointer variable.",tempKeyWord);
+	if(errorCode==19) sprintf(msg,"\"%s\" is already to be passed by value. You cannot use \"ByVal\".",tempKeyWord);
+	if(errorCode==21) sprintf(msg,"Wrong structure of \"If\" block.");
+	if(errorCode==22) sprintf(msg,"No matching \"End %s\" found for \"%s\".",tempKeyWord,tempKeyWord);
+	if(errorCode==23) sprintf(msg,"Cannot read the resource file \"%s\".",tempKeyWord);
+	if(errorCode==24) lstrcpy(msg,"Must not use String type as an argument for exported function. (Use BytePtr type instead.)");
+	if(errorCode==27) sprintf(msg,"\"%s\" Undefined procedure.",tempKeyWord);
+	if(errorCode==28) sprintf(msg,"\"%s\" Structure must not be passed by value. (Use \"ByRef\".)",tempKeyWord);
+	if(errorCode==29) sprintf(msg,"Array must not be passed by value. (Use \"ByRef\".)");
+	//errorCode==30は予約されています
+	if(errorCode==31) sprintf(msg,"\"%s\" is a struct. (Use period \".\" to refer to the members.)",tempKeyWord);
+	if(errorCode==32) sprintf(msg,"\"%s\" is a pointer of struct. (Use arrow \"->\" to refer to the members.)",tempKeyWord);
+	if(errorCode==33) sprintf(msg,"Constant formula has a thing that is not literal value or constant value.");
+	if(errorCode==34) sprintf(msg,"Constant formula must be defined in the module level.");
+	if(errorCode==38) sprintf(msg,"\"%s\" is a procedure without a return value.",tempKeyWord);
+	if(errorCode==39) sprintf(msg,"\"%s\" is not object pointer. \"->\" is invalid.",tempKeyWord);
+	if(errorCode==40) lstrcpy(msg,"Cannot set a object to return value.");
+	if(errorCode==41) lstrcpy(msg,"Init data is wrong.");
+	if(errorCode==42) lstrcpy(msg,"The inaccurate characters are contained after the closing parenthesis \")\".");
+	if(errorCode==43) lstrcpy(msg,"The inaccurate characters are contained after the double quote.");
+
+	//オブジェクト関連
+	if(errorCode==102) sprintf(msg,"\"%s\" The object is not defined.",tempKeyWord);
+	if(errorCode==103) sprintf(msg,"\"%s\" The member is not defined.",tempKeyWord);
+	if(errorCode==104) sprintf(msg,"\"%s\" The reference character is different.",tempKeyWord);
+	if(errorCode==105) sprintf(msg,"\"%s\" An own class is not inheritable.",tempKeyWord);
+	if(errorCode==106) sprintf(msg,"\"%s\" It class is not defined.",tempKeyWord);
+	if(errorCode==107) sprintf(msg,"\"%s\" Cannot access the private member.",tempKeyWord);
+	if(errorCode==108) sprintf(msg,"\"%s\" Cannot access the protected member.",tempKeyWord);
+	if(errorCode==109) sprintf(msg,"\"%s\" Cannot call the private member.",tempKeyWord);
+	if(errorCode==110) sprintf(msg,"\"%s\" Cannot call the protected member.",tempKeyWord);
+	if(errorCode==111) lstrcpy(msg,"The Inherits phrase must be described to the 1st line of class module");
+	if(errorCode==112) sprintf(msg,"\"%s\" is not class object. Therefor you cannot set the parameter for constructor.",tempKeyWord);
+	if(errorCode==113) sprintf(msg,"\"%s\" The parameter for constructor is wrong.",tempKeyWord);
+	if(errorCode==114) lstrcpy(msg,"Destructor cannot have a parameter.");
+	if(errorCode==115) lstrcpy(msg,"Constructor and Destructor cannot have a return value.");
+	if(errorCode==116) lstrcpy(msg,"Constructor and Destructor must be public access.");
+	if(errorCode==117) lstrcpy(msg,"Destructors name must be \"~ClassName\".");
+	if(errorCode==118) lstrcpy(msg,"Super class is not found.");
+	if(errorCode==119) sprintf(msg,"\"%s\" The member is not defined in the super class.",tempKeyWord);
+
+	//Enum関連
+	if(errorCode==150) sprintf(msg,"\"%s\" The value is not set",tempKeyWord);
+	if(errorCode==151) sprintf(msg,"\"%s\" is not found from enum lists.",tempKeyWord);
+
+	//リンカ
+	if(errorCode==200) sprintf(msg,"\"%s\" Unknown error.",tempKeyWord);
+#endif
+
+	return msg;
+}
+
+std::string ErrorInfo::GetFullMessageString() const
+{
+	if( sourceLineNum != -1 )
+	{
+		char temporary[1024];
+		sprintf( temporary, "%s(%d) : %s",
+			sourceFilePath.c_str(),
+			sourceLineNum + 1,
+			GetMessageString().c_str()
+			);
+
+		return temporary;
+	}
+
+	return GetMessageString();
+}
+
+void ErrorMessenger::Output( const ErrorInfo &errorInfo )
+{
+	if( errorInfo.GetErrorCode() == 3 )
+	{
+		if( errorInfo.GetKeyword().size() <= 0 )
+		{
+			// ありえない
+			_ASSERTE( false );
+		}
+
+		if( Jenga::Common::IsExistString( synonymKeyWords, errorInfo.GetKeyword() ) )
+		{
+			// 既にエラーが出力されている場合は無視
+			return;
+		}
+
+		synonymKeyWords.push_back( errorInfo.GetKeyword() );
+	}
+
+	errorInfos.push_back( errorInfo );
+
+	// 文字列を出力
+	Messenger::Output( errorInfo.GetFullMessageString() );
+}
+void ErrorMessenger::Output( int errorCode, const std::string &keyword, int sourceIndex )
+{
+	Output( ErrorInfo( errorCode, keyword, sourceIndex ) );
+}
+void ErrorMessenger::Output( int errorCode, const char *keyword, int sourceIndex )
+{
+	if( !keyword )
+	{
+		keyword = "";
+	}
+	Output( errorCode, std::string( keyword ), sourceIndex );
+}
+void ErrorMessenger::OutputFatalError()
+{
+	Output( 300, "", cp );
+}
+
+void ErrorMessenger::ClearSynonymKeyWords()
+{
+	synonymKeyWords.clear();
+}
+
+int ErrorMessenger::GetErrorCount() const
+{
+	int count = 0;
+	foreach( const ErrorInfo &errorInfo, errorInfos )
+	{
+		if( !errorInfo.IsWarning() )
+		{
+			count ++;
+		}
+	}
+	return count;
+}
+bool ErrorMessenger::HasError() const
+{
+	return ( GetErrorCount() > 0 );
+}
+int ErrorMessenger::GetWarningCount() const
+{
+	int count = 0;
+	foreach( const ErrorInfo &errorInfo, errorInfos )
+	{
+		if( errorInfo.IsWarning() )
+		{
+			count ++;
+		}
+	}
+	return count;
+}
+
+void ErrorMessenger::ShowErrorLine( int errorLineNum )
+{
+	const ErrorInfo *pErrorInfo = NULL;
+	foreach( const ErrorInfo &errorInfo, errorInfos )
+	{
+		if( errorInfo.GetErrorLineNum() == errorLineNum )
+		{
+			pErrorInfo = &errorInfo;
+			break;
+		}
+	}
+
+	if( !pErrorInfo )
+	{
+		// 該当なし
+		return;
+	}
+	if( pErrorInfo->GetSourceLineNum() == -1 )
+	{
+		return;
+	}
+
+	HANDLE hFile;
+	DWORD dw;
+	char FileName[MAX_PATH];
+	char temporary[MAX_PATH];
+
+	lstrcpy( FileName, pErrorInfo->GetSourceFilePath().c_str() );
+
+	if(IsWindow(hOwnerEditor)){
+		if(FileName){
+
+			while( !IsFileExist( FileName ) ){
+				char temp2[MAX_PATH],temp3[MAX_PATH];
+				_splitpath(FileName,NULL,NULL,temp2,temp3);
+				lstrcat(temp2,temp3);
+
+				sprintf(temporary,"\"%s\" が見つかりません。格納されているディレクトリを指定してください。",temp2);
+				if(!GetFolder(hOwnerEditor,temp3,temporary)) return;
+
+				if(temp3[lstrlen(temp3)-1]!='\\') lstrcat(temp3,"\\");
+
+				sprintf(FileName,"%s%s",temp3,temp2);
+			}
+
+			hFile=CreateFile(
+				( ActiveBasic::Common::Environment::GetUserAppDir() + "\\pgm.tmp" ).c_str(),
+				GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL);
+			WriteFile(hFile,FileName,lstrlen(FileName),&dw,NULL);
+			CloseHandle(hFile);
+
+			SendMessage(hOwnerEditor,WM_SHOWERROR,pErrorInfo->GetSourceLineNum(),0);
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp	(revision 774)
@@ -0,0 +1,214 @@
+#include "stdafx.h"
+
+#ifdef _AMD64_
+#include "../../compiler_x64/opcode.h"
+#else
+#include "../../compiler_x86/opcode.h"
+#endif
+
+using namespace ActiveBasic::Compiler;
+
+void ProcedureGenerator::Generate_InitStaticMember( const Classes &classes )
+{
+	//静的メンバをグローバル領域に作成
+
+	//イテレータをリセット
+
+	extern int cp;
+	int back_cp=cp;
+
+	classes.Iterator_Reset();
+	while(classes.Iterator_HasNext()){
+		CClass &objClass = *classes.Iterator_GetNext();
+		if( objClass.IsExternal() )
+		{
+			// 静的リンクライブラリの場合は飛ばす（既にインスタンスが定義済みであるため）
+			continue;
+		}
+
+		// 名前空間をセット
+		compiler.GetNamespaceSupporter().GetLivingNamespaceScopes() = objClass.GetNamespaceScopes();
+
+		DWORD dwFlags = 0;
+		if( objClass.GetName() == "_System_TypeBase" )
+		{
+			// _System_TypeBaseクラスはグローバル、スタティック領域を初期化するためのクラスなのでここでの初期化は除外する
+			dwFlags |= DIMFLAG_NONCALL_CONSTRACTOR;
+		}
+
+		// コンパイル中クラスとしてセット
+		compiler.SetCompilingClass( &objClass );
+
+		const EnumInfo *pEnumInfo = NULL;
+		if( objClass.IsEnum() )
+		{
+			pEnumInfo = compiler.enumInfoCollection.Find( objClass );
+		}
+
+		int i=0;
+		foreach( Member *member, objClass.GetStaticMembers() )
+		{
+			if( pEnumInfo )
+			{
+				cp = pEnumInfo->GetEnumMember( member->GetName() ).GetSourceIndex();
+			}
+
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->GetName().c_str());
+			dim(
+				temporary,
+				member->GetSubscripts(),
+				member->GetType(),
+				member->GetInitializeExpression().c_str(),
+				member->GetConstructParameter().c_str(),
+				dwFlags);
+
+			i++;
+		}
+
+		compiler.SetCompilingClass( NULL );
+	}
+
+	compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().clear();
+
+	cp=back_cp;
+}
+
+void ProcedureGenerator::Generate_System_InitializeUserTypes( const Classes &classes )
+{
+	char temporary[VN_SIZE];
+
+	////////////////////////////////////////////////////////////////////
+	// クラス登録
+	////////////////////////////////////////////////////////////////////
+
+	// イテレータをリセット
+	classes.Iterator_Reset();
+
+	while( classes.Iterator_HasNext() ){
+		const CClass &objClass = *classes.Iterator_GetNext();
+
+		if( !objClass.IsUsing() ){
+			// 未使用のクラスは無視する
+			continue;
+		}
+
+		std::string referenceOffsetsBuffer;
+		int numOfReference = 0;
+		objClass.GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference );
+
+		sprintf( temporary
+			, "Add(%c%c_System_TypeForClass[strNamespace=\"%s\",name=\"%s\",fullName=\"%s\",referenceOffsets=[%s],numOfReference=%d])"
+			, 1
+			, ESC_SYSTEM_STATIC_NEW
+			, objClass.GetNamespaceScopes().ToString().c_str()		// 名前空間
+			, objClass.GetName().c_str()							// クラス名
+			, objClass.GetFullName().c_str()						// フルネーム
+			, referenceOffsetsBuffer.c_str()						// 参照メンバオフセット配列
+			, numOfReference										// 参照メンバの個数
+			);
+
+		// コンパイル
+		ChangeOpcode( temporary );
+
+		objClass.SetTypeInfoDataTableOffset(
+			DataTableGenerator::GetLastMadeConstObjectDataTableOffset()
+		);
+	}
+}
+
+std::string ProcedureGenerator::GetStaticDefiningStringAsMemberTypeInfoNames( const CClass &_class )
+{
+	std::string result;
+
+	foreach( const Member *pMember, _class.GetDynamicMembers() )
+	{
+		if( result.size() )
+		{
+			result += ",";
+		}
+
+		result += "\"" + compiler.TypeToString( pMember->GetType() ) + "\"";
+	}
+
+	return result;
+}
+
+void ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType( const Classes &classes )
+{
+	extern int cp;
+	cp = -1;
+	////////////////////////////////////////////////////////////////////
+	// 基底クラスを登録
+	////////////////////////////////////////////////////////////////////
+
+	char temporary[8192];
+	sprintf(temporary, "%c%ctempType=Nothing%c%c_System_TypeForClass"
+		, HIBYTE( COM_DIM )
+		, LOBYTE( COM_DIM )
+		, 1
+		, ESC_AS
+		);
+	ChangeOpcode( temporary );
+
+	// イテレータをリセット
+	classes.Iterator_Reset();
+
+	while( classes.Iterator_HasNext() ){
+		const CClass &objClass = *classes.Iterator_GetNext();
+
+		if( !objClass.IsUsing() ){
+			// 未使用のクラスは無視する
+			continue;
+		}
+
+		if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){
+			sprintf( temporary
+				, "tempType=Search(\"%s\") As ActiveBasic.Core._System_TypeForClass"
+				, objClass.GetFullName().c_str()
+			);
+
+			// コンパイル
+			MakeMiddleCode( temporary );
+			ChangeOpcode( temporary );
+
+			sprintf( temporary
+				, "tempType.SetClassInfo(%d,_System_GetComVtbl(%s),_System_GetVtblList(%s),_System_GetDefaultConstructor(%s),_System_GetDestructor(%s))"
+				, objClass.GetSize()
+				, objClass.GetFullName().c_str()
+				, objClass.GetFullName().c_str()
+				, objClass.GetFullName().c_str()
+				, objClass.GetFullName().c_str()
+				, objClass.GetName().c_str()
+			);
+
+			// コンパイル
+			ChangeOpcode( temporary );
+
+			if( objClass.HasSuperClass() )
+			{
+				sprintf( temporary
+					, "tempType.SetBaseType(Search(\"%s\"))"
+					, objClass.GetSuperClass().GetFullName().c_str()
+				);
+
+				// コンパイル
+				ChangeOpcode( temporary );
+			}
+
+			if( objClass.GetDynamicMembers().size() )
+			{
+				// メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
+				sprintf(
+					temporary,
+					"tempType.SetMembers([%s],[%s],[%s],%d)",
+					objClass.GetStaticDefiningStringAsMemberNames().c_str(),
+					GetStaticDefiningStringAsMemberTypeInfoNames( objClass ).c_str(),
+					objClass.GetStaticDefiningStringAsMemberOffsets().c_str(),
+					objClass.GetDynamicMembers().size()
+				);
+				ChangeOpcode( temporary );
+			}
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Program.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Program.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Program.cpp	(revision 774)
@@ -0,0 +1,156 @@
+#include "stdafx.h"
+
+Jenga::Common::Logger Program::logger( Program::GetAbcUserAppDir() + "\\logger.log", true );
+
+Program program;
+
+void Program::Configurate()
+{
+	Configuration configuration;
+	const std::string filePath = Jenga::Common::Environment::GetAppDir() + "\\config.xml";
+	if( Jenga::Common::Path( filePath ).IsExistFile() )
+	{
+		configuration.ReadXml( filePath );
+	}
+	else
+	{
+		configuration.WriteXml( filePath );
+	}
+
+	ActiveBasic::Common::Environment::SetAbdevRootPath( configuration.GetAbdevRootRelativePath() );
+}
+
+bool Program::AnalysisCommandLines()
+{
+	// コマンドラインを解析
+	const Jenga::Common::CmdLines cmdLines( PathGetArgs( GetCommandLine() ) );
+	int cmdLineIndex = 0;
+
+	if( cmdLines.size() == 0 )
+	{
+		// 何も指定されていないとき
+		return true;
+	}
+
+	if( cmdLines[cmdLineIndex].IsNamelessCommand() )
+	{
+		// 先頭に無名コマンドがきた場合、ソースファイル名として認識する
+		std::string tempParam = cmdLines[cmdLineIndex].GetParameter();
+		Program::SetSourceFilePath( Jenga::Common::StringReplace( tempParam, "/", "\\" ) );
+
+		cmdLineIndex ++;
+
+		if( cmdLines.size() == 1 )
+		{
+			// ソースファイル名のみの指定だったとき
+			return true;
+		}
+
+		// 出力ファイル名を取得
+		if( cmdLines[cmdLineIndex].IsNamelessCommand() )
+		{
+			// 二番目にも無名コマンドがきた場合、出力ファイル名として認識する
+			std::string tempParam = cmdLines[cmdLineIndex].GetParameter();
+			SetOutputFilePath( Jenga::Common::StringReplace( tempParam, "/", "\\" ) );
+
+			cmdLineIndex ++;
+		}
+	}
+
+	for( ; cmdLineIndex < static_cast<int>(cmdLines.size()); cmdLineIndex++ )
+	{
+		const Jenga::Common::CmdLine &cmdLine = cmdLines[cmdLineIndex];
+
+		if( cmdLine.GetCommand() == "wnd" )
+		{
+			// 親エディタのウィンドウ ハンドル
+			isKickedFromEditor = true;
+			sscanf( cmdLine.GetParameter().c_str(), "%p", &hOwnerEditor );
+		}
+		else if( cmdLine.GetCommand() == "show_dlg" )
+		{
+			isShowDlg = true;
+		}
+		else if( cmdLine.GetCommand() == "debug" )
+		{
+			// デバッグ ビルド
+			compiler.SetDebugMark( true );
+		}
+		else if( cmdLine.GetCommand() == "run" )
+		{
+			// デバッグ実行
+			isDebugRun = true;
+		}
+		else if( cmdLine.GetCommand() == "attach" )
+		{
+			// アタッチ
+			isDebugRun = true;
+			isAttach = true;
+			sscanf( cmdLine.GetParameter().c_str(), "%08x", &attachProcessId );
+		}
+		else if( cmdLine.GetCommand() == "dll" )
+		{
+			// DLLとしてビルド
+			compiler.SetTargetModuleType( ActiveBasic::Common::TargetModuleType::Dll );
+		}
+		else if( cmdLine.GetCommand() == "static_library" )
+		{
+			// 静的リンクライブラリとしてビルド
+			compiler.SetTargetModuleType( ActiveBasic::Common::TargetModuleType::Sll );
+		}
+		else if( cmdLine.GetCommand() == "unicode" )
+		{
+			// Unicode
+			compiler.SetUnicodeMark( true );
+			typeOfPtrChar = MAKE_PTR_TYPE(DEF_WORD,1);
+			typeOfPtrUChar = MAKE_PTR_TYPE(DEF_WORD,1);
+		}
+		else if( cmdLine.GetCommand() == "clip_compile_view" )
+		{
+			//埋め込み型コンパイラビュー
+			isClipCompileView = true;
+		}
+		else if( cmdLine.GetCommand() == "include_dir" )
+		{
+			//インクルード ディレクトリ
+			includeDir = cmdLines[cmdLineIndex].GetParameter();
+
+			// '/' があった場合は '\\' に置換
+			Jenga::Common::StringReplace( includeDir, "/", "\\" );
+		}
+		else if( cmdLine.GetCommand() == "?" || cmdLine.GetCommand() == "help" )
+		{
+			std::cout << "TODO: ActiveBasic command line help." << std::endl;
+		}
+		else
+		{
+			// 不正なコマンド
+			std::string keyword = cmdLine.GetCommand();
+			if( keyword.size() == 0 )
+			{
+				keyword = cmdLine.GetParameter();
+			}
+			std::cout << keyword << " コマンドとして認識できません。" << std::endl;
+			return false;
+		}
+	}
+
+	return true;
+}
+
+const std::string Program::GetAbcUserAppDir()
+{
+	return ActiveBasic::Common::Environment::GetUserAppDir() + "\\abc";
+}
+
+int Program::GetExitCode() const
+{
+	if( !compiler.IsBuildSuccessful() )
+	{
+		// ビルドに失敗
+		return 1;
+	}
+
+	// ビルドに成功
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp	(revision 774)
@@ -0,0 +1,197 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Compiler;
+
+int VtblGenerator::GenerateVTablePart( const Methods &methods )
+{
+	const UserProc **ppsi = (const UserProc **)malloc(methods.GetVtblNum()*sizeof(UserProc *));
+
+	//関数テーブルに値をセット
+	int i2 = 0;
+	foreach( const CMethod *pMethod, methods )
+	{
+		if(pMethod->IsVirtual()){
+			if( !pMethod->GetUserProc().IsUsing() )
+			{
+				//ts((char *)pMethod->GetUserProc().GetFullName().c_str());
+			}
+			pMethod->GetUserProc().Using();
+
+			if(pMethod->IsAbstract())
+			{
+				throw;
+			}
+
+			ppsi[i2]=&pMethod->GetUserProc();
+
+			i2++;
+		}
+	}
+
+	int vtableDataTableOffset = compiler.GetObjectModule().dataTable.AddBinary( (void *)ppsi, methods.GetVtblNum()*sizeof(LONG_PTR) );
+
+	for( int i=0; i < methods.GetVtblNum(); i++ )
+	{
+		pobj_Reloc->AddSchedule_DataSection(static_cast<DWORD>(vtableDataTableOffset+i*sizeof(LONG_PTR)));
+	}
+
+	free(ppsi);
+
+	return vtableDataTableOffset;
+}
+
+void VtblGenerator::GenerateFullVTables( CClass &_class )
+{
+	if( _class.IsAbstract() )
+	{
+		// 抽象クラスは無視
+		return;
+	}
+	if( !_class.IsUsing() )
+	{
+		// 使われていないクラスは無視
+		return;
+	}
+
+	// vtblマスターリストの元データに不要なデータが含まれていたらエラー
+	if( _class.vtblMasterList.size() )
+	{
+		throw;
+	}
+
+	// 自身のクラスのvtblを生成
+	int thisClassVtblOffset = GenerateVTablePart( _class.GetDynamicMethods() );
+	_class.SetVtblOffset( thisClassVtblOffset );
+	_class.vtblMasterList.push_back( thisClassVtblOffset );
+
+	// インターフェイスのvtblを生成
+	foreach( const ::Interface *pInterface, _class.GetInterfaces() )
+	{
+		int tempVtblOffset = GenerateVTablePart( pInterface->GetDynamicMethods() );
+		_class.vtblMasterList.push_back( tempVtblOffset );
+
+		pInterface->SetVtblOffset( tempVtblOffset );
+
+		if( pInterface->GetClass().IsComInterface() )
+		{
+			if( _class.GetComVtblOffset() )
+			{
+				throw;
+			}
+			_class.SetComVtblOffset( tempVtblOffset );
+		}
+	}
+
+	// vtblマスターリストを生成
+	int offset = compiler.GetObjectModule().dataTable.AddBinary(
+		(void *)&_class.vtblMasterList[0],
+		static_cast<int>(_class.vtblMasterList.size()*sizeof(LONG_PTR))
+	);
+	_class.SetVtblMasterListOffset( offset );
+}
+
+void VtblGenerator::GenerateVTablesForAllClasses( Classes &classes )
+{
+	classes.Iterator_Reset();
+	while( classes.Iterator_HasNext() )
+	{
+		CClass *pClass = classes.Iterator_GetNext();
+		GenerateFullVTables( *pClass );
+
+		// テンプレート展開されたクラスも
+		foreach( ActiveBasic::Common::Lexical::ExpandedTemplateClass *pExpandedTemplateClass, pClass->expandedTemplateClasses )
+		{
+			if( !pExpandedTemplateClass->GetClass().expandedTemplateClasses.empty() )
+			{
+				// テンプレート展開後のクラスが更にテンプレート展開されていることはありえない
+				throw;
+			}
+
+			GenerateFullVTables( pExpandedTemplateClass->GetClass() );
+		}
+	}
+}
+
+void VtblGenerator::ActionVtblSchedule( CClass &_class, LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection )
+{
+	if( _class.IsAbstract() )
+	{
+		// 抽象クラスは無視
+		return;
+	}
+	if( !_class.IsUsing() )
+	{
+		// 使われていないクラスは無視
+		return;
+	}
+	if( _class.GetVtblOffset() == -1 )
+	{
+		return;
+	}
+
+	// 自身のクラスのvtbl
+	{
+		LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + _class.GetVtblOffset());
+
+		for( int i=0; i<_class.GetVtblNum(); i++ ){
+			const UserProc *pUserProc = (UserProc *)pVtbl[i];
+			if(!pUserProc) continue;
+
+			if( pUserProc->GetBeginOpAddress() == 0
+				&& pUserProc->GetEndOpAddress() == 0 )
+			{
+				Jenga::Throw( "未解決の仮想関数が存在する" );
+			}
+
+			pVtbl[i] = pUserProc->GetBeginOpAddress() + ImageBase + MemPos_CodeSection;
+		}
+	}
+
+	// インターフェイスのvtbl
+	foreach( const ::Interface *pInterface, _class.GetInterfaces() )
+	{
+		LONG_PTR *pVtbl = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + pInterface->GetVtblOffset());
+
+		for( int i=0; i<pInterface->GetClass().GetVtblNum(); i++ ){
+			const UserProc *pUserProc = (UserProc *)pVtbl[i];
+			if(!pUserProc) continue;
+
+			if( pUserProc->GetBeginOpAddress() == 0
+				&& pUserProc->GetEndOpAddress() == 0 )
+			{
+				Jenga::Throw( "未解決の仮想関数が存在する" );
+			}
+
+			pVtbl[i] = pUserProc->GetBeginOpAddress() + ImageBase + MemPos_CodeSection;
+		}
+	}
+
+	// vtblマスターリスト
+	LONG_PTR *pVtblMasterList = (LONG_PTR *)((char *)compiler.GetObjectModule().dataTable.GetPtr() + _class.GetVtblMasterListOffset() );
+	for( int i=0; i<static_cast<int>(_class.vtblMasterList.size()); i++ )
+	{
+		pVtblMasterList[i] = _class.vtblMasterList[i] + ImageBase + MemPos_DataSection;
+	}
+}
+
+void VtblGenerator::ActionVtblScheduleForAllClasses( Classes &classes, LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection )
+{
+	classes.Iterator_Reset();
+	while( classes.Iterator_HasNext() )
+	{
+		CClass *pClass = classes.Iterator_GetNext();
+		ActionVtblSchedule( *pClass, ImageBase, MemPos_CodeSection, MemPos_DataSection );
+
+		// テンプレート展開されたクラスも
+		foreach( ActiveBasic::Common::Lexical::ExpandedTemplateClass *pExpandedTemplateClass, pClass->expandedTemplateClasses )
+		{
+			if( !pExpandedTemplateClass->GetClass().expandedTemplateClasses.empty() )
+			{
+				// テンプレート展開後のクラスが更にテンプレート展開されていることはありえない
+				throw;
+			}
+
+			ActionVtblSchedule( pExpandedTemplateClass->GetClass(), ImageBase, MemPos_CodeSection, MemPos_DataSection );
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/ab_common/ab_common.vcproj
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/ab_common.vcproj	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/ab_common.vcproj	(revision 774)
@@ -0,0 +1,635 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="ab_common"
+	ProjectGUID="{87835C33-64C9-4BA5-9B39-608BA5394387}"
+	RootNamespace="ab_common"
+	Keyword="Win32Proj"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug(x86)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory=".\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release(x86)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory=".\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			WholeProgramOptimization="0"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="1"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug(x64)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory=".\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release(x64)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory=".\$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="1"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="ソース ファイル"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\src\Environment.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\malloc.c"
+				>
+				<FileConfiguration
+					Name="Debug(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						PreprocessorDefinitions="USE_DL_PREFIX"
+						UsePrecompiledHeader="0"
+						DisableSpecificWarnings="4267"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="3"
+						PreprocessorDefinitions="USE_DL_PREFIX"
+						UsePrecompiledHeader="0"
+						DisableSpecificWarnings="4267"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						PreprocessorDefinitions="USE_DL_PREFIX"
+						UsePrecompiledHeader="0"
+						DisableSpecificWarnings="4267"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						PreprocessorDefinitions="USE_DL_PREFIX"
+						UsePrecompiledHeader="0"
+						DisableSpecificWarnings="4267"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+			<Filter
+				Name="Lexical"
+				>
+				<File
+					RelativePath=".\src\Lexical\Class.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Const.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\DataTable.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Delegate.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Interface.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Member.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Meta.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Method.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Namespace.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\NamespaceSupporter.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\NativeCode.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\ObjectModule.cpp"
+					>
+					<FileConfiguration
+						Name="Debug(x86)|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release(x86)|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug(x64)|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							AdditionalOptions="/bigobj"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release(x64)|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Parameter.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Procedure.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Source.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Symbol.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Template.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Type.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\TypeDef.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Lexical\Variable.cpp"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="ResourceManager"
+				>
+				<File
+					RelativePath=".\src\ResourceManager\ResourceManager.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="ヘッダー ファイル"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\include\ab_common.h"
+				>
+			</File>
+			<File
+				RelativePath=".\include\BasicFixed.h"
+				>
+			</File>
+			<File
+				RelativePath=".\include\Environment.h"
+				>
+			</File>
+			<File
+				RelativePath=".\include\libs.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<Filter
+				Name="Lexical"
+				>
+				<File
+					RelativePath=".\include\Lexical\Class.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Const.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\DataTable.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Delegate.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Interface.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Member.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Meta.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Method.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Namespace.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\NamespaceSupporter.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\NativeCode.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\ObjectModule.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Parameter.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Procedure.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Prototype.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\RelationalObjectModuleItem.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Resolver.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Source.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Symbol.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Template.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Type.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\TypeDef.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\TypeMisc.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Lexical\Variable.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="ResourceManager"
+				>
+				<File
+					RelativePath=".\include\ResourceManager\ResourceManager.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="リソース ファイル"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: branches/egtra/ab5.0/abdev/ab_common/include/BasicFixed.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/BasicFixed.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/BasicFixed.h	(revision 774)
@@ -0,0 +1,144 @@
+//BasicFixed.h
+
+
+#define MAX_ARRAYDIM	16
+#define MAX_LEN			65535
+
+
+////////////////
+// マシンタイプ
+////////////////
+
+#define MACHINE_X86		1
+#define MACHINE_AMD64	2
+
+
+//////////////////////////////////////
+/* 演算子（優先順位が関係している） */
+//////////////////////////////////////
+
+//論理演算子
+#define CALC_XOR			3	// Xor
+#define CALC_OR				6	// Or
+#define CALC_AND			9	// And
+#define CALC_NOT			12	// Not
+
+//比較演算子
+#define CALC_PE				21	// <=
+#define CALC_QE				22	// >=
+#define CALC_NOTEQUAL		23	// <>
+#define CALC_EQUAL			24	// =
+#define CALC_P				25	// <
+#define CALC_Q				26	// >
+
+//算術演算子
+#define CALC_SHL			31	//<<
+#define CALC_SHR			32	//>>
+#define CALC_ADDITION		41	// +
+#define CALC_SUBTRACTION	42	// -
+#define CALC_STRPLUS		43	// &
+#define CALC_MOD			51	// Mod
+#define CALC_PRODUCT		61	// *
+#define CALC_QUOTIENT		62	// /
+#define CALC_INTQUOTIENT	63	//整数除算
+#define CALC_AS				71	// As
+#define CALC_BYVAL			72	// ByVal
+#define CALC_MINUSMARK		81	// -x
+#define CALC_POWER			91	// ^
+
+//代入演算子
+#define CALC_SUBSITUATION	200
+
+//添え字演算子
+#define CALC_ARRAY_GET		201
+#define CALC_ARRAY_SET		202
+
+
+
+//プロシージャの種類
+#define PROC_DEFAULT	1	// ユーザー定義関数
+#define PROC_DLL		2	// DLL関数
+#define PROC_BUILTIN	3	// コンパイラ埋め込み型
+#define PROC_PTR		4	// 関数ポインタ
+#define PROC_DELEGATE	5	// デリゲート
+
+
+
+//////////////////////////////////////////////////////////////////////
+// エスケープシーケンス用のバイトコードは0xA0～0xCFの範囲も利用できる
+//////////////////////////////////////////////////////////////////////
+
+//以下制御用エスケープシーケンス
+#define ESC_MOD				'1'		// MOD 演算子
+#define ESC_AND				'&'		// AND 演算子
+#define ESC_OR				'3'		// OR 演算子
+#define ESC_XOR				'4'		// XOR 演算子
+#define ESC_NOT				'5'		// NOT 演算子
+#define ESC_AS				'6'		// AS（区切り文字）
+#define ESC_THEN			2		// Then
+#define ESC_ELSE			3		// Else
+#define ESC_IF				'A'		// If
+#define ESC_ELSEIF			'B'		// ElseIf
+#define ESC_ENDIF			'C'		// End If
+#define ESC_DEF				'D'		// Def
+#define ESC_DECLARE			'E'		// Declare
+#define ESC_SUB				'F'		// Sub
+#define ESC_ENDSUB			'G'		// End Sub
+#define ESC_EXITSUB			'H'		// Exit Sub
+#define ESC_FUNCTION		'I'		// Function
+#define ESC_ENDFUNCTION		'J'		// End Function
+#define ESC_EXITFUNCTION	'K'		// Exit Function
+#define ESC_BYVAL			'L'		// ByVal
+#define ESC_BYREF			'M'		// ByRef
+#define ESC_TYPE			'N'		// Type
+#define ESC_ENDTYPE			'O'		// End Type
+#define ESC_EXITFOR			'P'		// Exit For
+#define ESC_EXITWHILE		'Q'		// Exit Wend
+#define ESC_EXITDO			'R'		// Exit Do
+#define ESC_SELECTCASE		'S'		// Select Case
+#define ESC_CASE			'T'		// Case
+#define ESC_CASEELSE		'U'		// Case Else
+#define ESC_ENDSELECT		'V'		// End Select
+#define ESC_CONST			'W'		// Const
+#define ESC_WITH			'X'		// With
+#define ESC_ENDWITH			'Y'		// End With
+#define ESC_CDECL			'Z'		// cdecl規約
+#define ESC_MACRO			'a'		// Macro
+#define ESC_ENDMACRO		'b'		// End Macro
+#define ESC_EXITMACRO		'c'		// Exit Macro
+#define ESC_EXPORT			'd'		// Export
+#define ESC_CONTINUE		'e'		// Continue
+#define ESC_PSMEM			'f'		// "->" Member of Pointer Struct（構造体ポインタのメンバ参照）
+#define ESC_STATIC			'g'		// Static
+#define ESC_TYPEDEF			'h'		// TypeDef
+#define ESC_TRY				'i'		// Try
+#define ESC_CATCH			'j'		// Catch
+#define ESC_FINALLY			'k'		// Finally
+#define ESC_THROW			'l'		// Throw
+#define ESC_ENDTRY			'm'		// End Try
+#define ESC_NAMESPACE		'o'		// Namespace
+#define ESC_ENDNAMESPACE	'p'		// End Namespace
+#define ESC_IMPORTS			'q'		// Imports
+#define ESC_CLEARNAMESPACEIMPORTED 'r'	// _ClearNamespaceImported
+#define ESC_OPERATOR		's'
+#define ESC_IN				't'		// In
+//EXEファイル用制御エスケープシーケンス
+#define ESC_USING			'u'		// Print命令語のUsing
+#define ESC_FOR				'v'		// Open命令語のFor
+#define ESC_LINENUM			'w'		// 行番号を示す
+
+//オブジェクト指向エスケープシーケンス
+#define ESC_CLASS			(char)0xA0
+#define ESC_ENDCLASS		(char)0xA1
+#define ESC_ABSTRACT		(char)0xA2
+#define ESC_VIRTUAL			(char)0xA3
+#define ESC_OVERRIDE		(char)0xA4
+#define ESC_INHERITS		(char)0xA5
+#define ESC_ENUM			(char)0xA6
+#define ESC_ENDENUM			(char)0xA7
+#define ESC_NEW				(char)0xA8
+#define ESC_INTERFACE		(char)0xA9
+#define ESC_ENDINTERFACE	(char)0xAA
+#define ESC_DELEGATE		(char)0xAB
+#define ESC_IMPLEMENTS		(char)0xAC
+#define ESC_SYSTEM_STATIC_NEW	(char)0xAD
Index: branches/egtra/ab5.0/abdev/ab_common/include/Environment.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Environment.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Environment.h	(revision 774)
@@ -0,0 +1,57 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{
+
+
+struct Platform
+{
+	enum EnumType
+	{
+		X86,
+		X64,
+	};
+};
+
+// ターゲット
+struct TargetModuleType
+{
+	enum EnumType
+	{
+		Exe = 0,
+		Dll,
+		Sll,
+	};
+};
+
+class Environment
+{
+	static std::string rootPath;
+	static bool isRemoveExternal;
+public:
+	static void SetAbdevRootPath( const std::string &rootPath );
+
+	static const std::string GetAbdevRootPath();
+
+	static const std::string GetUserAppDir();
+
+	static const std::string GetAbdevSystemDirPath()
+	{
+		return GetAbdevRootPath() + "\\system";
+	}
+
+	static const std::string GetCompilerExePath( Platform::EnumType platform );
+
+	static bool IsRemoveExternal()
+	{
+		return isRemoveExternal;
+	}
+	static void SetRemoveExternalMark( bool isRemoveExternalMark )
+	{
+		Environment::isRemoveExternal = isRemoveExternalMark;
+	}
+};
+
+BOOL EnableNX();
+void SetHeapOptions();
+
+}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Class.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Class.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Class.h	(revision 774)
@@ -0,0 +1,530 @@
+#pragma once
+
+class UserProc;
+class UserProcs;
+class Delegate;
+class Classes;
+
+class ClassPrototype : public Prototype, public DynamicMethodsPrototype
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Prototype );
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( DynamicMethodsPrototype );
+	}
+
+public:
+	ClassPrototype( const Symbol &symbol )
+		: Prototype( symbol )
+		, DynamicMethodsPrototype()
+	{
+	}
+	ClassPrototype()
+		: Prototype()
+		, DynamicMethodsPrototype()
+	{
+	}
+};
+
+class CClass: public ClassPrototype, public Jenga::Common::ObjectInHashmap<CClass>
+{
+public:
+	// 型の種類
+	enum ClassType{
+		Class,
+		Interface,
+		ComInterface,
+		Enum,
+		Delegate,
+		Structure,
+	};
+
+private:
+	ClassType classType;
+
+	// importされている名前空間
+	NamespaceScopesCollection importedNamespaces;
+
+	// 型パラメータ
+	GenericTypes formalGenericTypes;
+
+	// 基底クラス
+	const CClass *pSuperClass;
+
+	// 基底クラスの型パラメータ（実パラメータ）
+	Types superClassActualTypeParameters;
+
+	// Blittable型情報
+	Type blittableType;
+
+	// 実装するインターフェイス
+	Interfaces interfaces;
+
+	// 動的メンバ
+	Members dynamicMembers;
+
+	// 静的メンバ
+	Members staticMembers;
+
+	// 動的メソッド
+	int ConstructorMemberSubIndex;
+	int DestructorMemberSubIndex;
+	int vtblNum;					// 仮想関数の数
+
+	// 静的メソッド
+	Methods staticMethods;
+
+	//アラインメント値
+	int fixedAlignment;
+
+public:
+	ActiveBasic::Common::Lexical::ExpandedTemplateClasses expandedTemplateClasses;
+	Types expandedClassActualTypeParameters;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - CClass" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( ClassPrototype );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( classType );
+		ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
+		ar & BOOST_SERIALIZATION_NVP( formalGenericTypes );
+		ar & boost::serialization::make_nvp( "pSuperClass", const_cast<CClass *&>(pSuperClass) );
+		ar & BOOST_SERIALIZATION_NVP( superClassActualTypeParameters );
+		ar & BOOST_SERIALIZATION_NVP( blittableType );
+		ar & BOOST_SERIALIZATION_NVP( interfaces );
+		ar & BOOST_SERIALIZATION_NVP( dynamicMembers );
+		ar & BOOST_SERIALIZATION_NVP( staticMembers );
+		ar & BOOST_SERIALIZATION_NVP( ConstructorMemberSubIndex );
+		ar & BOOST_SERIALIZATION_NVP( DestructorMemberSubIndex );
+		ar & BOOST_SERIALIZATION_NVP( vtblNum );
+		ar & BOOST_SERIALIZATION_NVP( staticMethods );
+		ar & BOOST_SERIALIZATION_NVP( fixedAlignment );
+		ar & BOOST_SERIALIZATION_NVP( expandedTemplateClasses );
+		ar & BOOST_SERIALIZATION_NVP( expandedClassActualTypeParameters );
+	}
+
+	bool isReady;
+public:
+
+	CClass( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces );
+	CClass( const Symbol &symbol,
+		const NamespaceScopesCollection &importedNamespaces,
+		ClassType classType,
+		const GenericTypes &formalGenericTypes,
+		const Types &superClassActualTypeParameters,
+		int ConstructorMemberSubIndex,
+		int DestructorMemberSubIndex,
+		int vtblNum,
+		int fixedAlignment,
+		const Types &expandedClassActualTypeParameters );
+	CClass();
+	~CClass();
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+	virtual bool IsDuplication( const CClass *pClass ) const
+	{
+		if( pClass->IsEqualSymbol( *this ) )
+		{
+			return true;
+		}
+		return false;
+	}
+	bool Equals( const CClass *pClass ) const
+	{
+		// ポインタが等しいかどうかを見てみる
+		if( this == pClass )
+		{
+			return true;
+		}
+		else if( this->IsNeedResolve() || pClass->IsNeedResolve() )
+		{
+			// 依存関係解決前の状態であれば、パスが等しいかどうかを見てみる
+			if( this->IsDuplication( pClass ) )
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+
+	virtual void Using() const;
+
+	void Readed(){
+		isReady = true;
+	}
+	bool IsReady() const{
+		return isReady;
+	}
+
+	const NamespaceScopesCollection &GetImportedNamespaces() const
+	{
+		return importedNamespaces;
+	}
+
+	// 型パラメータ
+	const GenericTypes &GetFormalGenericTypes() const
+	{
+		return formalGenericTypes;
+	}
+	void AddFormalGenericType( GenericType genericType )
+	{
+		this->formalGenericTypes.push_back( genericType );
+	}
+	int GetFormalGenericTypeParameterIndex( const std::string &name ) const
+	{
+		int i = 0;
+		foreach( const GenericType &genericType, formalGenericTypes )
+		{
+			if( genericType.GetName() == name )
+			{
+				return i;
+			}
+			i++;
+		}
+		return -1;
+	}
+	bool IsExistFormalGenericTypeParameter( const std::string &name ) const
+	{
+		foreach( const GenericType &genericType, formalGenericTypes )
+		{
+			if( genericType.GetName() == name )
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	bool IsGeneric() const
+	{
+		return ( this->formalGenericTypes.size() != 0 );
+	}
+
+	// 継承元クラス
+	bool HasSuperClass() const
+	{
+		return ( pSuperClass != NULL );
+	}
+	const CClass &GetSuperClass() const
+	{
+		return *pSuperClass;
+	}
+	void SetSuperClass( const CClass *pSuperClass )
+	{
+		this->pSuperClass = pSuperClass;
+	}
+	const Types &GetSuperClassActualTypeParameters() const
+	{
+		return superClassActualTypeParameters;
+	}
+	void SetSuperClassActualTypeParameters( const Types &actualTypeParameters )
+	{
+		this->superClassActualTypeParameters = actualTypeParameters;
+	}
+
+	// Blittable型
+	bool IsBlittableType() const
+	{
+		return !blittableType.IsNull();
+	}
+	const Type &GetBlittableType() const
+	{
+		return blittableType;
+	}
+	void SetBlittableType( const Type &type ){
+		blittableType = type;
+	}
+
+	bool IsClass() const;
+	bool IsInterface() const;
+	bool IsComInterface() const;
+	bool IsEnum() const;
+	bool IsDelegate() const;
+	bool IsStructure() const;
+	void SetClassType( ClassType classType )
+	{
+		this->classType = classType;
+	}
+	ClassType GetClassType() const
+	{
+		return classType;
+	}
+
+
+	//コンストラクタをコンパイルしているかどうかのチェックフラグ
+private:
+	mutable bool isCompilingConstructor;
+public:
+	void NotifyStartConstructorCompile() const;
+	void NotifyFinishConstructorCompile() const;
+	bool IsCompilingConstructor() const;
+
+	//デストラクタをコンパイルしているかどうかのチェックフラグ
+private:
+	mutable bool isCompilingDestructor;
+public:
+	void NotifyStartDestructorCompile() const;
+	void NotifyFinishDestructorCompile() const;
+	bool IsCompilingDestructor() const;
+
+
+	//自身の派生クラスかどうかを確認
+	bool IsSubClass( const CClass *pClass ) const;
+
+	//自身と等しいまたは派生クラスかどうかを確認
+	bool IsEqualsOrSubClass( const CClass *pClass ) const;
+
+	// 自身と等しいまたは派生クラス、基底クラスかどうかを確認
+	bool IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const;
+
+	// インターフェイス
+	bool HasInterfaces() const
+	{
+		return ( interfaces.size() != 0 );
+	}
+	void AddInterface( ::Interface *pInterface )
+	{
+		interfaces.push_back( pInterface );
+	}
+	const Interfaces &GetInterfaces() const
+	{
+		return interfaces;
+	}
+	Interfaces &GetInterfaces()
+	{
+		return interfaces;
+	}
+	bool IsInheritsInterface( const CClass *pInterfaceClass ) const;
+
+	// クラス継承
+	bool InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine );
+
+	// インターフェイス継承
+	bool InheritsInterface( const CClass &inheritsInterfaceClass, const Types &actualTypeParameters, int nowLine );
+
+	//メンバ、メソッドの追加
+	void AddDynamicMember( Member *pMember );
+	void AddStaticMember( Member *pMember );
+
+	//重複チェック
+	bool DupliCheckAll(const char *name) const;
+	bool DupliCheckMember(const char *name) const;
+
+	const Members &GetDynamicMembers() const
+	{
+		return dynamicMembers;
+	}
+	const Members &GetStaticMembers() const
+	{
+		return staticMembers;
+	}
+	Members &GetDynamicMembers()
+	{
+		return dynamicMembers;
+	}
+	Members &GetStaticMembers()
+	{
+		return staticMembers;
+	}
+	
+	const Member *FindDynamicMember( const char *memberName ) const;
+	bool HasDynamicMember( const char *memberName ) const
+	{
+		return ( FindDynamicMember( memberName ) != NULL );
+	}
+
+	void EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const;
+	const CMethod *GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const;
+
+	const Methods &GetStaticMethods() const
+	{
+		return staticMethods;
+	}
+	Methods &GetStaticMethods()
+	{
+		return staticMethods;
+	}
+
+	//デフォルト コンストラクタ
+	const CMethod *GetConstructorMethod() const
+	{
+		if( ConstructorMemberSubIndex == -1 ) return NULL;
+		return GetDynamicMethods()[ConstructorMemberSubIndex];
+	}
+	void SetConstructorMemberSubIndex( int constructorMemberSubIndex )
+	{
+		this->ConstructorMemberSubIndex = constructorMemberSubIndex;
+	}
+	int GetConstructorMemberSubIndex() const
+	{
+		return ConstructorMemberSubIndex;
+	}
+
+	//デストラクタ メソッドを取得
+	const CMethod *GetDestructorMethod() const
+	{
+		if( DestructorMemberSubIndex == -1 ) return NULL;
+		return GetDynamicMethods()[DestructorMemberSubIndex];
+	}
+	void SetDestructorMemberSubIndex( int destructorMemberSubIndex )
+	{
+		this->DestructorMemberSubIndex = destructorMemberSubIndex;
+	}
+	int GetDestructorMemberSubIndex() const
+	{
+		return DestructorMemberSubIndex;
+	}
+
+	// ユーザ指定のアラインメント固定値
+	int GetFixedAlignment() const
+	{
+		return fixedAlignment;
+	}
+	void SetFixedAlignment( int fixedAlignment )
+	{
+		this->fixedAlignment = fixedAlignment;
+	}
+
+	// 展開時の型パラメータ情報
+	bool IsExpanded() const
+	{
+		return !expandedClassActualTypeParameters.empty();
+	}
+	void ResolveExpandedClassActualTypeParameter( Type &type ) const;
+
+	// メンバの総合サイズを取得
+private:
+	int cacheSize;
+public:
+	int GetSize() const;
+
+	// メンバのオフセットを取得
+	int GetMemberOffset( const char *memberName ) const;
+private:
+	// アラインメント値を取得
+	int GetAlignment() const;
+
+
+	/////////////////////////////////////////////////////////////////
+	// vtbl
+	/////////////////////////////////////////////////////////////////
+public:
+	// vtblに存在する仮想関数の数
+	int GetVtblNum() const
+	{
+		return vtblNum;
+	}
+	void SetVtblNum( int vtblNum )
+	{
+		this->vtblNum = vtblNum;
+	}
+	void AddVtblNum( int vtblNum )
+	{
+		this->vtblNum += vtblNum;
+	}
+	bool IsExistVirtualFunctions() const
+	{
+		// 構造体以外は仮想関数を持つ
+		return !IsStructure();
+	}
+	
+private:
+	int vtbl_offset;
+	int comVtblOffset;
+	int vtblMasterListOffset;
+public:
+	std::vector<long> vtblMasterList;
+	int GetVtblOffset() const
+	{
+		return vtbl_offset;
+	}
+	void SetVtblOffset( int vtblOffset )
+	{
+		this->vtbl_offset = vtblOffset;
+	}
+	int GetComVtblOffset() const
+	{
+		return comVtblOffset;
+	}
+	void SetComVtblOffset( int comVtblOffset )
+	{
+		this->comVtblOffset = comVtblOffset;
+	}
+	void GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const;
+	int GetVtblMasterListIndex( const CClass *pClass ) const;
+	long GetVtblMasterListOffset() const;
+	void SetVtblMasterListOffset( int vtblMasterListOffset )
+	{
+		this->vtblMasterListOffset = vtblMasterListOffset;
+	}
+	bool IsAbstract() const;
+
+
+	// TypeInfo用
+	mutable int typeInfoDataTableOffset;
+	void SetTypeInfoDataTableOffset( int typeInfoDataTableOffset ) const
+	{
+		this->typeInfoDataTableOffset = typeInfoDataTableOffset;
+	}
+	int GetTypeInfoDataTableOffset() const
+	{
+		return typeInfoDataTableOffset;
+	}
+
+	// 動的型データ用のメンバデータを取得
+	std::string GetStaticDefiningStringAsMemberNames() const;
+	std::string GetStaticDefiningStringAsMemberOffsets() const;
+	void GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset = 0 ) const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+class Classes : public Jenga::Common::Hashmap<CClass>
+{
+	// XMLシリアライズ用
+public:
+	Classes()
+		: pStringClass( NULL )
+		, pObjectClass( NULL )
+		, pInterfaceInfo( NULL )
+	{
+	}
+	~Classes()
+	{
+	}
+
+	bool Insert( CClass *pClass, int nowLine );
+	CClass *Add( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name,int nowLine);
+
+	const CClass *FindEx( const Symbol &symbol ) const;
+
+
+	/////////////////////////////
+	// 特殊クラス
+	/////////////////////////////
+	mutable const CClass *pStringClass;
+	mutable const CClass *pObjectClass;
+	mutable const CClass *pInterfaceInfo;
+	const CClass *GetStringClassPtr() const;
+	const CClass *GetObjectClassPtr() const;
+	const CClass *GetInterfaceInfoClassPtr() const;
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Const.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Const.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Const.h	(revision 774)
@@ -0,0 +1,173 @@
+#pragma once
+
+class CConst
+	: public RelationalObjectModuleItem
+	, public Jenga::Common::ObjectInHashmap<CConst>
+{
+	Type type;
+	_int64 i64data;
+
+	// XML繧ｷ繝ｪ繧｢繝ｩ繧､繧ｺ逕ｨ
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - CConst" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( type );
+		ar & BOOST_SERIALIZATION_NVP( i64data );
+	}
+
+public:
+	CConst( const Symbol &symbol, const Type &newType, _int64 i64data)
+		: RelationalObjectModuleItem( symbol )
+		, type( newType )
+		, i64data( i64data )
+	{
+	}
+	CConst( const Symbol &symbol, int value)
+		: RelationalObjectModuleItem( symbol )
+		, type( Type(DEF_LONG) )
+		, i64data( value )
+	{
+	}
+	CConst()
+	{
+	}
+	~CConst()
+	{
+	}
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+
+	Type GetType()
+	{
+		return type;
+	}
+	_int64 GetWholeData()
+	{
+		return i64data;
+	}
+	double GetDoubleData();
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+class Consts : public Jenga::Common::Hashmap<CConst>
+{
+	// XML繧ｷ繝ｪ繧｢繝ｩ繧､繧ｺ逕ｨ
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Consts" );
+
+		ar & boost::serialization::make_nvp("Hashmap_CConst",
+			boost::serialization::base_object<Jenga::Common::Hashmap<CConst>>(*this));
+	}
+
+public:
+
+	void Add( const Symbol &symbol, _int64 i64data, const Type &type );
+	void Add( const Symbol &symbol, int value);
+
+private:
+	CConst *GetObjectPtr( const Symbol &symbol );
+public:
+
+	int GetBasicType( const Symbol &symbol );
+	_int64 GetWholeData( const Symbol &symbol );
+	double GetDoubleData( const Symbol &symbol );
+	bool IsStringPtr( const Symbol &symbol, bool isUnicode );
+};
+
+class ConstMacro
+	: public RelationalObjectModuleItem
+	, public Jenga::Common::ObjectInHashmap<ConstMacro>
+{
+	std::vector<std::string> parameters;
+	std::string expression;
+
+	// XML繧ｷ繝ｪ繧｢繝ｩ繧､繧ｺ逕ｨ
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - ConstMacro" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( parameters );
+		ar & BOOST_SERIALIZATION_NVP( expression );
+	}
+
+public:
+	ConstMacro( const Symbol &symbol, const std::vector<std::string> &parameters, const std::string &expression )
+		: RelationalObjectModuleItem( symbol )
+		, parameters( parameters )
+		, expression( expression )
+	{
+	}
+	ConstMacro()
+	{
+	}
+	~ConstMacro()
+	{
+	}
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+
+	const std::vector<std::string> &GetParameters() const
+	{
+		return parameters;
+	}
+	const std::string &GetExpression() const
+	{
+		return expression;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+class ConstMacros
+	: public Jenga::Common::Hashmap<ConstMacro>
+{
+	// XML繧ｷ繝ｪ繧｢繝ｩ繧､繧ｺ逕ｨ
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - ConstMacros" );
+
+		ar & boost::serialization::make_nvp("Hashmap_ConstMacro",
+			boost::serialization::base_object<Jenga::Common::Hashmap<ConstMacro>>(*this));
+	}
+
+public:
+	bool Add( const Symbol &symbol, const char *parameterStr );
+	ConstMacro *Find( const Symbol &name );
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/DataTable.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/DataTable.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/DataTable.h	(revision 774)
@@ -0,0 +1,153 @@
+#pragma once
+
+//DataTable.cpp
+class DataTable
+{
+	char *buffer;
+	int size;
+
+public:
+	// リンカで解決しなければならないスケジュール
+	Schedules schedules;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+	template<class Archive> void load(Archive& ar, const unsigned int version)
+	{
+		std::string _buffer;
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( size );
+		ar & BOOST_SERIALIZATION_NVP( schedules );
+
+		// 読み込み後の処理
+		Realloc( size );
+		for( int i=0; i<size; i++ )
+		{
+			ULONG_PTR l1 = ( ( _buffer[i*3] >= 'a' ) ? ( _buffer[i*3] - 'a' + 0x0a ) : ( _buffer[i*3] - '0' ) ) * 0x10;
+			ULONG_PTR l2 = ( _buffer[i*3+1] >= 'a' ) ? ( _buffer[i*3+1] - 'a' + 0x0a ) : ( _buffer[i*3+1] - '0' );
+			ULONG_PTR l = l1 + l2;
+			buffer[i] = static_cast<char>(l);
+		}
+	}
+	template<class Archive> void save(Archive& ar, const unsigned int version) const
+	{
+		// 保存準備
+		char *tempCode = (char *)calloc( (size+1) * 3, 1 );
+		for( int i=0; i<size; i++ )
+		{
+			char temp[32];
+			sprintf( temp, "%02x,", (unsigned char)buffer[i] );
+			tempCode[i*3] = temp[0];
+			tempCode[i*3+1] = temp[1];
+			tempCode[i*3+2] = temp[2];
+		}
+
+		std::string _buffer = tempCode;
+		free( tempCode );
+
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( size );
+		ar & BOOST_SERIALIZATION_NVP( schedules );
+	}
+
+
+	void Realloc( int size )
+	{
+		this->buffer = (char *)realloc( this->buffer, size + 100 );
+		this->size = size;
+	}
+
+public:
+	DataTable()
+		: buffer( (char *)malloc(100) )
+		, size( 0 )
+	{
+		lstrcpy( buffer, "initialized!!!" );
+	}
+	DataTable( const DataTable &dataTable )
+		: buffer( (char *)malloc(100) )
+		, size( 0 )
+	{
+		lstrcpy( buffer, "initialized!!!" );
+		AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
+	}
+	~DataTable()
+	{
+		free( buffer );
+	}
+	void Clear()
+	{
+		size = 0;
+	}
+
+	void operator = ( const DataTable &dataTable )
+	{
+		Clear();
+		AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
+	}
+
+	int AddBinary( const void *buffer, int size );
+	int Add( _int64 i64data );
+	int Add( int i32data );
+	int Add( double dbl );
+	int Add( float flt );
+	int AddString( const char *str );
+	int AddString( const std::string &str );
+	int AddWString( const std::wstring &wstr );
+	void Add( const DataTable &dataTable )
+	{
+		long baseOffset = GetSize();
+
+		AddBinary( dataTable.GetPtr(), dataTable.GetSize() );
+
+		// スケジュールを追加
+		foreach( const Schedule &schedule, dataTable.schedules )
+		{
+			this->schedules.push_back(
+				Schedule(
+					schedule.GetType(),
+					baseOffset + schedule.GetOffset(),
+					schedule.GetLongPtrValue()
+				)
+			);
+		}
+	}
+	int AddSpace( int size );
+	void AddAlignment( int size );
+
+	const void *GetPtr() const
+	{
+		return buffer;
+	}
+	int GetSize() const
+	{
+		return size;
+	}
+
+	long GetLong( int pos ) const
+	{
+		return *(long *)( buffer + pos );
+	}
+	_int64 GetInt64( int pos ) const
+	{
+		return *(_int64 *)( buffer + pos );
+	}
+	void Overwrite( int pos, long newLongValue )
+	{
+		*(long *)( buffer + pos ) = newLongValue;
+	}
+	void OverwriteInt64( int pos, _int64 new64Value )
+	{
+		*(_int64 *)( buffer + pos ) = new64Value;
+	}
+	void OverwriteBinary( int pos, const void *ptr, int size )
+	{
+		memcpy( buffer + pos, ptr, size );
+	}
+
+	void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
+
+	void Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Delegate.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Delegate.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Delegate.h	(revision 774)
@@ -0,0 +1,99 @@
+#pragma once
+
+class Delegate
+	: public Procedure
+	, public Jenga::Common::ObjectInHashmap<Delegate>
+{
+	// importされている名前空間
+	NamespaceScopesCollection importedNamespaces;
+
+	std::string paramStr;
+	std::string returnTypeName;
+	int sourceIndex;
+
+	Parameters dynamicParams;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Delegate" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
+		ar & BOOST_SERIALIZATION_NVP( paramStr );
+		ar & BOOST_SERIALIZATION_NVP( returnTypeName );
+		ar & BOOST_SERIALIZATION_NVP( sourceIndex );
+		ar & BOOST_SERIALIZATION_NVP( dynamicParams );
+	}
+
+public:
+	Delegate( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Procedure::Kind procKind, const char *paramStr, const std::string &returnTypeName, int sourceIndex )
+		: Procedure( symbol, procKind, false )
+		, importedNamespaces( importedNamespaces )
+		, paramStr( paramStr )
+		, returnTypeName( returnTypeName )
+		, sourceIndex( sourceIndex )
+	{
+	}
+	Delegate()
+	{
+	}
+
+	const NamespaceScopesCollection &GetImportedNamespaces() const
+	{
+		return importedNamespaces;
+	}
+
+	const std::string &GetParamStr() const
+	{
+		return paramStr;
+	}
+	const std::string &GetReturnTypeName() const
+	{
+		return returnTypeName;
+	}
+	void SetReturnType( const Type &returnType )
+	{
+		this->returnType = returnType;
+	}
+
+	int GetSourceIndex() const
+	{
+		return sourceIndex;
+	}
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+
+	const Parameters &GetDynamicParams() const
+	{
+		return dynamicParams;
+	}
+	Parameters &GetDynamicParams()
+	{
+		return dynamicParams;
+	}
+
+	/*!
+	@brief	オーバーライド用にデリゲート同士が等しいかどうかをチェックする
+	@param	dgt 照らし合わせるデリゲート
+	*/
+	bool IsSimilar( const Delegate &dgt ) const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+typedef Jenga::Common::Hashmap<Delegate> Delegates;
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Interface.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Interface.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Interface.h	(revision 774)
@@ -0,0 +1,100 @@
+#pragma once
+
+class CClass;
+
+class DynamicMethodsPrototype
+{
+	// 動的メソッド
+	Methods dynamicMethods;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( dynamicMethods );
+	}
+
+public:
+	DynamicMethodsPrototype(){}
+	DynamicMethodsPrototype( const DynamicMethodsPrototype &dynamicMethodsPrototype )
+		: dynamicMethods( dynamicMethodsPrototype.dynamicMethods )
+	{
+	}
+	~DynamicMethodsPrototype(){}
+
+	const Methods &GetDynamicMethods() const
+	{
+		return dynamicMethods;
+	}
+	Methods &GetDynamicMethods()
+	{
+		return dynamicMethods;
+	}
+
+	void AddDynamicMethods( CMethod *pMethod )
+	{
+		dynamicMethods.push_back( pMethod );
+	}
+};
+
+class Interface : public DynamicMethodsPrototype
+{
+	const CClass *pInterfaceClass;
+	mutable int vtblOffset;
+
+	// 型パラメータ（実パラメータ）
+	Types actualTypeParameters;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Interface" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( DynamicMethodsPrototype );
+		ar & boost::serialization::make_nvp("pInterfaceClass", const_cast<CClass *&>(pInterfaceClass) );
+		ar & BOOST_SERIALIZATION_NVP( vtblOffset );
+		ar & BOOST_SERIALIZATION_NVP( actualTypeParameters );
+	}
+
+public:
+	Interface( const CClass *pInterfaceClass, const Types &actualTypeParameters );
+	Interface( const Interface &objInterface )
+		: DynamicMethodsPrototype( objInterface )
+		, pInterfaceClass( objInterface.pInterfaceClass )
+		, vtblOffset( objInterface.vtblOffset )
+	{
+	}
+	Interface()
+		: pInterfaceClass( NULL )
+		, vtblOffset( NULL )
+	{
+	}
+
+	const CClass &GetClass() const
+	{
+		return *pInterfaceClass;
+	}
+	int GetVtblOffset() const
+	{
+		return vtblOffset;
+	}
+	void SetVtblOffset( int vtblOffset ) const
+	{
+		this->vtblOffset = vtblOffset;
+	}
+
+	const Types &GetActualTypeParameters() const
+	{
+		return actualTypeParameters;
+	}
+
+	bool Equals( const Interface *pInterface ) const;
+
+	std::string GetFullNameWithActualGenericTypeParameters() const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+typedef std::vector<Interface *> Interfaces;
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Member.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Member.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Member.h	(revision 774)
@@ -0,0 +1,81 @@
+#pragma once
+
+class CClass;
+
+class Member : public MemberPrototype
+{
+	std::string name;
+	Type type;
+	bool isConst;
+	Subscripts subscripts;
+
+	std::string initializeExpression;
+	std::string constructParameter;
+
+	// XMLシリアライズ用
+	// TODO: xml
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Member" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( MemberPrototype );
+		ar & BOOST_SERIALIZATION_NVP( name );
+		ar & BOOST_SERIALIZATION_NVP( type );
+		ar & BOOST_SERIALIZATION_NVP( isConst );
+		ar & BOOST_SERIALIZATION_NVP( subscripts );
+		ar & BOOST_SERIALIZATION_NVP( initializeExpression );
+		ar & BOOST_SERIALIZATION_NVP( constructParameter );
+	}
+
+public:
+
+	int source_code_address;
+
+	Member( Prototype::Accessibility accessibility, const std::string &name, const Type &newType, bool isConst, const Subscripts &subscripts, const std::string &initializeExpression, const std::string &constructParameter );
+	Member( const Member &member, const Type &actualType );
+	Member( const Member &member );
+	Member();
+	~Member();
+
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	void SetName( const std::string &name )
+	{
+		this->name = name;
+	}
+
+	const Type &GetType() const
+	{
+		return type;
+	}
+	void ResetType( const Type &type )
+	{
+		this->type = type;
+	}
+
+	bool IsConst() const
+	{
+		return isConst;
+	}
+
+	const Subscripts &GetSubscripts() const
+	{
+		return subscripts;
+	}
+
+	const std::string &GetInitializeExpression() const
+	{
+		return initializeExpression;
+	}
+	const std::string &GetConstructParameter() const
+	{
+		return constructParameter;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+typedef std::vector<Member *> Members;
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Meta.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Meta.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Meta.h	(revision 774)
@@ -0,0 +1,165 @@
+#pragma once
+
+class Meta
+{
+	// 名前空間
+	NamespaceScopesCollection namespaceScopesCollection;
+
+	// 関数・メソッド
+	UserProcs userProcs;
+
+	// DLL関数
+	DllProcs dllProcs;
+
+	// クラス
+	Classes classesImpl;
+
+	// グローバル変数
+	GlobalVars globalVars;
+
+	// グローバル定数
+	Consts globalConsts;
+
+	// グローバル定数マクロ
+	ConstMacros globalConstMacros;
+
+	// blittable型
+	BlittableTypes blittableTypes;
+
+	// TypeDef
+	TypeDefCollection typeDefs;
+
+	// 関数ポインタ
+	ProcPointers procPointers;
+
+	// デリゲート
+	Delegates delegates;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Meta" );
+
+		ar & BOOST_SERIALIZATION_NVP( namespaceScopesCollection );
+		ar & BOOST_SERIALIZATION_NVP( userProcs );
+		ar & BOOST_SERIALIZATION_NVP( dllProcs );
+		ar & BOOST_SERIALIZATION_NVP( classesImpl );
+		ar & BOOST_SERIALIZATION_NVP( globalVars );
+		ar & BOOST_SERIALIZATION_NVP( globalConsts );
+		ar & BOOST_SERIALIZATION_NVP( globalConstMacros );
+		ar & BOOST_SERIALIZATION_NVP( blittableTypes );
+		ar & BOOST_SERIALIZATION_NVP( typeDefs );
+		ar & BOOST_SERIALIZATION_NVP( procPointers );
+		ar & BOOST_SERIALIZATION_NVP( delegates );
+	}
+
+	Classes *pNowClassesForDebugger;
+
+public:
+	Meta()
+		: classesImpl()
+		, pNowClassesForDebugger( &classesImpl )
+	{
+	}
+
+	// 初期化
+	void Clear();
+
+	// 静的リンク
+	void StaticLink( Meta &meta, long dataSectionBaseOffset, const std::vector<int> &relationTable );
+
+	const NamespaceScopesCollection &GetNamespaces() const
+	{
+		return namespaceScopesCollection;
+	}
+	NamespaceScopesCollection &GetNamespaces()
+	{
+		return namespaceScopesCollection;
+	}
+
+	const UserProcs &GetUserProcs() const
+	{
+		return userProcs;
+	}
+	UserProcs &GetUserProcs()
+	{
+		return userProcs;
+	}
+
+	const DllProcs &GetDllProcs() const
+	{
+		return dllProcs;
+	}
+	DllProcs &GetDllProcs()
+	{
+		return dllProcs;
+	}
+
+	const Classes &GetClasses() const
+	{
+		return *pNowClassesForDebugger;
+	}
+	Classes &GetClasses()
+	{
+		return *pNowClassesForDebugger;
+	}
+	void SetClasses( Classes *pClasses )
+	{
+		this->pNowClassesForDebugger = pClasses;
+	}
+
+	const GlobalVars &GetGlobalVars() const
+	{
+		return globalVars;
+	}
+	GlobalVars &GetGlobalVars()
+	{
+		return globalVars;
+	}
+
+	const Consts &GetGlobalConsts() const
+	{
+		return globalConsts;
+	}
+	Consts &GetGlobalConsts()
+	{
+		return globalConsts;
+	}
+
+	const ConstMacros &GetGlobalConstMacros() const
+	{
+		return globalConstMacros;
+	}
+	ConstMacros &GetGlobalConstMacros()
+	{
+		return globalConstMacros;
+	}
+
+	BlittableTypes &GetBlittableTypes()
+	{
+		return blittableTypes;
+	}
+
+	TypeDefCollection &GetTypeDefs()
+	{
+		return typeDefs;
+	}
+
+	ProcPointers &GetProcPointers()
+	{
+		return procPointers;
+	}
+
+	Delegates &GetDelegates()
+	{
+		return delegates;
+	}
+
+	const ::Delegate &ToDelegate( const CClass &_class );
+
+	const CClass *FindClassSupportedTypeDef( const Symbol &symbol );
+
+	void Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Method.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Method.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Method.h	(revision 774)
@@ -0,0 +1,281 @@
+#pragma once
+
+class UserProc;
+class CClass;
+
+class CMethod : public MemberPrototype
+{
+	const UserProc *pUserProc;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - CMethod" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( MemberPrototype );
+		ar & boost::serialization::make_nvp("pUserProc", const_cast<UserProc *&>(pUserProc));
+	}
+
+public:
+	CMethod( const UserProc *pUserProc, Prototype::Accessibility accessibility )
+		: MemberPrototype( accessibility )
+		, pUserProc( pUserProc )
+	{
+	}
+	CMethod()
+	{
+	}
+
+	const UserProc &GetUserProc() const
+	{
+		return *pUserProc;
+	}
+	void SetUserProcPtr( const UserProc *pUserProc )
+	{
+		this->pUserProc = pUserProc;
+	}
+
+	virtual bool IsAbstract() const = 0;
+	virtual void SetAbstractMark( bool isAbstractMark ) = 0;
+	virtual bool IsVirtual() const = 0;
+	virtual bool IsConst() const = 0;
+	virtual bool IsDynamic() const = 0;
+	virtual bool IsStatic() const = 0;
+	virtual const CClass *GetInheritsClassPtr() const = 0;
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass ) = 0;
+	virtual bool IsNotUse() const = 0;
+	virtual void SetNotUseMark( bool isNotUse ) = 0;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+class DynamicMethod : public CMethod
+{
+public:
+	struct OverrideResult
+	{
+		enum EnumType
+		{
+			Successful = 0,				// オーバーライドに成功
+			NotVirtual,					// 非Virtualメソッドに対してオーバーライドを行おうとした
+			NotUseOverrideModifier,		// Override修飾子が無い状況で基底クラスの実体メソッドをオーバーライドしようとした
+			DifferentAccesibility,		// オーバーライド元、先のアクセシビリティに相違がある
+		};
+
+		EnumType enumType;
+		const CMethod *pMethod;
+	};
+
+private:
+	bool isAbstract;
+	bool isVirtual;
+	bool isConst;
+	const CClass *pInheritsClass;
+
+	// 他のインターフェイスへ実装が移った場合（基底クラスメソッドのインターフェイス実装）はこのフラグをオンにする
+	bool isNotUse;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - DynamicMethod" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
+		ar & BOOST_SERIALIZATION_NVP( isAbstract );
+		ar & BOOST_SERIALIZATION_NVP( isVirtual );
+		ar & BOOST_SERIALIZATION_NVP( isConst );
+		ar & boost::serialization::make_nvp("pInheritsClass", const_cast<CClass *&>(pInheritsClass));
+		ar & BOOST_SERIALIZATION_NVP( isNotUse );
+	}
+
+public:
+	DynamicMethod( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isAbstract, bool isVirtual, bool isConst, const CClass *pInheritsClass = NULL )
+		: CMethod( pUserProc, accessibility )
+		, isAbstract( isAbstract )
+		, isVirtual( isVirtual )
+		, isConst( isConst )
+		, pInheritsClass( pInheritsClass )
+		, isNotUse( false )
+	{
+	}
+	DynamicMethod( const CMethod &method )
+		: CMethod( &method.GetUserProc(), method.GetAccessibility() )
+		, isAbstract( method.IsAbstract() )
+		, isVirtual( method.IsVirtual() )
+		, isConst( method.IsConst() )
+		, pInheritsClass( method.GetInheritsClassPtr() )
+		, isNotUse( false )
+	{
+	}
+	DynamicMethod()
+	{
+	}
+
+	DynamicMethod::OverrideResult::EnumType Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier );
+
+	virtual bool IsAbstract() const
+	{
+		return isAbstract;
+	}
+	virtual void SetAbstractMark( bool isAbstract )
+	{
+		this->isAbstract = isAbstract;
+	}
+	virtual bool IsVirtual() const
+	{
+		return isVirtual;
+	}
+	virtual bool IsConst() const
+	{
+		return isConst;
+	}
+	virtual bool IsDynamic() const
+	{
+		return true;
+	}
+	virtual bool IsStatic() const
+	{
+		return false;
+	}
+	virtual const CClass *GetInheritsClassPtr() const
+	{
+		return pInheritsClass;
+	}
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
+	{
+		this->pInheritsClass = pInheritsClass;
+	}
+	virtual bool IsNotUse() const
+	{
+		return isNotUse;
+	}
+	virtual void SetNotUseMark( bool isNotUse )
+	{
+		this->isNotUse = isNotUse;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+BOOST_CLASS_EXPORT( DynamicMethod );
+class StaticMethod : public CMethod
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - StaticMethod" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( CMethod );
+	}
+
+public:
+
+	// コンストラクタ
+	StaticMethod( UserProc *pUserProc, Prototype::Accessibility accessibility )
+		: CMethod( pUserProc, accessibility )
+	{
+	}
+
+	// コピーコンストラクタ
+	StaticMethod( const StaticMethod &staticMethod );
+
+	// デストラクタ
+	StaticMethod()
+	{
+	}
+
+	virtual bool Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
+	{
+		throw;
+	}
+
+	virtual bool IsAbstract() const
+	{
+		throw;
+	}
+	virtual void SetAbstractMark( bool isAbstract )
+	{
+		throw;
+	}
+	virtual bool IsVirtual() const{
+		return false;
+	}
+	virtual bool IsConst() const
+	{
+		throw;
+	}
+	virtual bool IsDynamic() const
+	{
+		return false;
+	}
+	virtual bool IsStatic() const
+	{
+		return true;
+	}
+	virtual const CClass *GetInheritsClassPtr() const
+	{
+		throw;
+	}
+	virtual void SetInheritsClassPtr( const CClass *pInheritsClass )
+	{
+		throw;
+	}
+	virtual bool IsNotUse() const
+	{
+		return false;
+	}
+	virtual void SetNotUseMark( bool isNotUse )
+	{
+		throw;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+BOOST_CLASS_EXPORT( StaticMethod );
+
+class Methods : public std::vector<CMethod *>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Methods" );
+
+		ar & boost::serialization::make_nvp("vector_CMethod", boost::serialization::base_object<vector<CMethod *>>(*this));
+	}
+
+public:
+	// コンストラクタ
+	Methods();
+
+	// コピーコンストラクタ
+	Methods( const Methods &methods );
+
+	// デストラクタ
+	~Methods();
+
+	//メンバ、メソッドの追加
+	void Add( UserProc *pUserProc, Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual );
+	void AddStatic(UserProc *pUserProc,Prototype::Accessibility accessibility);
+
+	/*!
+	@brief	オーバーライドのための検索
+	@param	actualTypeParametersForThisMethods thisオブジェクトで保有するメソッド群を対象とした実型パラメータ
+			pUserProc 照らし合わせる関数
+	*/
+	DynamicMethod *FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc );
+
+	const CMethod *GetMethodPtr( const UserProc *pUserProc ) const;
+	bool IsExist( const char *name ) const;
+	virtual void Enum( const char *methodName, std::vector<const UserProc *> &subs ) const;
+	virtual void Enum( BYTE idOperatorCalc, std::vector<const UserProc *> &subs ) const;
+
+	// 仮想メソッドの個数を取得
+	int GetVtblNum() const;
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Namespace.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Namespace.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Namespace.h	(revision 774)
@@ -0,0 +1,113 @@
+#pragma once
+#include <algorithm>
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class NamespaceScopes : public std::vector<std::string>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & boost::serialization::make_nvp("vector_string", boost::serialization::base_object<std::vector<std::string>>(*this));
+	}
+
+
+public:
+	NamespaceScopes(){}
+	NamespaceScopes( const std::string &namespaceStr );
+	NamespaceScopes( NamespaceScopes::const_iterator first, NamespaceScopes::const_iterator last )
+		: std::vector<std::string>( first, last )
+	{
+	}
+	~NamespaceScopes(){}
+
+	NamespaceScopes operator+ ( const NamespaceScopes &namespaceScopes ) const;
+
+	void append( const NamespaceScopes &namespaceScopes )
+	{
+		insert( end(), namespaceScopes.begin(), namespaceScopes.end() );
+	}
+
+	std::string ToString() const
+	{
+		std::string namespaceStr;
+		const std::vector<std::string> &me = *this;
+
+		bool isFirst = true;
+		foreach( const std::string &itemStr, me ){
+			if( isFirst ){
+				isFirst = false;
+			}
+			else{
+				namespaceStr += '.';
+			}
+
+			namespaceStr += itemStr;
+		}
+		return namespaceStr;
+	}
+
+	// 等しいかをチェック
+	bool IsEqual( const std::string &name ) const
+	{
+		if( ToString() == name ){
+			return true;
+		}
+		return false;
+	}
+
+	// 等しいかをチェック
+	bool IsEqual( const NamespaceScopes &namespaceScopes ) const;
+
+	// 所属しているかをチェック
+	// 例:
+	// baseNamespaceScopes =  "Discoversoft"
+	// entryNamespaceScopes = "Discoversoft.ActiveBasic"
+	// この場合、entryNamespaceScopes は baseNamespaceScopes に所属している。
+	static bool IsBelong( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes )
+	{
+		if( baseNamespaceScopes.size() > entryNamespaceScopes.size() ){
+			return false;
+		}
+		return std::equal( baseNamespaceScopes.begin(), baseNamespaceScopes.end(), entryNamespaceScopes.begin() );
+	}
+};
+
+inline bool operator ==( const NamespaceScopes &lhs, const NamespaceScopes &rhs )
+{
+	return lhs.IsEqual( rhs );
+}
+
+class NamespaceScopesCollection : public std::vector<NamespaceScopes>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & boost::serialization::make_nvp("vector_NamespaceScopes", boost::serialization::base_object<vector<NamespaceScopes>>(*this));
+	}
+
+public:
+	bool IsExist( const NamespaceScopes &namespaceScopes ) const
+	{
+		return std::find( this->begin(), this->end(), namespaceScopes ) != this->end();
+	}
+	bool IsExist( const std::string &namespaceStr ) const
+	{
+		return IsExist( NamespaceScopes( namespaceStr ) );
+	}
+
+	bool IsImported( const NamespaceScopes &namespaceScopes ) const
+	{
+		return IsExist( namespaceScopes );
+	}
+
+	void SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const;
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NamespaceSupporter.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NamespaceSupporter.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NamespaceSupporter.h	(revision 774)
@@ -0,0 +1,70 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class NamespaceSupporter
+{
+	const NamespaceScopesCollection *allNamespaceScopesCollection;
+
+	// Importsされた名前空間
+	NamespaceScopesCollection importedNamespaces;
+
+	// 現在の名前空間
+	NamespaceScopes livingNamespaceScopes;
+
+public:
+	NamespaceSupporter()
+		: allNamespaceScopesCollection( NULL )
+	{
+	}
+
+	void RegistAllNamespaceScopesCollection( const NamespaceScopesCollection *allNamespaceScopesCollection )
+	{
+		this->allNamespaceScopesCollection = allNamespaceScopesCollection;
+	}
+
+	const NamespaceScopesCollection &GetImportedNamespaces() const
+	{
+		return importedNamespaces;
+	}
+	void SetImportedNamespaces( const NamespaceScopesCollection &namespaces )
+	{
+		this->importedNamespaces = namespaces;
+	}
+	void ClearImportedNamespaces()
+	{
+		this->importedNamespaces.clear();
+	}
+	bool ImportsNamespace( const NamespaceScopes &namespaceScopes );
+	bool ImportsNamespace( const std::string &namespaceStr );
+
+	NamespaceScopes &GetLivingNamespaceScopes()
+	{
+		return livingNamespaceScopes;
+	}
+	void SetLivingNamespaceScopes( const NamespaceScopes &namespaceScopes )
+	{
+		this->livingNamespaceScopes = namespaceScopes;
+	}
+	bool IsLiving( const NamespaceScopes &namespaceScopes ) const
+	{
+		return NamespaceScopes::IsBelong( namespaceScopes, livingNamespaceScopes );
+	}
+
+
+	// 包括しているかをチェック
+	// 例:
+	// this =   "Discoversoft.ActiveBasic"
+	// living = "Discoversoft.ActiveBasic"
+	// entryName =   "ActiveBasic"
+	// この場合、living は entryName を包括している。
+	bool IsCoverd( const NamespaceScopes &base, const NamespaceScopes &entry ) const;
+
+
+	// 指定された名前空間が同一エリアと見なされるかどうかをチェック
+	bool IsSameAreaNamespace( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const;
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NativeCode.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NativeCode.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/NativeCode.h	(revision 774)
@@ -0,0 +1,252 @@
+#pragma once
+
+class UserProc;
+class DllProc;
+class CClass;
+
+class Schedule
+{
+public:
+	enum Type
+	{
+		None = 10000,
+		GlobalVar,		// グローバル変数スケジュール
+		DataTable,		// データテーブル スケジュール
+		CatchAddress,	// Catchアドレス スケジュール
+		Relocation,		// リロケーション情報スケジュール
+		UserProc,		// ユーザ定義関数呼び出し側スケジュール
+		AddressOf,		// ユーザ定義関数位置スケジュール
+		DllProc,		// DLL関数位置スケジュール
+		ComVtbl,		// com_vtblスケジュール
+		Vtbl,			// vtblスケジュール
+		TypeInfo,		// TypeInfoスケジュール
+	};
+
+private:
+	Type type;
+	long offset;
+
+	union{
+		LONG_PTR lpValue;
+		const ::UserProc *pUserProc;
+		const ::DllProc *pDllProc;
+		const ::CClass *pClass;
+	};
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Schedule" );
+
+		ar & BOOST_SERIALIZATION_NVP( type );
+		ar & BOOST_SERIALIZATION_NVP( offset );
+
+		switch( type )
+		{
+		case UserProc:
+		case AddressOf:
+		case CatchAddress:
+			ar & boost::serialization::make_nvp("pUserProc", const_cast<::UserProc *&>(pUserProc));
+			break;
+		case DllProc:
+			ar & boost::serialization::make_nvp("pDllProc", const_cast<::DllProc *&>(pDllProc));
+			break;
+		case ComVtbl:
+		case Vtbl:
+		case TypeInfo:
+			ar & boost::serialization::make_nvp("pClass", const_cast<::CClass *&>(pClass));
+			break;
+		default:
+			ar & BOOST_SERIALIZATION_NVP( lpValue );
+			break;
+		}
+	}
+
+public:
+	Schedule()
+	{
+	}
+	Schedule( Type type, long offset, LONG_PTR lpValue = 0 )
+		: type( type )
+		, offset( offset )
+		, lpValue( lpValue )
+	{
+	}
+	Schedule( Schedule::Type type, const ::UserProc *pUserProc, long offset )
+		: type( type )
+		, offset( offset )
+		, pUserProc( pUserProc )
+	{
+	}
+	Schedule( const ::DllProc *pDllProc, long offset )
+		: type( Schedule::DllProc )
+		, offset( offset )
+		, pDllProc( pDllProc )
+	{
+	}
+	Schedule( Type type, const ::CClass *pClass, long offset )
+		: type( type )
+		, pClass( pClass )
+		, offset( offset )
+	{
+		if( !( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo ) )
+		{
+			DebugBreak();
+		}
+	}
+	~Schedule()
+	{
+	}
+
+	Type GetType() const
+	{
+		return type;
+	}
+	long GetOffset() const
+	{
+		return offset;
+	}
+	LONG_PTR GetLongPtrValue() const
+	{
+		return lpValue;
+	}
+	const ::DllProc &GetDllProc() const;
+	const ::UserProc &GetUserProc() const;
+	const ::CClass &GetClass() const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+typedef std::vector<Schedule> Schedules;
+
+#define CODETYPE_SYSTEMPROC		0x0001
+#define CODETYPE_DEBUGPROC		0x0002
+class SourceLine
+{
+	long nativeCodePos;
+	DWORD codeType;
+	SourceCodePosition sourceCodePosition;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - SourceLine" );
+
+		ar & BOOST_SERIALIZATION_NVP( nativeCodePos );
+		ar & BOOST_SERIALIZATION_NVP( codeType );
+		ar & BOOST_SERIALIZATION_NVP( sourceCodePosition );
+	}
+
+public:
+	SourceLine( int nativeCodePos, DWORD codeType, const SourceCodePosition &sourceCodePosition )
+		: nativeCodePos( nativeCodePos )
+		, codeType( codeType )
+		, sourceCodePosition( sourceCodePosition )
+	{
+	}
+	SourceLine()
+	{
+	}
+
+	long GetNativeCodePos() const
+	{
+		return nativeCodePos;
+	}
+	DWORD GetCodeType() const
+	{
+		return codeType;
+	}
+	const SourceCodePosition &GetSourceCodePosition() const
+	{
+		return sourceCodePosition;
+	}
+	SourceCodePosition &GetSourceCodePosition()
+	{
+		return sourceCodePosition;
+	}
+	void SetSourceCodePosition( const SourceCodePosition &sourceCodePosition )
+	{
+		this->sourceCodePosition = sourceCodePosition;
+	}
+	bool IsInSystemProc() const
+	{
+		return ( (codeType&CODETYPE_SYSTEMPROC) != 0 );
+	}
+	bool IsInDebugProc() const
+	{
+		return ( (codeType&CODETYPE_DEBUGPROC) != 0 );
+	}
+};
+typedef std::vector<SourceLine> SourceLines;
+
+class NativeCode : public Jenga::Common::Binary
+{
+	// リンカで解決しなければならないスケジュール
+	Schedules schedules;
+
+	// ソースコード行番号とネイティブコード位置の対応情報
+	SourceLines sourceLines;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing(load) - NativeCode" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Jenga::Common::Binary );
+		ar & BOOST_SERIALIZATION_NVP( schedules );
+		ar & BOOST_SERIALIZATION_NVP( sourceLines );
+	}
+
+public:
+	NativeCode()
+		: Jenga::Common::Binary()
+	{
+	}
+	NativeCode( const NativeCode &nativeCode )
+		: Jenga::Common::Binary()
+	{
+		PutEx( nativeCode );
+	}
+	NativeCode( const char *codeBuffer, int size )
+		: Jenga::Common::Binary( codeBuffer, size )
+	{
+	}
+	~NativeCode()
+	{
+	}
+
+	void operator =( const NativeCode &nativeCode )
+	{
+		Clear();
+		PutEx( nativeCode );
+	}
+
+	const Schedules &GetSchedules() const
+	{
+		return schedules;
+	}
+
+	void PutEx( const NativeCode &nativeCode );
+	void PutEx( long l, Schedule::Type scheduleType );
+	void PutUserProcSchedule( const UserProc *pUserProc, bool isCall );
+	void PutCatchAddressSchedule( const UserProc *pUserProc, long codePos );
+	void PutDllProcSchedule( const DllProc *pDllProc );
+	void PutComVtblSchedule( const CClass *pClass );
+	void PutVtblSchedule( const CClass *pClass );
+
+	const SourceLines &GetSourceLines() const
+	{
+		return sourceLines;
+	}
+	void NextSourceLine( const SourceCodePosition &sourceCodePosition, bool isInSystemProc );
+
+	void ResetDataSectionBaseOffset( long dataSectionBaseOffset );
+	void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable );
+
+	void Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/ObjectModule.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/ObjectModule.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/ObjectModule.h	(revision 774)
@@ -0,0 +1,78 @@
+#pragma once
+
+class ObjectModule
+{
+public:
+	// オブジェクトモジュール名
+	std::string name;
+
+	// 関連オブジェクトモジュールの名前リスト
+	Jenga::Common::Strings relationalObjectModuleNames;
+
+	// メタ情報
+	Meta meta;
+
+	// グローバル領域のネイティブコード
+	NativeCode globalNativeCode;
+
+	// データテーブル
+	DataTable dataTable;
+
+private:
+	// ソースコード
+	BasicSource source;
+
+	// XMLシリアライズ用
+private:
+	virtual const char *RootTagName() const
+	{
+		return "objectModule";
+	}
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - objectModule" );
+
+		ar & BOOST_SERIALIZATION_NVP( name );
+		ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleNames );
+		ar & BOOST_SERIALIZATION_NVP( meta );
+		ar & BOOST_SERIALIZATION_NVP( globalNativeCode );
+		ar & BOOST_SERIALIZATION_NVP( dataTable );
+		ar & BOOST_SERIALIZATION_NVP( source );
+	}
+
+public:
+
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	void SetName( const std::string &name )
+	{
+		this->name = name;
+	}
+	const BasicSource &GetSource() const
+	{
+		return source;
+	}
+	BasicSource &GetSource()
+	{
+		return source;
+	}
+
+	// 静的リンクを行う
+	void StaticLink( ObjectModule &objectModule, bool isSll );
+
+	// 依存関係の解決を行う
+	void Resolve( ResolveErrors &resolveErrors );
+
+	// 下記の関連になるようなテーブルを取得する
+	// 要素 = 古いインデックス、値 = 新しいインデックス
+	const std::vector<int> GetRelationTable( const Jenga::Common::Strings &oldRelationalObjectModule );
+
+	bool Read( const std::string &filePath );
+	bool Write( const std::string &filePath ) const;
+	bool ReadString( const std::string &str );
+	bool WriteString( std::string &str ) const;
+};
+typedef std::vector<ObjectModule *> ObjectModules;
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Parameter.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Parameter.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Parameter.h	(revision 774)
@@ -0,0 +1,86 @@
+#pragma once
+
+class Parameter : public Type
+{
+	std::string varName;
+	bool isRef;
+	bool isArray;
+	Subscripts subscripts;
+
+	std::string initValue;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Parameter" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Type );
+		ar & BOOST_SERIALIZATION_NVP( varName );
+		ar & BOOST_SERIALIZATION_NVP( isRef );
+		ar & BOOST_SERIALIZATION_NVP( isArray );
+		ar & BOOST_SERIALIZATION_NVP( subscripts );
+		ar & BOOST_SERIALIZATION_NVP( initValue );
+	}
+
+public:
+	Parameter( const std::string &varName, const Type &type, bool isRef = false, const std::string initValue = "" );
+	Parameter( const Parameter &param, const Type &type );
+	Parameter( const Parameter &param );
+	Parameter();
+	~Parameter();
+
+	void SetArray( const Subscripts &subscripts ){
+		isArray = true;
+		this->subscripts = subscripts;
+	}
+
+	const std::string &GetVarName() const
+	{
+		return varName;
+	}
+
+	bool IsRef() const
+	{
+		return isRef;
+	}
+	bool IsArray(){
+		return isArray;
+	}
+	const Subscripts &GetSubscripts() const
+	{
+		return subscripts;
+	}
+
+	const std::string &GetInitValue() const
+	{
+		return initValue;
+	}
+
+	bool Equals( const Parameter &param, bool isContravariant ) const;
+	bool Equals( const Types &actualTypeParametersForThisProc, const Parameter &param, bool isContravariant ) const;
+};
+
+class Parameters : public std::vector<Parameter *>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Parameters" );
+
+		ar & boost::serialization::make_nvp("vector_Parameter", boost::serialization::base_object<std::vector<Parameter *>>(*this));
+	}
+
+public:
+
+	bool Equals( const Parameters &params, bool isContravariant = false ) const;
+	bool Equals( const Types &actualTypeParametersForThisProc, const Parameters &params, bool isContravariant = false ) const;
+
+	int GetMemorySize() const
+	{
+		return (int)this->size() * PTR_SIZE;
+	}
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Procedure.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Procedure.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Procedure.h	(revision 774)
@@ -0,0 +1,571 @@
+#pragma once
+
+class Procedure
+	: public RelationalObjectModuleItem
+{
+public:
+	// 種類
+	enum Kind{
+		Sub,
+		Function,
+	};
+
+private:
+	Kind kind;
+
+	bool isCdecl;
+	mutable bool isUsing;
+
+	// パラメータ
+	Parameters params;
+
+protected:
+
+	// 戻り値の型
+	Type returnType;
+
+private:
+	// ソースコードの位置
+	SourceCodePosition sourceCodePosition;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Procedure" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+		ar & BOOST_SERIALIZATION_NVP( kind );
+		ar & BOOST_SERIALIZATION_NVP( isCdecl );
+		ar & BOOST_SERIALIZATION_NVP( isUsing );
+		ar & BOOST_SERIALIZATION_NVP( params );
+		ar & BOOST_SERIALIZATION_NVP( returnType );
+		ar & BOOST_SERIALIZATION_NVP( sourceCodePosition );
+	}
+
+public:
+	Procedure( const Symbol &symbol, Kind kind, bool isCdecl )
+		: RelationalObjectModuleItem( symbol )
+		, kind( kind )
+		, isCdecl( isCdecl )
+		, isUsing( false )
+	{
+	}
+	Procedure()
+	{
+	}
+	~Procedure(){
+		foreach( Parameter *pParam, params ){
+			delete pParam;
+		}
+	}
+
+	bool IsSub() const
+	{
+		return ( kind == Sub );
+	}
+	bool IsFunction() const
+	{
+		return ( kind == Function );
+	}
+
+	bool IsCdecl() const
+	{
+		return isCdecl;
+	}
+	void Using() const
+	{
+		isUsing = true;
+	}
+	bool IsUsing() const
+	{
+		return isUsing;
+	}
+
+	const SourceCodePosition &GetSourceCodePosition() const
+	{
+		return sourceCodePosition;
+	}
+	void SetSourceCodePosition( const SourceCodePosition &sourceCodePosition )
+	{
+		this->sourceCodePosition = sourceCodePosition;
+	}
+	virtual void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable );
+
+	const Parameters &Params() const
+	{
+		return params;
+	}
+	Parameters &GetParameters()
+	{
+		return params;
+	}
+	const Type &ReturnType() const
+	{
+		return returnType;
+	}
+	Type &ReturnType()
+	{
+		return returnType;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+class UserProc : public Procedure, public Jenga::Common::ObjectInHashmap<UserProc>
+{
+public:
+	std::string _paramStr;
+
+private:
+	NamespaceScopesCollection importedNamespaces;
+
+	// 親クラスと対応するメソッド
+	const CClass *pParentClass;
+	const Interface *pInterface;
+	CMethod *pMethod;
+
+	bool isMacro;
+
+	// パラメータの追加情報
+	int secondParmNum;
+	Parameters realParams;
+	int realSecondParmNum;
+
+	// 各種フラグ
+	bool isExport;
+	mutable bool isAutoGenerationSystem;
+	mutable bool isAutoGeneration;
+	mutable bool isCompiled;
+
+	mutable DWORD beginOpAddress;
+	mutable DWORD endOpAddress;
+
+	// ローカル変数
+	mutable Variables localVars;
+
+	// 識別ID
+	int id;
+
+	// ネイティブコード
+	NativeCode nativeCode;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - UserProc" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
+		ar & boost::serialization::make_nvp("pParentClass", const_cast<CClass *&>(pParentClass) );
+		ar & boost::serialization::make_nvp("pInterface", const_cast<Interface *&>(pInterface) );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( _paramStr );
+		ar & BOOST_SERIALIZATION_NVP( importedNamespaces );
+		ar & BOOST_SERIALIZATION_NVP( pMethod );
+		ar & BOOST_SERIALIZATION_NVP( isMacro );
+		ar & BOOST_SERIALIZATION_NVP( secondParmNum );
+		ar & BOOST_SERIALIZATION_NVP( realParams );
+		ar & BOOST_SERIALIZATION_NVP( realSecondParmNum );
+		ar & BOOST_SERIALIZATION_NVP( isExport );
+		ar & BOOST_SERIALIZATION_NVP( isAutoGenerationSystem );
+		ar & BOOST_SERIALIZATION_NVP( isAutoGeneration );
+		ar & BOOST_SERIALIZATION_NVP( isCompiled );
+		ar & BOOST_SERIALIZATION_NVP( beginOpAddress );
+		ar & BOOST_SERIALIZATION_NVP( endOpAddress );
+		ar & BOOST_SERIALIZATION_NVP( localVars );
+		ar & BOOST_SERIALIZATION_NVP( id );
+		ar & BOOST_SERIALIZATION_NVP( nativeCode );
+	}
+
+public:
+
+	UserProc( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Kind kind, bool isMacro, bool isCdecl, bool isExport );
+	UserProc( const UserProc &userProc, const CClass *pParentClass );
+	UserProc();
+	~UserProc();
+
+	void SetReturnType( const Type &newReturnType )
+	{
+		returnType = newReturnType;
+	}
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+
+	virtual bool IsDuplication( const UserProc *pUserProc ) const
+	{
+		bool isEqualParentClass =
+			this->HasParentClass() && pUserProc->HasParentClass()
+			? this->GetParentClassPtr()->Equals( pUserProc->GetParentClassPtr() )
+			: this->GetParentClassPtr() == pUserProc->GetParentClassPtr();
+		bool isEqualInterface =
+			this->pInterface && pUserProc->pInterface
+			? this->pInterface->Equals( pUserProc->pInterface )
+			: this->pInterface == pUserProc->pInterface;
+
+		if( isEqualParentClass										// 親クラスが等しい
+			&& isEqualInterface										// インターフェイスが等しい
+			&& pUserProc->IsEqualSymbol( *this )					// 名前空間及び名前が等しい
+			&& this->Params().Equals( pUserProc->Params() )			// パラメータが等しい
+			&& this->returnType.Equals( pUserProc->returnType ) )	// 戻り値が等しい
+		{
+			return true;
+		}
+		return false;
+	}
+
+	virtual void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable );
+
+	/*!
+	@brief	オーバーライド用に関数同士が等しいかどうかをチェックする
+	@param	actualTypeParametersForThisProc thisオブジェクトで保有するメソッドを対象とした実型パラメータ
+			pUserProc 照らし合わせる関数
+	*/
+	bool IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const;
+
+	bool IsMacro() const
+	{
+		return isMacro;
+	}
+
+	int GetSecondParmNum() const
+	{
+		return secondParmNum;
+	}
+	void SetSecondParmNum( int secondParmNum )
+	{
+		this->secondParmNum = secondParmNum;
+	}
+	const Parameters &RealParams() const
+	{
+		return realParams;
+	}
+	Parameters &RealParams()
+	{
+		return realParams;
+	}
+	void SetRealParams( const Parameters &params )
+	{
+		realParams = params;
+	}
+	int GetRealSecondParmNum() const
+	{
+		return realSecondParmNum;
+	}
+
+	void ExportOff(){
+		isExport = false;
+	}
+	bool IsExport() const
+	{
+		return isExport;
+	}
+	void ThisIsAutoGenerationSystemProc() const
+	{
+		isAutoGenerationSystem = true;
+	}
+	bool IsAutoGenerationSystem() const
+	{
+		return isAutoGenerationSystem;
+	}
+	void ThisIsAutoGenerationProc() const
+	{
+		isAutoGeneration = true;
+	}
+	bool IsAutoGeneration() const
+	{
+		return isAutoGeneration;
+	}
+	bool IsSystem() const;
+	void CompleteCompile() const
+	{
+		isCompiled = true;
+	}
+	void KillCompileStatus() const
+	{
+		isCompiled = false;
+	}
+	bool IsCompiled() const
+	{
+		return isCompiled;
+	}
+	bool IsConstructor() const
+	{
+		return ( this->HasParentClass() && this->GetName() == this->GetParentClass().GetName() );
+	}
+	bool IsDestructor() const
+	{
+		return ( GetName()[0] == '~' );
+	}
+
+	// バイナリコード位置とサイズ
+	DWORD GetBeginOpAddress() const
+	{
+		return beginOpAddress;
+	}
+	void SetBeginOpAddress( DWORD beginOpAddress ) const
+	{
+		this->beginOpAddress = beginOpAddress;
+	}
+	DWORD GetEndOpAddress() const
+	{
+		return endOpAddress;
+	}
+	void SetEndOpAddress( DWORD endOpAddress ) const
+	{
+		this->endOpAddress = endOpAddress;
+	}
+	int GetCodeSize() const
+	{
+		return endOpAddress - beginOpAddress;
+	}
+
+	virtual const NamespaceScopes &GetNamespaceScopes() const;
+	const NamespaceScopesCollection &GetImportedNamespaces() const;
+
+	Variables &GetLocalVars() const
+	{
+		return localVars;
+	}
+
+	int GetId() const
+	{
+		return id;
+	}
+
+	const NativeCode &GetNativeCode() const
+	{
+		return nativeCode;
+	}
+	NativeCode &GetNativeCode()
+	{
+		return nativeCode;
+	}
+
+	std::string GetFullName() const;
+	bool IsCastOperator() const;
+
+	bool IsVirtual() const;
+
+	void SetParentClass( const CClass *pParentClass ){
+		this->pParentClass = pParentClass;
+	}
+	const CClass *GetParentClassPtr() const
+	{
+		return pParentClass;
+	}
+	const CClass &GetParentClass() const
+	{
+		return *pParentClass;
+	}
+	bool HasParentClass() const
+	{
+		return ( pParentClass != NULL );
+	}
+	bool IsGlobalProcedure() const
+	{
+		return ( pParentClass == NULL );
+	}
+	void SetInterface( const Interface *pInterface )
+	{
+		this->pInterface = pInterface;
+	}
+	void SetMethod( CMethod *pMethod ){
+		this->pMethod = pMethod;
+	}
+	const CMethod &GetMethod() const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+
+	static const UserProc *pGlobalProc;
+};
+
+class UserProcs : public Jenga::Common::Hashmap<UserProc>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - UserProcs" );
+
+		ar & boost::serialization::make_nvp("Hashmap_UserProcImpl",
+			boost::serialization::base_object<Jenga::Common::Hashmap<UserProc>>(*this));
+	}
+
+
+public:
+	UserProcs()
+	{
+	}
+	~UserProcs()
+	{
+	}
+
+	void EnumGlobalProcs( const char *simpleName, const Symbol &localSymbol, std::vector<const UserProc *> &subs );
+};
+
+class DllProc
+	: public Procedure
+	, public Jenga::Common::ObjectInHashmap<DllProc>
+{
+	std::string dllFileName;
+	std::string alias;
+	int lookupAddress;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - DllProc" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( dllFileName );
+		ar & BOOST_SERIALIZATION_NVP( alias );
+		ar & BOOST_SERIALIZATION_NVP( lookupAddress );
+	}
+
+public:
+	DllProc( const Symbol &symbol, Kind kind, bool isCdecl, const std::string &dllFileName, const std::string &alias )
+		: Procedure( symbol, kind, isCdecl )
+		, dllFileName( dllFileName )
+		, alias( alias )
+		, lookupAddress( 0 )
+	{
+	}
+	DllProc()
+	{
+	}
+	~DllProc()
+	{
+	}
+
+	virtual const std::string &GetKeyName() const
+	{
+		return GetName();
+	}
+
+	virtual bool IsDuplication( const DllProc *pDllProc ) const
+	{
+		if( pDllProc->IsEqualSymbol( *this )
+			&& this->Params().Equals( pDllProc->Params() ) )
+		{
+			return true;
+		}
+		return false;
+	}
+
+	const std::string &GetDllFileName() const
+	{
+		return dllFileName;
+	}
+	const std::string &GetAlias() const
+	{
+		return alias;
+	}
+
+	void SetLookupAddress( int lookupAddress ){
+		this->lookupAddress = lookupAddress;
+	}
+	int GetLookupAddress() const
+	{
+		return lookupAddress;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+class DllProcs : public Jenga::Common::Hashmap<DllProc>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - DllProcs" );
+
+		ar & boost::serialization::make_nvp("Hashmap_DllProc",
+			boost::serialization::base_object<Jenga::Common::Hashmap<DllProc>>(*this));
+	}
+};
+
+class ProcPointer
+	: public Procedure
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - ProcPointer" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Procedure );
+	}
+
+public:
+	ProcPointer( Kind kind )
+		: Procedure( Symbol( NamespaceScopes(), std::string() ), kind, false )
+	{
+	}
+	ProcPointer()
+	{
+	}
+	~ProcPointer()
+	{
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+class ProcPointers : public std::vector<ProcPointer *>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - ProcPointers" );
+
+		ar & boost::serialization::make_nvp("vector_ProcPointer",
+			boost::serialization::base_object<vector<ProcPointer *>>(*this));
+	}
+
+public:
+	ProcPointers()
+	{
+	}
+	~ProcPointers()
+	{
+		Clear();
+	}
+
+	void Clear();
+	void PullOutAll()
+	{
+		clear();
+	}
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Prototype.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Prototype.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Prototype.h	(revision 774)
@@ -0,0 +1,114 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class Prototype
+	: public RelationalObjectModuleItem
+{
+public:
+	enum Accessibility{
+		None,
+		Private,
+		Protected,
+		Public,
+	};
+
+private:
+	mutable bool isUsing;
+
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+		ar & BOOST_SERIALIZATION_NVP( isUsing );
+	}
+
+
+public:
+
+	Prototype( const Symbol &symbol )
+		: RelationalObjectModuleItem( symbol )
+		, isUsing( false )
+	{
+	}
+	Prototype()
+	{
+	}
+	~Prototype()
+	{
+	}
+
+	//自身と等しいかどうかを確認
+	bool IsEquals( const Prototype *prototype ) const
+	{
+		if( this == prototype ){
+			return true;
+		}
+		return false;
+	}
+
+	// 利用状況
+	bool IsUsing() const
+	{
+		return isUsing;
+	}
+	virtual void Using() const
+	{
+		isUsing = true;
+	}
+};
+
+class MemberPrototype
+{
+	Prototype::Accessibility accessibility;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( accessibility );
+	}
+
+public:
+	MemberPrototype( Prototype::Accessibility accessibility )
+		: accessibility( accessibility )
+	{
+	}
+	MemberPrototype()
+		: accessibility( Prototype::None )
+	{
+	}
+
+	Prototype::Accessibility GetAccessibility() const
+	{
+		return accessibility;
+	}
+	void SetAccessibility( Prototype::Accessibility accessibility ){
+		this->accessibility = accessibility;
+	}
+
+	bool IsNoneAccess() const
+	{
+		return ( accessibility == Prototype::None );
+	}
+	bool IsPrivate() const
+	{
+		return ( accessibility == Prototype::Private );
+	}
+	bool IsProtected() const
+	{
+		return ( accessibility == Prototype::Protected );
+	}
+	bool IsPublic() const
+	{
+		return ( accessibility == Prototype::Public );
+	}
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/RelationalObjectModuleItem.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/RelationalObjectModuleItem.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/RelationalObjectModuleItem.h	(revision 774)
@@ -0,0 +1,74 @@
+#pragma once
+
+class ObjectModule;
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class RelationalObjectModuleItem
+	: public Symbol
+{
+	int relationalObjectModuleIndex;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Symbol );
+		ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleIndex );
+	}
+
+public:
+	RelationalObjectModuleItem( const RelationalObjectModuleItem &relationalObjectModuleItem )
+		: Symbol( relationalObjectModuleItem )
+		, relationalObjectModuleIndex( relationalObjectModuleItem.relationalObjectModuleIndex )
+		, isNeedResolve( false )
+	{
+	}
+	RelationalObjectModuleItem( const Symbol &symbol )
+		: Symbol( symbol )
+		, relationalObjectModuleIndex( 0 )
+		, isNeedResolve( false )
+	{
+	}
+	RelationalObjectModuleItem()
+		: relationalObjectModuleIndex( -1 )
+		, isNeedResolve( false )
+	{
+	}
+
+	int GetRelationalObjectModuleIndex() const
+	{
+		return relationalObjectModuleIndex;
+	}
+	void SetRelationalObjectModuleIndex( int relationalObjectModuleIndex )
+	{
+		this->relationalObjectModuleIndex = relationalObjectModuleIndex;
+	}
+
+	virtual void ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
+	{
+		this->relationalObjectModuleIndex = relationTable[this->relationalObjectModuleIndex];
+	}
+
+	bool IsExternal() const
+	{
+		return ( relationalObjectModuleIndex != 0 );
+	}
+
+	bool isNeedResolve;
+	bool IsNeedResolve() const
+	{
+		return isNeedResolve;
+	}
+	void NeedResolve()
+	{
+		isNeedResolve = true;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors ) = 0;
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Resolver.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Resolver.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Resolver.h	(revision 774)
@@ -0,0 +1,37 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class ResolveError
+{
+	int relationalObjectModuleIndex;
+	std::string targetItemName;
+public:
+	ResolveError( int relationalObjectModuleIndex, const std::string targetItemName )
+		: relationalObjectModuleIndex( relationalObjectModuleIndex )
+		, targetItemName( targetItemName )
+	{
+	}
+
+	int GetRelationalObjectModuleIndex() const
+	{
+		return relationalObjectModuleIndex;
+	}
+	const std::string &GetTargetItemName() const
+	{
+		return targetItemName;
+	}
+};
+class ResolveErrors
+	: public std::vector<ResolveError>
+{
+public:
+	void Add( const ResolveError &resolveError )
+	{
+		this->push_back( resolveError );
+	}
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Source.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Source.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Source.h	(revision 774)
@@ -0,0 +1,307 @@
+#pragma once
+
+int ChangeReturnCodeImpl(char *buffer);
+
+class IncludedFilesRelation
+{
+	std::vector<std::string> filePaths;
+	std::vector<int> lineFileNumbers;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( filePaths );
+		ar & BOOST_SERIALIZATION_NVP( lineFileNumbers );
+	}
+
+public:
+	IncludedFilesRelation()
+	{
+	}
+	~IncludedFilesRelation()
+	{
+	}
+
+	const int GetFileNumber( int lineNumber ) const
+	{
+		return lineFileNumbers[lineNumber];
+	}
+	const std::string &GetFilePath( int lineNumber ) const
+	{
+		return filePaths[GetFileNumber( lineNumber )];
+	}
+	const std::string &GetFilePathFromFileNumber( int fileNumber ) const
+	{
+		return filePaths[fileNumber];
+	}
+	int GetFileCounts() const
+	{
+		return (int)filePaths.size();
+	}
+
+	int AddFile( const std::string &filePath )
+	{
+		filePaths.push_back( filePath );
+		return (int)filePaths.size()-1;
+	}
+	void AddLine( int fileNumber )
+	{
+		lineFileNumbers.push_back( fileNumber );
+	}
+
+	int GetLineCounts() const
+	{
+		return (int)lineFileNumbers.size();
+	}
+};
+
+class Text{
+protected:
+	char *buffer;
+	int length;
+
+public:
+
+	Text(){
+		buffer = (char *)calloc( 1, 1 );
+		length = 0;
+	}
+	Text( const Text &text )
+		: length( text.length )
+	{
+		buffer = (char *)malloc( length + 1 );
+		memcpy( buffer, text.buffer, length );
+		buffer[length] = 0;
+	}
+	~Text(){
+		free( buffer );
+	}
+	void Clear()
+	{
+		length = 0;
+	}
+	void Add( const std::string &str )
+	{
+		buffer = (char *)realloc( buffer, length + str.size() + 1 );
+		strcpy( buffer + length, str.c_str() );
+		length += (int)str.size();
+	}
+	void Add( const std::vector<char> &str )
+	{
+		buffer = (char *)realloc( buffer, length + str.size() + 1 );
+		strcpy( buffer + length, &str[0] );
+		length += (int)str.size();
+	}
+
+	bool ReadFile( const std::string &filePath );
+
+	static void SlideString(char *buffer, int slide){
+		memmove(buffer+slide, buffer, strlen(buffer)+1);
+	}
+};
+
+class BasicSource : public Text
+{
+	static const std::string generateDirectiveName;
+
+	IncludedFilesRelation includedFilesRelation;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+	template<class Archive> void load(Archive& ar, const unsigned int version)
+	{
+		std::string _buffer;
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( length );
+		ar & BOOST_SERIALIZATION_NVP( includedFilesRelation );
+
+		// 読み込み後の処理
+		Realloc( length );
+		for( int i=0; i<length; i++ )
+		{
+			ULONG_PTR l1 = ( ( _buffer[i*3] >= 'a' ) ? ( _buffer[i*3] - 'a' + 0x0a ) : ( _buffer[i*3] - '0' ) ) * 0x10;
+			ULONG_PTR l2 = ( _buffer[i*3+1] >= 'a' ) ? ( _buffer[i*3+1] - 'a' + 0x0a ) : ( _buffer[i*3+1] - '0' );
+			ULONG_PTR l = l1 + l2;
+			buffer[i] = static_cast<char>(l);
+		}
+		buffer[length] = 0;
+	}
+	template<class Archive> void save(Archive& ar, const unsigned int version) const
+	{
+		// 保存準備
+		char *tempCode = (char *)calloc( (length+1) * 3, 1 );
+		for( int i=0; i<length; i++ )
+		{
+			char temp[32];
+			sprintf( temp, "%02x,", (unsigned char)buffer[i] );
+			tempCode[i*3] = temp[0];
+			tempCode[i*3+1] = temp[1];
+			tempCode[i*3+2] = temp[2];
+		}
+
+		std::string _buffer = tempCode;
+		free( tempCode );
+
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( length );
+		ar & BOOST_SERIALIZATION_NVP( includedFilesRelation );
+	}
+
+private:
+	void Realloc( int newLength )
+	{
+		bool isEqualBasbuf = false;
+		extern char *basbuf;
+		if( basbuf == buffer + 2 )
+		{
+			isEqualBasbuf = true;
+		}
+
+		buffer = (char *)realloc( buffer, newLength + 255 );
+
+		length = newLength;
+
+		if( isEqualBasbuf )
+		{
+			basbuf = buffer + 2;
+		}
+	}
+
+	void IncludeFiles();
+
+	void ChangeReturnLineChar();
+
+	void RemoveComments();
+
+	bool ReadFile_InIncludeDirective( const std::string &filePath );
+	void DirectiveIncludeOrRequire( const std::string &mainSourceFilePath, const std::string &includeDirPath );
+
+	void RemoveReturnLineUnderbar();
+
+	void Initialize( const std::string &source );
+
+public:
+	BasicSource(){}
+	BasicSource( const BasicSource &basicSource )
+		: Text( basicSource )
+		, includedFilesRelation( basicSource.includedFilesRelation )
+	{
+	}
+	BasicSource( const std::string &source )
+	{
+		Initialize( source );
+	}
+	~BasicSource(){}
+
+	char *GetBuffer(){
+		return buffer+2;
+	}
+	const char *GetBuffer() const
+	{
+		return buffer+2;
+	}
+	int GetLength() const
+	{
+		return length-2;
+	}
+	void _ResetLength()
+	{
+		length = static_cast<int>(strlen( buffer ));
+	}
+
+	// 指定したインデックスが何行目かを取得
+	bool GetLineFromIndex( int index, int &result ) const;
+
+	const IncludedFilesRelation &GetIncludedFilesRelation() const
+	{
+		return includedFilesRelation;
+	}
+
+	void SetBuffer( const char *buffer );
+
+	bool ReadFile( const std::string &filePath, bool isDebug, bool isDll, bool isUnicode, int majorVer, const std::string &mainSourceFilePath, const std::string &includeDirPath );
+
+	void Addition( const char *buffer );
+
+	bool GetLineInfo( int sourceCodePos, int &line, std::string &fileName ) const;
+
+	void operator = ( const BasicSource &source ){
+		Realloc( source.length );
+		strcpy( buffer, source.buffer );
+	}
+
+	char operator[]( int index ) const
+	{
+		if( index>GetLength() )
+		{
+			Jenga::Throw( "BasicSource bad access" );
+		}
+		return buffer[2+index];
+	}
+
+	std::string cannotIncludePath;
+	int cannotIncludeSourcePos;
+};
+class BasicSources
+	: public std::vector<BasicSource>
+	, public Jenga::Common::BoostSerializationSupport<BasicSources>
+{
+	// XMLシリアライズ用
+private:
+	virtual const char *RootTagName() const
+	{
+		return "basicSources";
+	}
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & boost::serialization::make_nvp("vector_BasicSource", boost::serialization::base_object<std::vector<BasicSource>>(*this));
+	}
+};
+
+class SourceCodePosition
+{
+	int relationalObjectModuleIndex;
+	int pos;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( relationalObjectModuleIndex );
+		ar & BOOST_SERIALIZATION_NVP( pos );
+	}
+
+public:
+	SourceCodePosition( int relationalObjectModuleIndex, int pos )
+		: relationalObjectModuleIndex( relationalObjectModuleIndex )
+		, pos( pos )
+	{
+	}
+	SourceCodePosition()
+		: relationalObjectModuleIndex( -1 )
+		, pos( -1 )
+	{
+	}
+
+	int GetRelationalObjectModuleIndex() const;
+	void SetRelationalObjectModuleIndex( int relationalObjectModuleIndex )
+	{
+		this->relationalObjectModuleIndex = relationalObjectModuleIndex;
+	}
+	int GetPos() const
+	{
+		return pos;
+	}
+	void SetPos( int pos )
+	{
+		this->pos = pos;
+	}
+
+	bool IsNothing() const;
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Symbol.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Symbol.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Symbol.h	(revision 774)
@@ -0,0 +1,75 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+std::string Operator_NaturalStringToCalcMarkString( const std::string &name );
+std::string Operator_CalcMarkStringToNaturalString( const std::string &name );
+
+class Symbol
+{
+	static const NamespaceSupporter *namespaceSupporter;
+
+	NamespaceScopes namespaceScopes;
+	std::string name;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+	template<class Archive> void load(Archive& ar, const unsigned int version)
+	{
+		//trace_for_serialize( "serializing(load) - Symbol" );
+
+		ar & BOOST_SERIALIZATION_NVP( namespaceScopes );
+
+		std::string _name;
+		ar & BOOST_SERIALIZATION_NVP( _name );
+		this->name = Operator_NaturalStringToCalcMarkString( _name );
+	}
+	template<class Archive> void save(Archive& ar, const unsigned int version) const
+	{
+		//trace_for_serialize( "serializing(save) - Symbol" );
+
+		ar & BOOST_SERIALIZATION_NVP( namespaceScopes );
+
+		std::string _name = Operator_CalcMarkStringToNaturalString( name );
+		ar & BOOST_SERIALIZATION_NVP( _name );
+	}
+
+public:
+	Symbol( const NamespaceScopes &namespaceScopes, const std::string &name )
+		: namespaceScopes( namespaceScopes )
+		, name( name )
+	{
+	}
+	Symbol( const Symbol &symbol )
+		: namespaceScopes( symbol.namespaceScopes )
+		, name( symbol.name )
+	{
+	}
+	Symbol()
+	{
+	}
+
+	static void RegistNamespaceSupporter( const NamespaceSupporter *namespaceSupporter )
+	{
+		Symbol::namespaceSupporter = namespaceSupporter;
+	}
+
+	virtual const NamespaceScopes &GetNamespaceScopes() const
+	{
+		return namespaceScopes;
+	}
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	std::string GetFullName() const;
+
+	// シンボル比較
+	bool IsEqualSymbol( const NamespaceScopes &namespaceScopes, const std::string &name ) const;
+	bool IsEqualSymbol( const Symbol &symbol ) const;
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Template.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Template.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Template.h	(revision 774)
@@ -0,0 +1,55 @@
+#pragma once
+
+class CClass;
+
+namespace ActiveBasic{ namespace Common{ namespace Lexical{
+
+
+class ExpandedTemplateClass
+{
+	CClass *pClass;
+	Types actualTypes;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & BOOST_SERIALIZATION_NVP( pClass );
+		ar & BOOST_SERIALIZATION_NVP( actualTypes );
+	}
+
+
+public:
+	ExpandedTemplateClass( CClass *pClass, const Types &actualTypes )
+		: pClass( pClass )
+		, actualTypes( actualTypes )
+	{
+	}
+	ExpandedTemplateClass()
+		: pClass( NULL )
+	{
+	}
+	~ExpandedTemplateClass();
+
+	const CClass &GetClass() const
+	{
+		return *pClass;
+	}
+	CClass &GetClass()
+	{
+		return *pClass;
+	}
+
+	const Types &GetActualTypes() const
+	{
+		return actualTypes;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+typedef std::vector<ExpandedTemplateClass *> ExpandedTemplateClasses;
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Type.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Type.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Type.h	(revision 774)
@@ -0,0 +1,397 @@
+#pragma once
+
+class CClass;
+
+class GenericType;
+typedef std::vector<GenericType> GenericTypes;
+
+class Type
+{
+	int basicType;
+	union{
+		LONG_PTR index;
+		const CClass *pClass;
+	};
+
+	// ジェネリクス クラス インスタンス型の場合に使う
+	GenericTypes actualGenericTypes;
+
+	// 型パラメータで使う
+	std::string formalTypeName;	// 型パラメータの名前
+	int formalTypeIndex;		// 型パラメータの引数番号
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Type" );
+
+		ar & BOOST_SERIALIZATION_NVP( basicType );
+		if( HasMember() )
+		{
+			ar & boost::serialization::make_nvp("pClass", const_cast<CClass *&>(pClass));
+			ar & BOOST_SERIALIZATION_NVP( actualGenericTypes );
+		}
+		else
+		{
+			ar & BOOST_SERIALIZATION_NVP( index );
+		}
+
+		if( IsTypeParameter() )
+		{
+			ar & BOOST_SERIALIZATION_NVP( formalTypeName );
+			ar & BOOST_SERIALIZATION_NVP( formalTypeIndex );
+		}
+	}
+
+public:
+	static int GetBasicSize( int basicType );
+
+	Type():
+	  basicType( DEF_NON ),
+	  index( -1 ){}
+	Type( int basicType ):
+	  basicType( basicType ),
+	  index( -1 ){}
+
+	Type( int basicType, LONG_PTR index )
+		: basicType( basicType )
+		, index( index )
+	{
+	}
+
+	Type( int basicType, const CClass &objClass ):
+	  basicType( basicType ),
+	  index( (LONG_PTR)&objClass ){}
+
+	Type( const Type &type )
+		: basicType( type.basicType )
+		, index( type.index )
+		, actualGenericTypes( type.actualGenericTypes )
+		, formalTypeName( type.formalTypeName )
+		, formalTypeIndex( type.formalTypeIndex )
+	{
+	}
+
+	~Type();
+
+	void operator= ( const Type &type )
+	{
+		basicType = type.basicType;
+		index = type.index;
+		actualGenericTypes = type.actualGenericTypes;
+		formalTypeName = type.formalTypeName;
+		formalTypeIndex = type.formalTypeIndex;
+	}
+
+	__inline int GetBasicType() const
+	{
+		return basicType;
+	}
+	LONG_PTR GetIndex() const
+	{
+		return index;
+	}
+	const CClass &GetClass() const;
+
+	void SetBasicType( int basicType ){
+		this->basicType = basicType;
+	}
+	void SetIndex( LONG_PTR index ){
+		this->index = index;
+	}
+	void SetClassPtr( const CClass *pClass )
+	{
+		if( !HasMember() )
+		{
+			Jenga::Throw( "クラスまたは構造体でない型に対してSetClassPtrを呼び出した" );
+		}
+		this->pClass = pClass;
+	}
+	void SetNull(){
+		SetBasicType( DEF_NON );
+		SetIndex( -1 );
+	}
+	void SetType( int basicType, LONG_PTR index ){
+		SetBasicType( basicType );
+		SetIndex( index );
+	}
+	void SetType( int basicType, const CClass *pClass ){
+		SetBasicType( basicType );
+		this->pClass = pClass;
+	}
+	void SetActualGenericTypes( const GenericTypes &genericTypes )
+	{
+		this->actualGenericTypes = genericTypes;
+	}
+
+	int PtrLevel() const
+	{
+		return PTR_LEVEL( basicType );
+	}
+	void PtrLevelUp(){
+		PTR_LEVEL_UP( basicType );
+	}
+	void PtrLevelDown(){
+		PTR_LEVEL_DOWN( basicType );
+	}
+	void SetPtrLevel( int level )
+	{
+		basicType = MAKE_PTR_TYPE( NATURAL_TYPE( basicType ), level );
+	}
+
+	bool Equals( const Type &type ) const;
+	bool IsCovariant( const Type &type ) const;
+	bool IsContravariant( const Type &type ) const;
+
+	int GetBasicSize() const;
+	int GetSize() const;
+
+	bool IsNull() const;
+
+	bool IsByte() const;
+	bool IsSByte() const;
+	bool IsWord() const;
+	bool IsInteger() const;
+	bool IsDWord() const;
+	bool IsLong() const;
+	bool IsQWord() const;
+	bool IsInt64() const;
+	bool IsSingle() const;
+	bool IsDouble() const;
+	bool IsBoolean() const;
+
+	static bool IsPointer( int basicType );
+	bool IsPointer() const;
+	bool IsSigned() const;
+	bool IsNaturalWhole() const;
+	bool IsWhole() const;
+	bool IsReal() const;
+	bool Is64() const;
+	bool IsValueType() const;
+	bool IsProcPtr() const;
+	bool IsStruct() const;
+	bool IsStructPtr() const;
+	bool IsObject() const;
+	bool IsObjectPtr() const;
+	bool IsTypeParameter() const;
+	bool IsObjectClass() const;
+	bool IsStringClass() const;
+	bool IsVoidPtr() const;
+	bool IsAny() const;
+	bool IsDelegate() const;
+	bool IsInterface() const;
+	bool IsComInterface() const;
+
+	// オブジェクトや構造体など、メンバを持つ型かどうかを判別する
+	bool HasMember() const;
+
+	// 型パラメータの名前を取得
+	const std::string &GetFormalTypeName() const
+	{
+		if( !IsTypeParameter() )
+		{
+			Jenga::Throw( "型パラメータでない型に対してGetFormalTypeNameメソッドが呼ばれた" );
+		}
+		return formalTypeName;
+	}
+	void SetFormalTypeName( const std::string &formalTypeName )
+	{
+		if( !IsTypeParameter() )
+		{
+			Jenga::Throw( "型パラメータでない型に対してSetFormalTypeNameメソッドが呼ばれた" );
+		}
+		this->formalTypeName = formalTypeName;
+	}
+	int GetFormalTypeIndex() const
+	{
+		if( !IsTypeParameter() )
+		{
+			Jenga::Throw( "型パラメータでない型に対してGetFormalTypeIndexメソッドが呼ばれた" );
+		}
+		return formalTypeIndex;
+	}
+	void SetFormalTypeIndex( int formalTypeIndex )
+	{
+		if( !IsTypeParameter() )
+		{
+			Jenga::Throw( "型パラメータでない型に対してSetFormalTypeIndexメソッドが呼ばれた" );
+		}
+		this->formalTypeIndex = formalTypeIndex;
+	}
+
+	// 未完成
+	const Type &GetActualGenericType( int index ) const;
+	bool HasActualGenericType() const;
+
+	//型名を取得
+	std::string ToString() const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+
+
+private:
+	static const int basicTypeList[];
+	static const std::string basicTypeNameList[];
+public:
+	static bool StringToBasicType( const std::string &typeName, int &basicType );
+	static const char *Type::BasicTypeToCharPtr( const Type &type );
+	static int GetBasicTypeFromSimpleName( const char *variable );
+};
+
+class Types
+	: public std::vector<Type>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		ar & boost::serialization::make_nvp("vector_Type", boost::serialization::base_object<vector<Type>>(*this));
+	}
+
+public:
+	bool IsEquals( const Types &Types ) const;
+};
+
+/*!
+@brief	ジェネリックな型を解決する
+@param	typeParameter ジェネリック型を指定する。ここに解決後の型が入る。
+		classType インスタンス化されているオブジェクトの型
+		pUserProc 現在コンパイル中の関数（ただしクラスメソッドのみ）
+*/
+void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc = NULL );
+
+class GenericType
+{
+	std::string name;
+	Type type;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - GenericType" );
+
+		ar & BOOST_SERIALIZATION_NVP( name );
+		ar & BOOST_SERIALIZATION_NVP( type );
+	}
+
+public:
+	GenericType( const std::string &name, const Type &type )
+		: name( name )
+		, type( type )
+	{
+	}
+	GenericType()
+	{
+	}
+	~GenericType()
+	{
+	}
+
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	const Type &GetType() const
+	{
+		return type;
+	}
+	Type &GetType()
+	{
+		return type;
+	}
+};
+
+class BlittableType
+{
+	Type basicType;
+	const CClass *pClass;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - BlittableType" );
+
+		ar & BOOST_SERIALIZATION_NVP( basicType );
+		ar & boost::serialization::make_nvp("pClass", const_cast<CClass *&>(pClass) );
+	}
+
+public:
+	BlittableType( const Type &basicType, const CClass *pClass )
+		: basicType( basicType )
+		, pClass( pClass )
+	{
+	}
+	BlittableType()
+	{
+	}
+	const Type &GetBasicType() const
+	{
+		return basicType;
+	}
+	const CClass *GetClassPtr() const
+	{
+		return pClass;
+	}
+	const std::string GetCreateStaticMethodFullName() const;
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+class BlittableTypes : public std::vector<BlittableType>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - BlittableTypes" );
+
+		ar & boost::serialization::make_nvp("vector_BlittableType",
+			boost::serialization::base_object<std::vector<BlittableType>>(*this));
+	}
+
+public:
+	bool IsExist( Type type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		foreach( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return true;
+			}
+		}
+		return false;
+	}
+	const BlittableType &Find( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		foreach( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType;
+			}
+		}
+		Jenga::Throw( "Blittable型ではない" );
+
+		static BlittableType dummy;
+		return dummy;
+	}
+	const CClass *GetClassPtr( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		foreach( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType.GetClassPtr();
+			}
+		}
+		return NULL;
+	}
+	const CClass &GetClass( const Type &type ) const
+	{
+		return *GetClassPtr( type );
+	}
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeDef.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeDef.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeDef.h	(revision 774)
@@ -0,0 +1,75 @@
+#pragma once
+
+class TypeDefCollection;
+
+class TypeDef
+	: public RelationalObjectModuleItem
+{
+	friend TypeDefCollection;
+
+	std::string baseName;
+	Type baseType;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - TypeDef" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( baseName );
+		ar & BOOST_SERIALIZATION_NVP( baseType );
+	}
+
+public:
+	TypeDef( const Symbol &symbol, const std::string &baseName, const Type &baseType );
+	TypeDef()
+	{
+	}
+	~TypeDef()
+	{
+	}
+
+	const std::string &GetBaseName() const
+	{
+		return baseName;
+	}
+	const Type &GetBaseType() const
+	{
+		return baseType;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+};
+
+class TypeDefCollection : public std::vector<TypeDef>
+{
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - TypeDefCollection" );
+
+		ar & boost::serialization::make_nvp("vector_TypeDef",
+			boost::serialization::base_object<std::vector<TypeDef>>(*this));
+	}
+
+public:
+	TypeDefCollection();
+	~TypeDefCollection();
+
+	void Add( const Symbol &symbol, const std::string &baseName, int nowLine );
+	const TypeDef *Find( const Symbol &symbol ) const;
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeMisc.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeMisc.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/TypeMisc.h	(revision 774)
@@ -0,0 +1,77 @@
+#pragma once
+
+#define VN_SIZE			4096
+#define PTR_SIZE		sizeof(LONG_PTR)
+
+#define DEF_NON			-1
+
+/* basic\command.sbp内の "_System_Type_***" 定数と同期が必要 */
+#define FLAG_PTR		0x80000000
+#define FLAG_CAST		0x40000000
+
+//整数型
+#define DEF_SBYTE		0x00000001
+#define DEF_BYTE		0x00000002
+#define DEF_INTEGER		0x00000003
+#define DEF_WORD		0x00000004
+#define DEF_LONG		0x00000005
+#define DEF_DWORD		0x00000006
+#define DEF_INT64		0x00000007
+#define DEF_QWORD		0x00000008
+
+//実数型
+#define DEF_SINGLE		0x00000009
+#define DEF_DOUBLE		0x0000000A
+
+//文字型
+#define DEF_CHAR		0x0000000B
+
+//bool型
+#define DEF_BOOLEAN		0x0000000C
+
+//文字列型
+#define DEF_STRING		0x0000000D
+
+//ポインタ型
+#define DEF_PTR_VOID	0x0000000E
+#define DEF_PTR_PROC	0x0000000F
+
+//特殊型
+#define DEF_ANY						0x00000015
+#define DEF_ELLIPSE					0x00000016
+#define DEF_OBJECT					0x00000017		// クラス
+#define DEF_STRUCT					0x00000018		// 構造体
+#define DEF_TYPE_PARAMETER			0x00000019		// 型パラメータ（ジェネリクスサポート）
+
+//ポインタ型
+#define MASK_PTR		0x0000ff00
+#define MASK_NATURAL	0x000000ff
+
+#define PTR_LEVEL(t)	(((t)&MASK_PTR)>>8)
+#define NATURAL_TYPE(t)	((t)&MASK_NATURAL)
+#define MAKE_PTR_TYPE(t,p)	((t)|((p)<<8))
+#define PTR_LEVEL_UP(t)		t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)+1)
+#define PTR_LEVEL_DOWN(t)	t = MAKE_PTR_TYPE(NATURAL_TYPE(t),PTR_LEVEL(t)-1)
+
+#define DEF_PTR_OBJECT	MAKE_PTR_TYPE(DEF_OBJECT,1)
+#define DEF_PTR_STRUCT	MAKE_PTR_TYPE(DEF_STRUCT,1)
+
+
+
+//NumOpe関数の結果がリテラル値の場合、その値の補助情報がindexに格納される
+#define LITERAL_NULL		-2
+#define LITERAL_M128_0		-3
+#define LITERAL_0_255		-4
+#define LITERAL_M32768_0	-5
+#define LITERAL_0_65535		-6
+#define LITERAL_OTHER_MINUS	-7
+#define LITERAL_OTHER_PLUS	-8
+
+#define LITERAL_STRING		-9
+
+#define IS_LITERAL(x) (x<=LITERAL_NULL&&x!=LITERAL_STRING)
+#define IS_MINUS_LITERAL(x) (x==LITERAL_M128_0||x==LITERAL_M32768_0||x==LITERAL_OTHER_MINUS)
+#define IS_POSITIVE_LITERAL(x) (x==LITERAL_NULL||x==LITERAL_0_255||x==LITERAL_0_65535||x==LITERAL_OTHER_PLUS)
+
+
+typedef std::vector<int> Subscripts;
Index: branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Variable.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Variable.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/Lexical/Variable.h	(revision 774)
@@ -0,0 +1,266 @@
+#pragma once
+
+class Variable
+	: public RelationalObjectModuleItem
+{
+	Type type;
+	bool isConst;
+	bool isRef;
+	bool isArray;
+	Subscripts subscripts;
+
+	bool isParameter;
+	bool hasInitData;
+
+	//コンストラクタ用パラメータ
+	std::string paramStrForConstructor;
+
+
+	/* --- オフセット ---
+		※グローバル変数で初期バッファがない場合は最上位ビットに1がセットされ、
+		初期バッファの有無が識別される。
+		（その後、スケジュール実行により、実際の配置に並び替えられる）*/
+	int offset;
+
+
+	//レキシカルスコープ用
+	int scopeStartAddress;
+	int scopeEndAddress;
+	int scopeLevel;
+
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Variable" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( RelationalObjectModuleItem );
+
+		if( ActiveBasic::Common::Environment::IsRemoveExternal() )
+		{
+			if( this->IsExternal() )
+			{
+				this->NeedResolve();
+				return;
+			}
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( type );
+		ar & BOOST_SERIALIZATION_NVP( isConst );
+		ar & BOOST_SERIALIZATION_NVP( isRef );
+		ar & BOOST_SERIALIZATION_NVP( isArray );
+		ar & BOOST_SERIALIZATION_NVP( subscripts );
+		ar & BOOST_SERIALIZATION_NVP( isParameter );
+		ar & BOOST_SERIALIZATION_NVP( hasInitData );
+		ar & BOOST_SERIALIZATION_NVP( paramStrForConstructor );
+		ar & BOOST_SERIALIZATION_NVP( offset );
+		ar & BOOST_SERIALIZATION_NVP( scopeStartAddress );
+		ar & BOOST_SERIALIZATION_NVP( scopeEndAddress );
+		ar & BOOST_SERIALIZATION_NVP( scopeLevel );
+	}
+
+public:
+	Variable( const Symbol &symbol, const Type &type, bool isConst, bool isRef, const std::string &paramStrForConstructor, bool hasInitData );
+	Variable( const Variable &var );
+	Variable();
+
+	void SetArray( const Subscripts &subscripts ){
+		isArray = true;
+		this->subscripts = subscripts;
+	}
+
+	const Type &GetType() const
+	{
+		return type;
+	}
+	void ConstOff(){
+		isConst = false;
+	}
+	void ConstOn(){
+		isConst = true;
+	}
+	bool IsConst() const
+	{
+		return isConst;
+	}
+	bool IsRef() const
+	{
+		return isRef;
+	}
+	bool IsArray()const
+	{
+		return isArray;
+	}
+	const Subscripts &GetSubscripts() const
+	{
+		return subscripts;
+	}
+
+	void ThisIsByValStructParameter(){
+		isParameter = true;
+	}
+	bool IsByValStructParameter() const
+	{
+		return isParameter;
+	}
+	bool HasInitData() const
+	{
+		return hasInitData;
+	}
+
+
+	int GetMemorySize() const
+	{
+		if( isRef || isParameter ){
+			return PTR_SIZE;
+		}
+
+		int size = type.GetSize();
+
+		if( isArray ){
+			int num = 1;
+			for( int i=0; i<(int)subscripts.size(); i++){
+				num *= subscripts[i]+1;
+			}
+			size *= num;
+		}
+
+		if( size % PTR_SIZE ){
+			size += PTR_SIZE-(size%PTR_SIZE);
+		}
+
+		return size;
+	}
+
+	int GetOffsetAddress() const
+	{
+		return offset;
+	}
+	void SetOffsetAddress( int offset )
+	{
+		this->offset = offset;
+	}
+
+	const std::string &GetParamStrForConstructor() const
+	{
+		return paramStrForConstructor;
+	}
+
+	//レキシカルスコープ用
+	int GetScopeStartAddress() const
+	{
+		return scopeStartAddress;
+	}
+	void SetScopeStartAddress( int scopeStartAddress )
+	{
+		this->scopeStartAddress = scopeStartAddress;
+	}
+	int GetScopeEndAddress() const
+	{
+		return scopeEndAddress;
+	}
+	void SetScopeEndAddress( int scopeEndAddress )
+	{
+		this->scopeEndAddress = scopeEndAddress;
+	}
+	int GetScopeLevel() const
+	{
+		return scopeLevel;
+	}
+	void SetScopeLevel( int scopeLevel )
+	{
+		this->scopeLevel = scopeLevel;
+	}
+
+	virtual bool Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors );
+
+
+	bool isLiving;
+	int source_code_address;
+
+
+	static int GetSubScriptCounts( const Subscripts &subscripts ){
+		// 配列の要素数を取得
+		int i,i2;
+		for(i=0,i2=1;i<(int)subscripts.size();i++){
+			i2 *= subscripts[i]+1;
+		}
+		return i2;
+	}
+};
+
+class Variables : public std::vector<Variable *>
+{
+protected:
+	int allSize;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - Variables" );
+
+		ar & boost::serialization::make_nvp("vector_Variable", boost::serialization::base_object<vector<Variable *>>(*this));
+	}
+
+public:
+	Variables()
+		: allSize( 0 )
+	{
+	}
+	~Variables(){
+		Clear();
+	}
+
+	void Clear(){
+		for( int i=0; i<(int)this->size(); i++ ){
+			delete (*this)[i];
+		}
+
+		allSize = 0;
+		clear();
+	}
+	void PullOutAll()
+	{
+		clear();
+	}
+
+	int GetAllSize() const
+	{
+		return allSize;
+	}
+
+	bool DuplicateCheck( const Symbol &symbol, int nowScopeLevel ) const;
+
+	const Variable *BackSearch( const Symbol &symbol, int nowScopeLevel ) const;
+	const Variable *Find( const Symbol &symbol )const;
+};
+
+class GlobalVars : public Variables
+{
+public:
+	Jenga::Common::Binary initAreaBuffer;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	template<class Archive> void serialize(Archive& ar, const unsigned int version)
+	{
+		trace_for_serialize( "serializing - GlobalVars" );
+
+		ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP( Variables );
+		ar & BOOST_SERIALIZATION_NVP( initAreaBuffer );
+	}
+public:
+	GlobalVars()
+	{
+	}
+	~GlobalVars()
+	{
+	}
+
+	void Add( Variable *pVar, bool isResetOffsetAddress = true );
+};
Index: branches/egtra/ab5.0/abdev/ab_common/include/ResourceManager/ResourceManager.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/ResourceManager/ResourceManager.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/ResourceManager/ResourceManager.h	(revision 774)
@@ -0,0 +1,33 @@
+#pragma once
+
+namespace ActiveBasic{ namespace Common{
+
+
+struct ResourceItem
+{
+	std::string idName;
+	std::string filepath;
+
+	// IDEのみで使う
+	HTREEITEM hTreeItem;
+};
+typedef std::vector<ResourceItem> ResourceItems;
+
+
+class ResourceManager
+{
+public:
+	void Clear();
+	bool Load( const std::string &resourceFilePath );
+	bool Save( const std::string &resourceFilePath );
+
+	bool HasManifest() const;
+
+	ResourceItems cursorResources;
+	ResourceItems bitmapResources;
+	ResourceItems iconResources;
+	std::string manifestFilePath;
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/ab_common/include/ab_common.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/ab_common.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/ab_common.h	(revision 774)
@@ -0,0 +1,37 @@
+#pragma once
+
+#define trace_for_serialize( msg )
+
+#include "libs.h"
+
+#include "BasicFixed.h"
+#include "Environment.h"
+#include "Lexical/Namespace.h"
+#include "Lexical/NamespaceSupporter.h"
+#include "Lexical/Symbol.h"
+#include "Lexical/Resolver.h"
+#include "Lexical/RelationalObjectModuleItem.h"
+#include "Lexical/Prototype.h"
+#include "Lexical/TypeMisc.h"
+
+using namespace ActiveBasic::Common::Lexical;
+
+#include "Lexical/Source.h"
+#include "Lexical/NativeCode.h"
+#include "Lexical/Type.h"
+#include "Lexical/Method.h"
+#include "Lexical/Interface.h"
+#include "Lexical/Member.h"
+#include "Lexical/Template.h"
+#include "Lexical/Class.h"
+#include "Lexical/Parameter.h"
+#include "Lexical/Variable.h"
+#include "Lexical/Procedure.h"
+#include "Lexical/TypeDef.h"
+#include "Lexical/Const.h"
+#include "Lexical/Delegate.h"
+#include "Lexical/Meta.h"
+#include "Lexical/DataTable.h"
+#include "Lexical/ObjectModule.h"
+
+#include "ResourceManager/ResourceManager.h"
Index: branches/egtra/ab5.0/abdev/ab_common/include/libs.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/include/libs.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/include/libs.h	(revision 774)
@@ -0,0 +1,24 @@
+//libs.h
+//stdafx.hまたはab_common.hをインクルードしないcppファイルでも必ずインクルードすること
+
+#pragma once
+
+#define foreach(v, c) for each (v in c)
+
+#define lstrlenA strlen
+#define lstrcmpA strcmp
+#define lstrcpyA strcpy
+#define lstrcmpiA _stricmp
+
+extern "C"
+{
+	void* dlcalloc(size_t, size_t);
+	void  dlfree(void*);
+	void* dlmalloc(size_t);
+	void* dlrealloc(void*, size_t);
+}
+
+#define calloc dlcalloc 
+#define free dlfree
+#define malloc dlmalloc
+#define realloc dlrealloc
Index: branches/egtra/ab5.0/abdev/ab_common/malloc.c
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/malloc.c	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/malloc.c	(revision 774)
@@ -0,0 +1,5061 @@
+/*
+  This is a version (aka dlmalloc) of malloc/free/realloc written by
+  Doug Lea and released to the public domain, as explained at
+  http://creativecommons.org/licenses/publicdomain.  Send questions,
+  comments, complaints, performance data, etc to dl@cs.oswego.edu
+
+* Version 2.8.3 Thu Sep 22 11:16:15 2005  Doug Lea  (dl at gee)
+
+   Note: There may be an updated version of this malloc obtainable at
+           ftp://gee.cs.oswego.edu/pub/misc/malloc.c
+         Check before installing!
+
+* Quickstart
+
+  This library is all in one file to simplify the most common usage:
+  ftp it, compile it (-O3), and link it into another program. All of
+  the compile-time options default to reasonable values for use on
+  most platforms.  You might later want to step through various
+  compile-time and dynamic tuning options.
+
+  For convenience, an include file for code using this malloc is at:
+     ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h
+  You don't really need this .h file unless you call functions not
+  defined in your system include files.  The .h file contains only the
+  excerpts from this file needed for using this malloc on ANSI C/C++
+  systems, so long as you haven't changed compile-time options about
+  naming and tuning parameters.  If you do, then you can create your
+  own malloc.h that does include all settings by cutting at the point
+  indicated below. Note that you may already by default be using a C
+  library containing a malloc that is based on some version of this
+  malloc (for example in linux). You might still want to use the one
+  in this file to customize settings or to avoid overheads associated
+  with library versions.
+
+* Vital statistics:
+
+  Supported pointer/size_t representation:       4 or 8 bytes
+       size_t MUST be an unsigned type of the same width as
+       pointers. (If you are using an ancient system that declares
+       size_t as a signed type, or need it to be a different width
+       than pointers, you can use a previous release of this malloc
+       (e.g. 2.7.2) supporting these.)
+
+  Alignment:                                     8 bytes (default)
+       This suffices for nearly all current machines and C compilers.
+       However, you can define MALLOC_ALIGNMENT to be wider than this
+       if necessary (up to 128bytes), at the expense of using more space.
+
+  Minimum overhead per allocated chunk:   4 or  8 bytes (if 4byte sizes)
+                                          8 or 16 bytes (if 8byte sizes)
+       Each malloced chunk has a hidden word of overhead holding size
+       and status information, and additional cross-check word
+       if FOOTERS is defined.
+
+  Minimum allocated size: 4-byte ptrs:  16 bytes    (including overhead)
+                          8-byte ptrs:  32 bytes    (including overhead)
+
+       Even a request for zero bytes (i.e., malloc(0)) returns a
+       pointer to something of the minimum allocatable size.
+       The maximum overhead wastage (i.e., number of extra bytes
+       allocated than were requested in malloc) is less than or equal
+       to the minimum size, except for requests >= mmap_threshold that
+       are serviced via mmap(), where the worst case wastage is about
+       32 bytes plus the remainder from a system page (the minimal
+       mmap unit); typically 4096 or 8192 bytes.
+
+  Security: static-safe; optionally more or less
+       The "security" of malloc refers to the ability of malicious
+       code to accentuate the effects of errors (for example, freeing
+       space that is not currently malloc'ed or overwriting past the
+       ends of chunks) in code that calls malloc.  This malloc
+       guarantees not to modify any memory locations below the base of
+       heap, i.e., static variables, even in the presence of usage
+       errors.  The routines additionally detect most improper frees
+       and reallocs.  All this holds as long as the static bookkeeping
+       for malloc itself is not corrupted by some other means.  This
+       is only one aspect of security -- these checks do not, and
+       cannot, detect all possible programming errors.
+
+       If FOOTERS is defined nonzero, then each allocated chunk
+       carries an additional check word to verify that it was malloced
+       from its space.  These check words are the same within each
+       execution of a program using malloc, but differ across
+       executions, so externally crafted fake chunks cannot be
+       freed. This improves security by rejecting frees/reallocs that
+       could corrupt heap memory, in addition to the checks preventing
+       writes to statics that are always on.  This may further improve
+       security at the expense of time and space overhead.  (Note that
+       FOOTERS may also be worth using with MSPACES.)
+
+       By default detected errors cause the program to abort (calling
+       "abort()"). You can override this to instead proceed past
+       errors by defining PROCEED_ON_ERROR.  In this case, a bad free
+       has no effect, and a malloc that encounters a bad address
+       caused by user overwrites will ignore the bad address by
+       dropping pointers and indices to all known memory. This may
+       be appropriate for programs that should continue if at all
+       possible in the face of programming errors, although they may
+       run out of memory because dropped memory is never reclaimed.
+
+       If you don't like either of these options, you can define
+       CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
+       else. And if if you are sure that your program using malloc has
+       no errors or vulnerabilities, you can define INSECURE to 1,
+       which might (or might not) provide a small performance improvement.
+
+  Thread-safety: NOT thread-safe unless USE_LOCKS defined
+       When USE_LOCKS is defined, each public call to malloc, free,
+       etc is surrounded with either a pthread mutex or a win32
+       spinlock (depending on WIN32). This is not especially fast, and
+       can be a major bottleneck.  It is designed only to provide
+       minimal protection in concurrent environments, and to provide a
+       basis for extensions.  If you are using malloc in a concurrent
+       program, consider instead using ptmalloc, which is derived from
+       a version of this malloc. (See http://www.malloc.de).
+
+  System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
+       This malloc can use unix sbrk or any emulation (invoked using
+       the CALL_MORECORE macro) and/or mmap/munmap or any emulation
+       (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
+       memory.  On most unix systems, it tends to work best if both
+       MORECORE and MMAP are enabled.  On Win32, it uses emulations
+       based on VirtualAlloc. It also uses common C library functions
+       like memset.
+
+  Compliance: I believe it is compliant with the Single Unix Specification
+       (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
+       others as well.
+
+* Overview of algorithms
+
+  This is not the fastest, most space-conserving, most portable, or
+  most tunable malloc ever written. However it is among the fastest
+  while also being among the most space-conserving, portable and
+  tunable.  Consistent balance across these factors results in a good
+  general-purpose allocator for malloc-intensive programs.
+
+  In most ways, this malloc is a best-fit allocator. Generally, it
+  chooses the best-fitting existing chunk for a request, with ties
+  broken in approximately least-recently-used order. (This strategy
+  normally maintains low fragmentation.) However, for requests less
+  than 256bytes, it deviates from best-fit when there is not an
+  exactly fitting available chunk by preferring to use space adjacent
+  to that used for the previous small request, as well as by breaking
+  ties in approximately most-recently-used order. (These enhance
+  locality of series of small allocations.)  And for very large requests
+  (>= 256Kb by default), it relies on system memory mapping
+  facilities, if supported.  (This helps avoid carrying around and
+  possibly fragmenting memory used only for large chunks.)
+
+  All operations (except malloc_stats and mallinfo) have execution
+  times that are bounded by a constant factor of the number of bits in
+  a size_t, not counting any clearing in calloc or copying in realloc,
+  or actions surrounding MORECORE and MMAP that have times
+  proportional to the number of non-contiguous regions returned by
+  system allocation routines, which is often just 1.
+
+  The implementation is not very modular and seriously overuses
+  macros. Perhaps someday all C compilers will do as good a job
+  inlining modular code as can now be done by brute-force expansion,
+  but now, enough of them seem not to.
+
+  Some compilers issue a lot of warnings about code that is
+  dead/unreachable only on some platforms, and also about intentional
+  uses of negation on unsigned types. All known cases of each can be
+  ignored.
+
+  For a longer but out of date high-level description, see
+     http://gee.cs.oswego.edu/dl/html/malloc.html
+
+* MSPACES
+  If MSPACES is defined, then in addition to malloc, free, etc.,
+  this file also defines mspace_malloc, mspace_free, etc. These
+  are versions of malloc routines that take an "mspace" argument
+  obtained using create_mspace, to control all internal bookkeeping.
+  If ONLY_MSPACES is defined, only these versions are compiled.
+  So if you would like to use this allocator for only some allocations,
+  and your system malloc for others, you can compile with
+  ONLY_MSPACES and then do something like...
+    static mspace mymspace = create_mspace(0,0); // for example
+    #define mymalloc(bytes)  mspace_malloc(mymspace, bytes)
+
+  (Note: If you only need one instance of an mspace, you can instead
+  use "USE_DL_PREFIX" to relabel the global malloc.)
+
+  You can similarly create thread-local allocators by storing
+  mspaces as thread-locals. For example:
+    static __thread mspace tlms = 0;
+    void*  tlmalloc(size_t bytes) {
+      if (tlms == 0) tlms = create_mspace(0, 0);
+      return mspace_malloc(tlms, bytes);
+    }
+    void  tlfree(void* mem) { mspace_free(tlms, mem); }
+
+  Unless FOOTERS is defined, each mspace is completely independent.
+  You cannot allocate from one and free to another (although
+  conformance is only weakly checked, so usage errors are not always
+  caught). If FOOTERS is defined, then each chunk carries around a tag
+  indicating its originating mspace, and frees are directed to their
+  originating spaces.
+
+ -------------------------  Compile-time options ---------------------------
+
+Be careful in setting #define values for numerical constants of type
+size_t. On some systems, literal values are not automatically extended
+to size_t precision unless they are explicitly casted.
+
+WIN32                    default: defined if _WIN32 defined
+  Defining WIN32 sets up defaults for MS environment and compilers.
+  Otherwise defaults are for unix.
+
+MALLOC_ALIGNMENT         default: (size_t)8
+  Controls the minimum alignment for malloc'ed chunks.  It must be a
+  power of two and at least 8, even on machines for which smaller
+  alignments would suffice. It may be defined as larger than this
+  though. Note however that code and data structures are optimized for
+  the case of 8-byte alignment.
+
+MSPACES                  default: 0 (false)
+  If true, compile in support for independent allocation spaces.
+  This is only supported if HAVE_MMAP is true.
+
+ONLY_MSPACES             default: 0 (false)
+  If true, only compile in mspace versions, not regular versions.
+
+USE_LOCKS                default: 0 (false)
+  Causes each call to each public routine to be surrounded with
+  pthread or WIN32 mutex lock/unlock. (If set true, this can be
+  overridden on a per-mspace basis for mspace versions.)
+
+FOOTERS                  default: 0
+  If true, provide extra checking and dispatching by placing
+  information in the footers of allocated chunks. This adds
+  space and time overhead.
+
+INSECURE                 default: 0
+  If true, omit checks for usage errors and heap space overwrites.
+
+USE_DL_PREFIX            default: NOT defined
+  Causes compiler to prefix all public routines with the string 'dl'.
+  This can be useful when you only want to use this malloc in one part
+  of a program, using your regular system malloc elsewhere.
+
+ABORT                    default: defined as abort()
+  Defines how to abort on failed checks.  On most systems, a failed
+  check cannot die with an "assert" or even print an informative
+  message, because the underlying print routines in turn call malloc,
+  which will fail again.  Generally, the best policy is to simply call
+  abort(). It's not very useful to do more than this because many
+  errors due to overwriting will show up as address faults (null, odd
+  addresses etc) rather than malloc-triggered checks, so will also
+  abort.  Also, most compilers know that abort() does not return, so
+  can better optimize code conditionally calling it.
+
+PROCEED_ON_ERROR           default: defined as 0 (false)
+  Controls whether detected bad addresses cause them to bypassed
+  rather than aborting. If set, detected bad arguments to free and
+  realloc are ignored. And all bookkeeping information is zeroed out
+  upon a detected overwrite of freed heap space, thus losing the
+  ability to ever return it from malloc again, but enabling the
+  application to proceed. If PROCEED_ON_ERROR is defined, the
+  static variable malloc_corruption_error_count is compiled in
+  and can be examined to see if errors have occurred. This option
+  generates slower code than the default abort policy.
+
+DEBUG                    default: NOT defined
+  The DEBUG setting is mainly intended for people trying to modify
+  this code or diagnose problems when porting to new platforms.
+  However, it may also be able to better isolate user errors than just
+  using runtime checks.  The assertions in the check routines spell
+  out in more detail the assumptions and invariants underlying the
+  algorithms.  The checking is fairly extensive, and will slow down
+  execution noticeably. Calling malloc_stats or mallinfo with DEBUG
+  set will attempt to check every non-mmapped allocated and free chunk
+  in the course of computing the summaries.
+
+ABORT_ON_ASSERT_FAILURE   default: defined as 1 (true)
+  Debugging assertion failures can be nearly impossible if your
+  version of the assert macro causes malloc to be called, which will
+  lead to a cascade of further failures, blowing the runtime stack.
+  ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
+  which will usually make debugging easier.
+
+MALLOC_FAILURE_ACTION     default: sets errno to ENOMEM, or no-op on win32
+  The action to take before "return 0" when malloc fails to be able to
+  return memory because there is none available.
+
+HAVE_MORECORE             default: 1 (true) unless win32 or ONLY_MSPACES
+  True if this system supports sbrk or an emulation of it.
+
+MORECORE                  default: sbrk
+  The name of the sbrk-style system routine to call to obtain more
+  memory.  See below for guidance on writing custom MORECORE
+  functions. The type of the argument to sbrk/MORECORE varies across
+  systems.  It cannot be size_t, because it supports negative
+  arguments, so it is normally the signed type of the same width as
+  size_t (sometimes declared as "intptr_t").  It doesn't much matter
+  though. Internally, we only call it with arguments less than half
+  the max value of a size_t, which should work across all reasonable
+  possibilities, although sometimes generating compiler warnings.  See
+  near the end of this file for guidelines for creating a custom
+  version of MORECORE.
+
+MORECORE_CONTIGUOUS       default: 1 (true)
+  If true, take advantage of fact that consecutive calls to MORECORE
+  with positive arguments always return contiguous increasing
+  addresses.  This is true of unix sbrk. It does not hurt too much to
+  set it true anyway, since malloc copes with non-contiguities.
+  Setting it false when definitely non-contiguous saves time
+  and possibly wasted space it would take to discover this though.
+
+MORECORE_CANNOT_TRIM      default: NOT defined
+  True if MORECORE cannot release space back to the system when given
+  negative arguments. This is generally necessary only if you are
+  using a hand-crafted MORECORE function that cannot handle negative
+  arguments.
+
+HAVE_MMAP                 default: 1 (true)
+  True if this system supports mmap or an emulation of it.  If so, and
+  HAVE_MORECORE is not true, MMAP is used for all system
+  allocation. If set and HAVE_MORECORE is true as well, MMAP is
+  primarily used to directly allocate very large blocks. It is also
+  used as a backup strategy in cases where MORECORE fails to provide
+  space from system. Note: A single call to MUNMAP is assumed to be
+  able to unmap memory that may have be allocated using multiple calls
+  to MMAP, so long as they are adjacent.
+
+HAVE_MREMAP               default: 1 on linux, else 0
+  If true realloc() uses mremap() to re-allocate large blocks and
+  extend or shrink allocation spaces.
+
+MMAP_CLEARS               default: 1 on unix
+  True if mmap clears memory so calloc doesn't need to. This is true
+  for standard unix mmap using /dev/zero.
+
+USE_BUILTIN_FFS            default: 0 (i.e., not used)
+  Causes malloc to use the builtin ffs() function to compute indices.
+  Some compilers may recognize and intrinsify ffs to be faster than the
+  supplied C version. Also, the case of x86 using gcc is special-cased
+  to an asm instruction, so is already as fast as it can be, and so
+  this setting has no effect. (On most x86s, the asm version is only
+  slightly faster than the C version.)
+
+malloc_getpagesize         default: derive from system includes, or 4096.
+  The system page size. To the extent possible, this malloc manages
+  memory from the system in page-size units.  This may be (and
+  usually is) a function rather than a constant. This is ignored
+  if WIN32, where page size is determined using getSystemInfo during
+  initialization.
+
+USE_DEV_RANDOM             default: 0 (i.e., not used)
+  Causes malloc to use /dev/random to initialize secure magic seed for
+  stamping footers. Otherwise, the current time is used.
+
+NO_MALLINFO                default: 0
+  If defined, don't compile "mallinfo". This can be a simple way
+  of dealing with mismatches between system declarations and
+  those in this file.
+
+MALLINFO_FIELD_TYPE        default: size_t
+  The type of the fields in the mallinfo struct. This was originally
+  defined as "int" in SVID etc, but is more usefully defined as
+  size_t. The value is used only if  HAVE_USR_INCLUDE_MALLOC_H is not set
+
+REALLOC_ZERO_BYTES_FREES    default: not defined
+  This should be set if a call to realloc with zero bytes should 
+  be the same as a call to free. Some people think it should. Otherwise, 
+  since this malloc returns a unique pointer for malloc(0), so does 
+  realloc(p, 0).
+
+LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
+LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H,  LACKS_ERRNO_H
+LACKS_STDLIB_H                default: NOT defined unless on WIN32
+  Define these if your system does not have these header files.
+  You might need to manually insert some of the declarations they provide.
+
+DEFAULT_GRANULARITY        default: page size if MORECORE_CONTIGUOUS,
+                                system_info.dwAllocationGranularity in WIN32,
+                                otherwise 64K.
+      Also settable using mallopt(M_GRANULARITY, x)
+  The unit for allocating and deallocating memory from the system.  On
+  most systems with contiguous MORECORE, there is no reason to
+  make this more than a page. However, systems with MMAP tend to
+  either require or encourage larger granularities.  You can increase
+  this value to prevent system allocation functions to be called so
+  often, especially if they are slow.  The value must be at least one
+  page and must be a power of two.  Setting to 0 causes initialization
+  to either page size or win32 region size.  (Note: In previous
+  versions of malloc, the equivalent of this option was called
+  "TOP_PAD")
+
+DEFAULT_TRIM_THRESHOLD    default: 2MB
+      Also settable using mallopt(M_TRIM_THRESHOLD, x)
+  The maximum amount of unused top-most memory to keep before
+  releasing via malloc_trim in free().  Automatic trimming is mainly
+  useful in long-lived programs using contiguous MORECORE.  Because
+  trimming via sbrk can be slow on some systems, and can sometimes be
+  wasteful (in cases where programs immediately afterward allocate
+  more large chunks) the value should be high enough so that your
+  overall system performance would improve by releasing this much
+  memory.  As a rough guide, you might set to a value close to the
+  average size of a process (program) running on your system.
+  Releasing this much memory would allow such a process to run in
+  memory.  Generally, it is worth tuning trim thresholds when a
+  program undergoes phases where several large chunks are allocated
+  and released in ways that can reuse each other's storage, perhaps
+  mixed with phases where there are no such chunks at all. The trim
+  value must be greater than page size to have any useful effect.  To
+  disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
+  some people use of mallocing a huge space and then freeing it at
+  program startup, in an attempt to reserve system memory, doesn't
+  have the intended effect under automatic trimming, since that memory
+  will immediately be returned to the system.
+
+DEFAULT_MMAP_THRESHOLD       default: 256K
+      Also settable using mallopt(M_MMAP_THRESHOLD, x)
+  The request size threshold for using MMAP to directly service a
+  request. Requests of at least this size that cannot be allocated
+  using already-existing space will be serviced via mmap.  (If enough
+  normal freed space already exists it is used instead.)  Using mmap
+  segregates relatively large chunks of memory so that they can be
+  individually obtained and released from the host system. A request
+  serviced through mmap is never reused by any other request (at least
+  not directly; the system may just so happen to remap successive
+  requests to the same locations).  Segregating space in this way has
+  the benefits that: Mmapped space can always be individually released
+  back to the system, which helps keep the system level memory demands
+  of a long-lived program low.  Also, mapped memory doesn't become
+  `locked' between other chunks, as can happen with normally allocated
+  chunks, which means that even trimming via malloc_trim would not
+  release them.  However, it has the disadvantage that the space
+  cannot be reclaimed, consolidated, and then used to service later
+  requests, as happens with normal chunks.  The advantages of mmap
+  nearly always outweigh disadvantages for "large" chunks, but the
+  value of "large" may vary across systems.  The default is an
+  empirically derived value that works well in most systems. You can
+  disable mmap by setting to MAX_SIZE_T.
+
+*/
+
+#ifndef WIN32
+#ifdef _WIN32
+#define WIN32 1
+#endif  /* _WIN32 */
+#endif  /* WIN32 */
+#ifdef WIN32
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#define HAVE_MMAP 1
+#define HAVE_MORECORE 0
+#define LACKS_UNISTD_H
+#define LACKS_SYS_PARAM_H
+#define LACKS_SYS_MMAN_H
+#define LACKS_STRING_H
+#define LACKS_STRINGS_H
+#define LACKS_SYS_TYPES_H
+#define LACKS_ERRNO_H
+#define MALLOC_FAILURE_ACTION
+#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */
+#endif  /* WIN32 */
+
+#if defined(DARWIN) || defined(_DARWIN)
+/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
+#ifndef HAVE_MORECORE
+#define HAVE_MORECORE 0
+#define HAVE_MMAP 1
+#endif  /* HAVE_MORECORE */
+#endif  /* DARWIN */
+
+#ifndef LACKS_SYS_TYPES_H
+#include <sys/types.h>  /* For size_t */
+#endif  /* LACKS_SYS_TYPES_H */
+
+/* The maximum possible size_t value has all bits set */
+#define MAX_SIZE_T           (~(size_t)0)
+
+#ifndef ONLY_MSPACES
+#define ONLY_MSPACES 0
+#endif  /* ONLY_MSPACES */
+#ifndef MSPACES
+#if ONLY_MSPACES
+#define MSPACES 1
+#else   /* ONLY_MSPACES */
+#define MSPACES 0
+#endif  /* ONLY_MSPACES */
+#endif  /* MSPACES */
+#ifndef MALLOC_ALIGNMENT
+#define MALLOC_ALIGNMENT ((size_t)8U)
+#endif  /* MALLOC_ALIGNMENT */
+#ifndef FOOTERS
+#define FOOTERS 0
+#endif  /* FOOTERS */
+#ifndef ABORT
+#define ABORT  abort()
+#endif  /* ABORT */
+#ifndef ABORT_ON_ASSERT_FAILURE
+#define ABORT_ON_ASSERT_FAILURE 1
+#endif  /* ABORT_ON_ASSERT_FAILURE */
+#ifndef PROCEED_ON_ERROR
+#define PROCEED_ON_ERROR 0
+#endif  /* PROCEED_ON_ERROR */
+#ifndef USE_LOCKS
+#define USE_LOCKS 0
+#endif  /* USE_LOCKS */
+#ifndef INSECURE
+#define INSECURE 0
+#endif  /* INSECURE */
+#ifndef HAVE_MMAP
+#define HAVE_MMAP 1
+#endif  /* HAVE_MMAP */
+#ifndef MMAP_CLEARS
+#define MMAP_CLEARS 1
+#endif  /* MMAP_CLEARS */
+#ifndef HAVE_MREMAP
+#ifdef linux
+#define HAVE_MREMAP 1
+#else   /* linux */
+#define HAVE_MREMAP 0
+#endif  /* linux */
+#endif  /* HAVE_MREMAP */
+#ifndef MALLOC_FAILURE_ACTION
+#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
+#endif  /* MALLOC_FAILURE_ACTION */
+#ifndef HAVE_MORECORE
+#if ONLY_MSPACES
+#define HAVE_MORECORE 0
+#else   /* ONLY_MSPACES */
+#define HAVE_MORECORE 1
+#endif  /* ONLY_MSPACES */
+#endif  /* HAVE_MORECORE */
+#if !HAVE_MORECORE
+#define MORECORE_CONTIGUOUS 0
+#else   /* !HAVE_MORECORE */
+#ifndef MORECORE
+#define MORECORE sbrk
+#endif  /* MORECORE */
+#ifndef MORECORE_CONTIGUOUS
+#define MORECORE_CONTIGUOUS 1
+#endif  /* MORECORE_CONTIGUOUS */
+#endif  /* HAVE_MORECORE */
+#ifndef DEFAULT_GRANULARITY
+#if MORECORE_CONTIGUOUS
+#define DEFAULT_GRANULARITY (0)  /* 0 means to compute in init_mparams */
+#else   /* MORECORE_CONTIGUOUS */
+#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
+#endif  /* MORECORE_CONTIGUOUS */
+#endif  /* DEFAULT_GRANULARITY */
+#ifndef DEFAULT_TRIM_THRESHOLD
+#ifndef MORECORE_CANNOT_TRIM
+#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
+#else   /* MORECORE_CANNOT_TRIM */
+#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
+#endif  /* MORECORE_CANNOT_TRIM */
+#endif  /* DEFAULT_TRIM_THRESHOLD */
+#ifndef DEFAULT_MMAP_THRESHOLD
+#if HAVE_MMAP
+#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
+#else   /* HAVE_MMAP */
+#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
+#endif  /* HAVE_MMAP */
+#endif  /* DEFAULT_MMAP_THRESHOLD */
+#ifndef USE_BUILTIN_FFS
+#define USE_BUILTIN_FFS 0
+#endif  /* USE_BUILTIN_FFS */
+#ifndef USE_DEV_RANDOM
+#define USE_DEV_RANDOM 0
+#endif  /* USE_DEV_RANDOM */
+#ifndef NO_MALLINFO
+#define NO_MALLINFO 0
+#endif  /* NO_MALLINFO */
+#ifndef MALLINFO_FIELD_TYPE
+#define MALLINFO_FIELD_TYPE size_t
+#endif  /* MALLINFO_FIELD_TYPE */
+
+/*
+  mallopt tuning options.  SVID/XPG defines four standard parameter
+  numbers for mallopt, normally defined in malloc.h.  None of these
+  are used in this malloc, so setting them has no effect. But this
+  malloc does support the following options.
+*/
+
+#define M_TRIM_THRESHOLD     (-1)
+#define M_GRANULARITY        (-2)
+#define M_MMAP_THRESHOLD     (-3)
+
+/* ------------------------ Mallinfo declarations ------------------------ */
+
+#if !NO_MALLINFO
+/*
+  This version of malloc supports the standard SVID/XPG mallinfo
+  routine that returns a struct containing usage properties and
+  statistics. It should work on any system that has a
+  /usr/include/malloc.h defining struct mallinfo.  The main
+  declaration needed is the mallinfo struct that is returned (by-copy)
+  by mallinfo().  The malloinfo struct contains a bunch of fields that
+  are not even meaningful in this version of malloc.  These fields are
+  are instead filled by mallinfo() with other numbers that might be of
+  interest.
+
+  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
+  /usr/include/malloc.h file that includes a declaration of struct
+  mallinfo.  If so, it is included; else a compliant version is
+  declared below.  These must be precisely the same for mallinfo() to
+  work.  The original SVID version of this struct, defined on most
+  systems with mallinfo, declares all fields as ints. But some others
+  define as unsigned long. If your system defines the fields using a
+  type of different width than listed here, you MUST #include your
+  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
+*/
+
+/* #define HAVE_USR_INCLUDE_MALLOC_H */
+
+#ifdef HAVE_USR_INCLUDE_MALLOC_H
+#include "/usr/include/malloc.h"
+#else /* HAVE_USR_INCLUDE_MALLOC_H */
+
+struct mallinfo {
+  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
+  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
+  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
+  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
+  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
+  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
+  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
+  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
+  MALLINFO_FIELD_TYPE fordblks; /* total free space */
+  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
+};
+
+#endif /* HAVE_USR_INCLUDE_MALLOC_H */
+#endif /* NO_MALLINFO */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#if !ONLY_MSPACES
+
+/* ------------------- Declarations of public routines ------------------- */
+
+#ifndef USE_DL_PREFIX
+#define dlcalloc               calloc
+#define dlfree                 free
+#define dlmalloc               malloc
+#define dlmemalign             memalign
+#define dlrealloc              realloc
+#define dlvalloc               valloc
+#define dlpvalloc              pvalloc
+#define dlmallinfo             mallinfo
+#define dlmallopt              mallopt
+#define dlmalloc_trim          malloc_trim
+#define dlmalloc_stats         malloc_stats
+#define dlmalloc_usable_size   malloc_usable_size
+#define dlmalloc_footprint     malloc_footprint
+#define dlmalloc_max_footprint malloc_max_footprint
+#define dlindependent_calloc   independent_calloc
+#define dlindependent_comalloc independent_comalloc
+#endif /* USE_DL_PREFIX */
+
+
+/*
+  malloc(size_t n)
+  Returns a pointer to a newly allocated chunk of at least n bytes, or
+  null if no space is available, in which case errno is set to ENOMEM
+  on ANSI C systems.
+
+  If n is zero, malloc returns a minimum-sized chunk. (The minimum
+  size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
+  systems.)  Note that size_t is an unsigned type, so calls with
+  arguments that would be negative if signed are interpreted as
+  requests for huge amounts of space, which will often fail. The
+  maximum supported value of n differs across systems, but is in all
+  cases less than the maximum representable value of a size_t.
+*/
+void* dlmalloc(size_t);
+
+/*
+  free(void* p)
+  Releases the chunk of memory pointed to by p, that had been previously
+  allocated using malloc or a related routine such as realloc.
+  It has no effect if p is null. If p was not malloced or already
+  freed, free(p) will by default cause the current program to abort.
+*/
+void  dlfree(void*);
+
+/*
+  calloc(size_t n_elements, size_t element_size);
+  Returns a pointer to n_elements * element_size bytes, with all locations
+  set to zero.
+*/
+void* dlcalloc(size_t, size_t);
+
+/*
+  realloc(void* p, size_t n)
+  Returns a pointer to a chunk of size n that contains the same data
+  as does chunk p up to the minimum of (n, p's size) bytes, or null
+  if no space is available.
+
+  The returned pointer may or may not be the same as p. The algorithm
+  prefers extending p in most cases when possible, otherwise it
+  employs the equivalent of a malloc-copy-free sequence.
+
+  If p is null, realloc is equivalent to malloc.
+
+  If space is not available, realloc returns null, errno is set (if on
+  ANSI) and p is NOT freed.
+
+  if n is for fewer bytes than already held by p, the newly unused
+  space is lopped off and freed if possible.  realloc with a size
+  argument of zero (re)allocates a minimum-sized chunk.
+
+  The old unix realloc convention of allowing the last-free'd chunk
+  to be used as an argument to realloc is not supported.
+*/
+
+void* dlrealloc(void*, size_t);
+
+/*
+  memalign(size_t alignment, size_t n);
+  Returns a pointer to a newly allocated chunk of n bytes, aligned
+  in accord with the alignment argument.
+
+  The alignment argument should be a power of two. If the argument is
+  not a power of two, the nearest greater power is used.
+  8-byte alignment is guaranteed by normal malloc calls, so don't
+  bother calling memalign with an argument of 8 or less.
+
+  Overreliance on memalign is a sure way to fragment space.
+*/
+void* dlmemalign(size_t, size_t);
+
+/*
+  valloc(size_t n);
+  Equivalent to memalign(pagesize, n), where pagesize is the page
+  size of the system. If the pagesize is unknown, 4096 is used.
+*/
+void* dlvalloc(size_t);
+
+/*
+  mallopt(int parameter_number, int parameter_value)
+  Sets tunable parameters The format is to provide a
+  (parameter-number, parameter-value) pair.  mallopt then sets the
+  corresponding parameter to the argument value if it can (i.e., so
+  long as the value is meaningful), and returns 1 if successful else
+  0.  SVID/XPG/ANSI defines four standard param numbers for mallopt,
+  normally defined in malloc.h.  None of these are use in this malloc,
+  so setting them has no effect. But this malloc also supports other
+  options in mallopt. See below for details.  Briefly, supported
+  parameters are as follows (listed defaults are for "typical"
+  configurations).
+
+  Symbol            param #  default    allowed param values
+  M_TRIM_THRESHOLD     -1   2*1024*1024   any   (MAX_SIZE_T disables)
+  M_GRANULARITY        -2     page size   any power of 2 >= page size
+  M_MMAP_THRESHOLD     -3      256*1024   any   (or 0 if no MMAP support)
+*/
+int dlmallopt(int, int);
+
+/*
+  malloc_footprint();
+  Returns the number of bytes obtained from the system.  The total
+  number of bytes allocated by malloc, realloc etc., is less than this
+  value. Unlike mallinfo, this function returns only a precomputed
+  result, so can be called frequently to monitor memory consumption.
+  Even if locks are otherwise defined, this function does not use them,
+  so results might not be up to date.
+*/
+size_t dlmalloc_footprint(void);
+
+/*
+  malloc_max_footprint();
+  Returns the maximum number of bytes obtained from the system. This
+  value will be greater than current footprint if deallocated space
+  has been reclaimed by the system. The peak number of bytes allocated
+  by malloc, realloc etc., is less than this value. Unlike mallinfo,
+  this function returns only a precomputed result, so can be called
+  frequently to monitor memory consumption.  Even if locks are
+  otherwise defined, this function does not use them, so results might
+  not be up to date.
+*/
+size_t dlmalloc_max_footprint(void);
+
+#if !NO_MALLINFO
+/*
+  mallinfo()
+  Returns (by copy) a struct containing various summary statistics:
+
+  arena:     current total non-mmapped bytes allocated from system
+  ordblks:   the number of free chunks
+  smblks:    always zero.
+  hblks:     current number of mmapped regions
+  hblkhd:    total bytes held in mmapped regions
+  usmblks:   the maximum total allocated space. This will be greater
+                than current total if trimming has occurred.
+  fsmblks:   always zero
+  uordblks:  current total allocated space (normal or mmapped)
+  fordblks:  total free space
+  keepcost:  the maximum number of bytes that could ideally be released
+               back to system via malloc_trim. ("ideally" means that
+               it ignores page restrictions etc.)
+
+  Because these fields are ints, but internal bookkeeping may
+  be kept as longs, the reported values may wrap around zero and
+  thus be inaccurate.
+*/
+struct mallinfo dlmallinfo(void);
+#endif /* NO_MALLINFO */
+
+/*
+  independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
+
+  independent_calloc is similar to calloc, but instead of returning a
+  single cleared space, it returns an array of pointers to n_elements
+  independent elements that can hold contents of size elem_size, each
+  of which starts out cleared, and can be independently freed,
+  realloc'ed etc. The elements are guaranteed to be adjacently
+  allocated (this is not guaranteed to occur with multiple callocs or
+  mallocs), which may also improve cache locality in some
+  applications.
+
+  The "chunks" argument is optional (i.e., may be null, which is
+  probably the most typical usage). If it is null, the returned array
+  is itself dynamically allocated and should also be freed when it is
+  no longer needed. Otherwise, the chunks array must be of at least
+  n_elements in length. It is filled in with the pointers to the
+  chunks.
+
+  In either case, independent_calloc returns this pointer array, or
+  null if the allocation failed.  If n_elements is zero and "chunks"
+  is null, it returns a chunk representing an array with zero elements
+  (which should be freed if not wanted).
+
+  Each element must be individually freed when it is no longer
+  needed. If you'd like to instead be able to free all at once, you
+  should instead use regular calloc and assign pointers into this
+  space to represent elements.  (In this case though, you cannot
+  independently free elements.)
+
+  independent_calloc simplifies and speeds up implementations of many
+  kinds of pools.  It may also be useful when constructing large data
+  structures that initially have a fixed number of fixed-sized nodes,
+  but the number is not known at compile time, and some of the nodes
+  may later need to be freed. For example:
+
+  struct Node { int item; struct Node* next; };
+
+  struct Node* build_list() {
+    struct Node** pool;
+    int n = read_number_of_nodes_needed();
+    if (n <= 0) return 0;
+    pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
+    if (pool == 0) die();
+    // organize into a linked list...
+    struct Node* first = pool[0];
+    for (i = 0; i < n-1; ++i)
+      pool[i]->next = pool[i+1];
+    free(pool);     // Can now free the array (or not, if it is needed later)
+    return first;
+  }
+*/
+void** dlindependent_calloc(size_t, size_t, void**);
+
+/*
+  independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
+
+  independent_comalloc allocates, all at once, a set of n_elements
+  chunks with sizes indicated in the "sizes" array.    It returns
+  an array of pointers to these elements, each of which can be
+  independently freed, realloc'ed etc. The elements are guaranteed to
+  be adjacently allocated (this is not guaranteed to occur with
+  multiple callocs or mallocs), which may also improve cache locality
+  in some applications.
+
+  The "chunks" argument is optional (i.e., may be null). If it is null
+  the returned array is itself dynamically allocated and should also
+  be freed when it is no longer needed. Otherwise, the chunks array
+  must be of at least n_elements in length. It is filled in with the
+  pointers to the chunks.
+
+  In either case, independent_comalloc returns this pointer array, or
+  null if the allocation failed.  If n_elements is zero and chunks is
+  null, it returns a chunk representing an array with zero elements
+  (which should be freed if not wanted).
+
+  Each element must be individually freed when it is no longer
+  needed. If you'd like to instead be able to free all at once, you
+  should instead use a single regular malloc, and assign pointers at
+  particular offsets in the aggregate space. (In this case though, you
+  cannot independently free elements.)
+
+  independent_comallac differs from independent_calloc in that each
+  element may have a different size, and also that it does not
+  automatically clear elements.
+
+  independent_comalloc can be used to speed up allocation in cases
+  where several structs or objects must always be allocated at the
+  same time.  For example:
+
+  struct Head { ... }
+  struct Foot { ... }
+
+  void send_message(char* msg) {
+    int msglen = strlen(msg);
+    size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
+    void* chunks[3];
+    if (independent_comalloc(3, sizes, chunks) == 0)
+      die();
+    struct Head* head = (struct Head*)(chunks[0]);
+    char*        body = (char*)(chunks[1]);
+    struct Foot* foot = (struct Foot*)(chunks[2]);
+    // ...
+  }
+
+  In general though, independent_comalloc is worth using only for
+  larger values of n_elements. For small values, you probably won't
+  detect enough difference from series of malloc calls to bother.
+
+  Overuse of independent_comalloc can increase overall memory usage,
+  since it cannot reuse existing noncontiguous small chunks that
+  might be available for some of the elements.
+*/
+void** dlindependent_comalloc(size_t, size_t*, void**);
+
+
+/*
+  pvalloc(size_t n);
+  Equivalent to valloc(minimum-page-that-holds(n)), that is,
+  round up n to nearest pagesize.
+ */
+void*  dlpvalloc(size_t);
+
+/*
+  malloc_trim(size_t pad);
+
+  If possible, gives memory back to the system (via negative arguments
+  to sbrk) if there is unused memory at the `high' end of the malloc
+  pool or in unused MMAP segments. You can call this after freeing
+  large blocks of memory to potentially reduce the system-level memory
+  requirements of a program. However, it cannot guarantee to reduce
+  memory. Under some allocation patterns, some large free blocks of
+  memory will be locked between two used chunks, so they cannot be
+  given back to the system.
+
+  The `pad' argument to malloc_trim represents the amount of free
+  trailing space to leave untrimmed. If this argument is zero, only
+  the minimum amount of memory to maintain internal data structures
+  will be left. Non-zero arguments can be supplied to maintain enough
+  trailing space to service future expected allocations without having
+  to re-obtain memory from the system.
+
+  Malloc_trim returns 1 if it actually released any memory, else 0.
+*/
+int  dlmalloc_trim(size_t);
+
+/*
+  malloc_usable_size(void* p);
+
+  Returns the number of bytes you can actually use in
+  an allocated chunk, which may be more than you requested (although
+  often not) due to alignment and minimum size constraints.
+  You can use this many bytes without worrying about
+  overwriting other allocated objects. This is not a particularly great
+  programming practice. malloc_usable_size can be more useful in
+  debugging and assertions, for example:
+
+  p = malloc(n);
+  assert(malloc_usable_size(p) >= 256);
+*/
+size_t dlmalloc_usable_size(void*);
+
+/*
+  malloc_stats();
+  Prints on stderr the amount of space obtained from the system (both
+  via sbrk and mmap), the maximum amount (which may be more than
+  current if malloc_trim and/or munmap got called), and the current
+  number of bytes allocated via malloc (or realloc, etc) but not yet
+  freed. Note that this is the number of bytes allocated, not the
+  number requested. It will be larger than the number requested
+  because of alignment and bookkeeping overhead. Because it includes
+  alignment wastage as being in use, this figure may be greater than
+  zero even when no user-level chunks are allocated.
+
+  The reported current and maximum system memory can be inaccurate if
+  a program makes other calls to system memory allocation functions
+  (normally sbrk) outside of malloc.
+
+  malloc_stats prints only the most commonly interesting statistics.
+  More information can be obtained by calling mallinfo.
+*/
+void  dlmalloc_stats(void);
+
+#endif /* ONLY_MSPACES */
+
+#if MSPACES
+
+/*
+  mspace is an opaque type representing an independent
+  region of space that supports mspace_malloc, etc.
+*/
+typedef void* mspace;
+
+/*
+  create_mspace creates and returns a new independent space with the
+  given initial capacity, or, if 0, the default granularity size.  It
+  returns null if there is no system memory available to create the
+  space.  If argument locked is non-zero, the space uses a separate
+  lock to control access. The capacity of the space will grow
+  dynamically as needed to service mspace_malloc requests.  You can
+  control the sizes of incremental increases of this space by
+  compiling with a different DEFAULT_GRANULARITY or dynamically
+  setting with mallopt(M_GRANULARITY, value).
+*/
+mspace create_mspace(size_t capacity, int locked);
+
+/*
+  destroy_mspace destroys the given space, and attempts to return all
+  of its memory back to the system, returning the total number of
+  bytes freed. After destruction, the results of access to all memory
+  used by the space become undefined.
+*/
+size_t destroy_mspace(mspace msp);
+
+/*
+  create_mspace_with_base uses the memory supplied as the initial base
+  of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
+  space is used for bookkeeping, so the capacity must be at least this
+  large. (Otherwise 0 is returned.) When this initial space is
+  exhausted, additional memory will be obtained from the system.
+  Destroying this space will deallocate all additionally allocated
+  space (if possible) but not the initial base.
+*/
+mspace create_mspace_with_base(void* base, size_t capacity, int locked);
+
+/*
+  mspace_malloc behaves as malloc, but operates within
+  the given space.
+*/
+void* mspace_malloc(mspace msp, size_t bytes);
+
+/*
+  mspace_free behaves as free, but operates within
+  the given space.
+
+  If compiled with FOOTERS==1, mspace_free is not actually needed.
+  free may be called instead of mspace_free because freed chunks from
+  any space are handled by their originating spaces.
+*/
+void mspace_free(mspace msp, void* mem);
+
+/*
+  mspace_realloc behaves as realloc, but operates within
+  the given space.
+
+  If compiled with FOOTERS==1, mspace_realloc is not actually
+  needed.  realloc may be called instead of mspace_realloc because
+  realloced chunks from any space are handled by their originating
+  spaces.
+*/
+void* mspace_realloc(mspace msp, void* mem, size_t newsize);
+
+/*
+  mspace_calloc behaves as calloc, but operates within
+  the given space.
+*/
+void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
+
+/*
+  mspace_memalign behaves as memalign, but operates within
+  the given space.
+*/
+void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
+
+/*
+  mspace_independent_calloc behaves as independent_calloc, but
+  operates within the given space.
+*/
+void** mspace_independent_calloc(mspace msp, size_t n_elements,
+                                 size_t elem_size, void* chunks[]);
+
+/*
+  mspace_independent_comalloc behaves as independent_comalloc, but
+  operates within the given space.
+*/
+void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+                                   size_t sizes[], void* chunks[]);
+
+/*
+  mspace_footprint() returns the number of bytes obtained from the
+  system for this space.
+*/
+size_t mspace_footprint(mspace msp);
+
+/*
+  mspace_max_footprint() returns the peak number of bytes obtained from the
+  system for this space.
+*/
+size_t mspace_max_footprint(mspace msp);
+
+
+#if !NO_MALLINFO
+/*
+  mspace_mallinfo behaves as mallinfo, but reports properties of
+  the given space.
+*/
+struct mallinfo mspace_mallinfo(mspace msp);
+#endif /* NO_MALLINFO */
+
+/*
+  mspace_malloc_stats behaves as malloc_stats, but reports
+  properties of the given space.
+*/
+void mspace_malloc_stats(mspace msp);
+
+/*
+  mspace_trim behaves as malloc_trim, but
+  operates within the given space.
+*/
+int mspace_trim(mspace msp, size_t pad);
+
+/*
+  An alias for mallopt.
+*/
+int mspace_mallopt(int, int);
+
+#endif /* MSPACES */
+
+#ifdef __cplusplus
+};  /* end of extern "C" */
+#endif /* __cplusplus */
+
+/*
+  ========================================================================
+  To make a fully customizable malloc.h header file, cut everything
+  above this line, put into file malloc.h, edit to suit, and #include it
+  on the next line, as well as in programs that use this malloc.
+  ========================================================================
+*/
+
+/* #include "malloc.h" */
+
+/*------------------------------ internal #includes ---------------------- */
+
+#ifdef WIN32
+#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
+#endif /* WIN32 */
+
+#include <stdio.h>       /* for printing in malloc_stats */
+
+#ifndef LACKS_ERRNO_H
+#include <errno.h>       /* for MALLOC_FAILURE_ACTION */
+#endif /* LACKS_ERRNO_H */
+#if FOOTERS
+#include <time.h>        /* for magic initialization */
+#endif /* FOOTERS */
+#ifndef LACKS_STDLIB_H
+#include <stdlib.h>      /* for abort() */
+#endif /* LACKS_STDLIB_H */
+#ifdef DEBUG
+#if ABORT_ON_ASSERT_FAILURE
+#define assert(x) if(!(x)) ABORT
+#else /* ABORT_ON_ASSERT_FAILURE */
+#include <assert.h>
+#endif /* ABORT_ON_ASSERT_FAILURE */
+#else  /* DEBUG */
+#define assert(x)
+#endif /* DEBUG */
+#ifndef LACKS_STRING_H
+#include <string.h>      /* for memset etc */
+#endif  /* LACKS_STRING_H */
+#if USE_BUILTIN_FFS
+#ifndef LACKS_STRINGS_H
+#include <strings.h>     /* for ffs */
+#endif /* LACKS_STRINGS_H */
+#endif /* USE_BUILTIN_FFS */
+#if HAVE_MMAP
+#ifndef LACKS_SYS_MMAN_H
+#include <sys/mman.h>    /* for mmap */
+#endif /* LACKS_SYS_MMAN_H */
+#ifndef LACKS_FCNTL_H
+#include <fcntl.h>
+#endif /* LACKS_FCNTL_H */
+#endif /* HAVE_MMAP */
+#if HAVE_MORECORE
+#ifndef LACKS_UNISTD_H
+#include <unistd.h>     /* for sbrk */
+#else /* LACKS_UNISTD_H */
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
+extern void*     sbrk(ptrdiff_t);
+#endif /* FreeBSD etc */
+#endif /* LACKS_UNISTD_H */
+#endif /* HAVE_MMAP */
+
+#ifndef WIN32
+#ifndef malloc_getpagesize
+#  ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
+#    ifndef _SC_PAGE_SIZE
+#      define _SC_PAGE_SIZE _SC_PAGESIZE
+#    endif
+#  endif
+#  ifdef _SC_PAGE_SIZE
+#    define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
+#  else
+#    if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
+       extern size_t getpagesize();
+#      define malloc_getpagesize getpagesize()
+#    else
+#      ifdef WIN32 /* use supplied emulation of getpagesize */
+#        define malloc_getpagesize getpagesize()
+#      else
+#        ifndef LACKS_SYS_PARAM_H
+#          include <sys/param.h>
+#        endif
+#        ifdef EXEC_PAGESIZE
+#          define malloc_getpagesize EXEC_PAGESIZE
+#        else
+#          ifdef NBPG
+#            ifndef CLSIZE
+#              define malloc_getpagesize NBPG
+#            else
+#              define malloc_getpagesize (NBPG * CLSIZE)
+#            endif
+#          else
+#            ifdef NBPC
+#              define malloc_getpagesize NBPC
+#            else
+#              ifdef PAGESIZE
+#                define malloc_getpagesize PAGESIZE
+#              else /* just guess */
+#                define malloc_getpagesize ((size_t)4096U)
+#              endif
+#            endif
+#          endif
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+#endif
+
+/* ------------------- size_t and alignment properties -------------------- */
+
+/* The byte and bit size of a size_t */
+#define SIZE_T_SIZE         (sizeof(size_t))
+#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
+
+/* Some constants coerced to size_t */
+/* Annoying but necessary to avoid errors on some plaftorms */
+#define SIZE_T_ZERO         ((size_t)0)
+#define SIZE_T_ONE          ((size_t)1)
+#define SIZE_T_TWO          ((size_t)2)
+#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
+#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
+#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
+#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
+
+/* The bit mask value corresponding to MALLOC_ALIGNMENT */
+#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
+
+/* True if address a has acceptable alignment */
+#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
+
+/* the number of bytes to offset an address to align it */
+#define align_offset(A)\
+ ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
+  ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
+
+/* -------------------------- MMAP preliminaries ------------------------- */
+
+/*
+   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
+   checks to fail so compiler optimizer can delete code rather than
+   using so many "#if"s.
+*/
+
+
+/* MORECORE and MMAP must return MFAIL on failure */
+#define MFAIL                ((void*)(MAX_SIZE_T))
+#define CMFAIL               ((char*)(MFAIL)) /* defined for convenience */
+
+#if !HAVE_MMAP
+#define IS_MMAPPED_BIT       (SIZE_T_ZERO)
+#define USE_MMAP_BIT         (SIZE_T_ZERO)
+#define CALL_MMAP(s)         MFAIL
+#define CALL_MUNMAP(a, s)    (-1)
+#define DIRECT_MMAP(s)       MFAIL
+
+#else /* HAVE_MMAP */
+#define IS_MMAPPED_BIT       (SIZE_T_ONE)
+#define USE_MMAP_BIT         (SIZE_T_ONE)
+
+#ifndef WIN32
+#define CALL_MUNMAP(a, s)    munmap((a), (s))
+#define MMAP_PROT            (PROT_READ|PROT_WRITE)
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS        MAP_ANON
+#endif /* MAP_ANON */
+#ifdef MAP_ANONYMOUS
+#define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
+#define CALL_MMAP(s)         mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
+#else /* MAP_ANONYMOUS */
+/*
+   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
+   is unlikely to be needed, but is supplied just in case.
+*/
+#define MMAP_FLAGS           (MAP_PRIVATE)
+static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
+#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \
+           (dev_zero_fd = open("/dev/zero", O_RDWR), \
+            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
+            mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
+#endif /* MAP_ANONYMOUS */
+
+#define DIRECT_MMAP(s)       CALL_MMAP(s)
+#else /* WIN32 */
+
+/* Win32 MMAP via VirtualAlloc */
+static void* win32mmap(size_t size) {
+  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
+  return (ptr != 0)? ptr: MFAIL;
+}
+
+/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
+static void* win32direct_mmap(size_t size) {
+  void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
+                           PAGE_READWRITE);
+  return (ptr != 0)? ptr: MFAIL;
+}
+
+/* This function supports releasing coalesed segments */
+static int win32munmap(void* ptr, size_t size) {
+  MEMORY_BASIC_INFORMATION minfo;
+  char* cptr = ptr;
+  while (size) {
+    if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
+      return -1;
+    if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
+        minfo.State != MEM_COMMIT || minfo.RegionSize > size)
+      return -1;
+    if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
+      return -1;
+    cptr += minfo.RegionSize;
+    size -= minfo.RegionSize;
+  }
+  return 0;
+}
+
+#define CALL_MMAP(s)         win32mmap(s)
+#define CALL_MUNMAP(a, s)    win32munmap((a), (s))
+#define DIRECT_MMAP(s)       win32direct_mmap(s)
+#endif /* WIN32 */
+#endif /* HAVE_MMAP */
+
+#if HAVE_MMAP && HAVE_MREMAP
+#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
+#else  /* HAVE_MMAP && HAVE_MREMAP */
+#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
+#endif /* HAVE_MMAP && HAVE_MREMAP */
+
+#if HAVE_MORECORE
+#define CALL_MORECORE(S)     MORECORE(S)
+#else  /* HAVE_MORECORE */
+#define CALL_MORECORE(S)     MFAIL
+#endif /* HAVE_MORECORE */
+
+/* mstate bit set if continguous morecore disabled or failed */
+#define USE_NONCONTIGUOUS_BIT (4U)
+
+/* segment bit set in create_mspace_with_base */
+#define EXTERN_BIT            (8U)
+
+
+/* --------------------------- Lock preliminaries ------------------------ */
+
+#if USE_LOCKS
+
+/*
+  When locks are defined, there are up to two global locks:
+
+  * If HAVE_MORECORE, morecore_mutex protects sequences of calls to
+    MORECORE.  In many cases sys_alloc requires two calls, that should
+    not be interleaved with calls by other threads.  This does not
+    protect against direct calls to MORECORE by other threads not
+    using this lock, so there is still code to cope the best we can on
+    interference.
+
+  * magic_init_mutex ensures that mparams.magic and other
+    unique mparams values are initialized only once.
+*/
+
+#ifndef WIN32
+/* By default use posix locks */
+#include <pthread.h>
+#define MLOCK_T pthread_mutex_t
+#define INITIAL_LOCK(l)      pthread_mutex_init(l, NULL)
+#define ACQUIRE_LOCK(l)      pthread_mutex_lock(l)
+#define RELEASE_LOCK(l)      pthread_mutex_unlock(l)
+
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif /* HAVE_MORECORE */
+
+static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#else /* WIN32 */
+/*
+   Because lock-protected regions have bounded times, and there
+   are no recursive lock calls, we can use simple spinlocks.
+*/
+
+#define MLOCK_T long
+static int win32_acquire_lock (MLOCK_T *sl) {
+  for (;;) {
+#ifdef InterlockedCompareExchangePointer
+    if (!InterlockedCompareExchange(sl, 1, 0))
+      return 0;
+#else  /* Use older void* version */
+    if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0))
+      return 0;
+#endif /* InterlockedCompareExchangePointer */
+    Sleep (0);
+  }
+}
+
+static void win32_release_lock (MLOCK_T *sl) {
+  InterlockedExchange (sl, 0);
+}
+
+#define INITIAL_LOCK(l)      *(l)=0
+#define ACQUIRE_LOCK(l)      win32_acquire_lock(l)
+#define RELEASE_LOCK(l)      win32_release_lock(l)
+#if HAVE_MORECORE
+static MLOCK_T morecore_mutex;
+#endif /* HAVE_MORECORE */
+static MLOCK_T magic_init_mutex;
+#endif /* WIN32 */
+
+#define USE_LOCK_BIT               (2U)
+#else  /* USE_LOCKS */
+#define USE_LOCK_BIT               (0U)
+#define INITIAL_LOCK(l)
+#endif /* USE_LOCKS */
+
+#if USE_LOCKS && HAVE_MORECORE
+#define ACQUIRE_MORECORE_LOCK()    ACQUIRE_LOCK(&morecore_mutex);
+#define RELEASE_MORECORE_LOCK()    RELEASE_LOCK(&morecore_mutex);
+#else /* USE_LOCKS && HAVE_MORECORE */
+#define ACQUIRE_MORECORE_LOCK()
+#define RELEASE_MORECORE_LOCK()
+#endif /* USE_LOCKS && HAVE_MORECORE */
+
+#if USE_LOCKS
+#define ACQUIRE_MAGIC_INIT_LOCK()  ACQUIRE_LOCK(&magic_init_mutex);
+#define RELEASE_MAGIC_INIT_LOCK()  RELEASE_LOCK(&magic_init_mutex);
+#else  /* USE_LOCKS */
+#define ACQUIRE_MAGIC_INIT_LOCK()
+#define RELEASE_MAGIC_INIT_LOCK()
+#endif /* USE_LOCKS */
+
+
+/* -----------------------  Chunk representations ------------------------ */
+
+/*
+  (The following includes lightly edited explanations by Colin Plumb.)
+
+  The malloc_chunk declaration below is misleading (but accurate and
+  necessary).  It declares a "view" into memory allowing access to
+  necessary fields at known offsets from a given base.
+
+  Chunks of memory are maintained using a `boundary tag' method as
+  originally described by Knuth.  (See the paper by Paul Wilson
+  ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
+  techniques.)  Sizes of free chunks are stored both in the front of
+  each chunk and at the end.  This makes consolidating fragmented
+  chunks into bigger chunks fast.  The head fields also hold bits
+  representing whether chunks are free or in use.
+
+  Here are some pictures to make it clearer.  They are "exploded" to
+  show that the state of a chunk can be thought of as extending from
+  the high 31 bits of the head field of its header through the
+  prev_foot and PINUSE_BIT bit of the following chunk header.
+
+  A chunk that's in use looks like:
+
+   chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+           | Size of previous chunk (if P = 1)                             |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+         | Size of this chunk                                         1| +-+
+   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         |                                                               |
+         +-                                                             -+
+         |                                                               |
+         +-                                                             -+
+         |                                                               :
+         +-      size - sizeof(size_t) available payload bytes          -+
+         :                                                               |
+ chunk-> +-                                                             -+
+         |                                                               |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
+       | Size of next chunk (may or may not be in use)               | +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+    And if it's free, it looks like this:
+
+   chunk-> +-                                                             -+
+           | User payload (must be in use, or we would have merged!)       |
+           +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
+         | Size of this chunk                                         0| +-+
+   mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Next pointer                                                  |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Prev pointer                                                  |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         |                                                               :
+         +-      size - sizeof(struct chunk) unused bytes               -+
+         :                                                               |
+ chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         | Size of this chunk                                            |
+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
+       | Size of next chunk (must be in use, or we would have merged)| +-+
+ mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               :
+       +- User payload                                                -+
+       :                                                               |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+                                                                     |0|
+                                                                     +-+
+  Note that since we always merge adjacent free chunks, the chunks
+  adjacent to a free chunk must be in use.
+
+  Given a pointer to a chunk (which can be derived trivially from the
+  payload pointer) we can, in O(1) time, find out whether the adjacent
+  chunks are free, and if so, unlink them from the lists that they
+  are on and merge them with the current chunk.
+
+  Chunks always begin on even word boundaries, so the mem portion
+  (which is returned to the user) is also on an even word boundary, and
+  thus at least double-word aligned.
+
+  The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
+  chunk size (which is always a multiple of two words), is an in-use
+  bit for the *previous* chunk.  If that bit is *clear*, then the
+  word before the current chunk size contains the previous chunk
+  size, and can be used to find the front of the previous chunk.
+  The very first chunk allocated always has this bit set, preventing
+  access to non-existent (or non-owned) memory. If pinuse is set for
+  any given chunk, then you CANNOT determine the size of the
+  previous chunk, and might even get a memory addressing fault when
+  trying to do so.
+
+  The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
+  the chunk size redundantly records whether the current chunk is
+  inuse. This redundancy enables usage checks within free and realloc,
+  and reduces indirection when freeing and consolidating chunks.
+
+  Each freshly allocated chunk must have both cinuse and pinuse set.
+  That is, each allocated chunk borders either a previously allocated
+  and still in-use chunk, or the base of its memory arena. This is
+  ensured by making all allocations from the the `lowest' part of any
+  found chunk.  Further, no free chunk physically borders another one,
+  so each free chunk is known to be preceded and followed by either
+  inuse chunks or the ends of memory.
+
+  Note that the `foot' of the current chunk is actually represented
+  as the prev_foot of the NEXT chunk. This makes it easier to
+  deal with alignments etc but can be very confusing when trying
+  to extend or adapt this code.
+
+  The exceptions to all this are
+
+     1. The special chunk `top' is the top-most available chunk (i.e.,
+        the one bordering the end of available memory). It is treated
+        specially.  Top is never included in any bin, is used only if
+        no other chunk is available, and is released back to the
+        system if it is very large (see M_TRIM_THRESHOLD).  In effect,
+        the top chunk is treated as larger (and thus less well
+        fitting) than any other available chunk.  The top chunk
+        doesn't update its trailing size field since there is no next
+        contiguous chunk that would have to index off it. However,
+        space is still allocated for it (TOP_FOOT_SIZE) to enable
+        separation or merging when space is extended.
+
+     3. Chunks allocated via mmap, which have the lowest-order bit
+        (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set
+        PINUSE_BIT in their head fields.  Because they are allocated
+        one-by-one, each must carry its own prev_foot field, which is
+        also used to hold the offset this chunk has within its mmapped
+        region, which is needed to preserve alignment. Each mmapped
+        chunk is trailed by the first two fields of a fake next-chunk
+        for sake of usage checks.
+
+*/
+
+struct malloc_chunk {
+  size_t               prev_foot;  /* Size of previous chunk (if free).  */
+  size_t               head;       /* Size and inuse bits. */
+  struct malloc_chunk* fd;         /* double links -- used only if free. */
+  struct malloc_chunk* bk;
+};
+
+typedef struct malloc_chunk  mchunk;
+typedef struct malloc_chunk* mchunkptr;
+typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
+typedef unsigned int bindex_t;         /* Described below */
+typedef unsigned int binmap_t;         /* Described below */
+typedef unsigned int flag_t;           /* The type of various bit flag sets */
+
+/* ------------------- Chunks sizes and alignments ----------------------- */
+
+#define MCHUNK_SIZE         (sizeof(mchunk))
+
+#if FOOTERS
+#define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
+#else /* FOOTERS */
+#define CHUNK_OVERHEAD      (SIZE_T_SIZE)
+#endif /* FOOTERS */
+
+/* MMapped chunks need a second word of overhead ... */
+#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
+/* ... and additional padding for fake next-chunk at foot */
+#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
+
+/* The smallest size we can malloc is an aligned minimal chunk */
+#define MIN_CHUNK_SIZE\
+  ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* conversion from malloc headers to user pointers, and back */
+#define chunk2mem(p)        ((void*)((char*)(p)       + TWO_SIZE_T_SIZES))
+#define mem2chunk(mem)      ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
+/* chunk associated with aligned address A */
+#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
+
+/* Bounds on request (not chunk) sizes. */
+#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
+#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
+
+/* pad request bytes into a usable size */
+#define pad_request(req) \
+   (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
+
+/* pad request, checking for minimum (but not maximum) */
+#define request2size(req) \
+  (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
+
+
+/* ------------------ Operations on head and foot fields ----------------- */
+
+/*
+  The head field of a chunk is or'ed with PINUSE_BIT when previous
+  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
+  use. If the chunk was obtained with mmap, the prev_foot field has
+  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the
+  mmapped region to the base of the chunk.
+*/
+
+#define PINUSE_BIT          (SIZE_T_ONE)
+#define CINUSE_BIT          (SIZE_T_TWO)
+#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
+
+/* Head value for fenceposts */
+#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
+
+/* extraction of fields from head words */
+#define cinuse(p)           ((p)->head & CINUSE_BIT)
+#define pinuse(p)           ((p)->head & PINUSE_BIT)
+#define chunksize(p)        ((p)->head & ~(INUSE_BITS))
+
+#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
+#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)
+
+/* Treat space at ptr +/- offset as a chunk */
+#define chunk_plus_offset(p, s)  ((mchunkptr)(((char*)(p)) + (s)))
+#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
+
+/* Ptr to next or previous physical malloc_chunk. */
+#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS)))
+#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
+
+/* extract next chunk's pinuse bit */
+#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
+
+/* Get/set size at footer */
+#define get_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot)
+#define set_foot(p, s)  (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
+
+/* Set size, pinuse bit, and foot */
+#define set_size_and_pinuse_of_free_chunk(p, s)\
+  ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
+
+/* Set size, pinuse bit, foot, and clear next pinuse */
+#define set_free_with_pinuse(p, s, n)\
+  (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
+
+#define is_mmapped(p)\
+  (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))
+
+/* Get the internal overhead associated with chunk p */
+#define overhead_for(p)\
+ (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
+
+/* Return true if malloced space is not necessarily cleared */
+#if MMAP_CLEARS
+#define calloc_must_clear(p) (!is_mmapped(p))
+#else /* MMAP_CLEARS */
+#define calloc_must_clear(p) (1)
+#endif /* MMAP_CLEARS */
+
+/* ---------------------- Overlaid data structures ----------------------- */
+
+/*
+  When chunks are not in use, they are treated as nodes of either
+  lists or trees.
+
+  "Small"  chunks are stored in circular doubly-linked lists, and look
+  like this:
+
+    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Size of previous chunk                            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `head:' |             Size of chunk, in bytes                         |P|
+      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Forward pointer to next chunk in list             |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Back pointer to previous chunk in list            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Unused space (may be 0 bytes long)                .
+            .                                                               .
+            .                                                               |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `foot:' |             Size of chunk, in bytes                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+  Larger chunks are kept in a form of bitwise digital trees (aka
+  tries) keyed on chunksizes.  Because malloc_tree_chunks are only for
+  free chunks greater than 256 bytes, their size doesn't impose any
+  constraints on user chunk sizes.  Each node looks like:
+
+    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Size of previous chunk                            |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `head:' |             Size of chunk, in bytes                         |P|
+      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Forward pointer to next chunk of same size        |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Back pointer to previous chunk of same size       |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to left child (child[0])                  |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to right child (child[1])                 |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Pointer to parent                                 |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             bin index of this chunk                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+            |             Unused space                                      .
+            .                                                               |
+nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+    `foot:' |             Size of chunk, in bytes                           |
+            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+  Each tree holding treenodes is a tree of unique chunk sizes.  Chunks
+  of the same size are arranged in a circularly-linked list, with only
+  the oldest chunk (the next to be used, in our FIFO ordering)
+  actually in the tree.  (Tree members are distinguished by a non-null
+  parent pointer.)  If a chunk with the same size an an existing node
+  is inserted, it is linked off the existing node using pointers that
+  work in the same way as fd/bk pointers of small chunks.
+
+  Each tree contains a power of 2 sized range of chunk sizes (the
+  smallest is 0x100 <= x < 0x180), which is is divided in half at each
+  tree level, with the chunks in the smaller half of the range (0x100
+  <= x < 0x140 for the top nose) in the left subtree and the larger
+  half (0x140 <= x < 0x180) in the right subtree.  This is, of course,
+  done by inspecting individual bits.
+
+  Using these rules, each node's left subtree contains all smaller
+  sizes than its right subtree.  However, the node at the root of each
+  subtree has no particular ordering relationship to either.  (The
+  dividing line between the subtree sizes is based on trie relation.)
+  If we remove the last chunk of a given size from the interior of the
+  tree, we need to replace it with a leaf node.  The tree ordering
+  rules permit a node to be replaced by any leaf below it.
+
+  The smallest chunk in a tree (a common operation in a best-fit
+  allocator) can be found by walking a path to the leftmost leaf in
+  the tree.  Unlike a usual binary tree, where we follow left child
+  pointers until we reach a null, here we follow the right child
+  pointer any time the left one is null, until we reach a leaf with
+  both child pointers null. The smallest chunk in the tree will be
+  somewhere along that path.
+
+  The worst case number of steps to add, find, or remove a node is
+  bounded by the number of bits differentiating chunks within
+  bins. Under current bin calculations, this ranges from 6 up to 21
+  (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
+  is of course much better.
+*/
+
+struct malloc_tree_chunk {
+  /* The first four fields must be compatible with malloc_chunk */
+  size_t                    prev_foot;
+  size_t                    head;
+  struct malloc_tree_chunk* fd;
+  struct malloc_tree_chunk* bk;
+
+  struct malloc_tree_chunk* child[2];
+  struct malloc_tree_chunk* parent;
+  bindex_t                  index;
+};
+
+typedef struct malloc_tree_chunk  tchunk;
+typedef struct malloc_tree_chunk* tchunkptr;
+typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
+
+/* A little helper macro for trees */
+#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
+
+/* ----------------------------- Segments -------------------------------- */
+
+/*
+  Each malloc space may include non-contiguous segments, held in a
+  list headed by an embedded malloc_segment record representing the
+  top-most space. Segments also include flags holding properties of
+  the space. Large chunks that are directly allocated by mmap are not
+  included in this list. They are instead independently created and
+  destroyed without otherwise keeping track of them.
+
+  Segment management mainly comes into play for spaces allocated by
+  MMAP.  Any call to MMAP might or might not return memory that is
+  adjacent to an existing segment.  MORECORE normally contiguously
+  extends the current space, so this space is almost always adjacent,
+  which is simpler and faster to deal with. (This is why MORECORE is
+  used preferentially to MMAP when both are available -- see
+  sys_alloc.)  When allocating using MMAP, we don't use any of the
+  hinting mechanisms (inconsistently) supported in various
+  implementations of unix mmap, or distinguish reserving from
+  committing memory. Instead, we just ask for space, and exploit
+  contiguity when we get it.  It is probably possible to do
+  better than this on some systems, but no general scheme seems
+  to be significantly better.
+
+  Management entails a simpler variant of the consolidation scheme
+  used for chunks to reduce fragmentation -- new adjacent memory is
+  normally prepended or appended to an existing segment. However,
+  there are limitations compared to chunk consolidation that mostly
+  reflect the fact that segment processing is relatively infrequent
+  (occurring only when getting memory from system) and that we
+  don't expect to have huge numbers of segments:
+
+  * Segments are not indexed, so traversal requires linear scans.  (It
+    would be possible to index these, but is not worth the extra
+    overhead and complexity for most programs on most platforms.)
+  * New segments are only appended to old ones when holding top-most
+    memory; if they cannot be prepended to others, they are held in
+    different segments.
+
+  Except for the top-most segment of an mstate, each segment record
+  is kept at the tail of its segment. Segments are added by pushing
+  segment records onto the list headed by &mstate.seg for the
+  containing mstate.
+
+  Segment flags control allocation/merge/deallocation policies:
+  * If EXTERN_BIT set, then we did not allocate this segment,
+    and so should not try to deallocate or merge with others.
+    (This currently holds only for the initial segment passed
+    into create_mspace_with_base.)
+  * If IS_MMAPPED_BIT set, the segment may be merged with
+    other surrounding mmapped segments and trimmed/de-allocated
+    using munmap.
+  * If neither bit is set, then the segment was obtained using
+    MORECORE so can be merged with surrounding MORECORE'd segments
+    and deallocated/trimmed using MORECORE with negative arguments.
+*/
+
+struct malloc_segment {
+  char*        base;             /* base address */
+  size_t       size;             /* allocated size */
+  struct malloc_segment* next;   /* ptr to next segment */
+  flag_t       sflags;           /* mmap and extern flag */
+};
+
+#define is_mmapped_segment(S)  ((S)->sflags & IS_MMAPPED_BIT)
+#define is_extern_segment(S)   ((S)->sflags & EXTERN_BIT)
+
+typedef struct malloc_segment  msegment;
+typedef struct malloc_segment* msegmentptr;
+
+/* ---------------------------- malloc_state ----------------------------- */
+
+/*
+   A malloc_state holds all of the bookkeeping for a space.
+   The main fields are:
+
+  Top
+    The topmost chunk of the currently active segment. Its size is
+    cached in topsize.  The actual size of topmost space is
+    topsize+TOP_FOOT_SIZE, which includes space reserved for adding
+    fenceposts and segment records if necessary when getting more
+    space from the system.  The size at which to autotrim top is
+    cached from mparams in trim_check, except that it is disabled if
+    an autotrim fails.
+
+  Designated victim (dv)
+    This is the preferred chunk for servicing small requests that
+    don't have exact fits.  It is normally the chunk split off most
+    recently to service another small request.  Its size is cached in
+    dvsize. The link fields of this chunk are not maintained since it
+    is not kept in a bin.
+
+  SmallBins
+    An array of bin headers for free chunks.  These bins hold chunks
+    with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
+    chunks of all the same size, spaced 8 bytes apart.  To simplify
+    use in double-linked lists, each bin header acts as a malloc_chunk
+    pointing to the real first node, if it exists (else pointing to
+    itself).  This avoids special-casing for headers.  But to avoid
+    waste, we allocate only the fd/bk pointers of bins, and then use
+    repositioning tricks to treat these as the fields of a chunk.
+
+  TreeBins
+    Treebins are pointers to the roots of trees holding a range of
+    sizes. There are 2 equally spaced treebins for each power of two
+    from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
+    larger.
+
+  Bin maps
+    There is one bit map for small bins ("smallmap") and one for
+    treebins ("treemap).  Each bin sets its bit when non-empty, and
+    clears the bit when empty.  Bit operations are then used to avoid
+    bin-by-bin searching -- nearly all "search" is done without ever
+    looking at bins that won't be selected.  The bit maps
+    conservatively use 32 bits per map word, even if on 64bit system.
+    For a good description of some of the bit-based techniques used
+    here, see Henry S. Warren Jr's book "Hacker's Delight" (and
+    supplement at http://hackersdelight.org/). Many of these are
+    intended to reduce the branchiness of paths through malloc etc, as
+    well as to reduce the number of memory locations read or written.
+
+  Segments
+    A list of segments headed by an embedded malloc_segment record
+    representing the initial space.
+
+  Address check support
+    The least_addr field is the least address ever obtained from
+    MORECORE or MMAP. Attempted frees and reallocs of any address less
+    than this are trapped (unless INSECURE is defined).
+
+  Magic tag
+    A cross-check field that should always hold same value as mparams.magic.
+
+  Flags
+    Bits recording whether to use MMAP, locks, or contiguous MORECORE
+
+  Statistics
+    Each space keeps track of current and maximum system memory
+    obtained via MORECORE or MMAP.
+
+  Locking
+    If USE_LOCKS is defined, the "mutex" lock is acquired and released
+    around every public call using this mspace.
+*/
+
+/* Bin types, widths and sizes */
+#define NSMALLBINS        (32U)
+#define NTREEBINS         (32U)
+#define SMALLBIN_SHIFT    (3U)
+#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
+#define TREEBIN_SHIFT     (8U)
+#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
+#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
+#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
+
+struct malloc_state {
+  binmap_t   smallmap;
+  binmap_t   treemap;
+  size_t     dvsize;
+  size_t     topsize;
+  char*      least_addr;
+  mchunkptr  dv;
+  mchunkptr  top;
+  size_t     trim_check;
+  size_t     magic;
+  mchunkptr  smallbins[(NSMALLBINS+1)*2];
+  tbinptr    treebins[NTREEBINS];
+  size_t     footprint;
+  size_t     max_footprint;
+  flag_t     mflags;
+#if USE_LOCKS
+  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
+#endif /* USE_LOCKS */
+  msegment   seg;
+};
+
+typedef struct malloc_state*    mstate;
+
+/* ------------- Global malloc_state and malloc_params ------------------- */
+
+/*
+  malloc_params holds global properties, including those that can be
+  dynamically set using mallopt. There is a single instance, mparams,
+  initialized in init_mparams.
+*/
+
+struct malloc_params {
+  size_t magic;
+  size_t page_size;
+  size_t granularity;
+  size_t mmap_threshold;
+  size_t trim_threshold;
+  flag_t default_mflags;
+};
+
+static struct malloc_params mparams;
+
+/* The global malloc_state used for all non-"mspace" calls */
+static struct malloc_state _gm_;
+#define gm                 (&_gm_)
+#define is_global(M)       ((M) == &_gm_)
+#define is_initialized(M)  ((M)->top != 0)
+
+/* -------------------------- system alloc setup ------------------------- */
+
+/* Operations on mflags */
+
+#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
+#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
+#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
+
+#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
+#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
+#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
+
+#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
+#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
+
+#define set_lock(M,L)\
+ ((M)->mflags = (L)?\
+  ((M)->mflags | USE_LOCK_BIT) :\
+  ((M)->mflags & ~USE_LOCK_BIT))
+
+/* page-align a size */
+#define page_align(S)\
+ (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE))
+
+/* granularity-align a size */
+#define granularity_align(S)\
+  (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE))
+
+#define is_page_aligned(S)\
+   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
+#define is_granularity_aligned(S)\
+   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
+
+/*  True if segment S holds address A */
+#define segment_holds(S, A)\
+  ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
+
+/* Return segment holding given address */
+static msegmentptr segment_holding(mstate m, char* addr) {
+  msegmentptr sp = &m->seg;
+  for (;;) {
+    if (addr >= sp->base && addr < sp->base + sp->size)
+      return sp;
+    if ((sp = sp->next) == 0)
+      return 0;
+  }
+}
+
+/* Return true if segment contains a segment link */
+static int has_segment_link(mstate m, msegmentptr ss) {
+  msegmentptr sp = &m->seg;
+  for (;;) {
+    if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
+      return 1;
+    if ((sp = sp->next) == 0)
+      return 0;
+  }
+}
+
+#ifndef MORECORE_CANNOT_TRIM
+#define should_trim(M,s)  ((s) > (M)->trim_check)
+#else  /* MORECORE_CANNOT_TRIM */
+#define should_trim(M,s)  (0)
+#endif /* MORECORE_CANNOT_TRIM */
+
+/*
+  TOP_FOOT_SIZE is padding at the end of a segment, including space
+  that may be needed to place segment records and fenceposts when new
+  noncontiguous segments are added.
+*/
+#define TOP_FOOT_SIZE\
+  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
+
+
+/* -------------------------------  Hooks -------------------------------- */
+
+/*
+  PREACTION should be defined to return 0 on success, and nonzero on
+  failure. If you are not using locking, you can redefine these to do
+  anything you like.
+*/
+
+#if USE_LOCKS
+
+/* Ensure locks are initialized */
+#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams())
+
+#define PREACTION(M)  ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
+#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
+#else /* USE_LOCKS */
+
+#ifndef PREACTION
+#define PREACTION(M) (0)
+#endif  /* PREACTION */
+
+#ifndef POSTACTION
+#define POSTACTION(M)
+#endif  /* POSTACTION */
+
+#endif /* USE_LOCKS */
+
+/*
+  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
+  USAGE_ERROR_ACTION is triggered on detected bad frees and
+  reallocs. The argument p is an address that might have triggered the
+  fault. It is ignored by the two predefined actions, but might be
+  useful in custom actions that try to help diagnose errors.
+*/
+
+#if PROCEED_ON_ERROR
+
+/* A count of the number of corruption errors causing resets */
+int malloc_corruption_error_count;
+
+/* default corruption action */
+static void reset_on_error(mstate m);
+
+#define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
+#define USAGE_ERROR_ACTION(m, p)
+
+#else /* PROCEED_ON_ERROR */
+
+#ifndef CORRUPTION_ERROR_ACTION
+#define CORRUPTION_ERROR_ACTION(m) ABORT
+#endif /* CORRUPTION_ERROR_ACTION */
+
+#ifndef USAGE_ERROR_ACTION
+#define USAGE_ERROR_ACTION(m,p) ABORT
+#endif /* USAGE_ERROR_ACTION */
+
+#endif /* PROCEED_ON_ERROR */
+
+/* -------------------------- Debugging setup ---------------------------- */
+
+#if ! DEBUG
+
+#define check_free_chunk(M,P)
+#define check_inuse_chunk(M,P)
+#define check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P)
+#define check_malloc_state(M)
+#define check_top_chunk(M,P)
+
+#else /* DEBUG */
+#define check_free_chunk(M,P)       do_check_free_chunk(M,P)
+#define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
+#define check_top_chunk(M,P)        do_check_top_chunk(M,P)
+#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
+#define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
+#define check_malloc_state(M)       do_check_malloc_state(M)
+
+static void   do_check_any_chunk(mstate m, mchunkptr p);
+static void   do_check_top_chunk(mstate m, mchunkptr p);
+static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
+static void   do_check_inuse_chunk(mstate m, mchunkptr p);
+static void   do_check_free_chunk(mstate m, mchunkptr p);
+static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
+static void   do_check_tree(mstate m, tchunkptr t);
+static void   do_check_treebin(mstate m, bindex_t i);
+static void   do_check_smallbin(mstate m, bindex_t i);
+static void   do_check_malloc_state(mstate m);
+static int    bin_find(mstate m, mchunkptr x);
+static size_t traverse_and_check(mstate m);
+#endif /* DEBUG */
+
+/* ---------------------------- Indexing Bins ---------------------------- */
+
+#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
+#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)
+#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
+#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
+
+/* addressing by index. See above about smallbin repositioning */
+#define smallbin_at(M, i)   ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
+#define treebin_at(M,i)     (&((M)->treebins[i]))
+
+/* assign tree index for size S to variable I */
+#if defined(__GNUC__) && defined(i386)
+#define compute_tree_index(S, I)\
+{\
+  size_t X = S >> TREEBIN_SHIFT;\
+  if (X == 0)\
+    I = 0;\
+  else if (X > 0xFFFF)\
+    I = NTREEBINS-1;\
+  else {\
+    unsigned int K;\
+    __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm"  (X));\
+    I =  (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
+  }\
+}
+#else /* GNUC */
+#define compute_tree_index(S, I)\
+{\
+  size_t X = S >> TREEBIN_SHIFT;\
+  if (X == 0)\
+    I = 0;\
+  else if (X > 0xFFFF)\
+    I = NTREEBINS-1;\
+  else {\
+    unsigned int Y = (unsigned int)X;\
+    unsigned int N = ((Y - 0x100) >> 16) & 8;\
+    unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
+    N += K;\
+    N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
+    K = 14 - N + ((Y <<= K) >> 15);\
+    I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
+  }\
+}
+#endif /* GNUC */
+
+/* Bit representing maximum resolved size in a treebin at i */
+#define bit_for_tree_index(i) \
+   (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
+
+/* Shift placing maximum resolved bit in a treebin at i as sign bit */
+#define leftshift_for_tree_index(i) \
+   ((i == NTREEBINS-1)? 0 : \
+    ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
+
+/* The size of the smallest chunk held in bin with index i */
+#define minsize_for_tree_index(i) \
+   ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  \
+   (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
+
+
+/* ------------------------ Operations on bin maps ----------------------- */
+
+/* bit corresponding to given index */
+#define idx2bit(i)              ((binmap_t)(1) << (i))
+
+/* Mark/Clear bits with given index */
+#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
+#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
+#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
+
+#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
+#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
+#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
+
+/* index corresponding to given bit */
+
+#if defined(__GNUC__) && defined(i386)
+#define compute_bit2idx(X, I)\
+{\
+  unsigned int J;\
+  __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\
+  I = (bindex_t)J;\
+}
+
+#else /* GNUC */
+#if  USE_BUILTIN_FFS
+#define compute_bit2idx(X, I) I = ffs(X)-1
+
+#else /* USE_BUILTIN_FFS */
+#define compute_bit2idx(X, I)\
+{\
+  unsigned int Y = X - 1;\
+  unsigned int K = Y >> (16-4) & 16;\
+  unsigned int N = K;        Y >>= K;\
+  N += K = Y >> (8-3) &  8;  Y >>= K;\
+  N += K = Y >> (4-2) &  4;  Y >>= K;\
+  N += K = Y >> (2-1) &  2;  Y >>= K;\
+  N += K = Y >> (1-0) &  1;  Y >>= K;\
+  I = (bindex_t)(N + Y);\
+}
+#endif /* USE_BUILTIN_FFS */
+#endif /* GNUC */
+
+/* isolate the least set bit of a bitmap */
+#define least_bit(x)         ((x) & -(x))
+
+/* mask with all bits to left of least bit of x on */
+#define left_bits(x)         ((x<<1) | -(x<<1))
+
+/* mask with all bits to left of or equal to least bit of x on */
+#define same_or_left_bits(x) ((x) | -(x))
+
+
+/* ----------------------- Runtime Check Support ------------------------- */
+
+/*
+  For security, the main invariant is that malloc/free/etc never
+  writes to a static address other than malloc_state, unless static
+  malloc_state itself has been corrupted, which cannot occur via
+  malloc (because of these checks). In essence this means that we
+  believe all pointers, sizes, maps etc held in malloc_state, but
+  check all of those linked or offsetted from other embedded data
+  structures.  These checks are interspersed with main code in a way
+  that tends to minimize their run-time cost.
+
+  When FOOTERS is defined, in addition to range checking, we also
+  verify footer fields of inuse chunks, which can be used guarantee
+  that the mstate controlling malloc/free is intact.  This is a
+  streamlined version of the approach described by William Robertson
+  et al in "Run-time Detection of Heap-based Overflows" LISA'03
+  http://www.usenix.org/events/lisa03/tech/robertson.html The footer
+  of an inuse chunk holds the xor of its mstate and a random seed,
+  that is checked upon calls to free() and realloc().  This is
+  (probablistically) unguessable from outside the program, but can be
+  computed by any code successfully malloc'ing any chunk, so does not
+  itself provide protection against code that has already broken
+  security through some other means.  Unlike Robertson et al, we
+  always dynamically check addresses of all offset chunks (previous,
+  next, etc). This turns out to be cheaper than relying on hashes.
+*/
+
+#if !INSECURE
+/* Check if address a is at least as high as any from MORECORE or MMAP */
+#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
+/* Check if address of next chunk n is higher than base chunk p */
+#define ok_next(p, n)    ((char*)(p) < (char*)(n))
+/* Check if p has its cinuse bit on */
+#define ok_cinuse(p)     cinuse(p)
+/* Check if p has its pinuse bit on */
+#define ok_pinuse(p)     pinuse(p)
+
+#else /* !INSECURE */
+#define ok_address(M, a) (1)
+#define ok_next(b, n)    (1)
+#define ok_cinuse(p)     (1)
+#define ok_pinuse(p)     (1)
+#endif /* !INSECURE */
+
+#if (FOOTERS && !INSECURE)
+/* Check if (alleged) mstate m has expected magic field */
+#define ok_magic(M)      ((M)->magic == mparams.magic)
+#else  /* (FOOTERS && !INSECURE) */
+#define ok_magic(M)      (1)
+#endif /* (FOOTERS && !INSECURE) */
+
+
+/* In gcc, use __builtin_expect to minimize impact of checks */
+#if !INSECURE
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define RTCHECK(e)  __builtin_expect(e, 1)
+#else /* GNUC */
+#define RTCHECK(e)  (e)
+#endif /* GNUC */
+#else /* !INSECURE */
+#define RTCHECK(e)  (1)
+#endif /* !INSECURE */
+
+/* macros to set up inuse chunks with or without footers */
+
+#if !FOOTERS
+
+#define mark_inuse_foot(M,p,s)
+
+/* Set cinuse bit and pinuse bit of next chunk */
+#define set_inuse(M,p,s)\
+  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
+#define set_inuse_and_pinuse(M,p,s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
+
+/* Set size, cinuse and pinuse bit of this chunk */
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
+
+#else /* FOOTERS */
+
+/* Set foot of inuse chunk to be xor of mstate and seed */
+#define mark_inuse_foot(M,p,s)\
+  (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
+
+#define get_mstate_for(p)\
+  ((mstate)(((mchunkptr)((char*)(p) +\
+    (chunksize(p))))->prev_foot ^ mparams.magic))
+
+#define set_inuse(M,p,s)\
+  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
+  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
+  mark_inuse_foot(M,p,s))
+
+#define set_inuse_and_pinuse(M,p,s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
+ mark_inuse_foot(M,p,s))
+
+#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
+  ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
+  mark_inuse_foot(M, p, s))
+
+#endif /* !FOOTERS */
+
+/* ---------------------------- setting mparams -------------------------- */
+
+/* Initialize mparams */
+static int init_mparams(void) {
+  if (mparams.page_size == 0) {
+    size_t s;
+
+    mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
+    mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
+#if MORECORE_CONTIGUOUS
+    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
+#else  /* MORECORE_CONTIGUOUS */
+    mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
+#endif /* MORECORE_CONTIGUOUS */
+
+#if (FOOTERS && !INSECURE)
+    {
+#if USE_DEV_RANDOM
+      int fd;
+      unsigned char buf[sizeof(size_t)];
+      /* Try to use /dev/urandom, else fall back on using time */
+      if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
+          read(fd, buf, sizeof(buf)) == sizeof(buf)) {
+        s = *((size_t *) buf);
+        close(fd);
+      }
+      else
+#endif /* USE_DEV_RANDOM */
+        s = (size_t)(time(0) ^ (size_t)0x55555555U);
+
+      s |= (size_t)8U;    /* ensure nonzero */
+      s &= ~(size_t)7U;   /* improve chances of fault for bad values */
+
+    }
+#else /* (FOOTERS && !INSECURE) */
+    s = (size_t)0x58585858U;
+#endif /* (FOOTERS && !INSECURE) */
+    ACQUIRE_MAGIC_INIT_LOCK();
+    if (mparams.magic == 0) {
+      mparams.magic = s;
+      /* Set up lock for main malloc area */
+      INITIAL_LOCK(&gm->mutex);
+      gm->mflags = mparams.default_mflags;
+    }
+    RELEASE_MAGIC_INIT_LOCK();
+
+#ifndef WIN32
+    mparams.page_size = malloc_getpagesize;
+    mparams.granularity = ((DEFAULT_GRANULARITY != 0)?
+                           DEFAULT_GRANULARITY : mparams.page_size);
+#else /* WIN32 */
+    {
+      SYSTEM_INFO system_info;
+      GetSystemInfo(&system_info);
+      mparams.page_size = system_info.dwPageSize;
+      mparams.granularity = system_info.dwAllocationGranularity;
+    }
+#endif /* WIN32 */
+
+    /* Sanity-check configuration:
+       size_t must be unsigned and as wide as pointer type.
+       ints must be at least 4 bytes.
+       alignment must be at least 8.
+       Alignment, min chunk size, and page size must all be powers of 2.
+    */
+    if ((sizeof(size_t) != sizeof(char*)) ||
+        (MAX_SIZE_T < MIN_CHUNK_SIZE)  ||
+        (sizeof(int) < 4)  ||
+        (MALLOC_ALIGNMENT < (size_t)8U) ||
+        ((MALLOC_ALIGNMENT    & (MALLOC_ALIGNMENT-SIZE_T_ONE))    != 0) ||
+        ((MCHUNK_SIZE         & (MCHUNK_SIZE-SIZE_T_ONE))         != 0) ||
+        ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) ||
+        ((mparams.page_size   & (mparams.page_size-SIZE_T_ONE))   != 0))
+      ABORT;
+  }
+  return 0;
+}
+
+/* support for mallopt */
+static int change_mparam(int param_number, int value) {
+  size_t val = (size_t)value;
+  init_mparams();
+  switch(param_number) {
+  case M_TRIM_THRESHOLD:
+    mparams.trim_threshold = val;
+    return 1;
+  case M_GRANULARITY:
+    if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
+      mparams.granularity = val;
+      return 1;
+    }
+    else
+      return 0;
+  case M_MMAP_THRESHOLD:
+    mparams.mmap_threshold = val;
+    return 1;
+  default:
+    return 0;
+  }
+}
+
+#if DEBUG
+/* ------------------------- Debugging Support --------------------------- */
+
+/* Check properties of any chunk, whether free, inuse, mmapped etc  */
+static void do_check_any_chunk(mstate m, mchunkptr p) {
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+}
+
+/* Check properties of top chunk */
+static void do_check_top_chunk(mstate m, mchunkptr p) {
+  msegmentptr sp = segment_holding(m, (char*)p);
+  size_t  sz = chunksize(p);
+  assert(sp != 0);
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+  assert(sz == m->topsize);
+  assert(sz > 0);
+  assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
+  assert(pinuse(p));
+  assert(!next_pinuse(p));
+}
+
+/* Check properties of (inuse) mmapped chunks */
+static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
+  size_t  sz = chunksize(p);
+  size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD);
+  assert(is_mmapped(p));
+  assert(use_mmap(m));
+  assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
+  assert(ok_address(m, p));
+  assert(!is_small(sz));
+  assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
+  assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
+  assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
+}
+
+/* Check properties of inuse chunks */
+static void do_check_inuse_chunk(mstate m, mchunkptr p) {
+  do_check_any_chunk(m, p);
+  assert(cinuse(p));
+  assert(next_pinuse(p));
+  /* If not pinuse and not mmapped, previous chunk has OK offset */
+  assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
+  if (is_mmapped(p))
+    do_check_mmapped_chunk(m, p);
+}
+
+/* Check properties of free chunks */
+static void do_check_free_chunk(mstate m, mchunkptr p) {
+  size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
+  mchunkptr next = chunk_plus_offset(p, sz);
+  do_check_any_chunk(m, p);
+  assert(!cinuse(p));
+  assert(!next_pinuse(p));
+  assert (!is_mmapped(p));
+  if (p != m->dv && p != m->top) {
+    if (sz >= MIN_CHUNK_SIZE) {
+      assert((sz & CHUNK_ALIGN_MASK) == 0);
+      assert(is_aligned(chunk2mem(p)));
+      assert(next->prev_foot == sz);
+      assert(pinuse(p));
+      assert (next == m->top || cinuse(next));
+      assert(p->fd->bk == p);
+      assert(p->bk->fd == p);
+    }
+    else  /* markers are always of size SIZE_T_SIZE */
+      assert(sz == SIZE_T_SIZE);
+  }
+}
+
+/* Check properties of malloced chunks at the point they are malloced */
+static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
+  if (mem != 0) {
+    mchunkptr p = mem2chunk(mem);
+    size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT);
+    do_check_inuse_chunk(m, p);
+    assert((sz & CHUNK_ALIGN_MASK) == 0);
+    assert(sz >= MIN_CHUNK_SIZE);
+    assert(sz >= s);
+    /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
+    assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
+  }
+}
+
+/* Check a tree and its subtrees.  */
+static void do_check_tree(mstate m, tchunkptr t) {
+  tchunkptr head = 0;
+  tchunkptr u = t;
+  bindex_t tindex = t->index;
+  size_t tsize = chunksize(t);
+  bindex_t idx;
+  compute_tree_index(tsize, idx);
+  assert(tindex == idx);
+  assert(tsize >= MIN_LARGE_SIZE);
+  assert(tsize >= minsize_for_tree_index(idx));
+  assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
+
+  do { /* traverse through chain of same-sized nodes */
+    do_check_any_chunk(m, ((mchunkptr)u));
+    assert(u->index == tindex);
+    assert(chunksize(u) == tsize);
+    assert(!cinuse(u));
+    assert(!next_pinuse(u));
+    assert(u->fd->bk == u);
+    assert(u->bk->fd == u);
+    if (u->parent == 0) {
+      assert(u->child[0] == 0);
+      assert(u->child[1] == 0);
+    }
+    else {
+      assert(head == 0); /* only one node on chain has parent */
+      head = u;
+      assert(u->parent != u);
+      assert (u->parent->child[0] == u ||
+              u->parent->child[1] == u ||
+              *((tbinptr*)(u->parent)) == u);
+      if (u->child[0] != 0) {
+        assert(u->child[0]->parent == u);
+        assert(u->child[0] != u);
+        do_check_tree(m, u->child[0]);
+      }
+      if (u->child[1] != 0) {
+        assert(u->child[1]->parent == u);
+        assert(u->child[1] != u);
+        do_check_tree(m, u->child[1]);
+      }
+      if (u->child[0] != 0 && u->child[1] != 0) {
+        assert(chunksize(u->child[0]) < chunksize(u->child[1]));
+      }
+    }
+    u = u->fd;
+  } while (u != t);
+  assert(head != 0);
+}
+
+/*  Check all the chunks in a treebin.  */
+static void do_check_treebin(mstate m, bindex_t i) {
+  tbinptr* tb = treebin_at(m, i);
+  tchunkptr t = *tb;
+  int empty = (m->treemap & (1U << i)) == 0;
+  if (t == 0)
+    assert(empty);
+  if (!empty)
+    do_check_tree(m, t);
+}
+
+/*  Check all the chunks in a smallbin.  */
+static void do_check_smallbin(mstate m, bindex_t i) {
+  sbinptr b = smallbin_at(m, i);
+  mchunkptr p = b->bk;
+  unsigned int empty = (m->smallmap & (1U << i)) == 0;
+  if (p == b)
+    assert(empty);
+  if (!empty) {
+    for (; p != b; p = p->bk) {
+      size_t size = chunksize(p);
+      mchunkptr q;
+      /* each chunk claims to be free */
+      do_check_free_chunk(m, p);
+      /* chunk belongs in bin */
+      assert(small_index(size) == i);
+      assert(p->bk == b || chunksize(p->bk) == chunksize(p));
+      /* chunk is followed by an inuse chunk */
+      q = next_chunk(p);
+      if (q->head != FENCEPOST_HEAD)
+        do_check_inuse_chunk(m, q);
+    }
+  }
+}
+
+/* Find x in a bin. Used in other check functions. */
+static int bin_find(mstate m, mchunkptr x) {
+  size_t size = chunksize(x);
+  if (is_small(size)) {
+    bindex_t sidx = small_index(size);
+    sbinptr b = smallbin_at(m, sidx);
+    if (smallmap_is_marked(m, sidx)) {
+      mchunkptr p = b;
+      do {
+        if (p == x)
+          return 1;
+      } while ((p = p->fd) != b);
+    }
+  }
+  else {
+    bindex_t tidx;
+    compute_tree_index(size, tidx);
+    if (treemap_is_marked(m, tidx)) {
+      tchunkptr t = *treebin_at(m, tidx);
+      size_t sizebits = size << leftshift_for_tree_index(tidx);
+      while (t != 0 && chunksize(t) != size) {
+        t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+        sizebits <<= 1;
+      }
+      if (t != 0) {
+        tchunkptr u = t;
+        do {
+          if (u == (tchunkptr)x)
+            return 1;
+        } while ((u = u->fd) != t);
+      }
+    }
+  }
+  return 0;
+}
+
+/* Traverse each chunk and check it; return total */
+static size_t traverse_and_check(mstate m) {
+  size_t sum = 0;
+  if (is_initialized(m)) {
+    msegmentptr s = &m->seg;
+    sum += m->topsize + TOP_FOOT_SIZE;
+    while (s != 0) {
+      mchunkptr q = align_as_chunk(s->base);
+      mchunkptr lastq = 0;
+      assert(pinuse(q));
+      while (segment_holds(s, q) &&
+             q != m->top && q->head != FENCEPOST_HEAD) {
+        sum += chunksize(q);
+        if (cinuse(q)) {
+          assert(!bin_find(m, q));
+          do_check_inuse_chunk(m, q);
+        }
+        else {
+          assert(q == m->dv || bin_find(m, q));
+          assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */
+          do_check_free_chunk(m, q);
+        }
+        lastq = q;
+        q = next_chunk(q);
+      }
+      s = s->next;
+    }
+  }
+  return sum;
+}
+
+/* Check all properties of malloc_state. */
+static void do_check_malloc_state(mstate m) {
+  bindex_t i;
+  size_t total;
+  /* check bins */
+  for (i = 0; i < NSMALLBINS; ++i)
+    do_check_smallbin(m, i);
+  for (i = 0; i < NTREEBINS; ++i)
+    do_check_treebin(m, i);
+
+  if (m->dvsize != 0) { /* check dv chunk */
+    do_check_any_chunk(m, m->dv);
+    assert(m->dvsize == chunksize(m->dv));
+    assert(m->dvsize >= MIN_CHUNK_SIZE);
+    assert(bin_find(m, m->dv) == 0);
+  }
+
+  if (m->top != 0) {   /* check top chunk */
+    do_check_top_chunk(m, m->top);
+    assert(m->topsize == chunksize(m->top));
+    assert(m->topsize > 0);
+    assert(bin_find(m, m->top) == 0);
+  }
+
+  total = traverse_and_check(m);
+  assert(total <= m->footprint);
+  assert(m->footprint <= m->max_footprint);
+}
+#endif /* DEBUG */
+
+/* ----------------------------- statistics ------------------------------ */
+
+#if !NO_MALLINFO
+static struct mallinfo internal_mallinfo(mstate m) {
+  struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+  if (!PREACTION(m)) {
+    check_malloc_state(m);
+    if (is_initialized(m)) {
+      size_t nfree = SIZE_T_ONE; /* top always free */
+      size_t mfree = m->topsize + TOP_FOOT_SIZE;
+      size_t sum = mfree;
+      msegmentptr s = &m->seg;
+      while (s != 0) {
+        mchunkptr q = align_as_chunk(s->base);
+        while (segment_holds(s, q) &&
+               q != m->top && q->head != FENCEPOST_HEAD) {
+          size_t sz = chunksize(q);
+          sum += sz;
+          if (!cinuse(q)) {
+            mfree += sz;
+            ++nfree;
+          }
+          q = next_chunk(q);
+        }
+        s = s->next;
+      }
+
+      nm.arena    = sum;
+      nm.ordblks  = nfree;
+      nm.hblkhd   = m->footprint - sum;
+      nm.usmblks  = m->max_footprint;
+      nm.uordblks = m->footprint - mfree;
+      nm.fordblks = mfree;
+      nm.keepcost = m->topsize;
+    }
+
+    POSTACTION(m);
+  }
+  return nm;
+}
+#endif /* !NO_MALLINFO */
+
+static void internal_malloc_stats(mstate m) {
+  if (!PREACTION(m)) {
+    size_t maxfp = 0;
+    size_t fp = 0;
+    size_t used = 0;
+    check_malloc_state(m);
+    if (is_initialized(m)) {
+      msegmentptr s = &m->seg;
+      maxfp = m->max_footprint;
+      fp = m->footprint;
+      used = fp - (m->topsize + TOP_FOOT_SIZE);
+
+      while (s != 0) {
+        mchunkptr q = align_as_chunk(s->base);
+        while (segment_holds(s, q) &&
+               q != m->top && q->head != FENCEPOST_HEAD) {
+          if (!cinuse(q))
+            used -= chunksize(q);
+          q = next_chunk(q);
+        }
+        s = s->next;
+      }
+    }
+
+    fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
+    fprintf(stderr, "system bytes     = %10lu\n", (unsigned long)(fp));
+    fprintf(stderr, "in use bytes     = %10lu\n", (unsigned long)(used));
+
+    POSTACTION(m);
+  }
+}
+
+/* ----------------------- Operations on smallbins ----------------------- */
+
+/*
+  Various forms of linking and unlinking are defined as macros.  Even
+  the ones for trees, which are very long but have very short typical
+  paths.  This is ugly but reduces reliance on inlining support of
+  compilers.
+*/
+
+/* Link a free chunk into a smallbin  */
+#define insert_small_chunk(M, P, S) {\
+  bindex_t I  = small_index(S);\
+  mchunkptr B = smallbin_at(M, I);\
+  mchunkptr F = B;\
+  assert(S >= MIN_CHUNK_SIZE);\
+  if (!smallmap_is_marked(M, I))\
+    mark_smallmap(M, I);\
+  else if (RTCHECK(ok_address(M, B->fd)))\
+    F = B->fd;\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+  B->fd = P;\
+  F->bk = P;\
+  P->fd = F;\
+  P->bk = B;\
+}
+
+/* Unlink a chunk from a smallbin  */
+#define unlink_small_chunk(M, P, S) {\
+  mchunkptr F = P->fd;\
+  mchunkptr B = P->bk;\
+  bindex_t I = small_index(S);\
+  assert(P != B);\
+  assert(P != F);\
+  assert(chunksize(P) == small_index2size(I));\
+  if (F == B)\
+    clear_smallmap(M, I);\
+  else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\
+                   (B == smallbin_at(M,I) || ok_address(M, B)))) {\
+    F->bk = B;\
+    B->fd = F;\
+  }\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+}
+
+/* Unlink the first chunk from a smallbin */
+#define unlink_first_small_chunk(M, B, P, I) {\
+  mchunkptr F = P->fd;\
+  assert(P != B);\
+  assert(P != F);\
+  assert(chunksize(P) == small_index2size(I));\
+  if (B == F)\
+    clear_smallmap(M, I);\
+  else if (RTCHECK(ok_address(M, F))) {\
+    B->fd = F;\
+    F->bk = B;\
+  }\
+  else {\
+    CORRUPTION_ERROR_ACTION(M);\
+  }\
+}
+
+/* Replace dv node, binning the old one */
+/* Used only when dvsize known to be small */
+#define replace_dv(M, P, S) {\
+  size_t DVS = M->dvsize;\
+  if (DVS != 0) {\
+    mchunkptr DV = M->dv;\
+    assert(is_small(DVS));\
+    insert_small_chunk(M, DV, DVS);\
+  }\
+  M->dvsize = S;\
+  M->dv = P;\
+}
+
+/* ------------------------- Operations on trees ------------------------- */
+
+/* Insert chunk into tree */
+#define insert_large_chunk(M, X, S) {\
+  tbinptr* H;\
+  bindex_t I;\
+  compute_tree_index(S, I);\
+  H = treebin_at(M, I);\
+  X->index = I;\
+  X->child[0] = X->child[1] = 0;\
+  if (!treemap_is_marked(M, I)) {\
+    mark_treemap(M, I);\
+    *H = X;\
+    X->parent = (tchunkptr)H;\
+    X->fd = X->bk = X;\
+  }\
+  else {\
+    tchunkptr T = *H;\
+    size_t K = S << leftshift_for_tree_index(I);\
+    for (;;) {\
+      if (chunksize(T) != S) {\
+        tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
+        K <<= 1;\
+        if (*C != 0)\
+          T = *C;\
+        else if (RTCHECK(ok_address(M, C))) {\
+          *C = X;\
+          X->parent = T;\
+          X->fd = X->bk = X;\
+          break;\
+        }\
+        else {\
+          CORRUPTION_ERROR_ACTION(M);\
+          break;\
+        }\
+      }\
+      else {\
+        tchunkptr F = T->fd;\
+        if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
+          T->fd = F->bk = X;\
+          X->fd = F;\
+          X->bk = T;\
+          X->parent = 0;\
+          break;\
+        }\
+        else {\
+          CORRUPTION_ERROR_ACTION(M);\
+          break;\
+        }\
+      }\
+    }\
+  }\
+}
+
+/*
+  Unlink steps:
+
+  1. If x is a chained node, unlink it from its same-sized fd/bk links
+     and choose its bk node as its replacement.
+  2. If x was the last node of its size, but not a leaf node, it must
+     be replaced with a leaf node (not merely one with an open left or
+     right), to make sure that lefts and rights of descendents
+     correspond properly to bit masks.  We use the rightmost descendent
+     of x.  We could use any other leaf, but this is easy to locate and
+     tends to counteract removal of leftmosts elsewhere, and so keeps
+     paths shorter than minimally guaranteed.  This doesn't loop much
+     because on average a node in a tree is near the bottom.
+  3. If x is the base of a chain (i.e., has parent links) relink
+     x's parent and children to x's replacement (or null if none).
+*/
+
+#define unlink_large_chunk(M, X) {\
+  tchunkptr XP = X->parent;\
+  tchunkptr R;\
+  if (X->bk != X) {\
+    tchunkptr F = X->fd;\
+    R = X->bk;\
+    if (RTCHECK(ok_address(M, F))) {\
+      F->bk = R;\
+      R->fd = F;\
+    }\
+    else {\
+      CORRUPTION_ERROR_ACTION(M);\
+    }\
+  }\
+  else {\
+    tchunkptr* RP;\
+    if (((R = *(RP = &(X->child[1]))) != 0) ||\
+        ((R = *(RP = &(X->child[0]))) != 0)) {\
+      tchunkptr* CP;\
+      while ((*(CP = &(R->child[1])) != 0) ||\
+             (*(CP = &(R->child[0])) != 0)) {\
+        R = *(RP = CP);\
+      }\
+      if (RTCHECK(ok_address(M, RP)))\
+        *RP = 0;\
+      else {\
+        CORRUPTION_ERROR_ACTION(M);\
+      }\
+    }\
+  }\
+  if (XP != 0) {\
+    tbinptr* H = treebin_at(M, X->index);\
+    if (X == *H) {\
+      if ((*H = R) == 0) \
+        clear_treemap(M, X->index);\
+    }\
+    else if (RTCHECK(ok_address(M, XP))) {\
+      if (XP->child[0] == X) \
+        XP->child[0] = R;\
+      else \
+        XP->child[1] = R;\
+    }\
+    else\
+      CORRUPTION_ERROR_ACTION(M);\
+    if (R != 0) {\
+      if (RTCHECK(ok_address(M, R))) {\
+        tchunkptr C0, C1;\
+        R->parent = XP;\
+        if ((C0 = X->child[0]) != 0) {\
+          if (RTCHECK(ok_address(M, C0))) {\
+            R->child[0] = C0;\
+            C0->parent = R;\
+          }\
+          else\
+            CORRUPTION_ERROR_ACTION(M);\
+        }\
+        if ((C1 = X->child[1]) != 0) {\
+          if (RTCHECK(ok_address(M, C1))) {\
+            R->child[1] = C1;\
+            C1->parent = R;\
+          }\
+          else\
+            CORRUPTION_ERROR_ACTION(M);\
+        }\
+      }\
+      else\
+        CORRUPTION_ERROR_ACTION(M);\
+    }\
+  }\
+}
+
+/* Relays to large vs small bin operations */
+
+#define insert_chunk(M, P, S)\
+  if (is_small(S)) insert_small_chunk(M, P, S)\
+  else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
+
+#define unlink_chunk(M, P, S)\
+  if (is_small(S)) unlink_small_chunk(M, P, S)\
+  else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
+
+
+/* Relays to internal calls to malloc/free from realloc, memalign etc */
+
+#if ONLY_MSPACES
+#define internal_malloc(m, b) mspace_malloc(m, b)
+#define internal_free(m, mem) mspace_free(m,mem);
+#else /* ONLY_MSPACES */
+#if MSPACES
+#define internal_malloc(m, b)\
+   (m == gm)? dlmalloc(b) : mspace_malloc(m, b)
+#define internal_free(m, mem)\
+   if (m == gm) dlfree(mem); else mspace_free(m,mem);
+#else /* MSPACES */
+#define internal_malloc(m, b) dlmalloc(b)
+#define internal_free(m, mem) dlfree(mem)
+#endif /* MSPACES */
+#endif /* ONLY_MSPACES */
+
+/* -----------------------  Direct-mmapping chunks ----------------------- */
+
+/*
+  Directly mmapped chunks are set up with an offset to the start of
+  the mmapped region stored in the prev_foot field of the chunk. This
+  allows reconstruction of the required argument to MUNMAP when freed,
+  and also allows adjustment of the returned chunk to meet alignment
+  requirements (especially in memalign).  There is also enough space
+  allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain
+  the PINUSE bit so frees can be checked.
+*/
+
+/* Malloc using mmap */
+static void* mmap_alloc(mstate m, size_t nb) {
+  size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+  if (mmsize > nb) {     /* Check for wrap around 0 */
+    char* mm = (char*)(DIRECT_MMAP(mmsize));
+    if (mm != CMFAIL) {
+      size_t offset = align_offset(chunk2mem(mm));
+      size_t psize = mmsize - offset - MMAP_FOOT_PAD;
+      mchunkptr p = (mchunkptr)(mm + offset);
+      p->prev_foot = offset | IS_MMAPPED_BIT;
+      (p)->head = (psize|CINUSE_BIT);
+      mark_inuse_foot(m, p, psize);
+      chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
+      chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
+
+      if (mm < m->least_addr)
+        m->least_addr = mm;
+      if ((m->footprint += mmsize) > m->max_footprint)
+        m->max_footprint = m->footprint;
+      assert(is_aligned(chunk2mem(p)));
+      check_mmapped_chunk(m, p);
+      return chunk2mem(p);
+    }
+  }
+  return 0;
+}
+
+/* Realloc using mmap */
+static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) {
+  size_t oldsize = chunksize(oldp);
+  if (is_small(nb)) /* Can't shrink mmap regions below small size */
+    return 0;
+  /* Keep old chunk if big enough but not too big */
+  if (oldsize >= nb + SIZE_T_SIZE &&
+      (oldsize - nb) <= (mparams.granularity << 1))
+    return oldp;
+  else {
+    size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT;
+    size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
+    size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES +
+                                         CHUNK_ALIGN_MASK);
+    char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
+                                  oldmmsize, newmmsize, 1);
+    if (cp != CMFAIL) {
+      mchunkptr newp = (mchunkptr)(cp + offset);
+      size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
+      newp->head = (psize|CINUSE_BIT);
+      mark_inuse_foot(m, newp, psize);
+      chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
+      chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
+
+      if (cp < m->least_addr)
+        m->least_addr = cp;
+      if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
+        m->max_footprint = m->footprint;
+      check_mmapped_chunk(m, newp);
+      return newp;
+    }
+  }
+  return 0;
+}
+
+/* -------------------------- mspace management -------------------------- */
+
+/* Initialize top chunk and its size */
+static void init_top(mstate m, mchunkptr p, size_t psize) {
+  /* Ensure alignment */
+  size_t offset = align_offset(chunk2mem(p));
+  p = (mchunkptr)((char*)p + offset);
+  psize -= offset;
+
+  m->top = p;
+  m->topsize = psize;
+  p->head = psize | PINUSE_BIT;
+  /* set size of fake trailing chunk holding overhead space only once */
+  chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
+  m->trim_check = mparams.trim_threshold; /* reset on each update */
+}
+
+/* Initialize bins for a new mstate that is otherwise zeroed out */
+static void init_bins(mstate m) {
+  /* Establish circular links for smallbins */
+  bindex_t i;
+  for (i = 0; i < NSMALLBINS; ++i) {
+    sbinptr bin = smallbin_at(m,i);
+    bin->fd = bin->bk = bin;
+  }
+}
+
+#if PROCEED_ON_ERROR
+
+/* default corruption action */
+static void reset_on_error(mstate m) {
+  int i;
+  ++malloc_corruption_error_count;
+  /* Reinitialize fields to forget about all memory */
+  m->smallbins = m->treebins = 0;
+  m->dvsize = m->topsize = 0;
+  m->seg.base = 0;
+  m->seg.size = 0;
+  m->seg.next = 0;
+  m->top = m->dv = 0;
+  for (i = 0; i < NTREEBINS; ++i)
+    *treebin_at(m, i) = 0;
+  init_bins(m);
+}
+#endif /* PROCEED_ON_ERROR */
+
+/* Allocate chunk and prepend remainder with chunk in successor base. */
+static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
+                           size_t nb) {
+  mchunkptr p = align_as_chunk(newbase);
+  mchunkptr oldfirst = align_as_chunk(oldbase);
+  size_t psize = (char*)oldfirst - (char*)p;
+  mchunkptr q = chunk_plus_offset(p, nb);
+  size_t qsize = psize - nb;
+  set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+
+  assert((char*)oldfirst > (char*)q);
+  assert(pinuse(oldfirst));
+  assert(qsize >= MIN_CHUNK_SIZE);
+
+  /* consolidate remainder with first chunk of old base */
+  if (oldfirst == m->top) {
+    size_t tsize = m->topsize += qsize;
+    m->top = q;
+    q->head = tsize | PINUSE_BIT;
+    check_top_chunk(m, q);
+  }
+  else if (oldfirst == m->dv) {
+    size_t dsize = m->dvsize += qsize;
+    m->dv = q;
+    set_size_and_pinuse_of_free_chunk(q, dsize);
+  }
+  else {
+    if (!cinuse(oldfirst)) {
+      size_t nsize = chunksize(oldfirst);
+      unlink_chunk(m, oldfirst, nsize);
+      oldfirst = chunk_plus_offset(oldfirst, nsize);
+      qsize += nsize;
+    }
+    set_free_with_pinuse(q, qsize, oldfirst);
+    insert_chunk(m, q, qsize);
+    check_free_chunk(m, q);
+  }
+
+  check_malloced_chunk(m, chunk2mem(p), nb);
+  return chunk2mem(p);
+}
+
+
+/* Add a segment to hold a new noncontiguous region */
+static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
+  /* Determine locations and sizes of segment, fenceposts, old top */
+  char* old_top = (char*)m->top;
+  msegmentptr oldsp = segment_holding(m, old_top);
+  char* old_end = oldsp->base + oldsp->size;
+  size_t ssize = pad_request(sizeof(struct malloc_segment));
+  char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
+  size_t offset = align_offset(chunk2mem(rawsp));
+  char* asp = rawsp + offset;
+  char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
+  mchunkptr sp = (mchunkptr)csp;
+  msegmentptr ss = (msegmentptr)(chunk2mem(sp));
+  mchunkptr tnext = chunk_plus_offset(sp, ssize);
+  mchunkptr p = tnext;
+  int nfences = 0;
+
+  /* reset top to new space */
+  init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+
+  /* Set up segment record */
+  assert(is_aligned(ss));
+  set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
+  *ss = m->seg; /* Push current record */
+  m->seg.base = tbase;
+  m->seg.size = tsize;
+  m->seg.sflags = mmapped;
+  m->seg.next = ss;
+
+  /* Insert trailing fenceposts */
+  for (;;) {
+    mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
+    p->head = FENCEPOST_HEAD;
+    ++nfences;
+    if ((char*)(&(nextp->head)) < old_end)
+      p = nextp;
+    else
+      break;
+  }
+  assert(nfences >= 2);
+
+  /* Insert the rest of old top into a bin as an ordinary free chunk */
+  if (csp != old_top) {
+    mchunkptr q = (mchunkptr)old_top;
+    size_t psize = csp - old_top;
+    mchunkptr tn = chunk_plus_offset(q, psize);
+    set_free_with_pinuse(q, psize, tn);
+    insert_chunk(m, q, psize);
+  }
+
+  check_top_chunk(m, m->top);
+}
+
+/* -------------------------- System allocation -------------------------- */
+
+/* Get memory from system using MORECORE or MMAP */
+static void* sys_alloc(mstate m, size_t nb) {
+  char* tbase = CMFAIL;
+  size_t tsize = 0;
+  flag_t mmap_flag = 0;
+
+  init_mparams();
+
+  /* Directly map large chunks */
+  if (use_mmap(m) && nb >= mparams.mmap_threshold) {
+    void* mem = mmap_alloc(m, nb);
+    if (mem != 0)
+      return mem;
+  }
+
+  /*
+    Try getting memory in any of three ways (in most-preferred to
+    least-preferred order):
+    1. A call to MORECORE that can normally contiguously extend memory.
+       (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
+       or main space is mmapped or a previous contiguous call failed)
+    2. A call to MMAP new space (disabled if not HAVE_MMAP).
+       Note that under the default settings, if MORECORE is unable to
+       fulfill a request, and HAVE_MMAP is true, then mmap is
+       used as a noncontiguous system allocator. This is a useful backup
+       strategy for systems with holes in address spaces -- in this case
+       sbrk cannot contiguously expand the heap, but mmap may be able to
+       find space.
+    3. A call to MORECORE that cannot usually contiguously extend memory.
+       (disabled if not HAVE_MORECORE)
+  */
+
+  if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
+    char* br = CMFAIL;
+    msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
+    size_t asize = 0;
+    ACQUIRE_MORECORE_LOCK();
+
+    if (ss == 0) {  /* First time through or recovery */
+      char* base = (char*)CALL_MORECORE(0);
+      if (base != CMFAIL) {
+        asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
+        /* Adjust to end on a page boundary */
+        if (!is_page_aligned(base))
+          asize += (page_align((size_t)base) - (size_t)base);
+        /* Can't call MORECORE if size is negative when treated as signed */
+        if (asize < HALF_MAX_SIZE_T &&
+            (br = (char*)(CALL_MORECORE(asize))) == base) {
+          tbase = base;
+          tsize = asize;
+        }
+      }
+    }
+    else {
+      /* Subtract out existing available top space from MORECORE request. */
+      asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE);
+      /* Use mem here only if it did continuously extend old space */
+      if (asize < HALF_MAX_SIZE_T &&
+          (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) {
+        tbase = br;
+        tsize = asize;
+      }
+    }
+
+    if (tbase == CMFAIL) {    /* Cope with partial failure */
+      if (br != CMFAIL) {    /* Try to use/extend the space we did get */
+        if (asize < HALF_MAX_SIZE_T &&
+            asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) {
+          size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize);
+          if (esize < HALF_MAX_SIZE_T) {
+            char* end = (char*)CALL_MORECORE(esize);
+            if (end != CMFAIL)
+              asize += esize;
+            else {            /* Can't use; try to release */
+              CALL_MORECORE(-asize);
+              br = CMFAIL;
+            }
+          }
+        }
+      }
+      if (br != CMFAIL) {    /* Use the space we did get */
+        tbase = br;
+        tsize = asize;
+      }
+      else
+        disable_contiguous(m); /* Don't try contiguous path in the future */
+    }
+
+    RELEASE_MORECORE_LOCK();
+  }
+
+  if (HAVE_MMAP && tbase == CMFAIL) {  /* Try MMAP */
+    size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE;
+    size_t rsize = granularity_align(req);
+    if (rsize > nb) { /* Fail if wraps around zero */
+      char* mp = (char*)(CALL_MMAP(rsize));
+      if (mp != CMFAIL) {
+        tbase = mp;
+        tsize = rsize;
+        mmap_flag = IS_MMAPPED_BIT;
+      }
+    }
+  }
+
+  if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
+    size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE);
+    if (asize < HALF_MAX_SIZE_T) {
+      char* br = CMFAIL;
+      char* end = CMFAIL;
+      ACQUIRE_MORECORE_LOCK();
+      br = (char*)(CALL_MORECORE(asize));
+      end = (char*)(CALL_MORECORE(0));
+      RELEASE_MORECORE_LOCK();
+      if (br != CMFAIL && end != CMFAIL && br < end) {
+        size_t ssize = end - br;
+        if (ssize > nb + TOP_FOOT_SIZE) {
+          tbase = br;
+          tsize = ssize;
+        }
+      }
+    }
+  }
+
+  if (tbase != CMFAIL) {
+
+    if ((m->footprint += tsize) > m->max_footprint)
+      m->max_footprint = m->footprint;
+
+    if (!is_initialized(m)) { /* first-time initialization */
+      m->seg.base = m->least_addr = tbase;
+      m->seg.size = tsize;
+      m->seg.sflags = mmap_flag;
+      m->magic = mparams.magic;
+      init_bins(m);
+      if (is_global(m)) 
+        init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
+      else {
+        /* Offset top by embedded malloc_state */
+        mchunkptr mn = next_chunk(mem2chunk(m));
+        init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
+      }
+    }
+
+    else {
+      /* Try to merge with an existing segment */
+      msegmentptr sp = &m->seg;
+      while (sp != 0 && tbase != sp->base + sp->size)
+        sp = sp->next;
+      if (sp != 0 &&
+          !is_extern_segment(sp) &&
+          (sp->sflags & IS_MMAPPED_BIT) == mmap_flag &&
+          segment_holds(sp, m->top)) { /* append */
+        sp->size += tsize;
+        init_top(m, m->top, m->topsize + tsize);
+      }
+      else {
+        if (tbase < m->least_addr)
+          m->least_addr = tbase;
+        sp = &m->seg;
+        while (sp != 0 && sp->base != tbase + tsize)
+          sp = sp->next;
+        if (sp != 0 &&
+            !is_extern_segment(sp) &&
+            (sp->sflags & IS_MMAPPED_BIT) == mmap_flag) {
+          char* oldbase = sp->base;
+          sp->base = tbase;
+          sp->size += tsize;
+          return prepend_alloc(m, tbase, oldbase, nb);
+        }
+        else
+          add_segment(m, tbase, tsize, mmap_flag);
+      }
+    }
+
+    if (nb < m->topsize) { /* Allocate from new or extended top space */
+      size_t rsize = m->topsize -= nb;
+      mchunkptr p = m->top;
+      mchunkptr r = m->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(m, p, nb);
+      check_top_chunk(m, m->top);
+      check_malloced_chunk(m, chunk2mem(p), nb);
+      return chunk2mem(p);
+    }
+  }
+
+  MALLOC_FAILURE_ACTION;
+  return 0;
+}
+
+/* -----------------------  system deallocation -------------------------- */
+
+/* Unmap and unlink any mmapped segments that don't contain used chunks */
+static size_t release_unused_segments(mstate m) {
+  size_t released = 0;
+  msegmentptr pred = &m->seg;
+  msegmentptr sp = pred->next;
+  while (sp != 0) {
+    char* base = sp->base;
+    size_t size = sp->size;
+    msegmentptr next = sp->next;
+    if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
+      mchunkptr p = align_as_chunk(base);
+      size_t psize = chunksize(p);
+      /* Can unmap if first chunk holds entire segment and not pinned */
+      if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
+        tchunkptr tp = (tchunkptr)p;
+        assert(segment_holds(sp, (char*)sp));
+        if (p == m->dv) {
+          m->dv = 0;
+          m->dvsize = 0;
+        }
+        else {
+          unlink_large_chunk(m, tp);
+        }
+        if (CALL_MUNMAP(base, size) == 0) {
+          released += size;
+          m->footprint -= size;
+          /* unlink obsoleted record */
+          sp = pred;
+          sp->next = next;
+        }
+        else { /* back out if cannot unmap */
+          insert_large_chunk(m, tp, psize);
+        }
+      }
+    }
+    pred = sp;
+    sp = next;
+  }
+  return released;
+}
+
+static int sys_trim(mstate m, size_t pad) {
+  size_t released = 0;
+  if (pad < MAX_REQUEST && is_initialized(m)) {
+    pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
+
+    if (m->topsize > pad) {
+      /* Shrink top space in granularity-size units, keeping at least one */
+      size_t unit = mparams.granularity;
+      size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
+                      SIZE_T_ONE) * unit;
+      msegmentptr sp = segment_holding(m, (char*)m->top);
+
+      if (!is_extern_segment(sp)) {
+        if (is_mmapped_segment(sp)) {
+          if (HAVE_MMAP &&
+              sp->size >= extra &&
+              !has_segment_link(m, sp)) { /* can't shrink if pinned */
+            size_t newsize = sp->size - extra;
+            /* Prefer mremap, fall back to munmap */
+            if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
+                (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
+              released = extra;
+            }
+          }
+        }
+        else if (HAVE_MORECORE) {
+          if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
+            extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
+          ACQUIRE_MORECORE_LOCK();
+          {
+            /* Make sure end of memory is where we last set it. */
+            char* old_br = (char*)(CALL_MORECORE(0));
+            if (old_br == sp->base + sp->size) {
+              char* rel_br = (char*)(CALL_MORECORE(-extra));
+              char* new_br = (char*)(CALL_MORECORE(0));
+              if (rel_br != CMFAIL && new_br < old_br)
+                released = old_br - new_br;
+            }
+          }
+          RELEASE_MORECORE_LOCK();
+        }
+      }
+
+      if (released != 0) {
+        sp->size -= released;
+        m->footprint -= released;
+        init_top(m, m->top, m->topsize - released);
+        check_top_chunk(m, m->top);
+      }
+    }
+
+    /* Unmap any unused mmapped segments */
+    if (HAVE_MMAP) 
+      released += release_unused_segments(m);
+
+    /* On failure, disable autotrim to avoid repeated failed future calls */
+    if (released == 0)
+      m->trim_check = MAX_SIZE_T;
+  }
+
+  return (released != 0)? 1 : 0;
+}
+
+/* ---------------------------- malloc support --------------------------- */
+
+/* allocate a large request from the best fitting chunk in a treebin */
+static void* tmalloc_large(mstate m, size_t nb) {
+  tchunkptr v = 0;
+  size_t rsize = -nb; /* Unsigned negation */
+  tchunkptr t;
+  bindex_t idx;
+  compute_tree_index(nb, idx);
+
+  if ((t = *treebin_at(m, idx)) != 0) {
+    /* Traverse tree for this bin looking for node with size == nb */
+    size_t sizebits = nb << leftshift_for_tree_index(idx);
+    tchunkptr rst = 0;  /* The deepest untaken right subtree */
+    for (;;) {
+      tchunkptr rt;
+      size_t trem = chunksize(t) - nb;
+      if (trem < rsize) {
+        v = t;
+        if ((rsize = trem) == 0)
+          break;
+      }
+      rt = t->child[1];
+      t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
+      if (rt != 0 && rt != t)
+        rst = rt;
+      if (t == 0) {
+        t = rst; /* set t to least subtree holding sizes > nb */
+        break;
+      }
+      sizebits <<= 1;
+    }
+  }
+
+  if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
+    binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
+    if (leftbits != 0) {
+      bindex_t i;
+      binmap_t leastbit = least_bit(leftbits);
+      compute_bit2idx(leastbit, i);
+      t = *treebin_at(m, i);
+    }
+  }
+
+  while (t != 0) { /* find smallest of tree or subtree */
+    size_t trem = chunksize(t) - nb;
+    if (trem < rsize) {
+      rsize = trem;
+      v = t;
+    }
+    t = leftmost_child(t);
+  }
+
+  /*  If dv is a better fit, return 0 so malloc will use it */
+  if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
+    if (RTCHECK(ok_address(m, v))) { /* split */
+      mchunkptr r = chunk_plus_offset(v, nb);
+      assert(chunksize(v) == rsize + nb);
+      if (RTCHECK(ok_next(v, r))) {
+        unlink_large_chunk(m, v);
+        if (rsize < MIN_CHUNK_SIZE)
+          set_inuse_and_pinuse(m, v, (rsize + nb));
+        else {
+          set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+          set_size_and_pinuse_of_free_chunk(r, rsize);
+          insert_chunk(m, r, rsize);
+        }
+        return chunk2mem(v);
+      }
+    }
+    CORRUPTION_ERROR_ACTION(m);
+  }
+  return 0;
+}
+
+/* allocate a small request from the best fitting chunk in a treebin */
+static void* tmalloc_small(mstate m, size_t nb) {
+  tchunkptr t, v;
+  size_t rsize;
+  bindex_t i;
+  binmap_t leastbit = least_bit(m->treemap);
+  compute_bit2idx(leastbit, i);
+
+  v = t = *treebin_at(m, i);
+  rsize = chunksize(t) - nb;
+
+  while ((t = leftmost_child(t)) != 0) {
+    size_t trem = chunksize(t) - nb;
+    if (trem < rsize) {
+      rsize = trem;
+      v = t;
+    }
+  }
+
+  if (RTCHECK(ok_address(m, v))) {
+    mchunkptr r = chunk_plus_offset(v, nb);
+    assert(chunksize(v) == rsize + nb);
+    if (RTCHECK(ok_next(v, r))) {
+      unlink_large_chunk(m, v);
+      if (rsize < MIN_CHUNK_SIZE)
+        set_inuse_and_pinuse(m, v, (rsize + nb));
+      else {
+        set_size_and_pinuse_of_inuse_chunk(m, v, nb);
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        replace_dv(m, r, rsize);
+      }
+      return chunk2mem(v);
+    }
+  }
+
+  CORRUPTION_ERROR_ACTION(m);
+  return 0;
+}
+
+/* --------------------------- realloc support --------------------------- */
+
+static void* internal_realloc(mstate m, void* oldmem, size_t bytes) {
+  if (bytes >= MAX_REQUEST) {
+    MALLOC_FAILURE_ACTION;
+    return 0;
+  }
+  if (!PREACTION(m)) {
+    mchunkptr oldp = mem2chunk(oldmem);
+    size_t oldsize = chunksize(oldp);
+    mchunkptr next = chunk_plus_offset(oldp, oldsize);
+    mchunkptr newp = 0;
+    void* extra = 0;
+
+    /* Try to either shrink or extend into top. Else malloc-copy-free */
+
+    if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) &&
+                ok_next(oldp, next) && ok_pinuse(next))) {
+      size_t nb = request2size(bytes);
+      if (is_mmapped(oldp))
+        newp = mmap_resize(m, oldp, nb);
+      else if (oldsize >= nb) { /* already big enough */
+        size_t rsize = oldsize - nb;
+        newp = oldp;
+        if (rsize >= MIN_CHUNK_SIZE) {
+          mchunkptr remainder = chunk_plus_offset(newp, nb);
+          set_inuse(m, newp, nb);
+          set_inuse(m, remainder, rsize);
+          extra = chunk2mem(remainder);
+        }
+      }
+      else if (next == m->top && oldsize + m->topsize > nb) {
+        /* Expand into top */
+        size_t newsize = oldsize + m->topsize;
+        size_t newtopsize = newsize - nb;
+        mchunkptr newtop = chunk_plus_offset(oldp, nb);
+        set_inuse(m, oldp, nb);
+        newtop->head = newtopsize |PINUSE_BIT;
+        m->top = newtop;
+        m->topsize = newtopsize;
+        newp = oldp;
+      }
+    }
+    else {
+      USAGE_ERROR_ACTION(m, oldmem);
+      POSTACTION(m);
+      return 0;
+    }
+
+    POSTACTION(m);
+
+    if (newp != 0) {
+      if (extra != 0) {
+        internal_free(m, extra);
+      }
+      check_inuse_chunk(m, newp);
+      return chunk2mem(newp);
+    }
+    else {
+      void* newmem = internal_malloc(m, bytes);
+      if (newmem != 0) {
+        size_t oc = oldsize - overhead_for(oldp);
+        memcpy(newmem, oldmem, (oc < bytes)? oc : bytes);
+        internal_free(m, oldmem);
+      }
+      return newmem;
+    }
+  }
+  return 0;
+}
+
+/* --------------------------- memalign support -------------------------- */
+
+static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
+  if (alignment <= MALLOC_ALIGNMENT)    /* Can just use malloc */
+    return internal_malloc(m, bytes);
+  if (alignment <  MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
+    alignment = MIN_CHUNK_SIZE;
+  if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
+    size_t a = MALLOC_ALIGNMENT << 1;
+    while (a < alignment) a <<= 1;
+    alignment = a;
+  }
+  
+  if (bytes >= MAX_REQUEST - alignment) {
+    if (m != 0)  { /* Test isn't needed but avoids compiler warning */
+      MALLOC_FAILURE_ACTION;
+    }
+  }
+  else {
+    size_t nb = request2size(bytes);
+    size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
+    char* mem = (char*)internal_malloc(m, req);
+    if (mem != 0) {
+      void* leader = 0;
+      void* trailer = 0;
+      mchunkptr p = mem2chunk(mem);
+
+      if (PREACTION(m)) return 0;
+      if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */
+        /*
+          Find an aligned spot inside chunk.  Since we need to give
+          back leading space in a chunk of at least MIN_CHUNK_SIZE, if
+          the first calculation places us at a spot with less than
+          MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
+          We've allocated enough total room so that this is always
+          possible.
+        */
+        char* br = (char*)mem2chunk((size_t)(((size_t)(mem +
+                                                       alignment -
+                                                       SIZE_T_ONE)) &
+                                             -alignment));
+        char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
+          br : br+alignment;
+        mchunkptr newp = (mchunkptr)pos;
+        size_t leadsize = pos - (char*)(p);
+        size_t newsize = chunksize(p) - leadsize;
+
+        if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
+          newp->prev_foot = p->prev_foot + leadsize;
+          newp->head = (newsize|CINUSE_BIT);
+        }
+        else { /* Otherwise, give back leader, use the rest */
+          set_inuse(m, newp, newsize);
+          set_inuse(m, p, leadsize);
+          leader = chunk2mem(p);
+        }
+        p = newp;
+      }
+
+      /* Give back spare room at the end */
+      if (!is_mmapped(p)) {
+        size_t size = chunksize(p);
+        if (size > nb + MIN_CHUNK_SIZE) {
+          size_t remainder_size = size - nb;
+          mchunkptr remainder = chunk_plus_offset(p, nb);
+          set_inuse(m, p, nb);
+          set_inuse(m, remainder, remainder_size);
+          trailer = chunk2mem(remainder);
+        }
+      }
+
+      assert (chunksize(p) >= nb);
+      assert((((size_t)(chunk2mem(p))) % alignment) == 0);
+      check_inuse_chunk(m, p);
+      POSTACTION(m);
+      if (leader != 0) {
+        internal_free(m, leader);
+      }
+      if (trailer != 0) {
+        internal_free(m, trailer);
+      }
+      return chunk2mem(p);
+    }
+  }
+  return 0;
+}
+
+/* ------------------------ comalloc/coalloc support --------------------- */
+
+static void** ialloc(mstate m,
+                     size_t n_elements,
+                     size_t* sizes,
+                     int opts,
+                     void* chunks[]) {
+  /*
+    This provides common support for independent_X routines, handling
+    all of the combinations that can result.
+
+    The opts arg has:
+    bit 0 set if all elements are same size (using sizes[0])
+    bit 1 set if elements should be zeroed
+  */
+
+  size_t    element_size;   /* chunksize of each element, if all same */
+  size_t    contents_size;  /* total size of elements */
+  size_t    array_size;     /* request size of pointer array */
+  void*     mem;            /* malloced aggregate space */
+  mchunkptr p;              /* corresponding chunk */
+  size_t    remainder_size; /* remaining bytes while splitting */
+  void**    marray;         /* either "chunks" or malloced ptr array */
+  mchunkptr array_chunk;    /* chunk for malloced ptr array */
+  flag_t    was_enabled;    /* to disable mmap */
+  size_t    size;
+  size_t    i;
+
+  /* compute array length, if needed */
+  if (chunks != 0) {
+    if (n_elements == 0)
+      return chunks; /* nothing to do */
+    marray = chunks;
+    array_size = 0;
+  }
+  else {
+    /* if empty req, must still return chunk representing empty array */
+    if (n_elements == 0)
+      return (void**)internal_malloc(m, 0);
+    marray = 0;
+    array_size = request2size(n_elements * (sizeof(void*)));
+  }
+
+  /* compute total element size */
+  if (opts & 0x1) { /* all-same-size */
+    element_size = request2size(*sizes);
+    contents_size = n_elements * element_size;
+  }
+  else { /* add up all the sizes */
+    element_size = 0;
+    contents_size = 0;
+    for (i = 0; i != n_elements; ++i)
+      contents_size += request2size(sizes[i]);
+  }
+
+  size = contents_size + array_size;
+
+  /*
+     Allocate the aggregate chunk.  First disable direct-mmapping so
+     malloc won't use it, since we would not be able to later
+     free/realloc space internal to a segregated mmap region.
+  */
+  was_enabled = use_mmap(m);
+  disable_mmap(m);
+  mem = internal_malloc(m, size - CHUNK_OVERHEAD);
+  if (was_enabled)
+    enable_mmap(m);
+  if (mem == 0)
+    return 0;
+
+  if (PREACTION(m)) return 0;
+  p = mem2chunk(mem);
+  remainder_size = chunksize(p);
+
+  assert(!is_mmapped(p));
+
+  if (opts & 0x2) {       /* optionally clear the elements */
+    memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
+  }
+
+  /* If not provided, allocate the pointer array as final part of chunk */
+  if (marray == 0) {
+    size_t  array_chunk_size;
+    array_chunk = chunk_plus_offset(p, contents_size);
+    array_chunk_size = remainder_size - contents_size;
+    marray = (void**) (chunk2mem(array_chunk));
+    set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
+    remainder_size = contents_size;
+  }
+
+  /* split out elements */
+  for (i = 0; ; ++i) {
+    marray[i] = chunk2mem(p);
+    if (i != n_elements-1) {
+      if (element_size != 0)
+        size = element_size;
+      else
+        size = request2size(sizes[i]);
+      remainder_size -= size;
+      set_size_and_pinuse_of_inuse_chunk(m, p, size);
+      p = chunk_plus_offset(p, size);
+    }
+    else { /* the final element absorbs any overallocation slop */
+      set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
+      break;
+    }
+  }
+
+#if DEBUG
+  if (marray != chunks) {
+    /* final element must have exactly exhausted chunk */
+    if (element_size != 0) {
+      assert(remainder_size == element_size);
+    }
+    else {
+      assert(remainder_size == request2size(sizes[i]));
+    }
+    check_inuse_chunk(m, mem2chunk(marray));
+  }
+  for (i = 0; i != n_elements; ++i)
+    check_inuse_chunk(m, mem2chunk(marray[i]));
+
+#endif /* DEBUG */
+
+  POSTACTION(m);
+  return marray;
+}
+
+
+/* -------------------------- public routines ---------------------------- */
+
+#if !ONLY_MSPACES
+
+void* dlmalloc(size_t bytes) {
+  /*
+     Basic algorithm:
+     If a small request (< 256 bytes minus per-chunk overhead):
+       1. If one exists, use a remainderless chunk in associated smallbin.
+          (Remainderless means that there are too few excess bytes to
+          represent as a chunk.)
+       2. If it is big enough, use the dv chunk, which is normally the
+          chunk adjacent to the one used for the most recent small request.
+       3. If one exists, split the smallest available chunk in a bin,
+          saving remainder in dv.
+       4. If it is big enough, use the top chunk.
+       5. If available, get memory from system and use it
+     Otherwise, for a large request:
+       1. Find the smallest available binned chunk that fits, and use it
+          if it is better fitting than dv chunk, splitting if necessary.
+       2. If better fitting than any binned chunk, use the dv chunk.
+       3. If it is big enough, use the top chunk.
+       4. If request size >= mmap threshold, try to directly mmap this chunk.
+       5. If available, get memory from system and use it
+
+     The ugly goto's here ensure that postaction occurs along all paths.
+  */
+
+  if (!PREACTION(gm)) {
+    void* mem;
+    size_t nb;
+    if (bytes <= MAX_SMALL_REQUEST) {
+      bindex_t idx;
+      binmap_t smallbits;
+      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+      idx = small_index(nb);
+      smallbits = gm->smallmap >> idx;
+
+      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+        mchunkptr b, p;
+        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
+        b = smallbin_at(gm, idx);
+        p = b->fd;
+        assert(chunksize(p) == small_index2size(idx));
+        unlink_first_small_chunk(gm, b, p, idx);
+        set_inuse_and_pinuse(gm, p, small_index2size(idx));
+        mem = chunk2mem(p);
+        check_malloced_chunk(gm, mem, nb);
+        goto postaction;
+      }
+
+      else if (nb > gm->dvsize) {
+        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+          mchunkptr b, p, r;
+          size_t rsize;
+          bindex_t i;
+          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+          binmap_t leastbit = least_bit(leftbits);
+          compute_bit2idx(leastbit, i);
+          b = smallbin_at(gm, i);
+          p = b->fd;
+          assert(chunksize(p) == small_index2size(i));
+          unlink_first_small_chunk(gm, b, p, i);
+          rsize = small_index2size(i) - nb;
+          /* Fit here cannot be remainderless if 4byte sizes */
+          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+            set_inuse_and_pinuse(gm, p, small_index2size(i));
+          else {
+            set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+            r = chunk_plus_offset(p, nb);
+            set_size_and_pinuse_of_free_chunk(r, rsize);
+            replace_dv(gm, r, rsize);
+          }
+          mem = chunk2mem(p);
+          check_malloced_chunk(gm, mem, nb);
+          goto postaction;
+        }
+
+        else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
+          check_malloced_chunk(gm, mem, nb);
+          goto postaction;
+        }
+      }
+    }
+    else if (bytes >= MAX_REQUEST)
+      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+    else {
+      nb = pad_request(bytes);
+      if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
+        check_malloced_chunk(gm, mem, nb);
+        goto postaction;
+      }
+    }
+
+    if (nb <= gm->dvsize) {
+      size_t rsize = gm->dvsize - nb;
+      mchunkptr p = gm->dv;
+      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+        mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
+        gm->dvsize = rsize;
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+      }
+      else { /* exhaust dv */
+        size_t dvs = gm->dvsize;
+        gm->dvsize = 0;
+        gm->dv = 0;
+        set_inuse_and_pinuse(gm, p, dvs);
+      }
+      mem = chunk2mem(p);
+      check_malloced_chunk(gm, mem, nb);
+      goto postaction;
+    }
+
+    else if (nb < gm->topsize) { /* Split top */
+      size_t rsize = gm->topsize -= nb;
+      mchunkptr p = gm->top;
+      mchunkptr r = gm->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
+      mem = chunk2mem(p);
+      check_top_chunk(gm, gm->top);
+      check_malloced_chunk(gm, mem, nb);
+      goto postaction;
+    }
+
+    mem = sys_alloc(gm, nb);
+
+  postaction:
+    POSTACTION(gm);
+    return mem;
+  }
+
+  return 0;
+}
+
+void dlfree(void* mem) {
+  /*
+     Consolidate freed chunks with preceeding or succeeding bordering
+     free chunks, if they exist, and then place in a bin.  Intermixed
+     with special cases for top, dv, mmapped chunks, and usage errors.
+  */
+
+  if (mem != 0) {
+    mchunkptr p  = mem2chunk(mem);
+#if FOOTERS
+    mstate fm = get_mstate_for(p);
+    if (!ok_magic(fm)) {
+      USAGE_ERROR_ACTION(fm, p);
+      return;
+    }
+#else /* FOOTERS */
+#define fm gm
+#endif /* FOOTERS */
+    if (!PREACTION(fm)) {
+      check_inuse_chunk(fm, p);
+      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
+        size_t psize = chunksize(p);
+        mchunkptr next = chunk_plus_offset(p, psize);
+        if (!pinuse(p)) {
+          size_t prevsize = p->prev_foot;
+          if ((prevsize & IS_MMAPPED_BIT) != 0) {
+            prevsize &= ~IS_MMAPPED_BIT;
+            psize += prevsize + MMAP_FOOT_PAD;
+            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+              fm->footprint -= psize;
+            goto postaction;
+          }
+          else {
+            mchunkptr prev = chunk_minus_offset(p, prevsize);
+            psize += prevsize;
+            p = prev;
+            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+              if (p != fm->dv) {
+                unlink_chunk(fm, p, prevsize);
+              }
+              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+                fm->dvsize = psize;
+                set_free_with_pinuse(p, psize, next);
+                goto postaction;
+              }
+            }
+            else
+              goto erroraction;
+          }
+        }
+
+        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+          if (!cinuse(next)) {  /* consolidate forward */
+            if (next == fm->top) {
+              size_t tsize = fm->topsize += psize;
+              fm->top = p;
+              p->head = tsize | PINUSE_BIT;
+              if (p == fm->dv) {
+                fm->dv = 0;
+                fm->dvsize = 0;
+              }
+              if (should_trim(fm, tsize))
+                sys_trim(fm, 0);
+              goto postaction;
+            }
+            else if (next == fm->dv) {
+              size_t dsize = fm->dvsize += psize;
+              fm->dv = p;
+              set_size_and_pinuse_of_free_chunk(p, dsize);
+              goto postaction;
+            }
+            else {
+              size_t nsize = chunksize(next);
+              psize += nsize;
+              unlink_chunk(fm, next, nsize);
+              set_size_and_pinuse_of_free_chunk(p, psize);
+              if (p == fm->dv) {
+                fm->dvsize = psize;
+                goto postaction;
+              }
+            }
+          }
+          else
+            set_free_with_pinuse(p, psize, next);
+          insert_chunk(fm, p, psize);
+          check_free_chunk(fm, p);
+          goto postaction;
+        }
+      }
+    erroraction:
+      USAGE_ERROR_ACTION(fm, p);
+    postaction:
+      POSTACTION(fm);
+    }
+  }
+#if !FOOTERS
+#undef fm
+#endif /* FOOTERS */
+}
+
+void* dlcalloc(size_t n_elements, size_t elem_size) {
+  void* mem;
+  size_t req = 0;
+  if (n_elements != 0) {
+    req = n_elements * elem_size;
+    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+        (req / n_elements != elem_size))
+      req = MAX_SIZE_T; /* force downstream failure on overflow */
+  }
+  mem = dlmalloc(req);
+  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+    memset(mem, 0, req);
+  return mem;
+}
+
+void* dlrealloc(void* oldmem, size_t bytes) {
+  if (oldmem == 0)
+    return dlmalloc(bytes);
+#ifdef REALLOC_ZERO_BYTES_FREES
+  if (bytes == 0) {
+    dlfree(oldmem);
+    return 0;
+  }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+  else {
+#if ! FOOTERS
+    mstate m = gm;
+#else /* FOOTERS */
+    mstate m = get_mstate_for(mem2chunk(oldmem));
+    if (!ok_magic(m)) {
+      USAGE_ERROR_ACTION(m, oldmem);
+      return 0;
+    }
+#endif /* FOOTERS */
+    return internal_realloc(m, oldmem, bytes);
+  }
+}
+
+void* dlmemalign(size_t alignment, size_t bytes) {
+  return internal_memalign(gm, alignment, bytes);
+}
+
+void** dlindependent_calloc(size_t n_elements, size_t elem_size,
+                                 void* chunks[]) {
+  size_t sz = elem_size; /* serves as 1-element array */
+  return ialloc(gm, n_elements, &sz, 3, chunks);
+}
+
+void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
+                                   void* chunks[]) {
+  return ialloc(gm, n_elements, sizes, 0, chunks);
+}
+
+void* dlvalloc(size_t bytes) {
+  size_t pagesz;
+  init_mparams();
+  pagesz = mparams.page_size;
+  return dlmemalign(pagesz, bytes);
+}
+
+void* dlpvalloc(size_t bytes) {
+  size_t pagesz;
+  init_mparams();
+  pagesz = mparams.page_size;
+  return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
+}
+
+int dlmalloc_trim(size_t pad) {
+  int result = 0;
+  if (!PREACTION(gm)) {
+    result = sys_trim(gm, pad);
+    POSTACTION(gm);
+  }
+  return result;
+}
+
+size_t dlmalloc_footprint(void) {
+  return gm->footprint;
+}
+
+size_t dlmalloc_max_footprint(void) {
+  return gm->max_footprint;
+}
+
+#if !NO_MALLINFO
+struct mallinfo dlmallinfo(void) {
+  return internal_mallinfo(gm);
+}
+#endif /* NO_MALLINFO */
+
+void dlmalloc_stats() {
+  internal_malloc_stats(gm);
+}
+
+size_t dlmalloc_usable_size(void* mem) {
+  if (mem != 0) {
+    mchunkptr p = mem2chunk(mem);
+    if (cinuse(p))
+      return chunksize(p) - overhead_for(p);
+  }
+  return 0;
+}
+
+int dlmallopt(int param_number, int value) {
+  return change_mparam(param_number, value);
+}
+
+#endif /* !ONLY_MSPACES */
+
+/* ----------------------------- user mspaces ---------------------------- */
+
+#if MSPACES
+
+static mstate init_user_mstate(char* tbase, size_t tsize) {
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  mchunkptr mn;
+  mchunkptr msp = align_as_chunk(tbase);
+  mstate m = (mstate)(chunk2mem(msp));
+  memset(m, 0, msize);
+  INITIAL_LOCK(&m->mutex);
+  msp->head = (msize|PINUSE_BIT|CINUSE_BIT);
+  m->seg.base = m->least_addr = tbase;
+  m->seg.size = m->footprint = m->max_footprint = tsize;
+  m->magic = mparams.magic;
+  m->mflags = mparams.default_mflags;
+  disable_contiguous(m);
+  init_bins(m);
+  mn = next_chunk(mem2chunk(m));
+  init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
+  check_top_chunk(m, m->top);
+  return m;
+}
+
+mspace create_mspace(size_t capacity, int locked) {
+  mstate m = 0;
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  init_mparams(); /* Ensure pagesize etc initialized */
+
+  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+    size_t rs = ((capacity == 0)? mparams.granularity :
+                 (capacity + TOP_FOOT_SIZE + msize));
+    size_t tsize = granularity_align(rs);
+    char* tbase = (char*)(CALL_MMAP(tsize));
+    if (tbase != CMFAIL) {
+      m = init_user_mstate(tbase, tsize);
+      m->seg.sflags = IS_MMAPPED_BIT;
+      set_lock(m, locked);
+    }
+  }
+  return (mspace)m;
+}
+
+mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
+  mstate m = 0;
+  size_t msize = pad_request(sizeof(struct malloc_state));
+  init_mparams(); /* Ensure pagesize etc initialized */
+
+  if (capacity > msize + TOP_FOOT_SIZE &&
+      capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
+    m = init_user_mstate((char*)base, capacity);
+    m->seg.sflags = EXTERN_BIT;
+    set_lock(m, locked);
+  }
+  return (mspace)m;
+}
+
+size_t destroy_mspace(mspace msp) {
+  size_t freed = 0;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    msegmentptr sp = &ms->seg;
+    while (sp != 0) {
+      char* base = sp->base;
+      size_t size = sp->size;
+      flag_t flag = sp->sflags;
+      sp = sp->next;
+      if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) &&
+          CALL_MUNMAP(base, size) == 0)
+        freed += size;
+    }
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return freed;
+}
+
+/*
+  mspace versions of routines are near-clones of the global
+  versions. This is not so nice but better than the alternatives.
+*/
+
+
+void* mspace_malloc(mspace msp, size_t bytes) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  if (!PREACTION(ms)) {
+    void* mem;
+    size_t nb;
+    if (bytes <= MAX_SMALL_REQUEST) {
+      bindex_t idx;
+      binmap_t smallbits;
+      nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
+      idx = small_index(nb);
+      smallbits = ms->smallmap >> idx;
+
+      if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
+        mchunkptr b, p;
+        idx += ~smallbits & 1;       /* Uses next bin if idx empty */
+        b = smallbin_at(ms, idx);
+        p = b->fd;
+        assert(chunksize(p) == small_index2size(idx));
+        unlink_first_small_chunk(ms, b, p, idx);
+        set_inuse_and_pinuse(ms, p, small_index2size(idx));
+        mem = chunk2mem(p);
+        check_malloced_chunk(ms, mem, nb);
+        goto postaction;
+      }
+
+      else if (nb > ms->dvsize) {
+        if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
+          mchunkptr b, p, r;
+          size_t rsize;
+          bindex_t i;
+          binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
+          binmap_t leastbit = least_bit(leftbits);
+          compute_bit2idx(leastbit, i);
+          b = smallbin_at(ms, i);
+          p = b->fd;
+          assert(chunksize(p) == small_index2size(i));
+          unlink_first_small_chunk(ms, b, p, i);
+          rsize = small_index2size(i) - nb;
+          /* Fit here cannot be remainderless if 4byte sizes */
+          if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
+            set_inuse_and_pinuse(ms, p, small_index2size(i));
+          else {
+            set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+            r = chunk_plus_offset(p, nb);
+            set_size_and_pinuse_of_free_chunk(r, rsize);
+            replace_dv(ms, r, rsize);
+          }
+          mem = chunk2mem(p);
+          check_malloced_chunk(ms, mem, nb);
+          goto postaction;
+        }
+
+        else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
+          check_malloced_chunk(ms, mem, nb);
+          goto postaction;
+        }
+      }
+    }
+    else if (bytes >= MAX_REQUEST)
+      nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
+    else {
+      nb = pad_request(bytes);
+      if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
+        check_malloced_chunk(ms, mem, nb);
+        goto postaction;
+      }
+    }
+
+    if (nb <= ms->dvsize) {
+      size_t rsize = ms->dvsize - nb;
+      mchunkptr p = ms->dv;
+      if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
+        mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
+        ms->dvsize = rsize;
+        set_size_and_pinuse_of_free_chunk(r, rsize);
+        set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+      }
+      else { /* exhaust dv */
+        size_t dvs = ms->dvsize;
+        ms->dvsize = 0;
+        ms->dv = 0;
+        set_inuse_and_pinuse(ms, p, dvs);
+      }
+      mem = chunk2mem(p);
+      check_malloced_chunk(ms, mem, nb);
+      goto postaction;
+    }
+
+    else if (nb < ms->topsize) { /* Split top */
+      size_t rsize = ms->topsize -= nb;
+      mchunkptr p = ms->top;
+      mchunkptr r = ms->top = chunk_plus_offset(p, nb);
+      r->head = rsize | PINUSE_BIT;
+      set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
+      mem = chunk2mem(p);
+      check_top_chunk(ms, ms->top);
+      check_malloced_chunk(ms, mem, nb);
+      goto postaction;
+    }
+
+    mem = sys_alloc(ms, nb);
+
+  postaction:
+    POSTACTION(ms);
+    return mem;
+  }
+
+  return 0;
+}
+
+void mspace_free(mspace msp, void* mem) {
+  if (mem != 0) {
+    mchunkptr p  = mem2chunk(mem);
+#if FOOTERS
+    mstate fm = get_mstate_for(p);
+#else /* FOOTERS */
+    mstate fm = (mstate)msp;
+#endif /* FOOTERS */
+    if (!ok_magic(fm)) {
+      USAGE_ERROR_ACTION(fm, p);
+      return;
+    }
+    if (!PREACTION(fm)) {
+      check_inuse_chunk(fm, p);
+      if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) {
+        size_t psize = chunksize(p);
+        mchunkptr next = chunk_plus_offset(p, psize);
+        if (!pinuse(p)) {
+          size_t prevsize = p->prev_foot;
+          if ((prevsize & IS_MMAPPED_BIT) != 0) {
+            prevsize &= ~IS_MMAPPED_BIT;
+            psize += prevsize + MMAP_FOOT_PAD;
+            if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
+              fm->footprint -= psize;
+            goto postaction;
+          }
+          else {
+            mchunkptr prev = chunk_minus_offset(p, prevsize);
+            psize += prevsize;
+            p = prev;
+            if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
+              if (p != fm->dv) {
+                unlink_chunk(fm, p, prevsize);
+              }
+              else if ((next->head & INUSE_BITS) == INUSE_BITS) {
+                fm->dvsize = psize;
+                set_free_with_pinuse(p, psize, next);
+                goto postaction;
+              }
+            }
+            else
+              goto erroraction;
+          }
+        }
+
+        if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
+          if (!cinuse(next)) {  /* consolidate forward */
+            if (next == fm->top) {
+              size_t tsize = fm->topsize += psize;
+              fm->top = p;
+              p->head = tsize | PINUSE_BIT;
+              if (p == fm->dv) {
+                fm->dv = 0;
+                fm->dvsize = 0;
+              }
+              if (should_trim(fm, tsize))
+                sys_trim(fm, 0);
+              goto postaction;
+            }
+            else if (next == fm->dv) {
+              size_t dsize = fm->dvsize += psize;
+              fm->dv = p;
+              set_size_and_pinuse_of_free_chunk(p, dsize);
+              goto postaction;
+            }
+            else {
+              size_t nsize = chunksize(next);
+              psize += nsize;
+              unlink_chunk(fm, next, nsize);
+              set_size_and_pinuse_of_free_chunk(p, psize);
+              if (p == fm->dv) {
+                fm->dvsize = psize;
+                goto postaction;
+              }
+            }
+          }
+          else
+            set_free_with_pinuse(p, psize, next);
+          insert_chunk(fm, p, psize);
+          check_free_chunk(fm, p);
+          goto postaction;
+        }
+      }
+    erroraction:
+      USAGE_ERROR_ACTION(fm, p);
+    postaction:
+      POSTACTION(fm);
+    }
+  }
+}
+
+void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
+  void* mem;
+  size_t req = 0;
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  if (n_elements != 0) {
+    req = n_elements * elem_size;
+    if (((n_elements | elem_size) & ~(size_t)0xffff) &&
+        (req / n_elements != elem_size))
+      req = MAX_SIZE_T; /* force downstream failure on overflow */
+  }
+  mem = internal_malloc(ms, req);
+  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
+    memset(mem, 0, req);
+  return mem;
+}
+
+void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
+  if (oldmem == 0)
+    return mspace_malloc(msp, bytes);
+#ifdef REALLOC_ZERO_BYTES_FREES
+  if (bytes == 0) {
+    mspace_free(msp, oldmem);
+    return 0;
+  }
+#endif /* REALLOC_ZERO_BYTES_FREES */
+  else {
+#if FOOTERS
+    mchunkptr p  = mem2chunk(oldmem);
+    mstate ms = get_mstate_for(p);
+#else /* FOOTERS */
+    mstate ms = (mstate)msp;
+#endif /* FOOTERS */
+    if (!ok_magic(ms)) {
+      USAGE_ERROR_ACTION(ms,ms);
+      return 0;
+    }
+    return internal_realloc(ms, oldmem, bytes);
+  }
+}
+
+void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return internal_memalign(ms, alignment, bytes);
+}
+
+void** mspace_independent_calloc(mspace msp, size_t n_elements,
+                                 size_t elem_size, void* chunks[]) {
+  size_t sz = elem_size; /* serves as 1-element array */
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return ialloc(ms, n_elements, &sz, 3, chunks);
+}
+
+void** mspace_independent_comalloc(mspace msp, size_t n_elements,
+                                   size_t sizes[], void* chunks[]) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+    return 0;
+  }
+  return ialloc(ms, n_elements, sizes, 0, chunks);
+}
+
+int mspace_trim(mspace msp, size_t pad) {
+  int result = 0;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    if (!PREACTION(ms)) {
+      result = sys_trim(ms, pad);
+      POSTACTION(ms);
+    }
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return result;
+}
+
+void mspace_malloc_stats(mspace msp) {
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    internal_malloc_stats(ms);
+  }
+  else {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+}
+
+size_t mspace_footprint(mspace msp) {
+  size_t result;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    result = ms->footprint;
+  }
+  USAGE_ERROR_ACTION(ms,ms);
+  return result;
+}
+
+
+size_t mspace_max_footprint(mspace msp) {
+  size_t result;
+  mstate ms = (mstate)msp;
+  if (ok_magic(ms)) {
+    result = ms->max_footprint;
+  }
+  USAGE_ERROR_ACTION(ms,ms);
+  return result;
+}
+
+
+#if !NO_MALLINFO
+struct mallinfo mspace_mallinfo(mspace msp) {
+  mstate ms = (mstate)msp;
+  if (!ok_magic(ms)) {
+    USAGE_ERROR_ACTION(ms,ms);
+  }
+  return internal_mallinfo(ms);
+}
+#endif /* NO_MALLINFO */
+
+int mspace_mallopt(int param_number, int value) {
+  return change_mparam(param_number, value);
+}
+
+#endif /* MSPACES */
+
+/* -------------------- Alternative MORECORE functions ------------------- */
+
+/*
+  Guidelines for creating a custom version of MORECORE:
+
+  * For best performance, MORECORE should allocate in multiples of pagesize.
+  * MORECORE may allocate more memory than requested. (Or even less,
+      but this will usually result in a malloc failure.)
+  * MORECORE must not allocate memory when given argument zero, but
+      instead return one past the end address of memory from previous
+      nonzero call.
+  * For best performance, consecutive calls to MORECORE with positive
+      arguments should return increasing addresses, indicating that
+      space has been contiguously extended.
+  * Even though consecutive calls to MORECORE need not return contiguous
+      addresses, it must be OK for malloc'ed chunks to span multiple
+      regions in those cases where they do happen to be contiguous.
+  * MORECORE need not handle negative arguments -- it may instead
+      just return MFAIL when given negative arguments.
+      Negative arguments are always multiples of pagesize. MORECORE
+      must not misinterpret negative args as large positive unsigned
+      args. You can suppress all such calls from even occurring by defining
+      MORECORE_CANNOT_TRIM,
+
+  As an example alternative MORECORE, here is a custom allocator
+  kindly contributed for pre-OSX macOS.  It uses virtually but not
+  necessarily physically contiguous non-paged memory (locked in,
+  present and won't get swapped out).  You can use it by uncommenting
+  this section, adding some #includes, and setting up the appropriate
+  defines above:
+
+      #define MORECORE osMoreCore
+
+  There is also a shutdown routine that should somehow be called for
+  cleanup upon program exit.
+
+  #define MAX_POOL_ENTRIES 100
+  #define MINIMUM_MORECORE_SIZE  (64 * 1024U)
+  static int next_os_pool;
+  void *our_os_pools[MAX_POOL_ENTRIES];
+
+  void *osMoreCore(int size)
+  {
+    void *ptr = 0;
+    static void *sbrk_top = 0;
+
+    if (size > 0)
+    {
+      if (size < MINIMUM_MORECORE_SIZE)
+         size = MINIMUM_MORECORE_SIZE;
+      if (CurrentExecutionLevel() == kTaskLevel)
+         ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
+      if (ptr == 0)
+      {
+        return (void *) MFAIL;
+      }
+      // save ptrs so they can be freed during cleanup
+      our_os_pools[next_os_pool] = ptr;
+      next_os_pool++;
+      ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
+      sbrk_top = (char *) ptr + size;
+      return ptr;
+    }
+    else if (size < 0)
+    {
+      // we don't currently support shrink behavior
+      return (void *) MFAIL;
+    }
+    else
+    {
+      return sbrk_top;
+    }
+  }
+
+  // cleanup any allocated memory pools
+  // called as last thing before shutting down driver
+
+  void osCleanupMem(void)
+  {
+    void **ptr;
+
+    for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
+      if (*ptr)
+      {
+         PoolDeallocate(*ptr);
+         *ptr = 0;
+      }
+  }
+
+*/
+
+
+/* -----------------------------------------------------------------------
+History:
+    V2.8.3 Thu Sep 22 11:16:32 2005  Doug Lea  (dl at gee)
+      * Add max_footprint functions
+      * Ensure all appropriate literals are size_t
+      * Fix conditional compilation problem for some #define settings
+      * Avoid concatenating segments with the one provided
+        in create_mspace_with_base
+      * Rename some variables to avoid compiler shadowing warnings
+      * Use explicit lock initialization.
+      * Better handling of sbrk interference.
+      * Simplify and fix segment insertion, trimming and mspace_destroy
+      * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
+      * Thanks especially to Dennis Flanagan for help on these.
+
+    V2.8.2 Sun Jun 12 16:01:10 2005  Doug Lea  (dl at gee)
+      * Fix memalign brace error.
+
+    V2.8.1 Wed Jun  8 16:11:46 2005  Doug Lea  (dl at gee)
+      * Fix improper #endif nesting in C++
+      * Add explicit casts needed for C++
+
+    V2.8.0 Mon May 30 14:09:02 2005  Doug Lea  (dl at gee)
+      * Use trees for large bins
+      * Support mspaces
+      * Use segments to unify sbrk-based and mmap-based system allocation,
+        removing need for emulation on most platforms without sbrk.
+      * Default safety checks
+      * Optional footer checks. Thanks to William Robertson for the idea.
+      * Internal code refactoring
+      * Incorporate suggestions and platform-specific changes.
+        Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
+        Aaron Bachmann,  Emery Berger, and others.
+      * Speed up non-fastbin processing enough to remove fastbins.
+      * Remove useless cfree() to avoid conflicts with other apps.
+      * Remove internal memcpy, memset. Compilers handle builtins better.
+      * Remove some options that no one ever used and rename others.
+
+    V2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)
+      * Fix malloc_state bitmap array misdeclaration
+
+    V2.7.1 Thu Jul 25 10:58:03 2002  Doug Lea  (dl at gee)
+      * Allow tuning of FIRST_SORTED_BIN_SIZE
+      * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
+      * Better detection and support for non-contiguousness of MORECORE.
+        Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
+      * Bypass most of malloc if no frees. Thanks To Emery Berger.
+      * Fix freeing of old top non-contiguous chunk im sysmalloc.
+      * Raised default trim and map thresholds to 256K.
+      * Fix mmap-related #defines. Thanks to Lubos Lunak.
+      * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
+      * Branch-free bin calculation
+      * Default trim and mmap thresholds now 256K.
+
+    V2.7.0 Sun Mar 11 14:14:06 2001  Doug Lea  (dl at gee)
+      * Introduce independent_comalloc and independent_calloc.
+        Thanks to Michael Pachos for motivation and help.
+      * Make optional .h file available
+      * Allow > 2GB requests on 32bit systems.
+      * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
+        Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
+        and Anonymous.
+      * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
+        helping test this.)
+      * memalign: check alignment arg
+      * realloc: don't try to shift chunks backwards, since this
+        leads to  more fragmentation in some programs and doesn't
+        seem to help in any others.
+      * Collect all cases in malloc requiring system memory into sysmalloc
+      * Use mmap as backup to sbrk
+      * Place all internal state in malloc_state
+      * Introduce fastbins (although similar to 2.5.1)
+      * Many minor tunings and cosmetic improvements
+      * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
+      * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
+        Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
+      * Include errno.h to support default failure action.
+
+    V2.6.6 Sun Dec  5 07:42:19 1999  Doug Lea  (dl at gee)
+      * return null for negative arguments
+      * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
+         * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+          (e.g. WIN32 platforms)
+         * Cleanup header file inclusion for WIN32 platforms
+         * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+         * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+           memory allocation routines
+         * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+         * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+           usage of 'assert' in non-WIN32 code
+         * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+           avoid infinite loop
+      * Always call 'fREe()' rather than 'free()'
+
+    V2.6.5 Wed Jun 17 15:57:31 1998  Doug Lea  (dl at gee)
+      * Fixed ordering problem with boundary-stamping
+
+    V2.6.3 Sun May 19 08:17:58 1996  Doug Lea  (dl at gee)
+      * Added pvalloc, as recommended by H.J. Liu
+      * Added 64bit pointer support mainly from Wolfram Gloger
+      * Added anonymously donated WIN32 sbrk emulation
+      * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
+      * malloc_extend_top: fix mask error that caused wastage after
+        foreign sbrks
+      * Add linux mremap support code from HJ Liu
+
+    V2.6.2 Tue Dec  5 06:52:55 1995  Doug Lea  (dl at gee)
+      * Integrated most documentation with the code.
+      * Add support for mmap, with help from
+        Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+      * Use last_remainder in more cases.
+      * Pack bins using idea from  colin@nyx10.cs.du.edu
+      * Use ordered bins instead of best-fit threshhold
+      * Eliminate block-local decls to simplify tracing and debugging.
+      * Support another case of realloc via move into top
+      * Fix error occuring when initial sbrk_base not word-aligned.
+      * Rely on page size for units instead of SBRK_UNIT to
+        avoid surprises about sbrk alignment conventions.
+      * Add mallinfo, mallopt. Thanks to Raymond Nijssen
+        (raymond@es.ele.tue.nl) for the suggestion.
+      * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
+      * More precautions for cases where other routines call sbrk,
+        courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+      * Added macros etc., allowing use in linux libc from
+        H.J. Lu (hjl@gnu.ai.mit.edu)
+      * Inverted this history list
+
+    V2.6.1 Sat Dec  2 14:10:57 1995  Doug Lea  (dl at gee)
+      * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
+      * Removed all preallocation code since under current scheme
+        the work required to undo bad preallocations exceeds
+        the work saved in good cases for most test programs.
+      * No longer use return list or unconsolidated bins since
+        no scheme using them consistently outperforms those that don't
+        given above changes.
+      * Use best fit for very large chunks to prevent some worst-cases.
+      * Added some support for debugging
+
+    V2.6.0 Sat Nov  4 07:05:23 1995  Doug Lea  (dl at gee)
+      * Removed footers when chunks are in use. Thanks to
+        Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+
+    V2.5.4 Wed Nov  1 07:54:51 1995  Doug Lea  (dl at gee)
+      * Added malloc_trim, with help from Wolfram Gloger
+        (wmglo@Dent.MED.Uni-Muenchen.DE).
+
+    V2.5.3 Tue Apr 26 10:16:01 1994  Doug Lea  (dl at g)
+
+    V2.5.2 Tue Apr  5 16:20:40 1994  Doug Lea  (dl at g)
+      * realloc: try to expand in both directions
+      * malloc: swap order of clean-bin strategy;
+      * realloc: only conditionally expand backwards
+      * Try not to scavenge used bins
+      * Use bin counts as a guide to preallocation
+      * Occasionally bin return list chunks in first scan
+      * Add a few optimizations from colin@nyx10.cs.du.edu
+
+    V2.5.1 Sat Aug 14 15:40:43 1993  Doug Lea  (dl at g)
+      * faster bin computation & slightly different binning
+      * merged all consolidations to one part of malloc proper
+         (eliminating old malloc_find_space & malloc_clean_bin)
+      * Scan 2 returns chunks (not just 1)
+      * Propagate failure in realloc if malloc returns 0
+      * Add stuff to allow compilation on non-ANSI compilers
+          from kpv@research.att.com
+
+    V2.5 Sat Aug  7 07:41:59 1993  Doug Lea  (dl at g.oswego.edu)
+      * removed potential for odd address access in prev_chunk
+      * removed dependency on getpagesize.h
+      * misc cosmetics and a bit more internal documentation
+      * anticosmetics: mangled names in macros to evade debugger strangeness
+      * tested on sparc, hp-700, dec-mips, rs6000
+          with gcc & native cc (hp, dec only) allowing
+          Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+
+    Trial version Fri Aug 28 13:14:29 1992  Doug Lea  (dl at g.oswego.edu)
+      * Based loosely on libg++-1.2X malloc. (It retains some of the overall
+         structure of old version,  but most details differ.)
+ 
+*/
Index: branches/egtra/ab5.0/abdev/ab_common/src/Environment.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Environment.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Environment.cpp	(revision 774)
@@ -0,0 +1,116 @@
+#include "stdafx.h"
+#include <uxtheme.h>
+
+std::string ActiveBasic::Common::Environment::rootPath;
+bool ActiveBasic::Common::Environment::isRemoveExternal = false;
+
+using namespace ActiveBasic::Common;
+
+void Environment::SetAbdevRootPath( const std::string &rootPath )
+{
+	Environment::rootPath = Jenga::Common::Path::MakeFullPath( rootPath, Jenga::Common::Environment::GetAppDir() );
+}
+const std::string Environment::GetAbdevRootPath()
+{
+	if( rootPath.empty() )
+	{
+		SetAbdevRootPath( "" );
+	}
+	return rootPath;
+}
+
+const std::string Environment::GetUserAppDir()
+{
+	return Jenga::Common::Environment::GetUserAppDir() + "\\ActiveBasic";
+}
+
+const std::string Environment::GetCompilerExePath( Platform::EnumType platform )
+{
+	switch( platform )
+	{
+	case Platform::X86:
+		return rootPath + "\\bin\\x86\\abc.exe";
+	case Platform::X64:
+		return rootPath + "\\bin\\x64\\abc.exe";
+	}
+	throw;
+}
+
+void* operator new( std::size_t n )
+{
+	if ( void* p = dlmalloc(n) ){
+		return p;
+	}
+	else{
+		throw std::bad_alloc();
+	}
+}
+
+void* operator new[]( std::size_t n )
+{
+	return ::operator new( n );
+}
+
+void operator delete( void* p )
+{
+	dlfree( p );
+}
+
+void operator delete[]( void* p )
+{
+	::operator delete( p );
+}
+
+typedef HRESULT (WINAPI* PFN_EnableThemeDialogTexture)(HWND, DWORD);
+
+HMODULE hmodUxTheme = LoadLibrary("uxtheme");
+
+HRESULT ApplyDialogTexture( HWND hwnd )
+{
+	if( hmodUxTheme )
+	{
+		if( PFN_EnableThemeDialogTexture pfn = reinterpret_cast<PFN_EnableThemeDialogTexture>(
+			GetProcAddress(hmodUxTheme, "EnableThemeDialogTexture")) )
+		{
+			return pfn(hwnd, ETDT_ENABLETAB);
+		}
+	}
+	return E_NOTIMPL;
+}
+
+BOOL ActiveBasic::Common::EnableNX()
+{
+	typedef BOOL (WINAPI* PFNSETDEP)(DWORD);
+
+	HMODULE hmodKernel = GetModuleHandle(TEXT("KERNEL32.DLL"));
+	if (PFNSETDEP pfnSetDEP = reinterpret_cast<PFNSETDEP>(GetProcAddress(hmodKernel, "SetProcessDEPPolicy")))
+	{
+		return pfnSetDEP(PROCESS_DEP_ENABLE);
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+void ActiveBasic::Common::SetHeapOptions()
+{
+//	SetDllDirectory(_T(""));
+	HMODULE hmodKernel = GetModuleHandle(TEXT("KERNEL32.DLL"));
+
+	typedef BOOL (WINAPI* HSI)(HANDLE, HEAP_INFORMATION_CLASS ,PVOID, SIZE_T);
+	HSI pHsi = reinterpret_cast<HSI>(GetProcAddress(hmodKernel, "HeapSetInformation"));
+	if (!pHsi)
+	{
+		return;
+	}
+
+	ULONG enableLFH = 2;
+	pHsi(GetProcessHeap(), HeapCompatibilityInformation, &enableLFH, sizeof enableLFH);
+
+#ifndef HeapEnableTerminationOnCorruption
+#	define HeapEnableTerminationOnCorruption (HEAP_INFORMATION_CLASS)1
+#endif
+
+	pHsi(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp	(revision 774)
@@ -0,0 +1,973 @@
+#include "stdafx.h"
+#include <algorithm>
+#include <boost/checked_delete.hpp>
+
+CClass::CClass( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces )
+	: ClassPrototype( symbol )
+	, importedNamespaces( importedNamespaces )
+	, classType( Class )
+	, pSuperClass( NULL )
+	, blittableType( Type() )
+	, isReady( false )
+	, fixedAlignment( 0 )
+	, ConstructorMemberSubIndex( -1 )
+	, DestructorMemberSubIndex( -1 )
+	, vtblNum( 0 )
+	, vtbl_offset( -1 )
+	, comVtblOffset( 0 )
+	, isCompilingConstructor( false )
+	, isCompilingDestructor( false )
+	, cacheSize( 0 )
+{
+}
+
+CClass::CClass(
+	const Symbol &symbol,
+	const NamespaceScopesCollection &importedNamespaces,
+	ClassType classType,
+	const GenericTypes &formalGenericTypes,
+	const Types &superClassActualTypeParameters,
+	int ConstructorMemberSubIndex,
+	int DestructorMemberSubIndex,
+	int vtblNum,
+	int fixedAlignment,
+	const Types &expandedClassActualTypeParameters )
+	: ClassPrototype( symbol )
+	, importedNamespaces( importedNamespaces )
+	, classType( classType )
+	, formalGenericTypes( formalGenericTypes )
+	, pSuperClass( NULL )
+	, superClassActualTypeParameters( superClassActualTypeParameters )
+	, blittableType( Type() )
+	, isReady( false )
+	, ConstructorMemberSubIndex( ConstructorMemberSubIndex )
+	, DestructorMemberSubIndex( DestructorMemberSubIndex )
+	, vtblNum( vtblNum )
+	, fixedAlignment( fixedAlignment )
+	, expandedClassActualTypeParameters( expandedClassActualTypeParameters )
+	, vtbl_offset( -1 )
+	, comVtblOffset( 0 )
+	, isCompilingConstructor( false )
+	, isCompilingDestructor( false )
+	, cacheSize( 0 )
+{
+}
+
+CClass::CClass()
+	: ClassPrototype()
+	, importedNamespaces()
+	, classType()
+	, pSuperClass( NULL )
+	, blittableType( Type() )
+	, isReady( false )
+	, fixedAlignment( 0 )
+	, ConstructorMemberSubIndex( -1 )
+	, DestructorMemberSubIndex( -1 )
+	, vtblNum( 0 )
+	, vtbl_offset( -1 )
+	, comVtblOffset( 0 )
+	, isCompilingConstructor( false )
+	, isCompilingDestructor( false )
+	, cacheSize( 0 )
+{
+}
+
+CClass::~CClass()
+{
+	using std::for_each;
+	using boost::checked_deleter;
+	// 動的メンバ
+	for_each( dynamicMembers.begin(), dynamicMembers.end(), checked_deleter<Member>() );
+	// 静的メンバ
+	for_each( staticMembers.begin(), staticMembers.end(), checked_deleter<Member>() );
+	// インターフェイス
+	for_each( interfaces.begin(), interfaces.end(), checked_deleter<::Interface>() );
+	// テンプレート展開済みのクラス
+	for_each( expandedTemplateClasses.begin(), expandedTemplateClasses.end(), checked_deleter<ExpandedTemplateClass>() );
+}
+
+void CClass::Using() const
+{
+	if( this->IsUsing() )
+	{
+		// 既に使用することになっている
+		return;
+	}
+
+	Prototype::Using();
+
+	// 仮想関数になるメソッドに使用チェックをつける
+	const CClass &_class = *this;
+	foreach( const CMethod *pMethod, _class.GetDynamicMethods() )
+	{
+		if( pMethod->IsVirtual() )
+		{
+			pMethod->GetUserProc().Using();
+		}
+	}
+
+	// インターフェイスメソッドに使用チェックをつける
+	foreach( const ::Interface *pInterface, _class.GetInterfaces() )
+	{
+		foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() )
+		{
+			pMethod->GetUserProc().Using();
+		}
+	}
+}
+bool CClass::IsClass() const
+{
+	return classType == CClass::Class;
+}
+bool CClass::IsInterface() const
+{
+	return classType == CClass::Interface;
+}
+bool CClass::IsComInterface() const
+{
+	return classType == CClass::ComInterface;
+}
+bool CClass::IsEnum() const
+{
+	return classType == CClass::Enum;
+}
+bool CClass::IsDelegate() const
+{
+	return classType == CClass::Delegate;
+}
+bool CClass::IsStructure() const
+{
+	return classType == CClass::Structure;
+}
+
+
+// コンストラクタのコンパイルを開始
+void CClass::NotifyStartConstructorCompile() const
+{
+	isCompilingConstructor = true;
+}
+
+//コンストラクタのコンパイルを終了
+void CClass::NotifyFinishConstructorCompile() const
+{
+	isCompilingConstructor = false;
+}
+
+//コンストラクタをコンパイル中かどうかを判別
+bool CClass::IsCompilingConstructor() const
+{
+	return isCompilingConstructor;
+}
+
+//デストラクタのコンパイルを開始
+void CClass::NotifyStartDestructorCompile() const{
+	isCompilingDestructor = true;
+}
+
+//デストラクタのコンパイルを終了
+void CClass::NotifyFinishDestructorCompile() const{
+	isCompilingDestructor = false;
+}
+
+//デストラクタをコンパイル中かどうかを判別
+bool CClass::IsCompilingDestructor() const
+{
+	return isCompilingDestructor;
+}
+
+//自身の派生クラスかどうかを確認
+bool CClass::IsSubClass( const CClass *pSubClass ) const
+{
+	if( !pSubClass->HasSuperClass() )
+	{
+		return false;
+	}
+
+	const CClass *pTempClass = &pSubClass->GetSuperClass();
+	while( pTempClass ){
+		if( this == pTempClass ) return true;
+		pTempClass = &pTempClass->GetSuperClass();
+	}
+	return false;
+}
+
+//自身と等しいまたは派生クラスかどうかを確認
+bool CClass::IsEqualsOrSubClass( const CClass *pSubClass ) const
+{
+	if( IsEquals( pSubClass ) ) return true;
+	return IsSubClass( pSubClass );
+}
+
+// 自身と等しいまたは派生クラス、基底クラスかどうかを確認
+bool CClass::IsEqualsOrSubClassOrSuperClass( const CClass &objClass ) const
+{
+	if( IsEquals( &objClass ) ) return true;
+	if( IsSubClass( &objClass ) ) return true;
+	if( objClass.IsSubClass( this ) ) return true;
+	return false;
+}
+
+bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const
+{
+	foreach( const ::Interface *pInterface, interfaces ){
+		if( pInterfaceClass == &pInterface->GetClass() ){
+			return true;
+		}
+	}
+	return false;
+}
+
+bool CClass::InheritsClass( const CClass &inheritsClass, const Types &actualTypeParameters, int nowLine )
+{
+	//メソッドをコピー
+	const Methods& inheritsClassMethods = inheritsClass.GetDynamicMethods();
+	GetDynamicMethods().reserve( inheritsClassMethods.size() );
+	foreach( const CMethod *pBaseMethod, inheritsClassMethods ){
+		CMethod *pMethod = new DynamicMethod( *pBaseMethod );
+
+		// アクセシビリティ
+		if(pBaseMethod->GetAccessibility() == Prototype::Private){
+			pMethod->SetAccessibility( Prototype::None );
+		}
+		else{
+			pMethod->SetAccessibility( pBaseMethod->GetAccessibility() );
+		}
+
+		//pobj_Inherits
+		// ※継承元のClassIndexをセット（入れ子継承を考慮する）
+		if(pBaseMethod->GetInheritsClassPtr()==0){
+			pMethod->SetInheritsClassPtr( &inheritsClass );
+		}
+		else{
+			pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
+		}
+
+		GetDynamicMethods().push_back( pMethod );
+	}
+
+	//仮想関数の数
+	AddVtblNum( inheritsClass.GetVtblNum() );
+
+	//継承先のクラスをメンバとして保持する
+	SetSuperClass( &inheritsClass );
+	SetSuperClassActualTypeParameters( actualTypeParameters );
+
+	// インターフェイスを引き継ぐ
+	const Interfaces& inheritsClassInterfaces = inheritsClass.GetInterfaces();
+	interfaces.reserve( inheritsClassInterfaces.size() );
+	foreach( const ::Interface *pInterface, inheritsClassInterfaces )
+	{
+		interfaces.push_back( new ::Interface( *pInterface ) );
+	}
+
+	if( this->IsInterface() && inheritsClass.IsComInterface() )
+	{
+		// COMインターフェイスを継承した場合はCOMインターフェイスにする
+		this->SetClassType( CClass::ComInterface );
+	}
+
+	return true;
+}
+
+bool CClass::InheritsInterface( const CClass &inheritsInterfaceClass, const Types &actualTypeParameters, int nowLine )
+{
+	if( !( this->IsInterface() || this->IsComInterface() ) )
+	{
+		Jenga::Throw( "非インターフェイスに対してCClass::InheritsInterfaceメソッドが呼ばれた" );
+	}
+
+	// インターフェイスを継承する
+	return this->InheritsClass( inheritsInterfaceClass, actualTypeParameters, nowLine );
+}
+
+void CClass::AddDynamicMember( Member *pMember )
+{
+	dynamicMembers.push_back( pMember );
+}
+void CClass::AddStaticMember( Member *pMember )
+{
+	staticMembers.push_back( pMember );
+}
+
+bool CClass::DupliCheckAll(const char *name) const
+{
+	//重複チェック
+
+	//メンバ
+	if(DupliCheckMember(name)) return 1;
+
+	//メソッド
+	foreach( const CMethod *pMethod, GetDynamicMethods() ){
+		if(  name == pMethod->GetUserProc().GetName() ){
+			return 1;
+		}
+	}
+
+	return 0;
+}
+bool CClass::DupliCheckMember(const char *name) const
+{
+	//重複チェック
+
+	if( this->HasSuperClass() )
+	{
+		if( this->GetSuperClass().DupliCheckMember( name ) )
+		{
+			// 基底クラスで重複が発見された
+			return true;
+		}
+	}
+
+	// 動的メンバ
+	foreach( const Member *pMember, dynamicMembers )
+	{
+		if( GetName() == pMember->GetName() )
+		{
+			return true;
+		}
+	}
+
+	// 静的メンバ
+	foreach( Member *pMember, staticMembers ){
+		if( GetName() == pMember->GetName() ){
+			return true;
+		}
+	}
+
+	return false;
+}
+
+const Member *CClass::FindDynamicMember( const char *memberName ) const
+{
+	if( this->HasSuperClass() )
+	{
+		// 基底クラスで検索
+		const Member *result = this->GetSuperClass().FindDynamicMember( memberName );
+		if( result )
+		{
+			return result;
+		}
+	}
+
+	foreach( Member *pMember, GetDynamicMembers() )
+	{
+		if( pMember->GetName() == memberName )
+		{
+			return pMember;
+		}
+	}
+	return NULL;
+}
+
+void CClass::EnumDynamicMethodsOrInterfaceMethods( const char *methodName, std::vector<const UserProc *> &subs ) const
+{
+	// 動的メソッド
+	GetDynamicMethods().Enum( methodName, subs );
+
+	// インターフェイス メソッド
+	foreach( ::Interface *pInterface, GetInterfaces() )
+	{
+		pInterface->GetDynamicMethods().Enum( methodName, subs );
+	}
+}
+const CMethod *CClass::GetDynamicMethodOrInterfaceMethod( const UserProc *pUserProc ) const
+{
+	// 動的メソッド
+	const CMethod *result = GetDynamicMethods().GetMethodPtr( pUserProc );
+
+	if( !result )
+	{
+		// インターフェイス メソッド
+		foreach( ::Interface *pInterface, GetInterfaces() )
+		{
+			result = pInterface->GetDynamicMethods().GetMethodPtr( pUserProc );
+			if( result )
+			{
+				return result;
+			}
+		}
+	}
+
+	return result;
+}
+
+void CClass::ResolveExpandedClassActualTypeParameter( Type &type ) const
+{
+	if( !this->IsExpanded() )
+	{
+		_ASSERTE( false );
+	}
+
+	if( !type.IsTypeParameter() )
+	{
+		// 型パラメータではない場合
+		return;
+	}
+
+	type = expandedClassActualTypeParameters[type.GetFormalTypeIndex()];
+}
+
+//サイズを取得
+int CClass::GetSize() const
+{
+	int resultSize = 0;
+
+	int alignment = 1;
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			alignment = this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			const CClass& super = this->GetSuperClass();
+			// 基底クラスのサイズを追加
+			resultSize += super.GetSize();
+
+			// 基底クラスのアラインメントを取得
+			alignment = super.GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			resultSize += IsExistVirtualFunctions() ? PTR_SIZE*2 : 0;
+		}
+	}
+
+	foreach( Member *pMember, dynamicMembers )
+	{
+		const Type& memberType = pMember->GetType();
+		// メンバサイズ
+		int tempMemberSize = memberType.GetSize();
+
+		// 一時アラインメントを算出
+		int tempAlignment = tempMemberSize;
+		if( memberType.IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = memberType.GetClass().GetAlignment();
+		}
+
+		// アラインメントを考慮してパディングを追加
+		if( GetFixedAlignment() && alignment < tempAlignment )
+		{
+			if( resultSize % alignment )
+			{
+				resultSize += alignment - ( resultSize % alignment );
+			}
+		}
+		else
+		{
+			if( alignment < tempAlignment )
+			{
+				// 最大アラインメントを更新
+				alignment = tempAlignment;
+			}
+
+			if( tempMemberSize == 0 )
+			{
+				if( !memberType.IsStruct() )
+				{
+					throw;
+				}
+
+				//メンバを持たない構造体
+				//※何もしない（オフセットの計算をしない）
+			}
+			else{
+				if( resultSize % tempAlignment )
+				{
+					resultSize += tempAlignment - ( resultSize % tempAlignment );
+				}
+			}
+		}
+
+		// メンバサイズを加算（配列を考慮）
+		resultSize += tempMemberSize * Variable::GetSubScriptCounts( pMember->GetSubscripts() );
+	}
+
+	if( alignment )
+	{
+		// 末尾アラインメントを考慮してパディングを追加
+		if( resultSize % alignment )
+		{
+			resultSize += alignment - ( resultSize % alignment );
+		}
+	}
+
+	return resultSize;
+}
+
+//メンバのオフセットを取得
+int CClass::GetMemberOffset( const char *memberName ) const
+{
+	int resultSize = 0;
+
+	int alignment = 1;
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			alignment = this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			if( this->GetSuperClass().HasDynamicMember( memberName ) )
+			{
+				// 基底クラスのメンバを取得
+				return this->GetSuperClass().GetMemberOffset( memberName );
+			}
+
+			// 基底クラスのサイズを追加
+			resultSize += this->GetSuperClass().GetSize();
+
+			// 基底クラスのアラインメントを取得
+			alignment = this->GetSuperClass().GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			resultSize += IsExistVirtualFunctions() ? PTR_SIZE*2 : 0;
+		}
+	}
+
+	foreach( Member *pMember, dynamicMembers )
+	{
+		// メンバサイズ
+		int tempMemberSize = pMember->GetType().GetSize();
+
+		// 一時アラインメントを算出
+		int tempAlignment = tempMemberSize;
+		if( pMember->GetType().IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = pMember->GetType().GetClass().GetAlignment();
+		}
+
+		// アラインメントを考慮してパディングを追加
+		if( GetFixedAlignment() && alignment < tempAlignment )
+		{
+			if( resultSize % alignment )
+			{
+				resultSize += alignment - ( resultSize % alignment );
+			}
+		}
+		else
+		{
+			if( alignment < tempAlignment )
+			{
+				// 最大アラインメントを更新
+				alignment = tempAlignment;
+			}
+
+			if( tempMemberSize == 0 )
+			{
+				if( !pMember->GetType().IsStruct() )
+				{
+					throw;
+				}
+
+				//メンバを持たない構造体
+				//※何もしない（オフセットの計算をしない）
+			}
+			else{
+				if( resultSize % tempAlignment )
+				{
+					resultSize += tempAlignment - ( resultSize % tempAlignment );
+				}
+			}
+		}
+
+		if(memberName){
+			//メンバ指定がある場合は、オフセットを返す
+			if( pMember->GetName() == memberName )
+			{
+				return resultSize;
+			}
+		}
+
+		// メンバサイズを加算（配列を考慮）
+		resultSize += tempMemberSize * Variable::GetSubScriptCounts( pMember->GetSubscripts() );
+	}
+
+	if( alignment )
+	{
+		// 末尾アラインメントを考慮してパディングを追加
+		if( resultSize % alignment )
+		{
+			resultSize += alignment - ( resultSize % alignment );
+		}
+	}
+
+	return resultSize;
+}
+int CClass::GetAlignment() const
+{
+	int alignment = 1;
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			return this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			// 基底クラスのアラインメントを取得
+			alignment = this->GetSuperClass().GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			alignment = PTR_SIZE;
+		}
+	}
+
+	foreach( Member *pMember, dynamicMembers )
+	{
+		int tempAlignment = pMember->GetType().GetSize();
+		if( pMember->GetType().IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = pMember->GetType().GetClass().GetAlignment();
+		}
+
+		if( alignment < tempAlignment )
+		{
+			// 最大アラインメントを更新
+			alignment = tempAlignment;
+		}
+	}
+
+	return alignment;
+}
+
+void CClass::GetVtblMasterListIndexAndVtblIndex( const UserProc *pUserProc, int &vtblMasterListIndex, int &vtblIndex ) const
+{
+	vtblMasterListIndex = 0;
+
+	vtblIndex = 0;
+	foreach( const CMethod *pMethod, GetDynamicMethods() ){
+		if( &pMethod->GetUserProc() == pUserProc )
+		{
+			return;
+		}
+
+		if( pMethod->IsVirtual() )
+		{
+			vtblIndex++;
+		}
+	}
+
+	foreach( const ::Interface *pInterface, interfaces )
+	{
+		vtblMasterListIndex++;
+
+		vtblIndex = 0;
+		foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+			if( &pMethod->GetUserProc() == pUserProc )
+			{
+				return;
+			}
+
+			if( pMethod->IsVirtual() )
+			{
+				vtblIndex++;
+			}
+		}
+	}
+
+	_ASSERT( false );
+	throw;
+}
+int CClass::GetVtblMasterListIndex( const CClass *pClass ) const
+{
+	int result = 0;
+
+	foreach( const ::Interface *pInterface, interfaces )
+	{
+		result++;
+		
+		if( &pInterface->GetClass() == pClass )
+		{
+			return result;
+		}
+	}
+
+	_ASSERT( false );
+	throw;
+}
+long CClass::GetVtblMasterListOffset() const
+{
+	if( vtblMasterListOffset == -1 )
+	{
+		_ASSERT( false );
+		throw;
+	}
+
+	return vtblMasterListOffset;
+}
+bool CClass::IsAbstract() const
+{
+	// 未実装(abstract)の仮想関数を持つ場合はtrueを返す
+
+	foreach( const CMethod *pMethod, GetDynamicMethods() ){
+		if(pMethod->IsVirtual()){
+			if(pMethod->IsAbstract()){
+				return true;
+			}
+		}
+	}
+
+	// インターフェイスのvtbl
+	foreach( const ::Interface *pInterface, interfaces )
+	{
+		foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+			if(pMethod->IsVirtual()){
+				if(pMethod->IsAbstract()){
+					return true;
+				}
+			}
+		}
+	}
+
+	return false;
+}
+
+const CClass *Classes::FindEx( const Symbol &symbol ) const
+{
+	if( symbol.GetNamespaceScopes().size() == 0 && symbol.GetName() == "Object" )
+	{
+		return GetObjectClassPtr();
+	}
+	else if( symbol.GetNamespaceScopes().size() == 0 && symbol.GetName() == "String" )
+	{
+		return GetStringClassPtr();
+	}
+
+	std::vector<const CClass *> classes;
+	const CClass *pClass = GetHashArrayElement( symbol.GetName().c_str() );
+	while( pClass )
+	{
+		if( pClass->IsEqualSymbol( symbol.GetNamespaceScopes(), symbol.GetName() ) ){
+			//名前空間とクラス名が一致した
+			classes.push_back( pClass );
+		}
+		pClass = pClass->GetChainNext();
+	}
+	if( classes.size() > 0 )
+	{
+		// 複数の名前空間の中に同一のクラス名が存在する場合があるので、アクセス可能で尚且つ階層が一番深いものをチョイスする
+		pClass = classes.front();
+
+		foreach( const CClass *pTempClass, classes )
+		{
+			if( pClass->GetNamespaceScopes().size() < pTempClass->GetNamespaceScopes().size() )
+			{
+				pClass = pTempClass;
+			}
+		}
+
+		return pClass;
+	}
+
+	return NULL;
+}
+
+const CClass *Classes::GetStringClassPtr() const
+{
+	if( !pStringClass )
+	{
+		// キャッシュしておく
+		pStringClass = this->FindEx( Symbol( NamespaceScopes( "System" ), "String" ) );
+	}
+	return pStringClass;
+}
+const CClass *Classes::GetObjectClassPtr() const
+{
+	if( !pObjectClass )
+	{
+		// キャッシュしておく
+		pObjectClass = this->FindEx( Symbol( NamespaceScopes( "System" ), "Object" ) );
+	}
+	return pObjectClass;
+}
+const CClass *Classes::GetInterfaceInfoClassPtr() const
+{
+	if( !pInterfaceInfo )
+	{
+		// キャッシュしておく
+		pInterfaceInfo = this->FindEx( Symbol( NamespaceScopes( "ActiveBasic.Core" ), "InterfaceInfo" ) );
+	}
+	return pInterfaceInfo;
+}
+
+std::string CClass::GetStaticDefiningStringAsMemberNames() const
+{
+	std::string result;
+
+	foreach( const Member *pMember, dynamicMembers )
+	{
+		if( result.size() )
+		{
+			result += ',';
+		}
+
+		result += '\"' + pMember->GetName() + '\"';
+	}
+
+	return result;
+}
+std::string CClass::GetStaticDefiningStringAsMemberOffsets() const
+{
+	std::string result;
+
+	foreach( const Member *pMember, dynamicMembers )
+	{
+		if( result.size() )
+		{
+			result += ',';
+		}
+
+		int offset = this->GetMemberOffset( pMember->GetName().c_str() );
+
+		char temporary[255];
+		_itoa( offset, temporary, 16 );
+
+		result += (std::string)"&H" + temporary;
+	}
+
+	return result;
+}
+
+void CClass::GetReferenceOffsetsInitializeBuffer( std::string &referenceOffsetsBuffer, int &numOfReference, int baseOffset ) const
+{
+	const CClass &thisClass = *this;
+	foreach( const Member *pMember, thisClass.GetDynamicMembers() )
+	{
+		if( pMember->GetType().IsObject() || pMember->GetType().IsPointer() )
+		{
+			if( referenceOffsetsBuffer.size() )
+			{
+				referenceOffsetsBuffer += ",";
+			}
+
+			char temp[255];
+			sprintf( temp, "%d", baseOffset + thisClass.GetMemberOffset( pMember->GetName().c_str() ) );
+			referenceOffsetsBuffer += temp;
+
+			numOfReference++;
+		}
+		if( pMember->GetType().IsStruct() && !pMember->GetType().IsPointer() )
+		{
+			// 構造体の実体をメンバに持つとき
+			int baseOffset = thisClass.GetMemberOffset( pMember->GetName().c_str() );
+
+			// 構造体メンバでGCによるチェックが必要な参照位置を追加
+			pMember->GetType().GetClass().GetReferenceOffsetsInitializeBuffer( referenceOffsetsBuffer, numOfReference, baseOffset );
+		}
+	}
+}
+
+bool CClass::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	// 型パラメータ
+	BOOST_FOREACH( GenericType &genericType, formalGenericTypes )
+	{
+		genericType.GetType().Resolve( resolver, resolveErrors );
+	}
+
+	// 基底クラス
+	if( this->pSuperClass )
+	{
+		if( this->pSuperClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pSuperClass );
+			if( pTempClass )
+			{
+				this->pSuperClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pSuperClass->GetRelationalObjectModuleIndex(), this->pSuperClass->GetFullName() ) );
+			}
+		}
+	}
+
+	// 基底クラスの型パラメータ（実パラメータ）
+	BOOST_FOREACH( Type &superClassActualTypeParameter, superClassActualTypeParameters )
+	{
+		superClassActualTypeParameter.Resolve( resolver, resolveErrors );
+	}
+
+	// Blittable型情報
+	blittableType.Resolve( resolver, resolveErrors );
+
+	// 実装するインターフェイス
+	foreach( ::Interface *pInterface, interfaces )
+	{
+		pInterface->Resolve( resolver, resolveErrors );
+	}
+
+	// 動的メンバ
+	foreach( Member *pMember, dynamicMembers )
+	{
+		pMember->Resolve( resolver, resolveErrors );
+	}
+
+	// 静的メンバ
+	foreach( Member *pMember, staticMembers )
+	{
+		pMember->Resolve( resolver, resolveErrors );
+	}
+
+	// 動的メソッド
+	foreach( CMethod *pMethod, GetDynamicMethods() )
+	{
+		pMethod->Resolve( resolver, resolveErrors );
+	}
+
+	// 静的メソッド
+	foreach( CMethod *pMethod, staticMethods )
+	{
+		pMethod->Resolve( resolver, resolveErrors );
+	}
+
+	// テンプレート展開後のクラス
+	foreach( ActiveBasic::Common::Lexical::ExpandedTemplateClass *pExpandedTemplateClass, expandedTemplateClasses )
+	{
+		pExpandedTemplateClass->Resolve( resolver, resolveErrors );
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp	(revision 774)
@@ -0,0 +1,144 @@
+#include "stdafx.h"
+
+double CConst::GetDoubleData(){
+	double dbl;
+	memcpy(&dbl,&i64data,sizeof(_int64));
+	return dbl;
+}
+
+bool CConst::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	type.Resolve( resolver, resolveErrors );
+	return true;
+}
+
+void Consts::Add( const Symbol &symbol, _int64 i64data, const Type &type )
+{
+	CConst *newconst = new CConst( symbol, type, i64data );
+
+	//ハッシュリストに追加
+	Put( newconst );
+}
+void Consts::Add(const Symbol &symbol, int value){
+	CConst *newconst = new CConst( symbol, value);
+
+	//ハッシュリストに追加
+	Put( newconst );
+}
+
+CConst *Consts::GetObjectPtr( const Symbol &symbol )
+{
+	CConst *pConst = GetHashArrayElement( symbol.GetName().c_str() );
+	while( pConst )
+	{
+		if( pConst->IsEqualSymbol( symbol ) )
+		{
+			break;
+		}
+		pConst = pConst->GetChainNext();
+	}
+
+	return pConst;
+}
+
+
+int Consts::GetBasicType( const Symbol &symbol ){
+	CConst *pConst = GetObjectPtr( symbol );
+
+	if(!pConst) return 0;
+
+	return pConst->GetType().GetBasicType();
+}
+_int64 Consts::GetWholeData( const Symbol &symbol ){
+	CConst *pConst = GetObjectPtr( symbol );
+
+	if(!pConst) return 0;
+
+	return pConst->GetWholeData();
+}
+double Consts::GetDoubleData( const Symbol &symbol ){
+	CConst *pConst = GetObjectPtr( symbol );
+
+	if(!pConst) return 0;
+
+	return pConst->GetDoubleData();
+}
+bool Consts::IsStringPtr( const Symbol &symbol, bool isUnicode ){
+	CConst *pConst = GetObjectPtr( symbol );
+
+	if(!pConst) return false;
+
+	const Type &type = pConst->GetType();
+
+	int charType = isUnicode
+		? MAKE_PTR_TYPE(DEF_WORD,1)
+		: MAKE_PTR_TYPE(DEF_SBYTE,1);
+
+	return ( type.GetBasicType() == charType && type.GetIndex() == LITERAL_STRING );
+}
+
+bool ConstMacro::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	// 依存関係を解決すべきメンバは無い
+	return true;
+}
+
+// マクロ定数を追加するための関数
+bool ConstMacros::Add( const Symbol &symbol, const char *parameterStr )
+{
+	std::vector<std::string> parameters;
+
+	int i = 0;
+	if(parameterStr[i]!='(')
+	{
+		return false;
+	}
+
+	char temporary[VN_SIZE];
+	int i2;
+	for(i++,i2=0;;i++,i2++){
+		if(parameterStr[i]=='\0')
+		{
+			return false;
+		}
+		if(parameterStr[i]==','||parameterStr[i]==')'){
+			temporary[i2]=0;
+
+			parameters.push_back( temporary );
+
+			if(parameterStr[i]==')'){
+				i++;
+				if(parameterStr[i]!='=')
+				{
+					return false;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=parameterStr[i];
+	}
+
+	//データ
+	strcpy(temporary,parameterStr+i+1);
+
+	this->Put( new ConstMacro( symbol, parameters, temporary ) );
+
+	return true;
+}
+ConstMacro *ConstMacros::Find( const Symbol &symbol )
+{
+	ConstMacro *pConstMacro = GetHashArrayElement( symbol.GetName().c_str() );
+	while( pConstMacro )
+	{
+		if( pConstMacro->IsEqualSymbol( symbol ) )
+		{
+			break;
+		}
+		pConstMacro = pConstMacro->GetChainNext();
+	}
+
+	return pConstMacro;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp	(revision 774)
@@ -0,0 +1,86 @@
+#include "stdafx.h"
+
+int DataTable::AddBinary( const void *buffer, int size ){
+	int retSize = this->size;
+
+	Realloc( this->size + size );
+	memcpy( (char *)this->buffer + retSize, buffer, size );
+
+	return retSize;
+}
+int DataTable::Add( _int64 i64data ){
+	int retSize = size;
+	AddBinary( &i64data, sizeof( _int64 ) );
+	return retSize;
+}
+int DataTable::Add( int i32data ){
+	int retSize = size;
+	AddBinary( &i32data, sizeof( int ) );
+	return retSize;
+}
+int DataTable::Add( double dbl ){
+	int retSize = size;
+	AddBinary( &dbl, sizeof( double ) );
+	return retSize;
+}
+int DataTable::Add( float flt ){
+	int retSize = size;
+	AddBinary( &flt, sizeof( float ) );
+	return retSize;
+}
+int DataTable::AddString( const char *str )
+{
+	return AddBinary( str, strlen( str ) + sizeof(char) );
+}
+int DataTable::AddString( const std::string &str )
+{
+	return AddBinary( str.c_str(), static_cast<int>(str.size()) + sizeof(char) );
+}
+int DataTable::AddWString( const std::wstring &wstr )
+{
+	return AddBinary( wstr.c_str(), static_cast<int>((wstr.length()+1)*sizeof(wchar_t)));
+}
+int DataTable::AddSpace( int size )
+{
+	int retSize = this->size;
+	Realloc( this->size + size );
+	return retSize;
+}
+void DataTable::AddAlignment( int size )
+{
+	if( this->size % size == 0 )
+	{
+		// 既に境界のとき
+		return;
+	}
+	Realloc( this->size + ( size - (int)(this->size%size) ) );
+}
+
+void DataTable::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, schedules )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+#ifdef _WIN64
+			OverwriteInt64(
+				schedule.GetOffset(),
+				GetInt64( schedule.GetOffset() ) + dataSectionBaseOffset
+			);
+#else
+			Overwrite(
+				schedule.GetOffset(),
+				GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
+			);
+#endif
+		}
+	}
+}
+
+void DataTable::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	BOOST_FOREACH( Schedule &schedule, schedules )
+	{
+		schedule.Resolve( resolver, resolveErrors );
+	}
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Delegate.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Delegate.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Delegate.cpp	(revision 774)
@@ -0,0 +1,31 @@
+#include "stdafx.h"
+
+bool Delegate::IsSimilar( const Delegate &dgt ) const
+{
+	if( this->Params().Equals( dgt.Params(), true ) )			// パラメータが等しい、もしくは反変
+	{
+		if( this->returnType.Equals( dgt.returnType ) )
+		{
+			// 戻り値が等しい
+			return true;
+		}
+		else if( this->returnType.IsCovariant( dgt.returnType ) )
+		{
+			// 戻り値が共変
+			return true;
+		}
+	}
+	return false;
+}
+
+bool Delegate::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	Procedure::Resolve( resolver, resolveErrors );
+
+	foreach( Parameter *pParameter, dynamicParams )
+	{
+		pParameter->Resolve( resolver, resolveErrors );
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Interface.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Interface.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Interface.cpp	(revision 774)
@@ -0,0 +1,104 @@
+#include "stdafx.h"
+
+Interface::Interface( const CClass *pInterfaceClass, const Types &actualTypeParameters )
+	: DynamicMethodsPrototype()
+	, pInterfaceClass( pInterfaceClass )
+	, vtblOffset( -1 )
+	, actualTypeParameters( actualTypeParameters )
+{
+	//メソッドをコピー
+	foreach( const CMethod *pBaseMethod, pInterfaceClass->GetDynamicMethods() )
+	{
+		CMethod *pMethod = new DynamicMethod( *pBaseMethod );
+
+		// アクセシビリティ
+		if(pBaseMethod->GetAccessibility() == Prototype::Private){
+			pMethod->SetAccessibility( Prototype::None );
+		}
+		else{
+			pMethod->SetAccessibility( pBaseMethod->GetAccessibility() );
+		}
+
+		//pobj_Inherits
+		// ※継承元のClassIndexをセット（入れ子継承を考慮する）
+		if(pBaseMethod->GetInheritsClassPtr()==0){
+			pMethod->SetInheritsClassPtr( pInterfaceClass );
+		}
+		else{
+			pMethod->SetInheritsClassPtr( pBaseMethod->GetInheritsClassPtr() );
+		}
+
+		AddDynamicMethods( pMethod );
+	}
+}
+
+bool Interface::Equals( const Interface *pInterface ) const
+{
+	// ポインタが等しいかどうかを見てみる
+	if( this == pInterface )
+	{
+		return true;
+	}
+	else if( this->pInterfaceClass->IsNeedResolve() || pInterface->pInterfaceClass->IsNeedResolve() )
+	{
+		// 依存関係解決前の状態であれば、パスが等しいかどうかを見てみる
+		if( this-pInterfaceClass->IsDuplication( pInterface->pInterfaceClass ) )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+std::string Interface::GetFullNameWithActualGenericTypeParameters() const
+{
+	std::string interfaceName = this->GetClass().GetFullName();
+	if( actualTypeParameters.size() )
+	{
+		std::string actualGenericTypesName;
+		foreach( const Type &typeParameter, actualTypeParameters )
+		{
+			if( actualGenericTypesName.size() )
+			{
+				actualGenericTypesName += ",";
+			}
+			actualGenericTypesName += typeParameter.ToString();
+		}
+
+		interfaceName += "<" + actualGenericTypesName + ">";
+	}
+	return interfaceName;
+}
+
+bool Interface::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	// 動的メソッド
+	foreach( CMethod *pMethod, GetDynamicMethods() )
+	{
+		pMethod->Resolve( resolver, resolveErrors );
+	}
+
+	// クラス
+	if( this->pInterfaceClass )
+	{
+		if( this->pInterfaceClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pInterfaceClass );
+			if( pTempClass )
+			{
+				this->pInterfaceClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pInterfaceClass->GetRelationalObjectModuleIndex(), this->pInterfaceClass->GetFullName() ) );
+			}
+		}
+	}
+
+	BOOST_FOREACH( Type &actualTypeParameter, actualTypeParameters )
+	{
+		actualTypeParameter.Resolve( resolver, resolveErrors );
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Member.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Member.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Member.cpp	(revision 774)
@@ -0,0 +1,47 @@
+#include "stdafx.h"
+
+
+Member::Member( Prototype::Accessibility accessibility, const std::string &name, const Type &newType, bool isConst, const Subscripts &subscripts, const std::string &initializeExpression, const std::string &constructParameter )
+	: MemberPrototype( accessibility )
+	, name( name )
+	, type( newType )
+	, isConst( isConst )
+	, subscripts( subscripts )
+	, initializeExpression( initializeExpression )
+	, constructParameter( constructParameter )
+{
+}
+
+Member::Member( const Member &member )
+	: MemberPrototype( member.GetAccessibility() )
+	, name( member.GetName() )
+	, type( member.GetType() )
+	, isConst( member.IsConst() )
+	, subscripts( member.GetSubscripts() )
+	, source_code_address( member.source_code_address )
+{
+}
+
+Member::Member( const Member &member, const Type &actualType )
+	: MemberPrototype( member.GetAccessibility() )
+	, name( member.GetName() )
+	, type( actualType )
+	, isConst( member.IsConst() )
+	, subscripts( member.GetSubscripts() )
+	, source_code_address( member.source_code_address )
+{
+}
+
+Member::Member()
+{
+}
+
+Member::~Member()
+{
+}
+
+bool Member::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	type.Resolve( resolver, resolveErrors );
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp	(revision 774)
@@ -0,0 +1,334 @@
+#include "stdafx.h"
+
+void Meta::Clear()
+{
+	// 名前空間
+	namespaceScopesCollection.clear();
+
+	// 関数・メソッド
+	userProcs.Clear();
+
+	// DLL関数
+	dllProcs.Clear();
+
+	// クラス
+	classesImpl.Clear();
+
+	// グローバル変数
+	globalVars.Clear();
+
+	// グローバル定数
+	globalConsts.Clear();
+
+	// グローバル定数マクロ
+	globalConstMacros.Clear();
+
+	// blittable型
+	blittableTypes.clear();
+
+	// TypeDef
+	typeDefs.clear();
+
+	// 関数ポインタ
+	procPointers.Clear();
+}
+
+void Meta::StaticLink( Meta &meta, long dataSectionBaseOffset, const std::vector<int> &relationTable )
+{
+	// 名前空間
+	BOOST_FOREACH( NamespaceScopes &namespaceScopes, meta.namespaceScopesCollection )
+	{
+		if( !this->namespaceScopesCollection.IsExist( namespaceScopes ) )
+		{
+			this->namespaceScopesCollection.push_back( namespaceScopes );
+		}
+	}
+
+	// 関数・メソッド
+	meta.GetUserProcs().Iterator_Reset();
+	while( meta.GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = meta.GetUserProcs().Iterator_GetNext();
+		if( pUserProc->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pUserProc->ResetRelationalObjectModuleIndex( relationTable );
+
+		pUserProc->GetNativeCode().ResetDataSectionBaseOffset( dataSectionBaseOffset );
+
+		this->userProcs.Put( pUserProc );
+	}
+	meta.GetUserProcs().PullOutAll();
+
+	// DLL関数
+	meta.GetDllProcs().Iterator_Reset();
+	while( meta.GetDllProcs().Iterator_HasNext() )
+	{
+		DllProc *pDllProc = meta.GetDllProcs().Iterator_GetNext();
+		if( pDllProc->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pDllProc->ResetRelationalObjectModuleIndex( relationTable );
+		this->dllProcs.Put( pDllProc );
+	}
+	meta.GetDllProcs().PullOutAll();
+
+	// クラス
+	meta.GetClasses().Iterator_Reset();
+	while( meta.GetClasses().Iterator_HasNext() )
+	{
+		CClass *pClass = meta.GetClasses().Iterator_GetNext();
+		if( pClass->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pClass->ResetRelationalObjectModuleIndex( relationTable );
+		pClass->Readed();
+		this->GetClasses().Put( pClass );
+	}
+	meta.GetClasses().PullOutAll();
+
+	// グローバル変数
+	long initAreaBaseOffset = this->globalVars.initAreaBuffer.GetSize();
+	foreach( Variable *pVar, meta.globalVars )
+	{
+		if( pVar->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		// 基底スコープレベルのグローバル変数の生存値をオンにする
+		if( pVar->GetScopeLevel() == 0 )
+		{
+			pVar->isLiving = true;
+		}
+
+		bool isResetOffsetAddress = true;
+		if( pVar->HasInitData() )
+		{
+			// 初期バッファがあるときはデータテーブルオフセットを適用する
+			pVar->SetOffsetAddress( pVar->GetOffsetAddress() + initAreaBaseOffset );
+
+			isResetOffsetAddress = false;
+		}
+
+		pVar->ResetRelationalObjectModuleIndex( relationTable );
+		this->globalVars.Add( pVar, isResetOffsetAddress );
+	}
+	meta.globalVars.PullOutAll();
+	this->globalVars.initAreaBuffer.Put(
+		meta.globalVars.initAreaBuffer.GetBuffer(),
+		meta.globalVars.initAreaBuffer.GetSize()
+	);
+
+	// グローバル定数
+	meta.GetGlobalConsts().Iterator_Reset();
+	while( meta.GetGlobalConsts().Iterator_HasNext() )
+	{
+		CConst *pConst = meta.GetGlobalConsts().Iterator_GetNext();
+		if( pConst->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pConst->ResetRelationalObjectModuleIndex( relationTable );
+		this->GetGlobalConsts().Put( pConst );
+	}
+	meta.GetGlobalConsts().PullOutAll();
+
+	// グローバル定数マクロ
+	meta.GetGlobalConstMacros().Iterator_Reset();
+	while( meta.GetGlobalConstMacros().Iterator_HasNext() )
+	{
+		ConstMacro *pConstMacro = meta.GetGlobalConstMacros().Iterator_GetNext();
+		if( pConstMacro->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pConstMacro->ResetRelationalObjectModuleIndex( relationTable );
+		this->GetGlobalConstMacros().Put( pConstMacro );
+	}
+	meta.GetGlobalConstMacros().PullOutAll();
+
+	// blittable型
+	BOOST_FOREACH( BlittableType &blittableType, meta.blittableTypes )
+	{
+		// TODO: coreモジュール以外でもBlittable型用のクラスモジュールを定義できるようにすべき
+		this->blittableTypes.push_back( blittableType );
+	}
+	meta.blittableTypes.clear();
+
+	// TypeDef
+	BOOST_FOREACH( TypeDef &typeDef, meta.typeDefs )
+	{
+		if( typeDef.IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		typeDef.ResetRelationalObjectModuleIndex( relationTable );
+		this->typeDefs.push_back( typeDef );
+	}
+	meta.typeDefs.clear();
+
+	// 関数ポインタ
+	foreach( ProcPointer *pProcPointer, meta.procPointers )
+	{
+		if( pProcPointer->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pProcPointer->ResetRelationalObjectModuleIndex( relationTable );
+		this->procPointers.push_back( pProcPointer );
+	}
+	meta.procPointers.PullOutAll();
+
+	// デリゲート
+	meta.GetDelegates().Iterator_Reset();
+	while( meta.GetDelegates().Iterator_HasNext() )
+	{
+		Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext();
+		if( pDelegate->IsExternal() )
+		{
+			// 外部参照の場合は取り込まない
+			continue;
+		}
+
+		pDelegate->ResetRelationalObjectModuleIndex( relationTable );
+		this->GetDelegates().Put( pDelegate );
+	}
+	meta.GetDelegates().PullOutAll();
+}
+
+const ::Delegate &Meta::ToDelegate( const CClass &_class )
+{
+	const ::Delegate *dg = this->GetDelegates().GetHashArrayElement( _class.GetName().c_str() );
+	while( dg )
+	{
+		if( dg->IsEqualSymbol( _class.GetNamespaceScopes(), _class.GetName() ) ){
+			//名前空間とクラス名が一致した
+			return *dg;
+		}
+		dg = dg->GetChainNext();
+	}
+
+	throw;
+}
+
+const CClass *Meta::FindClassSupportedTypeDef( const Symbol &symbol )
+{
+	const CClass *pClass = this->GetClasses().FindEx( symbol );
+	if( pClass )
+	{
+		return pClass;
+	}
+
+	// TypeDefも見る
+	const TypeDef *pTypeDef = this->GetTypeDefs().Find( symbol );
+	if( pTypeDef )
+	{
+		Type type = pTypeDef->GetBaseType();
+		if( type.IsObject() )
+		{
+			return &type.GetClass();
+		}
+	}
+
+	return NULL;
+}
+
+void Meta::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	// 関数・メソッド
+	this->GetUserProcs().Iterator_Init();
+	this->GetUserProcs().Iterator_Reset();
+	while( this->GetUserProcs().Iterator_HasNext() )
+	{
+		UserProc *pUserProc = this->GetUserProcs().Iterator_GetNext();
+		pUserProc->Resolve( resolver, resolveErrors );
+	}
+
+	// DLL関数
+	this->GetDllProcs().Iterator_Init();
+	this->GetDllProcs().Iterator_Reset();
+	while( this->GetDllProcs().Iterator_HasNext() )
+	{
+		DllProc *pDllProc = this->GetDllProcs().Iterator_GetNext();
+		pDllProc->Resolve( resolver, resolveErrors );
+	}
+
+	// クラス
+	this->GetClasses().Iterator_Init();
+	this->GetClasses().Iterator_Reset();
+	while( this->GetClasses().Iterator_HasNext() )
+	{
+		CClass *pClass = this->GetClasses().Iterator_GetNext();
+		pClass->Resolve( resolver, resolveErrors );
+	}
+
+	// グローバル変数
+	foreach( Variable *pVar, globalVars )
+	{
+		pVar->Resolve( resolver, resolveErrors );
+	}
+
+	// グローバル定数
+	this->GetGlobalConsts().Iterator_Init();
+	this->GetGlobalConsts().Iterator_Reset();
+	while( this->GetGlobalConsts().Iterator_HasNext() )
+	{
+		CConst *pConst = this->GetGlobalConsts().Iterator_GetNext();
+		pConst->Resolve( resolver, resolveErrors );
+	}
+
+	// グローバル定数マクロ
+	this->GetGlobalConstMacros().Iterator_Init();
+	this->GetGlobalConstMacros().Iterator_Reset();
+	while( this->GetGlobalConstMacros().Iterator_HasNext() )
+	{
+		ConstMacro *pConstMacro = this->GetGlobalConstMacros().Iterator_GetNext();
+		pConstMacro->Resolve( resolver, resolveErrors );
+	}
+
+	// blittable型
+	BOOST_FOREACH( BlittableType &blittableType, blittableTypes )
+	{
+		blittableType.Resolve( resolver, resolveErrors );
+	}
+
+	// TypeDef
+	BOOST_FOREACH( TypeDef &typeDef, typeDefs )
+	{
+		typeDef.Resolve( resolver, resolveErrors );
+	}
+
+	// 関数ポインタ
+	foreach( ProcPointer *pProcPointer, procPointers )
+	{
+		pProcPointer->Resolve( resolver, resolveErrors );
+	}
+
+	// デリゲート
+	this->GetDelegates().Iterator_Init();
+	this->GetDelegates().Iterator_Reset();
+	while( this->GetDelegates().Iterator_HasNext() )
+	{
+		Delegate *pDelegate = this->GetDelegates().Iterator_GetNext();
+		pDelegate->Resolve( resolver, resolveErrors );
+	}
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Method.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Method.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Method.cpp	(revision 774)
@@ -0,0 +1,191 @@
+#include "stdafx.h"
+
+bool CMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	if( this->pUserProc )
+	{
+		if( this->pUserProc->IsNeedResolve() )
+		{
+			const UserProc *pTempUserProc = resolver.meta.GetUserProcs().FindLike( this->pUserProc );
+			if( pTempUserProc )
+			{
+				this->pUserProc = pTempUserProc;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pUserProc->GetRelationalObjectModuleIndex(), this->pUserProc->GetFullName() ) );
+			}
+		}
+	}
+	return true;
+}
+
+DynamicMethod::OverrideResult::EnumType DynamicMethod::Override( const UserProc *pUserProc, Prototype::Accessibility accessibility, bool isOverrideModifier )
+{
+	bool isAbstractBefore = this->IsAbstract();
+
+	//メンバ関数を上書き
+	this->SetUserProcPtr( pUserProc );
+	this->SetAbstractMark( false );
+
+	if( this->IsVirtual() )
+	{
+		if( !isAbstractBefore && isOverrideModifier == false )
+		{
+			return OverrideResult::NotUseOverrideModifier;
+		}
+	}
+	else
+	{
+		return OverrideResult::NotVirtual;
+	}
+
+	if( this->GetAccessibility() != accessibility )
+	{
+		return OverrideResult::DifferentAccesibility;
+	}
+
+	return OverrideResult::Successful;
+}
+
+bool DynamicMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	CMethod::Resolve( resolver, resolveErrors );
+
+	if( this->pInheritsClass )
+	{
+		if( this->pInheritsClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( pInheritsClass );
+			if( pTempClass )
+			{
+				this->pInheritsClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pInheritsClass->GetRelationalObjectModuleIndex(), this->pInheritsClass->GetFullName() ) );
+			}
+		}
+	}
+
+	return true;
+}
+
+StaticMethod::StaticMethod( const StaticMethod &staticMethod )
+{
+	// 静的メソッドがコピーコンストラトされることは想定しない
+	throw;
+}
+
+bool StaticMethod::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	CMethod::Resolve( resolver, resolveErrors );
+	return true;
+}
+
+
+Methods::Methods()
+{
+}
+
+// コピーコンストラクタ
+Methods::Methods( const Methods &methods )
+{
+	foreach( CMethod *pMethod, methods )
+	{
+		this->push_back( new DynamicMethod( dynamic_cast<DynamicMethod &>(*pMethod) ) );
+	}
+}
+
+Methods::~Methods()
+{
+	Methods &methods = *this;
+	foreach( CMethod *pMethod, methods )
+	{
+		delete pMethod;
+	}
+}
+
+void Methods::Add( UserProc *pUserProc,Prototype::Accessibility accessibility, bool isConst, bool isAbstract, bool isVirtual ){
+	CMethod *pMethod = new DynamicMethod( pUserProc, accessibility, isAbstract, isVirtual, isConst );
+	this->push_back( pMethod );
+	pUserProc->SetMethod( pMethod );
+}
+void Methods::AddStatic(UserProc *pUserProc, Prototype::Accessibility accessibility ){
+	CMethod *pMethod = new StaticMethod( pUserProc, accessibility );
+	this->push_back( pMethod );
+	pUserProc->SetMethod( pMethod );
+}
+
+DynamicMethod *Methods::FindForOverride( const Types &actualTypeParametersForThisMethods, const UserProc *pUserProc )
+{
+	//メソッドのオーバーライド
+	Methods &methods = *this;
+	foreach( CMethod *pMethod, methods )
+	{
+		if( !pMethod->IsNotUse() && pMethod->GetUserProc().IsEqualForOverride( actualTypeParametersForThisMethods, pUserProc ) )
+		{
+			return dynamic_cast<DynamicMethod *>(pMethod);
+		}
+	}
+	return NULL;
+}
+
+const CMethod *Methods::GetMethodPtr( const UserProc *pUserProc ) const
+{
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		if( pUserProc == &methods[i]->GetUserProc() ){
+			return methods[i];
+		}
+	}
+	return NULL;
+}
+bool Methods::IsExist( const char *name ) const
+{
+	const Methods &methods = *this;
+	foreach( const CMethod *pMethod, methods ){
+		if( pMethod->GetUserProc().GetName() == name ) return true;
+	}
+	return false;
+}
+void Methods::Enum( const char *methodName, std::vector<const UserProc *> &subs ) const
+{
+	//オブジェクトのメンバ関数の場合
+	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		if( methods[i]->GetUserProc().GetName() == methodName && methods[i]->IsNotUse() == false ){
+			subs.push_back( &methods[i]->GetUserProc() );
+		}
+	}
+}
+void Methods::Enum( BYTE idOperatorCalc, std::vector<const UserProc *> &subs ) const
+{
+	//オブジェクトのメンバ関数の場合
+	//※オーバーライドされた関数を先にサーチする必要があるため、バックサーチを行う
+	const Methods &methods = *this;
+	for( int i=(int)methods.size()-1; i>=0; i-- ){
+		const UserProc &userProc = methods[i]->GetUserProc();
+		const char *temp = userProc.GetName().c_str();
+		if(temp[0]==1&&temp[1]==ESC_OPERATOR){
+			if((BYTE)temp[2]==idOperatorCalc){
+				subs.push_back( &userProc );
+			}
+		}
+	}
+}
+
+int Methods::GetVtblNum() const
+{
+	int count = 0;
+	const Methods &methods = *this;
+	foreach( const CMethod *pMethod, methods )
+	{
+		if( pMethod->IsVirtual() )
+		{
+			count++;
+		}
+	}
+	return count;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Namespace.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Namespace.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Namespace.cpp	(revision 774)
@@ -0,0 +1,73 @@
+#include "stdafx.h"
+#include <algorithm>
+
+using namespace ActiveBasic::Common::Lexical;
+
+
+NamespaceScopes::NamespaceScopes( const std::string &namespaceStr ){
+	if( namespaceStr.size() == 0 ){
+		return;
+	}
+
+	std::string::size_type i = 0;
+	while( true ){
+		std::string::size_type i2 = namespaceStr.find( '.', i );
+
+		std::string tempName = namespaceStr.substr( i, i2-i );
+
+		push_back( tempName );
+
+		if( i2 == std::string::npos ){
+			break;
+		}
+
+		i = i2 + 1;
+	}
+}
+
+NamespaceScopes NamespaceScopes::operator+ ( const NamespaceScopes &namespaceScopes ) const
+{
+	NamespaceScopes result;
+	result.reserve( this->size() + namespaceScopes.size() );
+	result = *this;
+	result.append( namespaceScopes );
+	return result;
+}
+
+bool NamespaceScopes::IsEqual( const NamespaceScopes &namespaceScopes ) const
+{
+	if( this->size() != namespaceScopes.size() )
+	{
+		return false;
+	}
+	return std::equal(begin(), end(), namespaceScopes.begin() );
+}
+
+void NamespaceScopesCollection::SplitNamespace( const char *fullName, char *namespaceStr, char *simpleName ) const
+{
+	NamespaceScopes namespaceScopes( fullName );
+	bool hasSimpleName = false;
+	while( namespaceScopes.size() > 0 ){
+		if( IsExist( namespaceScopes ) ){
+			break;
+		}
+		namespaceScopes.pop_back();
+
+		hasSimpleName = true;
+	}
+
+	strcpy( namespaceStr, namespaceScopes.ToString().c_str() );
+
+	bool hasNamespace = false;
+	if( namespaceStr[0] ){
+		hasNamespace = true;
+	}
+
+	int dotLength = 0;
+	if( hasSimpleName && hasNamespace ){
+		dotLength = 1;
+	}
+
+	strcpy( simpleName, fullName + strlen( namespaceStr ) + dotLength );
+}
+
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NamespaceSupporter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NamespaceSupporter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NamespaceSupporter.cpp	(revision 774)
@@ -0,0 +1,89 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Common::Lexical;
+
+bool NamespaceSupporter::ImportsNamespace( const NamespaceScopes &namespaceScopes )
+{
+	_ASSERT( allNamespaceScopesCollection );
+	if( !allNamespaceScopesCollection->IsExist( namespaceScopes ) ){
+		return false;
+	}
+
+	this->importedNamespaces.push_back( namespaceScopes );
+
+	return true;
+}
+
+bool NamespaceSupporter::ImportsNamespace( const std::string &namespaceStr )
+{
+	NamespaceScopes namespaceScopes( namespaceStr );
+
+	return ImportsNamespace( namespaceScopes );
+}
+
+bool NamespaceSupporter::IsCoverd( const NamespaceScopes &base, const NamespaceScopes &entry ) const
+{
+	// まずはそのままでマッチングを試みる
+	if( base.IsEqual( entry ) )
+	{
+		return true;
+	}
+
+	// 現在の名前空間とのマッチングを試みる
+	typedef NamespaceScopes::const_iterator cnsit_t;
+	cnsit_t first = livingNamespaceScopes.begin();
+	cnsit_t last = livingNamespaceScopes.end();
+	NamespaceScopes temp;
+	while( first != last )
+	{
+		temp.assign( first, last );
+		temp.append( entry );
+		if( base.IsEqual( temp ) )
+		{
+			return true;
+		}
+		--last;
+	}
+
+	// Importsされている名前空間とのマッチングを試みる
+	foreach( const NamespaceScopes &importedNamespaceScopes, GetImportedNamespaces() )
+	{
+		if( base.IsEqual( importedNamespaceScopes + entry ) )
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+
+bool NamespaceSupporter::IsSameAreaNamespace( const NamespaceScopes &baseNamespaceScopes, const NamespaceScopes &entryNamespaceScopes ) const
+{
+	if( entryNamespaceScopes.size() )
+	{
+		if( IsCoverd( baseNamespaceScopes, entryNamespaceScopes ) )
+		{
+			// 包括しているときは同一と見なす
+			return true;
+		}
+	}
+	else{
+		if( baseNamespaceScopes.size() )
+		{
+			// 名前空間の判断が必要なとき
+			if( this->importedNamespaces.IsImported( baseNamespaceScopes )
+				|| IsLiving( baseNamespaceScopes ) )
+			{
+				// Using指定があるとき
+				// または
+				// 指定された名前空間が現在の名前空間スコープと同一のとき
+				return true;
+			}
+		}
+		else{
+			return true;
+		}
+	}
+
+	return false;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/NativeCode.cpp	(revision 774)
@@ -0,0 +1,220 @@
+#include "stdafx.h"
+
+#define BREAK_EIP(checkEip)  (obp+0x00401000>=checkEip)
+
+const ::DllProc &Schedule::GetDllProc() const
+{
+	_ASSERT( type == Schedule::DllProc );
+	return *pDllProc;
+}
+const ::UserProc &Schedule::GetUserProc() const
+{
+	_ASSERT( type == Schedule::UserProc || type == Schedule::AddressOf || type == Schedule::CatchAddress );
+	return *pUserProc;
+}
+const ::CClass &Schedule::GetClass() const
+{
+	_ASSERT( type == Schedule::ComVtbl || type == Schedule::Vtbl || type == Schedule::TypeInfo );
+	return *pClass;
+}
+
+bool Schedule::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	switch( type )
+	{
+	case UserProc:
+	case AddressOf:
+	case CatchAddress:
+		if( this->pUserProc->IsNeedResolve() )
+		{
+			const ::UserProc *pTempUserProc = resolver.meta.GetUserProcs().FindLike( this->pUserProc );
+			if( pTempUserProc )
+			{
+				this->pUserProc = pTempUserProc;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pUserProc->GetRelationalObjectModuleIndex(), this->pUserProc->GetFullName() ) );
+			}
+		}
+		break;
+	case DllProc:
+		if( this->pDllProc->IsNeedResolve() )
+		{
+			const ::DllProc *pTempDllProc = resolver.meta.GetDllProcs().FindLike( this->pDllProc );
+			if( pTempDllProc )
+			{
+				this->pDllProc = pTempDllProc;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pDllProc->GetRelationalObjectModuleIndex(), this->pDllProc->GetFullName() ) );
+			}
+		}
+		break;
+	case ComVtbl:
+	case Vtbl:
+	case TypeInfo:
+		if( this->pClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass );
+			if( pTempClass )
+			{
+				this->pClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) );
+			}
+		}
+		break;
+	default:
+		break;
+	}
+
+	return true;
+}
+
+void NativeCode::PutEx( const NativeCode &nativeCode )
+{
+	long baseOffset = GetSize();
+
+	// コードバッファを追加
+	Put( nativeCode.GetBuffer(), nativeCode.GetSize() );
+
+	// スケジュールを追加
+	foreach( const Schedule &schedule, nativeCode.schedules )
+	{
+		this->schedules.push_back(
+			Schedule(
+				schedule.GetType(),
+				baseOffset + schedule.GetOffset(),
+				schedule.GetLongPtrValue()
+			)
+		);
+	}
+
+	// ソースコード行番号とネイティブコード位置の対応情報を追加
+	foreach( const SourceLine &sourceLine, nativeCode.sourceLines )
+	{
+		this->sourceLines.push_back(
+			SourceLine(
+				baseOffset + sourceLine.GetNativeCodePos(),
+				sourceLine.GetCodeType(),
+				sourceLine.GetSourceCodePosition()
+			)
+		);
+	}
+}
+
+void NativeCode::PutEx( long l, Schedule::Type scheduleType )
+{
+	if( scheduleType != Schedule::None )
+	{
+		schedules.push_back( Schedule( scheduleType, GetSize() ) );
+	}
+
+	Put( l );
+}
+
+void NativeCode::PutUserProcSchedule( const UserProc *pUserProc, bool isCall )
+{
+	pUserProc->Using();
+
+	Schedule::Type type = isCall ? Schedule::UserProc : Schedule::AddressOf;
+
+	schedules.push_back( Schedule( type, pUserProc, GetSize() ) );
+
+	Put( (long)0 );
+}
+
+void NativeCode::PutCatchAddressSchedule( const UserProc *pUserProc, long codePos )
+{
+	pUserProc->Using();
+
+	schedules.push_back( Schedule( Schedule::CatchAddress, pUserProc, GetSize() ) );
+
+	Put( codePos );
+}
+
+void NativeCode::PutDllProcSchedule( const DllProc *pDllProc )
+{
+	schedules.push_back( Schedule( pDllProc, GetSize() ) );
+
+	Put( (long)0 );
+}
+
+void NativeCode::PutComVtblSchedule( const CClass *pClass )
+{
+	schedules.push_back( Schedule( Schedule::ComVtbl, pClass, GetSize() ) );
+
+	Put( (long)0 );
+}
+
+void NativeCode::PutVtblSchedule( const CClass *pClass )
+{
+	schedules.push_back( Schedule( Schedule::Vtbl, pClass, GetSize() ) );
+
+	Put( (long)0 );
+}
+
+void NativeCode::NextSourceLine( const SourceCodePosition &sourceCodePosition, bool isInSystemProc )
+{
+	if( sourceLines.size() )
+	{
+		if( sourceLines.back().GetNativeCodePos() == GetSize() )
+		{
+			sourceLines.back().SetSourceCodePosition( sourceCodePosition );
+			return;
+		}
+	}
+
+	extern BOOL bDebugSupportProc;
+	DWORD sourceLineType = 0;
+	if( bDebugSupportProc )
+	{
+		sourceLineType |= CODETYPE_DEBUGPROC;
+	}
+	if( isInSystemProc )
+	{
+		sourceLineType |= CODETYPE_SYSTEMPROC;
+	}
+	sourceLines.push_back(
+		SourceLine(
+			GetSize(),
+			sourceLineType,
+			sourceCodePosition
+		)
+	);
+}
+
+void NativeCode::ResetDataSectionBaseOffset( long dataSectionBaseOffset )
+{
+	foreach( const Schedule &schedule, schedules )
+	{
+		if( schedule.GetType() == Schedule::DataTable )
+		{
+			Overwrite(
+				schedule.GetOffset(),
+				GetLong( schedule.GetOffset() ) + dataSectionBaseOffset
+			);
+		}
+	}
+}
+void NativeCode::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
+{
+	BOOST_FOREACH( SourceLine &sourceLine, sourceLines )
+	{
+		sourceLine.GetSourceCodePosition().SetRelationalObjectModuleIndex(
+			relationTable[sourceLine.GetSourceCodePosition().GetRelationalObjectModuleIndex()]
+		);
+	}
+}
+
+void NativeCode::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	BOOST_FOREACH( Schedule &schedule, schedules )
+	{
+		schedule.Resolve( resolver, resolveErrors );
+	}
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/ObjectModule.cpp	(revision 774)
@@ -0,0 +1,253 @@
+#pragma warning(disable : 4996)
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <iomanip>
+#include <ios>
+#include <streambuf>
+#include <sstream>
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <tchar.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+
+
+// ObjectModuleの内容をXmlで生成する場合はこの行を有効にする
+//#define OBJECT_MODULE_IS_NOT_BINARY
+
+
+#ifdef OBJECT_MODULE_IS_NOT_BINARY
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#else
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#endif
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/vector.hpp>
+#include <boost/serialization/map.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/is_abstract.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+
+#define foreach(v, c) for each (v in c)
+
+#include <jenga/include/jenga.h>
+#include <abdev/ab_common/include/ab_common.h>
+
+
+void ObjectModule::StaticLink( ObjectModule &objectModule, bool isSll )
+{
+	const std::vector<int> relationTable = this->GetRelationTable( objectModule.relationalObjectModuleNames );
+
+	long dataSectionBaseOffset = dataTable.GetSize();
+
+	// メタ情報を結合
+	meta.StaticLink( objectModule.meta, dataSectionBaseOffset, relationTable );
+
+	if( !isSll )
+	{
+		// グローバル ネイティブコードを結合
+		objectModule.globalNativeCode.ResetDataSectionBaseOffset( dataSectionBaseOffset );
+		objectModule.globalNativeCode.ResetRelationalObjectModuleIndex( relationTable );
+		globalNativeCode.PutEx( objectModule.globalNativeCode );
+
+		// データテーブルを結合
+		objectModule.dataTable.ResetDataSectionBaseOffset( dataSectionBaseOffset );
+		dataTable.Add( objectModule.dataTable );
+	}
+
+	// TODO: basbufがいらなくなったら消す
+	extern char *basbuf;
+	basbuf = this->source.GetBuffer();
+}
+
+void ObjectModule::Resolve( ResolveErrors &resolveErrors )
+{
+	this->meta.Resolve( *this, resolveErrors );
+
+	// グローバルネイティブコードを解決（スケジュールを解決する）
+	this->globalNativeCode.Resolve( *this, resolveErrors );
+
+	// データテーブルを解決（スケジュールを解決する）
+	this->dataTable.Resolve( *this, resolveErrors );
+}
+
+const std::vector<int> ObjectModule::GetRelationTable( const Jenga::Common::Strings &oldRelationalObjectModuleNames )
+{
+	// 要素 = 古いインデックス、値 = 新しいインデックス
+	std::vector<int> relationTable;
+
+	// リレーションテーブルを構築
+	foreach( const std::string &oldRelationalObjectModuleName, oldRelationalObjectModuleNames )
+	{
+		bool isMatch = false;
+		for( int i=0; i<static_cast<int>(this->relationalObjectModuleNames.size()); i++ )
+		{
+			if( oldRelationalObjectModuleName == this->relationalObjectModuleNames[i] )
+			{
+				isMatch = true;
+				relationTable.push_back( i );
+				break;
+			}
+		}
+
+		if( !isMatch )
+		{
+			// エラー
+			_ASSERT( false );
+		}
+	}
+
+	return relationTable;
+}
+
+bool ObjectModule::Read( const std::string &filePath )
+{
+	// XMLとして読み込む
+	bool isSuccessful = false;
+
+	try{
+#ifdef OBJECT_MODULE_IS_NOT_BINARY
+		std::ifstream ifs( filePath.c_str() );
+		boost::archive::xml_iarchive ia(ifs);
+#else
+		std::ifstream ifs( filePath.c_str(), std::ios::in | std::ios::binary );
+		boost::archive::binary_iarchive ia(ifs);
+#endif
+
+		// ファイルから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception& e )
+	{
+		MessageBox( NULL, e.what(), "XMLシリアライズの例外", MB_OK );
+	}
+	catch(...){
+		MessageBox( NULL, "archive_exception以外の不明な例外", "XMLシリアライズの例外", MB_OK );
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+bool ObjectModule::Write( const std::string &filePath ) const
+{
+	bool isSuccessful = false;
+
+	try{
+#ifdef OBJECT_MODULE_IS_NOT_BINARY
+		std::ofstream ofs( filePath.c_str() );
+		boost::archive::xml_oarchive oa(ofs);
+#else
+		std::ofstream ofs( filePath.c_str(), std::ios::out | std::ios::binary );
+		boost::archive::binary_oarchive oa(ofs);
+#endif
+
+		// ファイルに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception& e )
+	{
+		MessageBox( NULL, e.what(), "XMLシリアライズの例外", MB_OK );
+	}
+	catch(...){
+		MessageBox( NULL, "archive_exception以外の不明な例外", "XMLシリアライズの例外", MB_OK );
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+bool ObjectModule::ReadString( const std::string &str )
+{
+	bool isSuccessful = false;
+
+	// 入力アーカイブの作成
+
+	try{
+#ifdef OBJECT_MODULE_IS_NOT_BINARY
+		std::istringstream iss( str );
+		boost::archive::xml_iarchive ia(iss);
+#else
+		std::istringstream iss( str, std::ios::in | std::ios::binary );
+		boost::archive::binary_iarchive ia(iss);
+#endif
+
+		// 文字列ストリームから読込
+		ia >> boost::serialization::make_nvp( RootTagName(), *this );
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception& e )
+	{
+		MessageBox( NULL, e.what(), "XMLシリアライズの例外", MB_OK );
+	}
+	catch(...){
+		MessageBox( NULL, "archive_exception以外の不明な例外", "XMLシリアライズの例外", MB_OK );
+	}
+
+	if( !isSuccessful )
+	{
+		return false;
+	}
+
+	return true;
+}
+bool ObjectModule::WriteString( std::string &str ) const
+{
+	// 出力アーカイブの作成
+
+	bool isSuccessful = false;
+	try{
+#ifdef OBJECT_MODULE_IS_NOT_BINARY
+		std::ostringstream oss;
+		boost::archive::xml_oarchive oa(oss);
+#else
+		std::ostringstream oss( "", std::ios::out | std::ios::binary );
+		boost::archive::binary_oarchive oa(oss);
+#endif
+
+		// 文字列ストリームに書き出し
+		oa << boost::serialization::make_nvp( RootTagName(), *this );
+
+		str = oss.str();
+
+		isSuccessful = true;
+	}
+	catch( boost::archive::archive_exception &e )
+	{
+		MessageBox( NULL, e.what(), "XMLシリアライズの例外", MB_OK );
+	}
+	catch(...){
+		MessageBox( NULL, "archive_exception以外の不明な例外", "XMLシリアライズの例外", MB_OK );
+	}
+
+	return isSuccessful;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Parameter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Parameter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Parameter.cpp	(revision 774)
@@ -0,0 +1,124 @@
+#include "stdafx.h"
+
+Parameter::Parameter( const std::string &varName, const Type &type, bool isRef, const std::string initValue )
+	: Type( type )
+	, varName( varName )
+	, isRef( isRef )
+	, isArray( false )
+	, initValue( initValue )
+{
+}
+
+Parameter::Parameter( const Parameter &param, const Type &type )
+	: Type( type )
+	, varName( param.varName )
+	, isRef( param.isRef )
+	, isArray( param.isArray )
+	, subscripts( param.subscripts )
+	, initValue( param.initValue )
+{
+}
+
+Parameter::Parameter( const Parameter &param )
+	: Type( param )
+	, varName( param.varName )
+	, isRef( param.isRef )
+	, isArray( param.isArray )
+	, subscripts( param.subscripts )
+	, initValue( param.initValue )
+{
+}
+
+Parameter::Parameter()
+{
+}
+
+Parameter::~Parameter()
+{
+}
+
+bool Parameter::Equals( const Parameter &param, bool isContravariant ) const
+{
+	if( Type::Equals( param ) && this->isRef == param.isRef )
+	{
+		return true;
+	}
+	else
+	{
+		if( this->isRef && this->GetBasicType() == DEF_ANY &&
+			param.isRef == false && param.IsPointer()
+			||
+			this->isRef == false && this->IsPointer() &&
+			param.isRef && param.GetBasicType() == DEF_ANY )
+		{
+			/* ByRef var As Any
+					と
+				var As VoidPtr
+				は同等
+			*/
+			return true;
+		}
+	}
+
+	if( isContravariant )
+	{
+		// 反変引数を許可する
+		if( this->IsContravariant( param ) && this->isRef == param.isRef )
+		{
+			// 反変引数だったとき
+			return true;
+		}
+	}
+
+	return false;
+}
+bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param, bool isContravariant ) const
+{
+	if( Equals( param, isContravariant ) )
+	{
+		return true;
+	}
+	
+	if( this->IsTypeParameter() )
+	{
+		// 型パラメータだったとき
+		if( actualTypeParametersForThisProc[this->GetFormalTypeIndex()].Equals( param ) )
+		{
+			// 戻り値が等しい
+			return true;
+		}
+	}
+
+	return false;
+}
+
+bool Parameters::Equals( const Parameters &params, bool isContravariant ) const
+{
+	if( this->size() != params.size() ){
+		return false;
+	}
+
+	int max = (int)this->size();
+	for( int i=0; i<max; i++ ){
+		if( !(*this)[i]->Equals( *params[i], isContravariant ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
+bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params, bool isContravariant ) const
+{
+	if( this->size() != params.size() ){
+		return false;
+	}
+
+	int max = (int)this->size();
+	for( int i=0; i<max; i++ ){
+		if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i], isContravariant ) ){
+			return false;
+		}
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp	(revision 774)
@@ -0,0 +1,276 @@
+#include "stdafx.h"
+
+
+void Procedure::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
+{
+	RelationalObjectModuleItem::ResetRelationalObjectModuleIndex( relationTable );
+
+	if( !this->sourceCodePosition.IsNothing() )
+	{
+		this->sourceCodePosition.SetRelationalObjectModuleIndex( relationTable[this->sourceCodePosition.GetRelationalObjectModuleIndex()] );
+	}
+}
+
+bool Procedure::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	foreach( Parameter *pParameter, params )
+	{
+		pParameter->Resolve( resolver, resolveErrors );
+	}
+
+	returnType.Resolve( resolver, resolveErrors );
+
+	return true;
+}
+
+
+void UserProc::ResetRelationalObjectModuleIndex( const std::vector<int> &relationTable )
+{
+	Procedure::ResetRelationalObjectModuleIndex( relationTable );
+
+	this->GetNativeCode().ResetRelationalObjectModuleIndex( relationTable );
+}
+
+int id_base = 0;
+
+UserProc::UserProc( const Symbol &symbol, const NamespaceScopesCollection &importedNamespaces, Kind kind, bool isMacro, bool isCdecl, bool isExport )
+	: Procedure( symbol, kind, isCdecl )
+	, importedNamespaces( importedNamespaces )
+	, pParentClass( NULL )
+	, pInterface( NULL )
+	, pMethod( NULL )
+	, isMacro( isMacro )
+	, secondParmNum( 0 )
+	, realSecondParmNum( 1 )
+	, isExport( isExport )
+	, isAutoGenerationSystem( false )
+	, isAutoGeneration( false )
+	, isCompiled( false )
+	, beginOpAddress( 0 )
+	, endOpAddress( 0 )
+	, id( id_base ++ )
+{
+}
+
+UserProc::UserProc( const UserProc &userProc, const CClass *pParentClass )
+	: Procedure( userProc )
+	, _paramStr( userProc._paramStr )
+	, importedNamespaces( userProc.importedNamespaces )
+	, pParentClass( pParentClass )
+	, pInterface( NULL )
+	, pMethod( NULL )
+	, isMacro( userProc.isMacro )
+	, secondParmNum( userProc.secondParmNum )
+	, realParams( userProc.realParams )
+	, realSecondParmNum( userProc.realSecondParmNum )
+	, isExport( userProc.isExport )
+	, isAutoGenerationSystem( userProc.isAutoGenerationSystem )
+	, isAutoGeneration( userProc.isAutoGeneration )
+	, isCompiled( false )
+	, beginOpAddress( 0 )
+	, endOpAddress( 0 )
+	, localVars( Variables() )
+	, id( id_base ++ )
+	, nativeCode( NativeCode() )
+{
+}
+
+UserProc::UserProc()
+{
+}
+
+UserProc::~UserProc()
+{
+	foreach( Parameter *pParam, realParams ){
+		delete pParam;
+	}
+}
+
+bool UserProc::IsEqualForOverride( const Types &actualTypeParametersForThisProc, const UserProc *pUserProc ) const
+{
+	if( this->GetName() == pUserProc->GetName()						// 名前空間及び名前が等しい
+		&& this->Params().Equals( actualTypeParametersForThisProc, pUserProc->Params() ) )			// パラメータが等しい
+	{
+		if( this->returnType.Equals( pUserProc->returnType ) )
+		{
+			// 戻り値が等しい
+			return true;
+		}
+		else if( this->returnType.IsCovariant( pUserProc->returnType ) )
+		{
+			// 戻り値が共変
+			return true;
+		}
+		else if( this->returnType.IsTypeParameter() )
+		{
+			// 型パラメータだったとき
+
+			if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].Equals( pUserProc->returnType ) )
+			{
+				// 戻り値が等しい
+				return true;
+			}
+			else if( actualTypeParametersForThisProc[this->returnType.GetFormalTypeIndex()].IsCovariant( pUserProc->returnType ) )
+			{
+				// 戻り値が共変
+				return true;
+			}
+		}
+	}
+	return false;
+}
+	
+
+std::string UserProc::GetFullName() const
+{
+	if( HasParentClass() ){
+		return GetParentClass().GetName() + "." + GetName();
+	}
+
+	return GetName();
+}
+bool UserProc::IsCastOperator() const
+{
+	if( GetName()[0] == 1 && GetName()[1] == ESC_OPERATOR && GetName()[2] == CALC_AS )
+	{
+		return true;
+	}
+	return false;
+}
+bool UserProc::IsSystem() const
+{
+	// "_System_" を名前の先頭に含む関数
+	if( memcmp( this->GetName().c_str(), "_System_", 8 ) == 0 )
+	{
+		return true;
+	}
+
+	// "_System_" を名前の先頭に含むクラスのメソッド
+	if( this->HasParentClass() )
+	{
+		if( memcmp( this->GetParentClass().GetName().c_str(), "_System_", 8 ) == 0 )
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+const NamespaceScopes &UserProc::GetNamespaceScopes() const
+{
+	if( HasParentClass() )
+	{
+		return GetParentClassPtr()->GetNamespaceScopes();
+	}
+	return Symbol::GetNamespaceScopes();
+}
+const NamespaceScopesCollection &UserProc::GetImportedNamespaces() const
+{
+	if( pParentClass )
+	{
+		return pParentClass->GetImportedNamespaces();
+	}
+	return importedNamespaces;
+}
+bool UserProc::IsVirtual() const
+{
+	if( pMethod == NULL ){
+		return false;
+	}
+	return ( pMethod->IsVirtual() != 0 );
+}
+const CMethod &UserProc::GetMethod() const
+{
+	if( !HasParentClass() )
+	{
+		Jenga::Throw( "グローバル関数に対してUserProc::GetMethodメソッドが呼ばれた" );
+	}
+	return *pMethod;
+}
+
+bool UserProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	Procedure::Resolve( resolver, resolveErrors );
+
+	if( this->pParentClass )
+	{
+		if( this->pParentClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pParentClass );
+			if( pTempClass )
+			{
+				this->pParentClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pParentClass->GetRelationalObjectModuleIndex(), this->pParentClass->GetFullName() ) );
+			}
+		}
+	}
+
+	if( pInterface )
+	{
+		const_cast<Interface *>(pInterface)->Resolve( resolver, resolveErrors );
+	}
+
+	if( pMethod )
+	{
+		pMethod->Resolve( resolver, resolveErrors );
+	}
+
+	foreach( Parameter *pParameter, realParams )
+	{
+		pParameter->Resolve( resolver, resolveErrors );
+	}
+
+	foreach( Variable *pLocalVar, localVars )
+	{
+		pLocalVar->Resolve( resolver, resolveErrors );
+	}
+
+	nativeCode.Resolve( resolver, resolveErrors );
+	return true;
+}
+
+const UserProc *UserProc::pGlobalProc = NULL;
+
+
+void UserProcs::EnumGlobalProcs( const char *simpleName, const Symbol &localSymbol, std::vector<const UserProc *> &subs )
+{
+	///////////////////////////
+	// グローバル関数を検索
+	///////////////////////////
+
+	// ハッシュ値を取得
+	UserProc *pUserProc = GetHashArrayElement( simpleName );
+	while(pUserProc){
+		if( pUserProc->IsGlobalProcedure() ){
+			if( pUserProc->IsEqualSymbol( localSymbol ) ){
+				subs.push_back( pUserProc );
+			}
+		}
+
+		pUserProc=pUserProc->GetChainNext();
+	}
+}
+
+bool DllProc::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	Procedure::Resolve( resolver, resolveErrors );
+	return true;
+}
+
+bool ProcPointer::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	Procedure::Resolve( resolver, resolveErrors );
+	return true;
+}
+
+void ProcPointers::Clear()
+{
+	ProcPointers &procPointers = *this;
+	foreach( ProcPointer *pProcPointer, procPointers ){
+		delete pProcPointer;
+	}
+	this->clear();
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Source.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Source.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Source.cpp	(revision 774)
@@ -0,0 +1,972 @@
+#include "stdafx.h"
+#include <hash_set>
+
+const std::string BasicSource::generateDirectiveName = "#generate";
+
+
+class CDefine{
+	stdext::hash_set<std::string> names;
+public:
+//	void Free();
+	void Init( bool isDebug, bool isDll, bool isUnicode, int majorVer );
+
+	bool add(char const *name);
+	bool undef(char const *name);
+	bool check(char const *name);
+	void preprocessor_ifdef(char *buffer,bool isNot);
+	void DirectiveIfdef(char *buffer);
+};
+CDefine objDefine;
+
+
+//////////////////////////////////////
+// #requireの管理
+//////////////////////////////////////
+namespace
+{
+class CRequireFiles{
+	stdext::hash_set<std::string> filepaths;
+public:
+	void clear(){
+		filepaths.clear();
+	}
+	//既に存在するものを追加しようとするとfalseを返す（旧IsIncludedと逆なことに注意）
+	bool TryAdd( const std::string &includeFilePath ){
+		char tempPath[MAX_PATH];
+		DWORD len = GetShortPathName(includeFilePath.c_str(), tempPath, MAX_PATH);
+		if (len >= MAX_PATH){
+			return false;
+		}
+		for( DWORD i = 0; i < len; ++i ){
+			char c = toupper(tempPath[i]);
+			if (c == '/'){
+				tempPath[i] = '\\';
+			}
+			else{
+				tempPath[i] = c;
+			}
+		}
+		return filepaths.insert( tempPath ).second;
+	}
+};
+CRequireFiles requireFiles;
+} //namespace
+
+//////////////////////////////////////
+// #define間するクラス
+//////////////////////////////////////
+
+void CDefine::Init( bool isDebug, bool isDll, bool isUnicode, int majorVer )
+{
+	names.clear();
+
+	if( isDebug )
+	{
+		add("_DEBUG");
+	}
+
+#ifdef _AMD64_
+	add("_WIN64");
+#endif
+
+	if( isDll )
+	{
+		add("_DLL");
+	}
+
+	if( isUnicode )
+	{
+		add( "UNICODE" );
+	}
+
+	char temporary[255];
+	sprintf(temporary,"_AB_VER%d",majorVer);
+	add(temporary);
+}
+bool CDefine::add(char const *name)
+{
+	return names.insert(name).second;
+}
+bool CDefine::undef(char const *name){
+	return names.erase(name) > 0;
+}
+bool CDefine::check(char const *name){
+	return names.find(name) != names.end();
+}
+
+int Search_endif(char const *buffer,int i, int *pLine = 0){
+	for(;;i++){
+		if(buffer[i]=='\0') break;
+
+		if( buffer[i] == '\n' ){
+			if( pLine ){
+				(*pLine)++;
+			}
+		}
+
+		if(buffer[i-1]=='\n'){
+			if(_memicmp(buffer+i,"#ifdef",6)==0||_memicmp(buffer+i,"#ifndef",7)==0){
+				i=Search_endif(buffer,i+6, pLine);
+				if(buffer[i]=='\0') break;
+				continue;
+			}
+			else if(_memicmp(buffer+i,"#endif",6)==0){
+				break;
+			}
+		}
+	}
+	return i;
+}
+
+void CDefine::preprocessor_ifdef(char *buffer,bool isNot){
+	int i,i2,i3;
+	char temporary[VN_SIZE];
+
+	if(isNot) i=strlen("#ifndef");
+	else i=strlen("#ifdef");
+	while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+	for(i2=0;;i++,i2++){
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			temporary[i2]=0;
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	int sw=0;
+	if(check(temporary)) sw=1;
+
+	if(isNot){
+		//#ifndefのとき（反対にする）
+		if(sw) sw=0;
+		else sw=1;
+	}
+
+	//#ifdefの行を消去
+	memset(buffer,' ',static_cast<size_t>(i));
+
+	BOOL bElse=0;
+	if(sw){
+		//TRUEのとき
+
+		//#else、#endifを探索
+		for(;;i++){
+			if(buffer[i]=='\0') break;
+
+			if(i==0||buffer[i-1]=='\n'){
+				if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
+					i=Search_endif(buffer,i+6);
+					if(buffer[i]=='\0') break;
+					continue;
+				}
+				else if(memicmp(buffer+i,"#else",5)==0){
+					i2=5;
+					bElse=1;
+					break;
+				}
+				else if(memicmp(buffer+i,"#endif",6)==0){
+					i2=6;
+					bElse=0;
+					break;
+				}
+			}
+		}
+
+		//行を消去
+		Text::SlideString(buffer+i+i2,-i2);
+
+		if(bElse){
+			//#elseがある場合はその区間を消去
+
+			for(i2=i,i3=0;;i2++){
+				if(buffer[i2]=='\0') break;
+
+				if(buffer[i2]=='\n') i3++;
+
+				if(i2==0||buffer[i2-1]=='\n'){
+					if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
+						i2=Search_endif(buffer,i2+6, &i3 );
+						if(buffer[i2]=='\0') break;
+						continue;
+					}
+					if(memicmp(buffer+i2,"#endif",6)==0){
+						i2+=6;
+						break;
+					}
+				}
+			}
+
+			//ソースコード区間を消去し、改行コードを挿入
+			Text::SlideString(buffer+i2,i-i2+i3);
+			memset(buffer+i,'\n',i3);
+		}
+	}
+	else{
+		//FALSEのとき
+
+		//#else、#endifを探索
+		for(i2=i,i3=0;;i2++){
+			if(buffer[i2]=='\0') break;
+
+			if(buffer[i2]=='\n') i3++;
+
+			if(i2==0||buffer[i2-1]=='\n'){
+				if(memicmp(buffer+i2,"#ifdef",6)==0||memicmp(buffer+i2,"#ifndef",7)==0){
+					i2=Search_endif(buffer,i2+6, &i3 );
+					if(buffer[i2]=='\0') break;
+					continue;
+				}
+				else if(memicmp(buffer+i2,"#else",5)==0){
+					i2+=5;
+					bElse=1;
+					break;
+				}
+				else if(memicmp(buffer+i2,"#endif",6)==0){
+					i2+=6;
+					bElse=0;
+					break;
+				}
+			}
+		}
+
+		//ソースコード区間を消去し、改行コードを挿入
+		Text::SlideString(buffer+i2,i-i2+i3);
+		memset(buffer+i,'\n',i3);
+
+		if(bElse){
+			//#endifを探索
+			for(;;i++){
+				if(buffer[i]=='\0') break;
+
+				if(i==0||buffer[i-1]=='\n'){
+					if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
+						i=Search_endif(buffer,i+6);
+						if(buffer[i]=='\0') break;
+						continue;
+					}
+					else if(memicmp(buffer+i,"#endif",6)==0){
+						i2=6;
+						bElse=0;
+						break;
+					}
+				}
+			}
+
+			//行を消去
+			Text::SlideString(buffer+i+i2,-i2);
+		}
+	}
+}
+
+
+void CDefine::DirectiveIfdef(char *buffer){
+	int i,i2,i3,sw;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+
+		if(i==0||(i>=1&&buffer[i-1]=='\n')){
+			sw=0;
+			if(memicmp(buffer+i,"#define",7)==0){
+				i2=i+7;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				for(i3=0;;i2++,i3++){
+					if(buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=buffer[i2];
+				}
+				add(temporary);
+				//ディレクティブを消去
+				memset(buffer+i,' ',static_cast<size_t>(i2-i));
+				i=i2;
+			}
+			if(memicmp(buffer+i,"#undef",6)==0){
+				i2=i+6;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				for(i3=0;;i2++,i3++){
+					if(buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=buffer[i2];
+				}
+				undef(temporary);
+				//ディレクティブを消去
+				memset(buffer+i,' ',static_cast<size_t>(i2-i));
+				i=i2;
+			}
+			else if(memicmp(buffer+i,"#ifdef",6)==0){
+				preprocessor_ifdef(buffer+i,false);
+				continue;
+			}
+			else if(memicmp(buffer+i,"#ifndef",7)==0){
+				preprocessor_ifdef(buffer+i,true);
+				continue;
+			}
+			else continue;
+		}
+	}
+}
+
+
+
+
+bool Text::ReadFile( const std::string &filePath ){
+	//ファイルオープン
+	HANDLE hFile=CreateFile(filePath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		DebugBreak(); return false;
+	}
+
+	length = GetFileSize( hFile, NULL );
+
+	buffer = (char *)realloc( buffer, length + 1 );
+
+	//読み込み
+	DWORD dwAccBytes;
+	::ReadFile(hFile,buffer,length,&dwAccBytes,0);
+	buffer[dwAccBytes]=0;
+
+	//ファイルクローズ
+	CloseHandle(hFile);
+
+	return true;
+}
+
+//改行コードのCRLFをLFに変換
+int ChangeReturnCodeImpl(char *buffer)
+{
+	int i;
+	for(i=0;buffer[i]!='\0';i++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			buffer[i]=' ';
+		}
+	}
+	return i;
+}
+
+void BasicSource::ChangeReturnLineChar(){
+	int i;
+
+	bool isMustChange = false;
+	for( i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]=='\n' )
+		{
+			if( i>0 )
+			{
+				if( buffer[i-1] == '\r' )
+				{
+					isMustChange = true;
+				}
+			}
+		}
+	}
+
+	if( !isMustChange )
+	{
+		// 改行コードの変換は必要ない
+		return;
+	}
+
+#ifdef _DEBUG
+	//改行コードの整合性チェック
+	for( i=0; ; i++ ){
+		if( buffer[i] == '\0' ){
+			break;
+		}
+		if( buffer[i]!='\r' && buffer[i+1]=='\n'
+			||  buffer[i]=='\r' && buffer[i+1]!='\n' ){
+				char temporary[255];
+				strncpy( temporary, buffer + i-100, 130 );
+				temporary[130] = 0;
+				for(int i2=0; ;i2++){
+					if(temporary[i2]=='\r') temporary[i2]='A';
+					if(temporary[i2]=='\n') temporary[i2]='B';
+					if(temporary[i2]=='\0') break;
+				}
+
+				extern HWND hOwnerEditor;
+				MessageBox( hOwnerEditor, temporary, "改行コードの整合性チェック", MB_OK | MB_ICONEXCLAMATION );
+		}
+	}
+#endif
+
+	ChangeReturnCodeImpl(buffer);
+
+	length = i;
+}
+
+void BasicSource::RemoveComments(){
+	int i,i2,i3,IsStr;
+	char *temporary=static_cast<char *>(malloc(strlen(buffer)+1));
+	for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+
+			if(i3){
+				//複数行に渡る注釈文の中に改行が存在するとき
+				memset(temporary+i2,'\n',i3);
+				i2+=i3;
+				i3=0;
+			}
+		}
+		if(buffer[i]=='\''&&IsStr==0){
+			//注釈文
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+			while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
+		}
+		if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
+			//注釈文（複数行）
+			i+=2;
+			i3=0;
+			while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+				if(buffer[i]=='\n') i3++;
+				if(buffer[i]=='\0') break;
+				i++;
+			}
+			if(buffer[i]){
+				i+=2;
+			}
+			i--;
+			i2--;
+			continue;
+		}
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	std::swap(buffer,temporary);
+	free(temporary);
+}
+
+bool BasicSource::ReadFile_InIncludeDirective( const std::string &filePath ){
+	if( !Text::ReadFile( filePath ) ){
+		return false;
+	}
+
+	// 改行コードをCRLFからLFに変換
+	ChangeReturnLineChar();
+
+	// コメントを削除
+	RemoveComments();
+
+	// #ifdefディレクティブを処理
+	objDefine.DirectiveIfdef( buffer );
+
+	// アンダーバーによる改行を正規表現に戻す
+	RemoveReturnLineUnderbar();
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	Text::SlideString( buffer, 2 );
+	buffer[0] = '\n';
+	buffer[1] = '\n';
+
+	return true;
+}
+
+void BasicSource::DirectiveIncludeOrRequire( const std::string &mainSourceFilePath, const std::string &includeDirPath )
+{
+	int i,i2,i3,sw1,LineNum,FileLayer[255],layer,LastFileByte[255];
+	char temporary[MAX_PATH],temp2[MAX_PATH+255],*LayerDir[255];
+
+	layer=0;
+	FileLayer[layer]=0;
+	LastFileByte[layer]=GetLength();
+	LineNum=0;
+
+	if( includedFilesRelation.GetLineCounts() != 0 )
+	{
+		Jenga::Throw( "インクルードファイル構造の初期値が不正" );
+	}
+
+	// メインソースコード
+	FileLayer[layer] = includedFilesRelation.AddFile( mainSourceFilePath );
+
+	//参照ディレクトリ
+	std::string mainSourceFileDir = Jenga::Common::Path::ExtractDirPath( mainSourceFilePath );
+	LayerDir[0]=(char *)malloc(mainSourceFileDir.size()+1);
+	strcpy(LayerDir[0],mainSourceFileDir.c_str());
+
+	for(i=0;;i++){
+		if(buffer[i]=='\0'){
+			break;
+		}
+		if(buffer[i]=='\n'){
+			includedFilesRelation.AddLine( FileLayer[layer] );
+		}
+		if(i>LastFileByte[layer]){
+			free(LayerDir[layer]);
+			LayerDir[layer]=0;
+			layer--;
+		}
+		if((buffer[i-1]=='\n'||i==0)&&buffer[i]=='#'){
+			bool isRequire = false;
+
+			int includeDirectiveLength;
+
+			char findStr[1024];
+			if(memcmp( buffer + i + 1, "include", 7 ) == 0
+				|| memcmp( buffer + i + 1, "require", 7 ) == 0)
+			{
+				//#requireの場合
+				if( buffer[i + 1] == 'r' ) isRequire = true;
+
+				i2=i+8;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				if(buffer[i2]=='\"') sw1=0;
+				else if(buffer[i2]=='<') sw1=1;
+				i2++;
+
+				for(i3=0;;i2++,i3++){
+					if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=buffer[i2];
+				}
+				while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
+
+				includeDirectiveLength = i2 - i;
+
+				if(sw1){
+					sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
+					strcpy(findStr,temp2);
+				}
+				else{
+					Jenga::Common::Directory dir( LayerDir[layer] );
+					strcpy( findStr, dir.GetFullPath( temporary ).c_str() );
+				}
+			}
+			else if(memcmp(buffer+i+1,"prompt",6)==0){
+				includeDirectiveLength = 7;
+				sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
+			}
+			else if(memcmp(buffer+i+1,"N88BASIC",8)==0){
+				includeDirectiveLength = 9;
+				sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
+			}
+			else if(memcmp(buffer+i+1,"console",7)==0){
+				//サブシステム タイプをCUIに変更
+				extern unsigned short TypeOfSubSystem;
+				TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_CUI;
+
+				includeDirectiveLength = 8;
+				sprintf(findStr,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );
+			}
+			else continue;
+
+			// インクルードファイルを列挙（ワイルドカード指定を想定）
+			Jenga::Common::Strings resultOfFullPath;
+			Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr );
+
+			if( resultOfFullPath.empty() )
+			{
+				this->cannotIncludePath = findStr;
+				this->cannotIncludeSourcePos = i;
+				includedFilesRelation.AddLine( FileLayer[layer] );
+				break;
+			}
+
+			for( int j=static_cast<int>(resultOfFullPath.size()-1); j>=0; j-- )
+			{
+				const std::string &sourceFilePath = resultOfFullPath[j];
+
+				const int headIndex = i;
+
+				if( headIndex == 0 && Jenga::Common::Path( sourceFilePath ).GetFileName() == "basic" )
+				{
+					// basic.sbpインクルード時は何もしない
+					// ワイルドカードで複数ファイルを指定した場合、２つ目以上のファイルの場合もこちら
+				}
+				else
+				{
+					//ディレクティブが消えるため、一行減ってしまうのを防ぐ（basic.sbpを除く）
+					Text::SlideString( buffer + headIndex + includeDirectiveLength, 1 );
+					buffer[headIndex+includeDirectiveLength]='\n';
+					for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
+				}
+
+				layer++;
+				FileLayer[layer] = includedFilesRelation.AddFile( sourceFilePath );
+
+				//#requireの場合では、既に読み込まれているファイルは読み込まないようにする
+				BasicSource source;
+
+				if( !requireFiles.TryAdd( sourceFilePath ) && isRequire ){
+					//既に読み込まれているときは空データ
+					source.SetBuffer( "" );
+				}
+				else{
+					//インクルードファイルを読み込む
+					if( !source.ReadFile_InIncludeDirective( sourceFilePath ) )
+					{
+						_ASSERTE( false );
+					}
+				}
+
+				Realloc( strlen(buffer) + source.GetLength() );
+				Text::SlideString(
+					buffer + headIndex + includeDirectiveLength,
+					source.GetLength() - includeDirectiveLength
+				);
+				memcpy(
+					buffer + headIndex,
+					source.GetBuffer(),
+					source.GetLength()
+				);
+
+				//新しい参照ディレクトリをセット
+				char temp4[MAX_PATH];
+				_splitpath(sourceFilePath.c_str(),temp2,temp4,0,0);
+				strcat(temp2,temp4);
+				LayerDir[layer]=(char *)malloc(strlen(temp2)+1);
+				strcpy(LayerDir[layer],temp2);
+
+				//ファイル範囲をスライド
+				LastFileByte[layer] = headIndex + source.GetLength() - 1;
+				for(i3=0;i3<layer;i3++)
+				{
+					LastFileByte[i3] += source.GetLength() - includeDirectiveLength;
+				}
+
+				includeDirectiveLength = 0;
+			}
+			i--;
+		}
+	}
+
+	free(LayerDir[0]);
+
+	length = strlen(buffer);
+}
+
+int KillReturnCode_InParameter(char *buffer,int *pRnum,char cBeginPare,char cEndPare){
+	int i,i2,i3,IsStr;
+
+	//カッコ'('直下の改行
+	while(buffer[0]=='\n'){
+		buffer[0]=' ';
+		(*pRnum)++;
+	}
+
+	for(i=0,IsStr=0;;i++){
+		if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
+			i++;
+			continue;
+		}
+
+		if(buffer[i]=='\"') IsStr^=1;
+
+		if(buffer[i]=='\0') break;	//エラー
+		if(buffer[i]=='\n'){
+			i2=0;
+			i3=0;
+			while(buffer[i+i2]=='\n'){
+				i2++;
+				i3++;
+				while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
+			}
+			while(buffer[i+i2]==' '||buffer[i+i2]=='\t') i2++;
+
+			if(buffer[i+i2]==cEndPare){
+				Text::SlideString(buffer+i+i2,-i2);
+				(*pRnum)+=i3;
+				break;
+			}
+
+			//エラー
+			break;
+		}
+
+		if(buffer[i]=='('&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,pRnum,'(',')');
+			i+=i2;
+			if(buffer[i]!=')') break;
+			continue;
+		}
+		if(buffer[i]=='['&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,pRnum,'[',']');
+			i+=i2;
+			if(buffer[i]!=']') break;
+			continue;
+		}
+		if(buffer[i]==cEndPare&&IsStr==0) break;
+
+		if(buffer[i]==','&&buffer[i+1]=='\n'&&IsStr==0){
+			i++;
+			while(buffer[i]=='\n'){
+				Text::SlideString(buffer+i+1,-1);
+				(*pRnum)++;
+			}
+			i--;
+		}
+	}
+	return i;
+}
+void BasicSource::RemoveReturnLineUnderbar(){
+	int i,i2;
+
+	//アンダーバーによる改行
+	for(i=0;;i++){
+		i2=0;
+		while(buffer[i]=='_'&&buffer[i+1]=='\n'){
+			i2++;
+			Text::SlideString(buffer+i+2,-2);
+			while(buffer[i]=='\n'){
+				Text::SlideString(buffer+i+1,-1);
+				i2++;
+			}
+			for(;;i++){
+				if(buffer[i]=='_'&&buffer[i+1]=='\n') break;
+				if(buffer[i]=='\n'||buffer[i]=='\0'){
+					Text::SlideString(buffer+i,i2);
+					memset(buffer+i,'\n',i2);
+					break;
+				}
+			}
+		}
+		if(buffer[i]=='\0') break;
+	}
+
+	//カッコ内パラメータの改行
+	int IsStr,rnum;
+	for(i=0,IsStr=0,rnum=0;;i++){
+		if(IsDBCSLeadByte(buffer[i])&&buffer[i+1]){
+			i++;
+			continue;
+		}
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='\n'){
+			if(rnum){
+				Text::SlideString(buffer+i+1,rnum);
+				memset(buffer+i+1,'\n',rnum);
+				rnum=0;
+			}
+		}
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='('&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,&rnum,'(',')');
+			i+=i2;
+			if(buffer[i]!=')') break;
+		}
+		if(buffer[i]=='['&&IsStr==0){
+			i++;
+			i2=KillReturnCode_InParameter(buffer+i,&rnum,'[',']');
+			i+=i2;
+			if(buffer[i]!=']') break;
+		}
+	}
+
+	length = strlen(buffer);
+}
+
+void BasicSource::Initialize( const std::string &source )
+{
+	Clear();
+	Add( source );
+
+	// 改行コードをCRLFからLFに変換
+	ChangeReturnLineChar();
+
+	// コメントを削除
+	RemoveComments();
+
+	//最終行には文字を含ませないようにする
+	if( strlen(buffer)>0 && buffer[strlen(buffer)-1] != '\n' )
+	{
+		Realloc( length + 1 );
+		strcat( buffer, "\n" );
+	}
+
+	// アンダーバーによる改行を正規表現に戻す
+	RemoveReturnLineUnderbar();
+}
+
+// 指定したインデックスが何行目かを取得
+bool BasicSource::GetLineFromIndex( int index, int &result ) const
+{
+	result = 0;
+	for( int i=2; i<index; i++ )
+	{
+		if( this->buffer[i] == '\n' )
+		{
+			result ++;
+		}
+		if( this->buffer[i] == '\0' )
+		{
+			return false;
+		}
+	}
+	return true;
+}
+
+void BasicSource::SetBuffer( const char *buffer ){
+	this->buffer = (char *)calloc( strlen(buffer) + 1, 1 );
+	strcpy( this->buffer, buffer );
+	length = strlen(buffer);
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	Text::SlideString( this->buffer, 2 );
+	this->buffer[0] = '\n';
+	this->buffer[1] = '\n';
+}
+
+bool BasicSource::ReadFile( const std::string &filePath, bool isDebug, bool isDll, bool isUnicode, int majorVer, const std::string &mainSourceFilePath, const std::string &includeDirPath )
+{
+	if( !Text::ReadFile( filePath ) ){
+		return false;
+	}
+
+	// 改行コードをCRLFからLFに変換
+	ChangeReturnLineChar();
+
+	// #defineと#requireを初期化
+	// TODO: バージョン番号の識別子defineが未完成
+	objDefine.Init( isDebug, isDll, isUnicode, majorVer );
+	requireFiles.clear();
+
+	// コメントを削除
+	RemoveComments();
+
+	// #ifdefディレクティブを処理
+	objDefine.DirectiveIfdef( buffer );
+
+	//最終行には文字を含ませないようにする
+	Realloc( length + 1 );
+	strcat( buffer, "\n" );
+
+	// #include / #require ディレクティブを処理
+	DirectiveIncludeOrRequire( mainSourceFilePath, includeDirPath );
+
+	// アンダーバーによる改行を正規表現に戻す
+	RemoveReturnLineUnderbar();
+
+	// ダミー改行をセット
+	Realloc( length + 2 );
+	Text::SlideString( buffer, 2 );
+	buffer[0] = '\n';
+	buffer[1] = '\n';
+
+	extern char *basbuf;
+	basbuf = GetBuffer();
+
+	return true;
+}
+
+void BasicSource::Addition( const char *buffer ){
+	Realloc( length + strlen(buffer) );
+	strcat( this->buffer, buffer );
+}
+
+bool BasicSource::GetLineInfo( int sourceCodePos, int &line, std::string &filePath ) const
+{
+	const char *buffer = this->GetBuffer();
+	if( this->GetLength() < sourceCodePos )
+	{
+		char temp[256];
+		strncpy( temp, buffer, 100 );
+		strcat( temp, "..." );
+		MyAssertMsg( false, ( (std::string)"下記ソースコードの" + Jenga::Common::ToString( sourceCodePos ) + "バイト目（存在しない箇所）を参照しようとした。\n\n" + temp ).c_str() );
+		return false;
+	}
+
+	int i = sourceCodePos;
+	int i2,i3,i4,i5;
+	if(buffer[i]=='\n') i--;
+	bool result = this->GetLineFromIndex( i, i2 );
+	MyAssert( result );
+
+	if( includedFilesRelation.GetLineCounts() <= i2 )
+	{
+		MyAssertMsg( false, "BasicSource::GetLineInfoメソッドで不正な行の情報を取得しようとした" );
+
+		//ファイル・行番号を特定できなかった場合
+		line = -1;
+		filePath = "";
+		return false;
+	}
+
+	i4=0;
+	while( includedFilesRelation.GetFileNumber( i2 ) != includedFilesRelation.GetFileNumber( i4 ) )
+	{
+		i4++;
+	}
+	for(i3=0,i5=0;i5<i4;i3++){
+		if(buffer[i3]=='\n') i5++;
+		if(buffer[i3]=='\0')
+		{
+			MyAssert( false );
+			return false;
+		}
+	}
+	for(i5=0;i4<i2;i3++){
+		if(buffer[i3]=='\n'){
+			i4++;
+			i5++;
+			if( includedFilesRelation.GetFileNumber( i2 ) < includedFilesRelation.GetFileNumber( i4 ) )
+			{
+				for( ;includedFilesRelation.GetFileNumber( i2 ) != includedFilesRelation.GetFileNumber( i4 ); i3++ ){
+					if(buffer[i3]=='\n') i4++;
+				}
+			}
+		}
+		if(buffer[i3]=='\0')
+		{
+			MyAssert( false );
+			return false;
+		}
+	}
+
+	//行番号をセット
+	line = i5;
+
+	//ファイル名をセット
+	filePath = includedFilesRelation.GetFilePath( i2 );
+
+	return true;
+}
+
+int SourceCodePosition::GetRelationalObjectModuleIndex() const
+{
+	if( this->IsNothing() )
+	{
+		_ASSERTE( false );
+		throw;
+	}
+
+	return relationalObjectModuleIndex;
+}
+bool SourceCodePosition::IsNothing() const
+{
+	if( this->relationalObjectModuleIndex == -1 && this->pos == -1 )
+	{
+		return true;
+	}
+
+	if( this->relationalObjectModuleIndex == -1 || this->pos == -1 )
+	{
+		_ASSERTE( false );
+		throw;
+	}
+
+	return false;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Symbol.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Symbol.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Symbol.cpp	(revision 774)
@@ -0,0 +1,148 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Common::Lexical;
+
+const NamespaceSupporter *Symbol::namespaceSupporter = NULL;
+
+char const *calcNames[256] = {
+	0,
+};
+void InitCalcNames()
+{
+	if( calcNames[CALC_XOR] )
+	{
+		return;
+	}
+	calcNames[CALC_XOR] = "xor";
+	calcNames[CALC_OR] = "or";
+	calcNames[CALC_AND] = "and";
+	calcNames[CALC_NOT] = "Not";
+	calcNames[CALC_PE] = "<=";
+	calcNames[CALC_QE] = ">=";
+	calcNames[CALC_NOTEQUAL] = "<>";
+	calcNames[CALC_EQUAL] = "=(compare)";
+	calcNames[CALC_P] = "<";
+	calcNames[CALC_Q] = ">";
+	calcNames[CALC_SHL] = "<<";
+	calcNames[CALC_SHR] = ">>";
+	calcNames[CALC_ADDITION] = "+";
+	calcNames[CALC_SUBTRACTION] = "-";
+	calcNames[CALC_STRPLUS] = "&";
+	calcNames[CALC_MOD] = "mod";
+	calcNames[CALC_PRODUCT] = "*";
+	calcNames[CALC_QUOTIENT] = "/";
+	calcNames[CALC_INTQUOTIENT] = "\\";
+	calcNames[CALC_AS] = "As";
+	calcNames[CALC_BYVAL] = "ByVal";
+	calcNames[CALC_MINUSMARK] = "-(mark)";
+	calcNames[CALC_POWER] = "^";
+	calcNames[CALC_SUBSITUATION] = "=";
+	calcNames[CALC_ARRAY_GET] = "[]";
+	calcNames[CALC_ARRAY_SET] = "[]=";
+}
+void GetCalcName(int idCalc,char *name){
+	InitCalcNames();
+
+	if( calcNames[idCalc] == NULL )
+	{
+		throw;
+	}
+
+	lstrcpy( name, calcNames[idCalc] );
+}
+
+std::string ActiveBasic::Common::Lexical::Operator_CalcMarkStringToNaturalString( const std::string &name )
+{
+	if( name[0] == 1 && name[1] == ESC_OPERATOR )
+	{
+		BYTE calcId = name[2];
+		char temporary[255], calcName[255];
+		GetCalcName( calcId, calcName );
+		temporary[0] = name[0];
+		temporary[1] = name[1];
+		lstrcpy( temporary+2, calcName );
+		return temporary;
+	}
+	return name;
+}
+
+BYTE ToCalcId( const char *name )
+{
+	InitCalcNames();
+
+	for( int i=0; i<255; i++ )
+	{
+		if( calcNames[i] )
+		{
+			if( lstrcmp( name, calcNames[i] ) == 0 )
+			{
+				return i;
+			}
+		}
+	}
+
+	throw;
+}
+
+std::string ActiveBasic::Common::Lexical::Operator_NaturalStringToCalcMarkString( const std::string &name )
+{
+	if( name[0] == 1 && name[1] == ESC_OPERATOR )
+	{
+		BYTE calcId = ToCalcId( name.c_str()+2 );
+		char temporary[255];
+		temporary[0] = name[0];
+		temporary[1] = name[1];
+		temporary[2] = calcId;
+		temporary[3] = 0;
+		return temporary;
+	}
+	return name;
+}
+
+std::string Symbol::GetFullName() const
+{
+	if( namespaceScopes.size() )
+	{
+		return namespaceScopes.ToString() + '.' + name;
+	}
+
+	return name;
+}
+
+bool Symbol::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const std::string &name ) const
+{
+	if( GetName() != name ){
+		return false;
+	}
+
+	_ASSERTE( namespaceSupporter );
+	return namespaceSupporter->IsSameAreaNamespace( GetNamespaceScopes(), namespaceScopes );
+}
+bool Symbol::IsEqualSymbol( const Symbol &symbol ) const
+{
+	const NamespaceScopes &symbolNS = symbol.GetNamespaceScopes();
+	if( IsEqualSymbol( symbolNS, symbol.GetName() ) )
+	{
+		return true;
+	}
+
+	if( !symbolNS.empty() )
+	{
+		// 静的メンバを考慮
+		//name == className + '.' + memberNameならIsSameAreaNamespaceで名前空間が一致するか調べる。
+		std::string const& className = symbolNS.back();
+		std::string const& memberName = symbol.GetName();
+		std::size_t classNameSize = className.size();
+		if( name.size() != classNameSize + 1 + memberName.size() ){
+			return false;
+		}
+		if( std::equal( className.begin(), className.end(), name.begin() )
+			&& name[classNameSize] == '.'
+			&& std::equal( memberName.begin(), memberName.end(), name.begin() + (classNameSize + 1) ) )
+		{
+			return namespaceSupporter->IsSameAreaNamespace( GetNamespaceScopes(),
+				NamespaceScopes( symbolNS.begin(), symbolNS.end() - 1 ) );
+		}
+	}
+	return false;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Template.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Template.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Template.cpp	(revision 774)
@@ -0,0 +1,32 @@
+#include "stdafx.h"
+
+ExpandedTemplateClass::~ExpandedTemplateClass()
+{
+	if( pClass )
+	{
+		delete pClass;
+	}
+}
+
+bool ExpandedTemplateClass::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	if( pClass->IsNeedResolve() )
+	{
+		CClass *pTempClass = const_cast<CClass *>(resolver.meta.GetClasses().FindLike( pClass ));
+		if( pTempClass )
+		{
+			this->pClass = pTempClass;
+		}
+		else
+		{
+			resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) );
+		}
+	}
+
+	BOOST_FOREACH( Type &actualType, actualTypes )
+	{
+		actualType.Resolve( resolver, resolveErrors );
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Type.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Type.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Type.cpp	(revision 774)
@@ -0,0 +1,694 @@
+#include "stdafx.h"
+
+const int Type::basicTypeList[] = {
+	DEF_BYTE,
+	DEF_SBYTE,
+	DEF_WORD,
+	DEF_INTEGER,
+	DEF_DWORD,
+	DEF_LONG,
+	DEF_QWORD,
+	DEF_INT64,
+
+	DEF_SINGLE,
+	DEF_DOUBLE,
+
+	DEF_BOOLEAN,
+
+	DEF_PTR_VOID,
+
+	DEF_ANY,
+
+	DEF_NON
+};
+
+const std::string Type::basicTypeNameList[] = {
+	"Byte",
+	"SByte",
+	"Word",
+	"Integer",
+	"DWord",
+	"Long",
+	"QWord",
+	"Int64",
+
+	"Single",
+	"Double",
+
+	"Boolean",
+
+	"VoidPtr",
+
+	"Any",
+
+	""
+};
+
+Type::~Type()
+{
+}
+
+bool Type::StringToBasicType( const std::string &typeName, int &basicType ){
+	for( int i=0; ; i++ ){
+		if( basicTypeList[i] == DEF_NON ){
+			break;
+		}
+		if( basicTypeNameList[i] == typeName ){
+			basicType = basicTypeList[i];
+			return true;
+		}
+	}
+	return false;
+}
+const char *Type::BasicTypeToCharPtr( const Type &type )
+{
+	for( int i=0; ; i++ ){
+		if( basicTypeList[i] == DEF_NON ){
+			break;
+		}
+		if( basicTypeList[i] == type.GetBasicType() ){
+			return basicTypeNameList[i].c_str();
+		}
+	}
+	return NULL;
+}
+
+int Type::GetBasicSize( int basicType )
+{
+
+	// 基本型
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_BOOLEAN:
+			return sizeof(BYTE);
+
+		case DEF_INTEGER:
+		case DEF_WORD:
+			return sizeof(WORD);
+
+		case DEF_LONG:
+		case DEF_DWORD:
+			return sizeof(DWORD);
+
+		case DEF_INT64:
+		case DEF_QWORD:
+			return sizeof(_int64);
+
+		case DEF_DOUBLE:
+			return sizeof(double);
+		case DEF_SINGLE:
+			return sizeof(float);
+	}
+
+	// ポインタ
+	if(IsPointer( basicType )){
+		return PTR_SIZE;
+	}
+
+	// オブジェクト
+	if(basicType==DEF_OBJECT){
+		return PTR_SIZE;
+	}
+
+	throw;
+
+	return 0;
+}
+
+const CClass &Type::GetClass() const
+{
+	if( !HasMember() )
+	{
+		Jenga::Throw( "クラスまたは構造体でない型に対してGetClassを呼び出した" );
+	}
+
+	return *pClass;
+}
+
+bool Type::Equals( const Type &type ) const
+{
+	if( basicType == type.basicType )
+	{
+		if( NATURAL_TYPE( basicType ) == DEF_OBJECT || NATURAL_TYPE( basicType ) == DEF_STRUCT )
+		{
+			// ポインタが等しいかどうかを見てみる
+			if( this->pClass == type.pClass )
+			{
+				return true;
+			}
+			else if( this->pClass->IsNeedResolve() || type.pClass->IsNeedResolve() )
+			{
+				// 依存関係解決前の状態であれば、パスが等しいかどうかを見てみる
+				if( this->pClass->IsDuplication( type.pClass ) )
+				{
+					return true;
+				}
+			}
+		}
+		else
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+bool Type::IsCovariant( const Type &type ) const
+{
+	if( !this->IsObject() || !type.IsObject() )
+	{
+		// 共変性の判別はクラス型のみ
+		return false;
+	}
+
+	return this->GetClass().IsSubClass( &type.GetClass() );
+}
+bool Type::IsContravariant( const Type &type ) const
+{
+	if( !this->IsObject() || !type.IsObject() )
+	{
+		// 反変性の判別はクラス型のみ
+		return false;
+	}
+
+	return type.GetClass().IsSubClass( &this->GetClass() );
+}
+
+int Type::GetBasicSize() const
+{
+	return GetBasicSize( basicType );
+}
+int Type::GetSize() const
+{
+
+	// 基本型
+	switch( basicType ){
+		case DEF_LONG:
+			if(index==LITERAL_NULL||index==LITERAL_M128_0||index==LITERAL_0_255){
+				return sizeof(BYTE);
+			}
+			else if(index==LITERAL_M32768_0||index==LITERAL_0_65535){
+				return sizeof(WORD);
+			}
+			return sizeof(DWORD);
+
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_BOOLEAN:
+			return sizeof(BYTE);
+
+		case DEF_INTEGER:
+		case DEF_WORD:
+			return sizeof(WORD);
+
+		case DEF_DWORD:
+			return sizeof(DWORD);
+
+		case DEF_INT64:
+		case DEF_QWORD:
+			return sizeof(_int64);
+
+		case DEF_DOUBLE:
+			return sizeof(double);
+		case DEF_SINGLE:
+			return sizeof(float);
+	}
+
+	// ポインタ
+	if(IsPointer()){
+		return PTR_SIZE;
+	}
+
+	// 構造体
+	if( IsStruct() )
+	{
+		if( !pClass ){
+			throw;
+		}
+
+		return pClass->GetSize();
+	}
+
+	// オブジェクト
+	if( IsObject() )
+	{
+		return PTR_SIZE;
+	}
+
+	throw;
+}
+
+bool Type::IsNull() const{
+  if( basicType == DEF_NON ){
+	  return true;
+  }
+  return false;
+}
+
+bool Type::IsByte() const{
+  if( basicType == DEF_BYTE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsSByte() const{
+  if( basicType == DEF_SBYTE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsWord() const{
+  if( basicType == DEF_WORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsInteger() const{
+  if( basicType == DEF_INTEGER ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsDWord() const{
+  if( basicType == DEF_DWORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsLong() const{
+  if( basicType == DEF_LONG ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsQWord() const{
+  if( basicType == DEF_QWORD ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsInt64() const{
+  if( basicType == DEF_INT64 ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsSingle() const{
+  if( basicType == DEF_SINGLE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsDouble() const{
+  if( basicType == DEF_DOUBLE ){
+	  return true;
+  }
+  return false;
+}
+bool Type::IsBoolean() const{
+  if( basicType == DEF_BOOLEAN ){
+	  return true;
+  }
+  return false;
+}
+
+bool Type::IsPointer( int basicType )
+{
+	if( basicType == DEF_NON )
+	{
+		return false;
+	}
+
+	if(PTR_LEVEL( basicType )|| basicType == DEF_PTR_VOID || basicType == DEF_PTR_PROC
+		|| ( basicType & FLAG_PTR ) ){
+			return true;
+	}
+
+	return false;
+}
+bool Type::IsPointer() const
+{
+	return IsPointer( basicType );
+}
+bool Type::IsSigned() const
+{
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_INTEGER:
+		case DEF_LONG:
+		case DEF_INT64:
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::IsNaturalWhole() const
+{
+	switch( basicType ){
+		case DEF_SBYTE:
+		case DEF_BYTE:
+		case DEF_INTEGER:
+		case DEF_WORD:
+		case DEF_LONG:
+		case DEF_DWORD:
+		case DEF_INT64:
+		case DEF_QWORD:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::IsWhole() const
+{
+	return (
+		IsNaturalWhole()
+		|| IsPointer( basicType )
+		|| basicType == DEF_BOOLEAN
+		);
+}
+bool Type::IsReal() const
+{
+	switch( basicType ){
+		case DEF_SINGLE:
+		case DEF_DOUBLE:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+bool Type::Is64() const
+{
+	switch( basicType ){
+		case DEF_QWORD:
+		case DEF_INT64:
+			return true;
+		default:
+			break;
+	}
+	return false;
+}
+
+bool Type::IsValueType() const
+{
+	return ( IsWhole() || IsReal() );
+}
+
+bool Type::IsProcPtr() const
+{
+	if( basicType == DEF_PTR_PROC ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsStruct() const
+{
+	if( basicType == DEF_STRUCT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsStructPtr() const
+{
+	if( basicType == DEF_PTR_STRUCT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsObject() const
+{
+	return (
+		basicType == DEF_OBJECT
+		|| basicType == DEF_TYPE_PARAMETER
+	);
+}
+bool Type::IsObjectPtr() const
+{
+	if( basicType == DEF_PTR_OBJECT ){
+		return true;
+	}
+	return false;
+}
+bool Type::IsTypeParameter() const
+{
+	return ( NATURAL_TYPE(basicType) == DEF_TYPE_PARAMETER );
+}
+bool Type::IsObjectClass() const
+{
+	if( basicType == DEF_OBJECT ){
+		if( pClass->GetName() == "Object" ){
+			return true;
+		}
+	}
+	return false;
+}
+bool Type::IsStringClass() const
+{
+	if( basicType == DEF_OBJECT ){
+		if( pClass->GetName() == "String" ){
+			return true;
+		}
+	}
+	return false;
+}
+bool Type::IsVoidPtr() const
+{
+	if( basicType == DEF_PTR_VOID ){
+		return true;
+	}
+	return false;
+}
+
+bool Type::IsAny() const
+{
+	if( basicType == DEF_ANY ){
+		return true;
+	}
+	return false;
+}
+
+bool Type::IsDelegate() const
+{
+	return ( IsObject() && GetClass().IsDelegate() );
+}
+bool Type::IsInterface() const
+{
+	return ( IsObject() && GetClass().IsInterface() );
+}
+bool Type::IsComInterface() const
+{
+	return ( IsObject() && GetClass().IsComInterface() );
+}
+
+
+bool Type::HasMember() const
+{
+	if( NATURAL_TYPE( basicType ) == DEF_OBJECT
+		|| NATURAL_TYPE( basicType ) == DEF_STRUCT
+		|| NATURAL_TYPE( basicType ) == DEF_TYPE_PARAMETER
+	){
+		return true;
+	}
+	return false;
+}
+
+const Type &Type::GetActualGenericType( int index ) const
+{
+	return actualGenericTypes[index].GetType();
+}
+bool Type::HasActualGenericType() const
+{
+	return ( actualGenericTypes.size() > 0 );
+}
+
+std::string Type::ToString() const
+{
+	const char *basicTypeName = BasicTypeToCharPtr( *this );
+	if( basicTypeName )
+	{
+		return basicTypeName;
+	}
+
+	if( IsTypeParameter() )
+	{
+		return GetFormalTypeName();
+	}
+
+	std::string typeName = GetClass().GetFullName();
+	if( HasActualGenericType() )
+	{
+		std::string actualGenericTypesName;
+		foreach( const GenericType &actualGenericType, actualGenericTypes )
+		{
+			if( actualGenericTypesName.size() )
+			{
+				actualGenericTypesName += ",";
+			}
+			actualGenericTypesName += actualGenericType.GetName();
+		}
+
+		typeName += "<" + actualGenericTypesName + ">";
+	}
+	return typeName;
+}
+
+int Type::GetBasicTypeFromSimpleName( const char *variable ){
+	extern char DefIntVari[26],DefSngVari[26],DefStrVari[26],divNum,dsvNum,dStrvNum;
+	int i;
+	char name[VN_SIZE];
+
+	//構造体メンバの場合を考慮
+	for(i=lstrlen(variable);i>0;i--){
+		if(variable[i]=='.'){
+			i++;
+			break;
+		}
+	}
+
+	for(;;i++){
+		if(variable[i]=='('||variable[i]=='\0'){
+			name[i]=0;
+			break;
+		}
+		name[i]=variable[i];
+	}
+	//変数名から選択
+	i--;
+	if(name[i]=='#') return DEF_DOUBLE;
+	if(name[i]=='!') return DEF_SINGLE;
+	if(name[i]=='%') return DEF_INTEGER;
+	return DEF_DOUBLE;
+}
+
+bool Type::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	if( this->HasMember() )
+	{
+		if( this->pClass->IsNeedResolve() )
+		{
+			const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass );
+			if( pTempClass )
+			{
+				this->pClass = pTempClass;
+			}
+			else
+			{
+				resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) );
+			}
+		}
+
+		BOOST_FOREACH( GenericType &actualGenericType, actualGenericTypes )
+		{
+			actualGenericType.GetType().Resolve( resolver, resolveErrors );
+		}
+	}
+	return true;
+}
+
+bool Types::IsEquals( const Types &types ) const
+{
+	if( this->size() != types.size() )
+	{
+		// アイテム数が違う
+		return false;
+	}
+
+	const Types &thisTypes = *this;
+	for( int i=0; i<static_cast<int>(this->size()); i++ )
+	{
+		if( !thisTypes[i].Equals( types[i] ) )
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+void ResolveFormalGenericTypeParameter( Type &typeParameter, const Type &classType, const UserProc *pUserProc )
+{
+	if( !typeParameter.IsTypeParameter() )
+	{
+		// ジェネリックな型ではなかったとき
+		return;
+	}
+
+	/////////////////////////////////////////////////////////
+	// ☆★☆ ジェネリクスサポート ☆★☆
+
+	// ポインタレベルを抽出
+	int ptrLevel = PTR_LEVEL( typeParameter.GetBasicType() );
+
+	if( pUserProc )
+	{
+		if( classType.IsObject() )
+		{
+			// 基底クラスでの自己解決
+			const CClass *pClass = &classType.GetClass();
+			while( pClass->HasSuperClass() )
+			{
+				if( pUserProc->GetParentClassPtr() == &pClass->GetSuperClass() )
+				{
+					if( pClass->GetSuperClassActualTypeParameters().size() )
+					{
+						// TODO: 適切な形に実装し直す（暫定的にトップの型を持ってきている）
+						typeParameter = pClass->GetSuperClassActualTypeParameters()[0];
+					}
+				}
+				pClass = &pClass->GetSuperClass();
+			}
+		}
+	}
+
+	if( typeParameter.IsTypeParameter() )
+	{
+		if( classType.HasActualGenericType() )
+		{
+			typeParameter = classType.GetActualGenericType( typeParameter.GetFormalTypeIndex() );
+		}
+		else
+		{
+			// 制約クラス（指定されていないときはObjectクラス）にセットする
+			typeParameter.SetBasicType( DEF_OBJECT );
+		}
+	}
+
+	for( int i=0; i<ptrLevel; i++ )
+	{
+		typeParameter.PtrLevelUp();
+	}
+
+	//
+	/////////////////////////////////////////////////////////
+}
+
+
+const std::string BlittableType::GetCreateStaticMethodFullName() const
+{
+	return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName() + "._Create";
+}
+
+bool BlittableType::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	basicType.Resolve( resolver, resolveErrors );
+
+	if( this->pClass->IsNeedResolve() )
+	{
+		const CClass *pTempClass = resolver.meta.GetClasses().FindLike( this->pClass );
+		if( pTempClass )
+		{
+			this->pClass = pTempClass;
+		}
+		else
+		{
+			resolveErrors.Add( ResolveError( this->pClass->GetRelationalObjectModuleIndex(), this->pClass->GetFullName() ) );
+		}
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/TypeDef.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/TypeDef.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/TypeDef.cpp	(revision 774)
@@ -0,0 +1,36 @@
+#include "stdafx.h"
+
+TypeDef::TypeDef( const Symbol &symbol, const std::string &baseName, const Type &baseType )
+	: RelationalObjectModuleItem( symbol )
+	, baseName( baseName )
+	, baseType( baseType )
+{
+}
+
+bool TypeDef::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	this->baseType.Resolve( resolver, resolveErrors );
+	return true;
+}
+
+TypeDefCollection::TypeDefCollection(){
+}
+TypeDefCollection::~TypeDefCollection(){
+}
+void TypeDefCollection::Add( const Symbol &symbol, const std::string &baseName, int nowLine ){
+	TypeDef typeDef( symbol, baseName, nowLine );
+	this->push_back( typeDef );
+}
+
+const TypeDef *TypeDefCollection::Find( const Symbol &symbol ) const
+{
+	const TypeDefCollection &typeDefs = *this;
+	foreach( const TypeDef &typeDef, typeDefs )
+	{
+		if( typeDef.IsEqualSymbol( symbol ) )
+		{
+			return &typeDef;
+		}
+	}
+	return NULL;
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Variable.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Variable.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Variable.cpp	(revision 774)
@@ -0,0 +1,119 @@
+#include "stdafx.h"
+
+Variable::Variable( const Symbol &symbol, const Type &type, bool isConst, bool isRef, const std::string &paramStrForConstructor, bool hasInitData )
+	: RelationalObjectModuleItem( symbol )
+	, type( type )
+	, isConst( isConst )
+	, isRef( isRef )
+	, isArray( false )
+	, isParameter( false)
+	, paramStrForConstructor( paramStrForConstructor )
+	, hasInitData( hasInitData )
+{
+}
+Variable::Variable( const Variable &var )
+	: RelationalObjectModuleItem( var )
+	, type( var.type )
+	, isConst( var.isConst )
+	, isRef( var.isRef )
+	, isArray( var.isArray )
+	, subscripts( var.subscripts )
+	, isParameter( false )
+	, paramStrForConstructor( var.paramStrForConstructor )
+	, hasInitData( var.hasInitData )
+{
+}
+Variable::Variable()
+{
+}
+
+bool Variable::Resolve( const ObjectModule &resolver, ResolveErrors &resolveErrors )
+{
+	this->type.Resolve( resolver, resolveErrors );
+	return true;
+}
+
+
+bool Variables::DuplicateCheck( const Symbol &symbol, int nowScopeLevel ) const
+{
+	//レキシカルスコープを考慮して重複判定
+	for( int i=(int)this->size()-1; i>=0 ; i-- ){
+		const Variable *pVar = (*this)[i];
+		if( pVar->isLiving									//現在のスコープで有効なもの
+			&& pVar->GetScopeLevel() == nowScopeLevel		//現在のスコープと同一レベル
+			)
+		{
+			if( pVar->IsEqualSymbol( symbol ) ){
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+const Variable *Variables::BackSearch( const Symbol &symbol, int nowScopeLevel ) const
+{
+	//レキシカルスコープを考慮してバックサーチ
+	for( int i=(int)this->size()-1; i>=0 ; i-- ){
+		const Variable *pVar = (*this)[i];
+		if( pVar->isLiving									//現在のスコープで有効なもの
+			&& pVar->GetScopeLevel() <= nowScopeLevel		//現在のスコープレベルを超さないもの（Returnによる解放処理中を考慮）
+			){
+				if( pVar->IsEqualSymbol( symbol ) ){
+					return pVar;
+				}
+		}
+	}
+	return NULL;
+}
+
+const Variable *Variables::Find( const Symbol &symbol )const
+{
+	int max = (int)this->size();
+	for( int i=0; i<max; i++ ){
+		Variable *pVar = (*this)[i];
+		if( pVar->IsEqualSymbol( symbol ) ){
+			return pVar;
+		}
+	}
+	return NULL;
+}
+
+void GlobalVars::Add( Variable *pVar, bool isResetOffsetAddress )
+{
+	int alignment = 0;
+	if( pVar->GetType().IsStruct() ){
+		alignment = pVar->GetType().GetClass().GetFixedAlignment();
+	}
+
+	if( pVar->HasInitData() ){
+		//初期バッファがあるとき
+
+		if( isResetOffsetAddress )
+		{
+			if( alignment ){
+				if( initAreaBuffer.GetSize() % alignment ){
+					initAreaBuffer.Resize( initAreaBuffer.GetSize() + ( alignment - (initAreaBuffer.GetSize() % alignment) ) );
+				}
+			}
+
+			pVar->SetOffsetAddress( initAreaBuffer.GetSize() );
+
+			initAreaBuffer.Resize( initAreaBuffer.GetSize() + pVar->GetMemorySize() );
+		}
+	}
+	else{
+		//初期バッファがないとき
+
+		if( alignment ){
+			if( allSize % alignment ){
+				allSize += alignment - (allSize % alignment);
+			}
+		}
+
+		pVar->SetOffsetAddress( allSize | 0x80000000 );
+		allSize += pVar->GetMemorySize();
+	}
+
+	push_back( pVar );
+}
Index: branches/egtra/ab5.0/abdev/ab_common/src/ResourceManager/ResourceManager.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/src/ResourceManager/ResourceManager.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/src/ResourceManager/ResourceManager.cpp	(revision 774)
@@ -0,0 +1,121 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::Common;
+
+
+void ResourceManager::Clear()
+{
+	this->cursorResources.clear();
+	this->bitmapResources.clear();
+	this->iconResources.clear();
+	this->manifestFilePath.clear();
+}
+
+bool ResourceManager::Load( const std::string &resourceFilePath )
+{
+	// まずはクリアする
+	this->Clear();
+
+
+	int i2,i3;
+	char temp2[MAX_PATH];
+	HANDLE hFile;
+
+	hFile=CreateFile(resourceFilePath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE)
+	{
+		return false;
+	}
+	i2=GetFileSize(hFile,NULL);
+	char *_buf = (char *)malloc(i2*2+1);
+	ReadFile(hFile,_buf,i2,(DWORD *)&i3,NULL);
+	CloseHandle(hFile);
+	_buf[i3]=0;
+	std::string buffer = _buf;
+	free(_buf);
+
+	// 改行コードのCRLFをLFに変換
+	Jenga::Common::StringReplace( buffer, "\r\n", "\n" );
+
+	std::string baseDir = Jenga::Common::Path::ExtractDirPath( resourceFilePath );
+
+	i2=0;
+	while(1){
+		//ID
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+		std::string _idname = Jenga::Common::EasyToken::GetIdentifierToken( buffer, i2 );
+
+		if( _idname.size() == 0 )
+		{
+			break;
+		}
+
+		//Type
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		char temporary[MAX_PATH];
+		lstrcpy( temporary, Jenga::Common::EasyToken::GetIdentifierToken( buffer, i2 ).c_str() );
+
+		//FileName
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		if(buffer[i2]!='\"'){
+			//エラー
+			return false;
+		}
+		for(i2++,i3=0;;i2++,i3++){
+			if(buffer[i2]=='\"'){
+				temp2[i3]=0;
+				break;
+			}
+			temp2[i3]=buffer[i2];
+		}
+		lstrcpy( temp2, Jenga::Common::Directory( baseDir ).GetFullPath( temp2 ).c_str() );
+
+		ResourceItem item;
+		item.idName = _idname;
+		item.filepath = temp2;
+
+		if(lstrcmpi(temporary,"CURSOR")==0)
+		{
+			this->cursorResources.push_back( item );
+		}
+		else if(lstrcmpi(temporary,"BITMAP")==0)
+		{
+			this->bitmapResources.push_back( item );
+		}
+		else if(lstrcmpi(temporary,"ICON")==0)
+		{
+			this->iconResources.push_back( item );
+		}
+		else if(lstrcmpi(temporary,"RT_MANIFEST")==0)
+		{
+			if( !this->manifestFilePath.empty() )
+			{
+				// 埋め込みマニフェストが2つ以上指定された
+				return false;
+			}
+
+			this->manifestFilePath = temp2;
+		}
+		else
+		{
+			return false;
+		}
+
+		i2++;
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+		if(buffer[i2]=='\0') break;
+		else if(buffer[i2]!='\n')
+		{
+			return false;
+		}
+		i2++;
+	}
+
+	return true;
+}
+
+bool ResourceManager::HasManifest() const
+{
+	return !this->manifestFilePath.empty();
+}
Index: branches/egtra/ab5.0/abdev/ab_common/stdafx.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/stdafx.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/stdafx.cpp	(revision 774)
@@ -0,0 +1,1 @@
+#include "stdafx.h"
Index: branches/egtra/ab5.0/abdev/ab_common/stdafx.h
===================================================================
--- branches/egtra/ab5.0/abdev/ab_common/stdafx.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_common/stdafx.h	(revision 774)
@@ -0,0 +1,29 @@
+#pragma once
+#pragma strict_gs_check(on)
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <assert.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+
+#include <jenga/include/jenga.h>
+
+#include "include/ab_common.h"
Index: branches/egtra/ab5.0/abdev/ab_x64.sln
===================================================================
--- branches/egtra/ab5.0/abdev/ab_x64.sln	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_x64.sln	(revision 774)
@@ -0,0 +1,32 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenga", "..\jenga\projects\jenga\jenga.vcproj", "{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ab_common", "ab_common\ab_common.vcproj", "{87835C33-64C9-4BA5-9B39-608BA5394387}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "compiler_x64", "compiler_x64\compiler_x64.vcproj", "{864B921B-423B-4F9E-9E6B-31B15968EDF9}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Debug|Win32.ActiveCfg = Debug(x64)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Debug|Win32.Build.0 = Debug(x64)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Release|Win32.ActiveCfg = Release(x64)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Release|Win32.Build.0 = Release(x64)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Debug|Win32.ActiveCfg = Debug(x64)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Debug|Win32.Build.0 = Debug(x64)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Release|Win32.ActiveCfg = Release(x64)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Release|Win32.Build.0 = Release(x64)|Win32
+		{864B921B-423B-4F9E-9E6B-31B15968EDF9}.Debug|Win32.ActiveCfg = Debug|Win32
+		{864B921B-423B-4F9E-9E6B-31B15968EDF9}.Debug|Win32.Build.0 = Debug|Win32
+		{864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.ActiveCfg = Release|Win32
+		{864B921B-423B-4F9E-9E6B-31B15968EDF9}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: branches/egtra/ab5.0/abdev/ab_x86.sln
===================================================================
--- branches/egtra/ab5.0/abdev/ab_x86.sln	(revision 774)
+++ branches/egtra/ab5.0/abdev/ab_x86.sln	(revision 774)
@@ -0,0 +1,56 @@
+﻿
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual C++ Express 2005
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenga", "..\jenga\projects\jenga\jenga.vcproj", "{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ab_common", "ab_common\ab_common.vcproj", "{87835C33-64C9-4BA5-9B39-608BA5394387}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "abdev", "abdev\abdev.vcproj", "{DC1B787E-510F-4F7D-8F9A-182600904D83}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "compiler_x86", "compiler_x86\compiler_x86.vcproj", "{11F0E9AB-EAEC-4616-A9DD-838073342CBB}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+		TheText_Debug|Win32 = TheText_Debug|Win32
+		TheText_Release|Win32 = TheText_Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Debug|Win32.ActiveCfg = Debug(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Debug|Win32.Build.0 = Debug(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Release|Win32.ActiveCfg = Release(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.Release|Win32.Build.0 = Release(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.TheText_Debug|Win32.ActiveCfg = Debug(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.TheText_Debug|Win32.Build.0 = Debug(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.TheText_Release|Win32.ActiveCfg = Release(x86)|Win32
+		{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}.TheText_Release|Win32.Build.0 = Release(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Debug|Win32.ActiveCfg = Debug(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Debug|Win32.Build.0 = Debug(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Release|Win32.ActiveCfg = Release(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.Release|Win32.Build.0 = Release(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.TheText_Debug|Win32.ActiveCfg = Debug(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.TheText_Debug|Win32.Build.0 = Debug(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.TheText_Release|Win32.ActiveCfg = Release(x86)|Win32
+		{87835C33-64C9-4BA5-9B39-608BA5394387}.TheText_Release|Win32.Build.0 = Release(x86)|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.Debug|Win32.ActiveCfg = Debug|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.Debug|Win32.Build.0 = Debug|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.Release|Win32.ActiveCfg = Release|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.Release|Win32.Build.0 = Release|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Debug|Win32.ActiveCfg = TheText_Debug|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Debug|Win32.Build.0 = TheText_Debug|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Release|Win32.ActiveCfg = TheText_Release|Win32
+		{DC1B787E-510F-4F7D-8F9A-182600904D83}.TheText_Release|Win32.Build.0 = TheText_Release|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Debug|Win32.ActiveCfg = Debug|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Debug|Win32.Build.0 = Debug|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Release|Win32.ActiveCfg = Release|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.Release|Win32.Build.0 = Release|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.TheText_Debug|Win32.ActiveCfg = Debug|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.TheText_Debug|Win32.Build.0 = Debug|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.TheText_Release|Win32.ActiveCfg = Release|Win32
+		{11F0E9AB-EAEC-4616-A9DD-838073342CBB}.TheText_Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
Index: branches/egtra/ab5.0/abdev/abdev/Attach.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Attach.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Attach.cpp	(revision 774)
@@ -0,0 +1,335 @@
+#include "stdafx.h"
+
+#ifndef THETEXT
+
+#include "common.h"
+#include <psapi.h>
+#include <tlhelp32.h>
+
+#pragma comment(lib, "psapi.lib")
+
+using namespace ActiveBasic::IDE;
+
+HRESULT ApplyDialogTexture( HWND );
+
+
+int GetSelectingProcessId(HWND hListView,DWORD *lpdwPlatform){
+	int nCount;
+	nCount=ListView_GetItemCount(hListView);
+
+	char temporary[255];
+	DWORD dwProcessId;
+	int i;
+	for(i=0;i<nCount;i++){
+		if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+			ListView_GetItemText(hListView,i,1,temporary,255);
+			dwProcessId=atoi(temporary);
+
+			ListView_GetItemText(hListView,i,2,temporary,255);
+			if(lstrcmpi(temporary,"Win32")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_I386;
+			else if(lstrcmpi(temporary,"Win64")==0) *lpdwPlatform=IMAGE_FILE_MACHINE_AMD64;
+			break;
+		}
+	}
+	if(i==nCount) return 0;
+
+	return dwProcessId;
+}
+
+void InsertProcess_ToListView(HWND hListView,char *lpszAppPath,int id,char *lpszPlatform,char *lpszTitle){
+	char szAppName[MAX_PATH],temp2[MAX_PATH];
+	_splitpath(lpszAppPath,NULL,NULL,szAppName,temp2);
+	lstrcat(szAppName,temp2);
+
+	//イメージリストを取得
+	HIMAGELIST hImageList;
+	hImageList=ListView_GetImageList(hListView,LVSIL_SMALL );
+
+	//アイコンを取得
+	int iImage;
+	SHFILEINFO shfi;
+	SHGetFileInfo(lpszAppPath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
+	if(shfi.hIcon){
+		iImage=ImageList_AddIcon(hImageList,shfi.hIcon);
+		DestroyIcon(shfi.hIcon);
+	}
+	else iImage=-1;
+
+	char szId[255];
+	sprintf(szId,"%d",id);
+
+	//リストビューに追加
+	LV_ITEM item;
+	if(iImage==-1) item.mask=LVIF_TEXT;
+	else item.mask=LVIF_TEXT|LVIF_IMAGE;
+	item.iItem=0;
+
+	item.pszText=szAppName;
+	item.iSubItem=0;
+	item.iImage=iImage;
+	ListView_InsertItem(hListView,&item);
+
+	item.mask=LVIF_TEXT ;
+	item.pszText=szId;
+	item.iSubItem++;
+	ListView_SetItem(hListView,&item);
+
+	item.pszText=lpszPlatform;
+	item.iSubItem++;
+	ListView_SetItem(hListView,&item);
+
+	item.pszText=lpszTitle;
+	item.iSubItem++;
+	ListView_SetItem(hListView,&item);
+}
+
+void ListupProcesses64(HWND hListView)
+{
+	ListView_DeleteAllItems(hListView);
+
+
+	/////////////////////////////////////////////////////
+	// 64ビット版プロセス列挙モジュールを呼び出す
+	/////////////////////////////////////////////////////
+
+	std::string enumProcess64ExePath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\enum_process64.exe";
+
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	memset(&si,0,sizeof(STARTUPINFO));
+	si.cb=sizeof(STARTUPINFO);
+	CreateProcess(NULL,const_cast<char *>(enumProcess64ExePath.c_str()),NULL,NULL,0,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
+
+	WaitForSingleObject(pi.hProcess,INFINITE);
+
+
+	//////////////////////////////////
+	// 生成されたファイルの読み込み
+	//////////////////////////////////
+
+	std::string listPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\enum_process64\\list.dat";
+
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg( listPath );
+	if(!buffer) return;
+
+	int i=0;
+	char temporary[MAX_PATH];
+	while(1){
+		//ファイルパス
+		char szAppPath[MAX_PATH];
+		i=GetOneParameter(buffer,i,szAppPath);
+		if(szAppPath[0]=='\0') break;
+		RemoveStringQuotes(szAppPath);
+
+		//プロセスID
+		DWORD dwProcessId;
+		i=GetOneParameter(buffer,i,temporary);
+		if(temporary[0]=='\0') break;
+		dwProcessId=(DWORD)atoi(temporary);
+
+		//プラットフォーム
+		char szPlatform[255];
+		i=GetOneParameter(buffer,i,szPlatform);
+		if(temporary[0]=='\0') break;
+
+		//タイトル
+		char szTitle[255];
+		int i2;
+		for(i2=0;;i++,i2++){
+			if(IS_RETURN(buffer,i)||buffer[i]=='\0'){
+				szTitle[i2]=0;
+				break;
+			}
+			szTitle[i2]=buffer[i];
+		}
+
+
+		//リストビューへ追加
+		InsertProcess_ToListView(hListView,szAppPath,dwProcessId,szPlatform,szTitle);
+
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
+		if(buffer[i]=='\0') break;
+	}
+
+	HeapDefaultFree(buffer);
+}
+
+// EnumWindowsProcコールバック関数
+BOOL CALLBACK FindWindowProc(HWND hwnd, LPARAM lParam)
+{
+    HWND* pphWnd = (HWND*)lParam;
+    *pphWnd = hwnd;
+    return FALSE; /* 列挙を中断 */
+}
+void ListupProcesses(HWND hListView){
+	char temporary[MAX_PATH];
+
+	ListView_DeleteAllItems(hListView);
+
+	DWORD *pdwProcessId;
+	pdwProcessId=(DWORD *)HeapAlloc(hHeap,0,8192*sizeof(DWORD));
+
+	//プロセスを列挙
+	DWORD cbNeeded;
+	EnumProcesses(pdwProcessId,8192*sizeof(DWORD),&cbNeeded);
+
+	char szMyAppPath[MAX_PATH];
+	GetModuleFileName(GetModuleHandle(0),szMyAppPath,MAX_PATH);
+
+	int i;
+	for(i=0;i<(int)(cbNeeded/sizeof(DWORD));i++){
+
+		//プロセスIDを元にハンドルを取得
+		HANDLE hProcess;
+		hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pdwProcessId[i]);
+		if(!hProcess) continue;
+
+		//そのプロセスにおける実行モジュールのインスタンスハンドルを取得
+		HINSTANCE hModule;
+		DWORD cbReturned;
+		if(!EnumProcessModules( hProcess, &hModule, sizeof(HINSTANCE), &cbReturned ))
+			continue;
+
+		//実行ファイル名を取得
+		GetModuleFileNameEx(hProcess,hModule,temporary,MAX_PATH);
+
+
+		//////////////////////////////
+		// ウィンドウタイトルを取得
+		//////////////////////////////
+
+		//スナップショットを取得
+		HANDLE hSnapshot;
+		hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
+
+		THREADENTRY32 te;
+		memset(&te,0,sizeof(THREADENTRY32));
+		te.dwSize=sizeof(THREADENTRY32);
+		if(Thread32First(hSnapshot,&te)){
+			do{
+				if(te.th32OwnerProcessID==pdwProcessId[i]){
+					break;
+				}
+			}while(Thread32Next(hSnapshot,&te));
+		}
+
+		HWND hwnd;
+		hwnd=0;
+		EnumThreadWindows(te.th32ThreadID,FindWindowProc,(LPARAM)&hwnd);
+
+		while(GetParent(hwnd)) hwnd=GetParent(hwnd);
+
+		char szWndTitle[1024];
+		szWndTitle[0]=0;
+		if(hwnd) GetWindowText(hwnd,szWndTitle,1024);
+
+		CloseHandle(hSnapshot);
+
+
+
+		CloseHandle(hProcess);
+
+		if(lstrcmpi(szMyAppPath,temporary)==0){
+			//自分自身（ProjectEditor.exe）は無視
+			continue;
+		}
+
+		//リストビューへ追加
+		InsertProcess_ToListView(hListView,temporary,pdwProcessId[i],"Win32",szWndTitle);
+	}
+
+	HeapDefaultFree(pdwProcessId);
+}
+
+INT_PTR CALLBACK DlgAttach(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static HWND hListView;
+	static HIMAGELIST hImageList;
+	static DWORD *lpdwPlatform;
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			lpdwPlatform=(DWORD *)lParam;
+
+			hListView=GetDlgItem(hwnd,IDC_PROCESSLIST);
+
+			//拡張スタイル
+			DWORD dwStyle;
+			dwStyle=ListView_GetExtendedListViewStyle(hListView);
+			dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
+			ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+
+			//イメージリストの生成と設定
+			hImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,0,0);
+			ListView_SetImageList(hListView,hImageList,LVSIL_SMALL );
+
+
+			///////////////////////////
+			// カラムをセット
+			///////////////////////////
+
+			LV_COLUMN ListView_Column;
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			ListView_Column.cx=150;
+			ListView_Column.pszText="プロセス名";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=70;
+			ListView_Column.pszText="ID";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=50;
+			ListView_Column.pszText="種別";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=200;
+			ListView_Column.pszText="タイトル";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+
+			//リスビューを更新
+			if(IsWow64()) ListupProcesses64(hListView);
+			else ListupProcesses(hListView);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					EndDialog(hwnd,GetSelectingProcessId(hListView,lpdwPlatform));
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			return 0;
+
+		case WM_NOTIFY:
+			NMLISTVIEW *nmListView;
+			nmListView=(NMLISTVIEW *)lParam;
+			if(nmListView->hdr.hwndFrom==hListView){
+				if(nmListView->hdr.code==NM_DBLCLK){
+					if(nmListView->iItem==-1) return 1;
+					SendMessage(hwnd,WM_COMMAND,IDOK,0);
+					return 1;
+				}
+			}
+			break;
+
+		case WM_DESTROY:
+			ImageList_Destroy(hImageList);
+			return 1;
+	}
+	return 0;
+}
+
+
+#endif //THETEXT
Index: branches/egtra/ab5.0/abdev/abdev/Attach.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Attach.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Attach.h	(revision 774)
@@ -0,0 +1,2 @@
+
+INT_PTR CALLBACK DlgAttach(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
Index: branches/egtra/ab5.0/abdev/abdev/BREGEXP.H
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/BREGEXP.H	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/BREGEXP.H	(revision 774)
@@ -0,0 +1,77 @@
+/*
+Visual Basic からお使いのときは次のDeclare文を使ってください。
+Private Declare Function Match Lib "bregexp" _
+      (szRegstr As String, szTarget As String) As String
+
+
+Private Declare Function Replace Lib "bregexp" _
+      (szRegstr As String, szTarget As String) As String
+
+Private Declare Function Translate Lib "bregexp" _
+      (szRegstr As String, szTarget As String, ret As String) As Long
+
+Private Declare Function Split Lib "bregexp" _
+      (szRegstr As String, szTarget As String, limit As Long) As Variant
+
+Private Declare Function MatchEx Lib "bregexp" _
+      (szRegstr As String, szTarget As String, mode As Long) As Variant
+
+*/
+
+
+#ifdef _BREGEXP_
+#define BREGEXPAPI __declspec(dllexport) 
+#else
+#define BREGEXPAPI __declspec(dllimport) 
+#endif
+
+typedef struct bregexp {
+	const char *outp;			/* result std::string start ptr   */
+	const char *outendp;		/* result std::string end ptr     */ 
+	const int  splitctr;		/* split result counter     */ 
+	const char **splitp;		/* split result pointer ptr     */ 
+	int     rsv1;				/* reserved for external use    */ 
+} BREGEXP;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+typedef BREGEXPAPI int (*PFUNC_BMatch)(char* str,char *target,char *targetendp,
+								BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BSubst)(char* str,char *target,char *targetendp,
+								BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BTrans)(char* str,char *target,char *targetendp,
+								BREGEXP **rxp,char *msg) ;
+typedef BREGEXPAPI int (*PFUNC_BSplit)(char* str,char *target,char *targetendp,
+						int limit,BREGEXP **rxp,char *msg);
+typedef BREGEXPAPI void (*PFUNC_BRegfree)(BREGEXP* rx);
+
+typedef BREGEXPAPI char *(*PFUNC_BRegexpVersion)(void);
+
+
+class CRegExp{
+	HINSTANCE hLib;
+public:
+	CRegExp();
+	~CRegExp();
+	PFUNC_BMatch BMatch;
+	PFUNC_BSubst BSubst;
+	PFUNC_BTrans BTrans;
+	PFUNC_BSplit BSplit;
+	PFUNC_BRegfree BRegfree;
+	PFUNC_BRegexpVersion BRegexpVersion;
+
+	char *compare(HWND hFindDlg,char *buffer,char *exp,BOOL IsBigSmall, bool isWordUnit, int *pLength);
+	char *GetPermuStr(HWND hFindDlg,char *buffer,char *exp,char *szPermu,BOOL IsBigSmall);
+};
+extern CRegExp obj_RegExp;
+
+
+#if defined(__cplusplus)
+}
+#endif
+
+
+#undef BREGEXPAPI
Index: branches/egtra/ab5.0/abdev/abdev/Backup.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Backup.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Backup.cpp	(revision 774)
@@ -0,0 +1,209 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+
+char szBackupDirPath[MAX_PATH];
+
+void CreateBackupDir(void){
+	//自動バックアップ用のフォルダを取得
+	extern char szBackupDirPath[MAX_PATH];
+	GUID guid;
+	char *temp2;
+	CoCreateGuid(&guid);
+	UuidToString(&guid,(unsigned char **)&temp2);
+
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	ShortPathToLongPath(temporary,szBackupDirPath);
+	if(szBackupDirPath[lstrlen(szBackupDirPath)-1]!='\\') lstrcat(szBackupDirPath,"\\");
+
+#ifdef THETEXT
+	lstrcat(szBackupDirPath,"TheText_Temporary_");
+#else
+	lstrcat(szBackupDirPath,"abdev_temporary_");
+#endif
+	lstrcat(szBackupDirPath,temp2);
+	RpcStringFree((unsigned char **)&temp2);
+
+	CreateDirectory(szBackupDirPath,NULL);
+	lstrcat(szBackupDirPath,"\\");
+}
+
+
+void backup(void *dummy){
+	extern char szBackupDirPath[MAX_PATH];
+	int i,iNum=0;
+	char temporary[MAX_PATH];
+
+	lstrcpy( temporary, szBackupDirPath );
+	if( temporary[lstrlen(temporary)-1] == '\\' ) temporary[lstrlen(temporary)-1] = 0;
+	if( !IsExistDirectory( temporary ) ){
+		//バックアップ用一時ディレクトリが存在しないときは作る
+		CreateDirectory( temporary, NULL );
+	}
+
+	char *temp2;
+	temp2=(char *)malloc(8192);
+	sprintf(temp2,"%x\r\n",hOwner);
+
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd){
+			int WndNum;
+			WndNum=i;
+
+			if(!IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)) continue;
+
+			//ファイルを保存
+			sprintf(temporary,"%sdocument%02d.txt",szBackupDirPath,iNum);
+			WriteBuffer(temporary,MdiInfo[WndNum]->pMdiTextEdit->buffer,lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer), false);
+
+			//情報を追加
+			sprintf(temp2+lstrlen(temp2),"%s\r\n",MdiInfo[WndNum]->path.c_str());
+
+			iNum++;
+		}
+	}
+
+	//バックアップヘッダ
+	sprintf(temporary,"%sinfo.txt",szBackupDirPath);
+	WriteBuffer_NonErrMsg(temporary,temp2,lstrlen(temp2));
+
+	free(temp2);
+}
+
+
+void RestoreBeforeState(const char *dir_path,char *pHeaderBuffer){
+	int i,i2;
+	for(i=0;;i++){
+		if(pHeaderBuffer[i]=='\0') break;
+		if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n') break;
+	}
+	if(pHeaderBuffer[i]=='\0') return;
+	i+=2;
+
+
+	int iDocNum=0;
+	char temporary[MAX_PATH];
+	while(1){
+		//元のファイルパスを取得
+		char szBeforeFilePath[MAX_PATH];
+		for(i2=0;;i++,i2++){
+			if(pHeaderBuffer[i]=='\r'&&pHeaderBuffer[i+1]=='\n'){
+				szBeforeFilePath[i2]=0;
+				break;
+			}
+			szBeforeFilePath[i2]=pHeaderBuffer[i];
+			if(pHeaderBuffer[i]=='\0') break;
+		}
+		if(pHeaderBuffer[i]=='\0') break;
+
+		sprintf(temporary,"%sdocument%02d.txt",dir_path,iDocNum);
+
+		HWND hChild;
+		hChild=NewTextEditWindow(temporary,WNDTYPE_TEXT);
+		int WndNum;
+		WndNum=GetWndNum(hChild);
+
+		char szOldTitle[MAX_PATH];
+		lstrcpy(szOldTitle,MdiInfo[WndNum]->title.c_str());
+
+		//ドキュメント セレクト コンボボックスから消去
+		extern HWND hDocCombo;
+		i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[WndNum]->title.c_str());
+		SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
+
+		//パスを変更
+		MdiInfo[WndNum]->path = szBeforeFilePath;
+
+		//ドキュメント セレクト コンボボックスに挿入
+		char str[MAX_PATH],str2[MAX_PATH];
+		if(szBeforeFilePath[0]){
+			_splitpath(szBeforeFilePath,NULL,NULL,str,str2);
+			lstrcat(str,str2);
+		}
+		else{
+			extern int DocumentCounter;
+			DocumentCounter++;
+			sprintf(str,"Document[%d]",DocumentCounter);
+		}
+		DuplicateTitleCheck(str);
+		MdiInfo[WndNum]->title = str;
+		SendMessage(hDocCombo,CB_ADDSTRING,0,(long)MdiInfo[WndNum]->title.c_str());
+		i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
+		SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+
+		//MDIウィンドウのタイトルを再設定
+		SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
+
+		//タブコントロールを再設定
+		COLORREF TabColor;
+		TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath(MdiInfo[WndNum]->path);
+		pobj_MainTab->DeleteItem( szOldTitle, false );
+		pobj_MainTab->InsertItem( hChild, MdiInfo[WndNum]->title.c_str(), false, TabColor );
+
+		MdiInfo[WndNum]->pMdiTextEdit->Modify();
+
+
+		iDocNum++;
+
+		i+=2;
+		if(pHeaderBuffer[i]=='\0') break;
+	}
+
+	RemoveDirectoryStrong(dir_path);
+}
+
+
+BOOL restore(void){
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	char temporary[MAX_PATH],*temp2;
+
+	char szTempPath[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	ShortPathToLongPath(temporary,szTempPath);
+	if(szTempPath[lstrlen(szTempPath)-1]!='\\') lstrcat(szTempPath,"\\");
+
+	sprintf(temporary,"%s*",szTempPath);
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind!=INVALID_HANDLE_VALUE){
+		do{
+			if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
+#ifdef THETEXT
+				if(memcmp(wfd.cFileName,"TheText_Temporary_",18)==0){
+#else
+				if(memcmp(wfd.cFileName,"abdev_temporary_",16)==0){
+#endif
+					sprintf(temporary,"%s%s\\info.txt",szTempPath,wfd.cFileName);
+					temp2=ReadBuffer_NonErrMsg(temporary);
+					if(temp2){
+						HWND hTemp;
+						sscanf(temp2,"%x",&hTemp);
+						if(!IsWindow(hTemp)){
+							sprintf(temporary,"前回、%sが異常終了した可能性があります。データを復元しますか？",APPLICATION_NAME);
+							if(MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNO)==IDNO){
+								HeapDefaultFree(temp2);
+
+								sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
+								RemoveDirectoryStrong(temporary);
+								return 0;
+							}
+
+							sprintf(temporary,"%s%s\\",szTempPath,wfd.cFileName);
+							RestoreBeforeState(temporary,temp2);
+
+							HeapDefaultFree(temp2);
+
+							return 1;
+						}
+
+						HeapDefaultFree(temp2);
+					}
+				}
+			}
+		}while(FindNextFile(hFind,&wfd));
+	}
+
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/CClassInfo.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/CClassInfo.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/CClassInfo.cpp	(revision 774)
@@ -0,0 +1,300 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+
+CClassInfo::CClassInfo(){
+	pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
+	MemberNum=0;
+}
+CClassInfo::~CClassInfo(){
+	int i;
+	for(i=0;i<MemberNum;i++){
+		HeapDefaultFree(pMemberInfo[i].pName);
+	}
+	HeapDefaultFree(pMemberInfo);
+}
+
+int CClassInfo::Analyze(char *pBuf,int *p){
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	i=*p;
+
+	DWORD dwAccess;
+
+	//種類を取得
+	DWORD dwClassType;
+	if(memicmp(pBuf+i,"Class",5)==0){
+		dwClassType=ESC_CLASS;
+		i+=5;
+
+		dwAccess=ACCESS_PRIVATE;
+	}
+	else if(memicmp(pBuf+i,"Type",4)==0){
+		dwClassType=ESC_TYPE;
+		i+=4;
+
+		dwAccess=ACCESS_PUBLIC;
+	}
+	else if(memicmp(pBuf+i,"Interface",9)==0){
+		dwClassType=ESC_INTERFACE;
+		i+=9;
+
+		dwAccess=ACCESS_PUBLIC;
+	}
+	else return 0;
+	JumpBlank(pBuf,&i);
+
+
+	//クラス名を取得
+	for(i2=0;;i++,i2++){
+		if(!(IsVariableChar(pBuf[i])||pBuf[i]=='~')){
+			ClassName[i2]=0;
+			break;
+		}
+		ClassName[i2]=pBuf[i];
+	}
+	JumpBlank(pBuf,&i);
+
+
+	//メンバ変数、関数を取得
+	while(1){
+		if(pBuf[i]=='\0') break;
+		if(memicmp(pBuf+i,"End",3)==0){
+			/*	End Class
+				End Type
+				の検出 */
+			i2=i+3;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+			if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
+				memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
+				memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))){
+				while(!IsCommandDelimitation(pBuf,i2)) i2++;
+				i=i2;
+				break;
+			}
+		}
+
+		// Static/Constを飛ばす
+		if( memicmp(pBuf+i,"Static",6)==0 ){
+			// Static
+			i+=6;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		if(pBuf[i]=='c'||pBuf[i]=='C'){
+			// Const
+			i+=5;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+
+		DWORD dwProc;
+		if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
+			memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+			//メンバ関数のとき
+
+			if(pBuf[i]=='a'||pBuf[i]=='A'){
+				i+=9;
+				dwProc=ESC_ABSTRACT;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='v'||pBuf[i]=='V'){
+				i+=8;
+				dwProc=ESC_VIRTUAL;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='o'||pBuf[i]=='O'){
+				i+=9;
+				dwProc=ESC_OVERRIDE;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='f'||pBuf[i]=='F'){
+				i+=9;
+				dwProc=ESC_FUNCTION;
+			}
+			else if(pBuf[i]=='s'||pBuf[i]=='S'){
+				i+=4;
+				dwProc=ESC_SUB;
+			}
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		else{
+			//メンバ変数のとき
+			dwProc=0;
+		}
+
+		int code_pos;
+		code_pos=i;
+
+		//変数名または関数名を取得
+		if(pBuf[i]=='~'){
+			temporary[0]='~';
+			i2=1;
+			i++;
+		}
+		else i2=0;
+		for(;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			if(pBuf[i]=='\''||(pBuf[i]=='/'&&pBuf[i+1]=='*')){
+				//コメント中
+				JumpBlank(pBuf,&i);
+				break;
+			}
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				i+=i2;
+				break;
+			}
+		}
+		JumpBlank(pBuf,&i);
+
+		if(lstrcmpi(temporary,"Inherits")==0){
+			//継承指定の場合（ツリーに反映すべきデータはないので無視する）
+			continue;
+		}
+
+		//アクセスを変更
+		if(lstrcmpi(temporary,"Private")==0){
+			dwAccess=ACCESS_PRIVATE;
+			continue;
+		}
+		if(lstrcmpi(temporary,"Public")==0){
+			dwAccess=ACCESS_PUBLIC;
+			continue;
+		}
+		if(lstrcmpi(temporary,"Protected")==0){
+			dwAccess=ACCESS_PROTECTED;
+			continue;
+		}
+
+		//重複チェック（オーバーライド関数を考慮）
+		for(i2=0;i2<MemberNum;i2++){
+			if(lstrcmp(pMemberInfo[i2].pName,temporary)==0){
+				lstrcat(temporary," ");
+				break;
+			}
+		}
+
+		pMemberInfo=
+			(MEMBERINFO *)HeapReAlloc(hHeap,
+				0,
+				pMemberInfo,
+				(MemberNum+1)*sizeof(MEMBERINFO));
+
+		//メンバ名
+		pMemberInfo[MemberNum].pName=
+			(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(pMemberInfo[MemberNum].pName,
+			temporary);
+
+		//メンバの種類（変数、Virtual、Sub、Function）
+		pMemberInfo[MemberNum].dwProc=dwProc;
+
+		//アクセシビリティ
+		pMemberInfo[MemberNum].dwAccess=dwAccess;
+
+		//コードの位置
+		pMemberInfo[MemberNum].code_pos=code_pos;
+
+		MemberNum++;
+
+		if(dwProc){
+			//Abstract定義以外はEnd Sub、End Functionをサーチする
+			if(dwProc==ESC_ABSTRACT) continue;
+			if(dwClassType==ESC_INTERFACE) continue;
+
+			while(1){
+				if(pBuf[i]=='\0'){
+					i2=0;
+					break;
+				}
+
+				if(memicmp(pBuf+i,"End",3)==0){
+					/*	End Sub
+						End Function
+						の検出 */
+					i+=3;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+					if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
+						memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
+						i2=1;
+						break;
+					}
+
+					if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
+						memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
+						memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
+						i2=0;
+						break;
+					}
+				}
+
+				//次の行をサーチ
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+			}
+
+			if(i2==0){
+				//コード解析が不正に終了
+				*p=i;
+				return 0;
+			}
+
+			//次の行をサーチ
+			for(;;i++){
+				if(pBuf[i]=='\0') break;
+				i2=IsCommandDelimitation(pBuf,i);
+				if(i2){
+					i+=i2;
+					break;
+				}
+			}
+			JumpBlank(pBuf,&i);
+		}
+	}
+
+	*p=i;
+
+	return 1;
+}
+
+
Index: branches/egtra/ab5.0/abdev/abdev/CIEsink.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/CIEsink.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/CIEsink.h	(revision 774)
@@ -0,0 +1,64 @@
+#include <atlbase.h>	// ATL基本機能用ヘッダファイル
+#include <atlcom.h>		// ATL COM共通用ヘッダファイル
+#include <atlhost.h>	// ATL コンテナ機能サポート用ヘッダファイル
+#include <EXDISPID.H>
+
+// 数字は任意。詳しくはIDispatchImplのドキュメント参照
+#define SINKID_COUNTEREVENTS 0
+
+/* CIESink : シンク(イベント受付窓口)クラス */
+class ATL_NO_VTABLE CIESink :
+	public CComObjectRootEx<CComSingleThreadModel>,
+	public IDispEventImpl<SINKID_COUNTEREVENTS, CIESink, &DIID_DWebBrowserEvents2>
+{
+private:
+	CComPtr<IUnknown> m_pUnkIE;
+
+public:
+	CIESink() {}
+
+	HRESULT AdviseToIE( CComPtr<IUnknown> pUnkIE)
+	{
+		m_pUnkIE = pUnkIE;
+		
+		// タイプ ライブラリへのポインタやバージョン情報の設定
+		AtlGetObjectSourceInterface( pUnkIE, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum) ;
+
+		// イベントをDispatch
+		HRESULT hr = this->DispEventAdvise( pUnkIE);
+
+		return hr ;
+	}
+
+BEGIN_COM_MAP(CIESink)
+	COM_INTERFACE_ENTRY_IID(DIID_DWebBrowserEvents2, CIESink)
+END_COM_MAP()
+
+BEGIN_SINK_MAP(CIESink)
+	SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, &CIESink::OnBeforeNavigate2)
+	SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_NEWWINDOW2, &CIESink::OnNewWindow2)
+	SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_ONQUIT, &CIESink::OnQuit)
+END_SINK_MAP()
+
+// OnBeforeNavigate2
+void _stdcall OnBeforeNavigate2( IDispatch** ppDisp, VARIANT* pvUrl, VARIANT*, VARIANT* pvTarget, VARIANT*,
+				   VARIANT*, VARIANT_BOOL *pbCancel)
+{
+	return ;
+}
+
+// OnNewWindow2
+void _stdcall OnNewWindow2( IDispatch** ppDisp, VARIANT_BOOL *pbCancel)
+{
+	return ;
+}
+
+// OnQuit
+void _stdcall OnQuit()
+{
+	DispEventUnadvise( m_pUnkIE);
+	return ;
+}
+};
+
+
Index: branches/egtra/ab5.0/abdev/abdev/Caret.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Caret.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Caret.cpp	(revision 774)
@@ -0,0 +1,850 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+extern int font_width,font_height;
+
+BOOL IsRightTurn(char *pBuf,int i,int now_x){
+	if(pobj_nv->bRightTurn==0) return 0;
+	if(pobj_nv->iMaxOneLineTextLength-1<=now_x && pBuf[i]!='\r') return 1;
+	return 0;
+}
+
+int GetBufferIndexFromCaretPos(char *pBuf,int now_x,int now_y){
+	int i,i2;
+	int x,y;
+
+	// 行の確認
+	for(i=0,x=0,y=0;;i++,x++){
+		if(y>=now_y) break;
+		if(pBuf[i]=='\0') return 0;
+		if(IsRightTurn(pBuf,i,x)){
+			//右端で折り返す
+			y++;
+			x=-1;
+			i--;
+			continue;
+		}
+		if(pBuf[i]=='\t'){
+			//タブ文字
+			int tab;
+			tab=pobj_nv->TabSize;
+
+			if(x%tab==0) i2=tab;
+			else i2=tab-x%tab;
+			x+=i2-1;
+			continue;
+		}
+		else if(IsDBCSLeadByte(pBuf[i])){
+			//マルチバイト文字
+			x++;
+			i++;
+			continue;
+		}
+
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			y++;
+			i++;
+			x=-1;
+		}
+	}
+
+	//列の確認
+	for(x=0;x<now_x;i++,x++){
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0') return 0;
+
+		if(pBuf[i]=='\t'){
+			//タブ文字
+			int tab;
+			tab=pobj_nv->TabSize;
+
+			if(x%tab==0) i2=tab;
+			else i2=tab-x%tab;
+			x+=i2-1;
+			continue;
+		}
+		else if(IsDBCSLeadByte(pBuf[i])){
+			//マルチバイト文字
+			x++;
+			i++;
+			continue;
+		}
+	}
+
+	return i;
+}
+void GetCaretPosFromBufferIndex(char *pBuf,int index,POINT *pCaretPos){
+	int i,i2;
+
+	pCaretPos->x=0;
+	pCaretPos->y=0;
+	for(i=0;i<index;i++,pCaretPos->x++){
+		if(pBuf[i]=='\0') break;
+		if(IsRightTurn(pBuf,i,pCaretPos->x)){
+			//右端で折り返す
+			pCaretPos->y++;
+			pCaretPos->x=-1;
+			i--;
+			continue;
+		}
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			pCaretPos->x=-1;
+			pCaretPos->y++;
+			i++;
+			continue;
+		}
+		if(IsDBCSLeadByte(pBuf[i])){
+			i++;
+			pCaretPos->x++;
+			continue;
+		}
+		if(pBuf[i]=='\t'){
+			//タブ文字
+			int tab;
+			tab=pobj_nv->TabSize;
+
+			if(pCaretPos->x%tab==0) i2=tab;
+			else i2=tab-pCaretPos->x%tab;
+			pCaretPos->x+=i2-1;
+			continue;
+		}
+		else if(IsDBCSLeadByte(pBuf[i])){
+			//マルチバイト文字
+			pCaretPos->x++;
+			i++;
+			continue;
+		}
+	}
+}
+
+void TextEdit_GetSel(int WndNum,CHARRANGE *pCharRange){
+	//////////////////////////////////////////
+	// 選択範囲（バッファインデックス）を取得
+	//////////////////////////////////////////
+
+	pCharRange->cpMin=GetBufferIndexFromCaretPos(
+		MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+	if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y){
+		//選択されていないとき
+		pCharRange->cpMax=pCharRange->cpMin;
+	}
+	else{
+		pCharRange->cpMax=GetBufferIndexFromCaretPos(
+			MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x,
+			MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y);
+	}
+
+	if(pCharRange->cpMin>pCharRange->cpMax){
+		long temp;
+		temp=pCharRange->cpMin;
+		pCharRange->cpMin=pCharRange->cpMax;
+		pCharRange->cpMax=temp;
+	}
+}
+void TextEdit_GetSelText(int WndNum,CHARRANGE *pCharRange,char *buffer){
+
+	memcpy(buffer,
+		MdiInfo[WndNum]->pMdiTextEdit->buffer+pCharRange->cpMin,
+		pCharRange->cpMax-pCharRange->cpMin);
+	buffer[pCharRange->cpMax-pCharRange->cpMin]=0;
+}
+
+void GetScrollBaseCaretPos(MDIINFO *pMdiInfo,int *pNaturalBaseX,int *pNaturalBaseY)
+{
+	HWND hEdit = pMdiInfo->pMdiTextEdit->hEdit;
+
+	//垂直スクロールバーの位置
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_POS;
+	GetScrollInfo(hEdit,SB_VERT,&si);
+	*pNaturalBaseY-=si.nPos;		//文字単位
+
+	//水平スクロールバーの位置
+	GetScrollInfo(hEdit,SB_HORZ,&si);
+	*pNaturalBaseX-=si.nPos;		//文字単位
+}
+
+void GetNaturalBaseCaretPos(int WndNum,int *pScrollBaseX,int *pScrollBaseY){
+
+	HWND hEdit;
+	hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
+
+	//垂直スクロールバーの位置
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_POS;
+	GetScrollInfo(hEdit,SB_VERT,&si);
+	*pScrollBaseY+=si.nPos;		//文字単位
+
+	//水平スクロールバーの位置
+	GetScrollInfo(hEdit,SB_HORZ,&si);
+	*pScrollBaseX+=si.nPos;		//文字単位
+}
+
+void TextEdit_SetSel(int WndNum,int StartIndex,int EndIndex,BOOL bShowCenter){
+
+	GetCaretPosFromBufferIndex(
+		MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		StartIndex,
+		&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+	GetCaretPosFromBufferIndex(
+		MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		EndIndex,
+		&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+
+	HWND hEdit;
+	hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
+
+	if(!TextEdit_ScrollCaret(WndNum,0,bShowCenter))
+		InvalidateRect(hEdit,NULL,0);
+	ResetCaretPos(WndNum);
+
+	ResetState_EditMenu();
+}
+void TextEdit_SelectOneLine(int WndNum,int code_pos,BOOL bShowCenter){
+
+	///////////////////////
+	// 定義行の選択範囲
+	///////////////////////
+
+	int iStartPos;
+	iStartPos=code_pos;
+	while(MdiInfo[WndNum]->pMdiTextEdit->buffer[iStartPos]!='\n'&&iStartPos>0) iStartPos--;
+	if(MdiInfo[WndNum]->pMdiTextEdit->buffer[iStartPos]=='\n') iStartPos++;
+
+	int iEndPos;
+	iEndPos=code_pos;
+	while(MdiInfo[WndNum]->pMdiTextEdit->buffer[iEndPos]!='\r'&&MdiInfo[WndNum]->pMdiTextEdit->buffer[iEndPos]!='\0') iEndPos++;
+
+	TextEdit_SetSel(WndNum,iStartPos,iEndPos,bShowCenter);
+}
+void ResetCaretPos(int WndNum,BOOL bInputAndReset){
+	extern HANDLE hHeap;
+	int x,y;
+
+	POINT OldPos;
+	GetCaretPos(&OldPos);
+
+	x=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
+	y=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
+	GetScrollBaseCaretPos(MdiInfo[WndNum],&x,&y);
+
+	//エディタ画面左端のコントロールタブ
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	//コントロールタブ上にカーソルがきたときに、非表示にする
+	if(OldPos.x>=iControlTabSpace&&x<0) HideCaret(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+	else if(OldPos.x<iControlTabSpace&&x>=0) ShowCaret(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+
+	SetCaretPos(
+		x*font_width     +iControlTabSpace,
+		y*font_height);
+
+	SetStatusText(NULL);
+
+
+	//////////////////////////////////////////////
+	// Web検索文字列
+	//////////////////////////////////////////////
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		int start,end;
+		if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y){
+			//文字列を選択中でないとき
+
+			int sw=0;
+			if(bInputAndReset){
+				if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x>1){
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x-=2;
+					sw=1;
+				}
+			}
+
+			TextEdit_GetWordCaret(
+				MdiInfo[WndNum]->pMdiTextEdit->hEdit,
+				WndNum,
+				&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos,
+				&start,&end,
+				WORDCARET_BEFORE);
+
+			if(sw) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+=2;
+
+			//半角文字列を選択時の全角とのズレを修正
+			POINT pos;
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,start,&pos);
+			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,end,&pos);
+			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
+		}
+		else{
+			//文字列を選択中のとき
+			start=GetBufferIndexFromCaretPos(
+				MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+			end=GetBufferIndexFromCaretPos(
+				MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x,
+				MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y);
+		}
+
+		if(start>end){
+			int iTemp;
+			iTemp=start;
+			start=end;
+			end=iTemp;
+		}
+
+		char *pTemp;
+		int length;
+		length=end-start;
+		if(length<0) length=0;
+		pTemp=(char *)HeapAlloc(hHeap,0,length+1024);
+		memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+start,length);
+		pTemp[length]=0;
+
+		char *temp2;
+		temp2=strstr(pTemp,"\r\n");
+		if(temp2) temp2[0]=0;
+
+		extern HWND hWebSearchCombo;
+		SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),pTemp);
+
+		//未完成
+		HeapDefaultFree(pTemp);
+		/*if((!IsHiragana(pTemp))&&pTemp[0]&&pTemp[1]){
+			//バックグラウンドでWeb検索をかける
+			_beginthread(WebSearchThread,0,(void *)pTemp);
+
+			//※pTempはWebSearchThreadスレッド内で破棄する
+		}
+		else{
+			HeapDefaultFree(pTemp);
+		}*/
+	}
+
+
+	////////////////////////////////////////////////////
+	// パラメータヒントを更新
+	////////////////////////////////////////////////////
+
+	extern METHODCHECKINFO MethodCheckInfo;
+	if(MethodCheckInfo.hWnd){
+		if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
+			ShowParameterHint(WndNum);
+	}
+
+
+	//////////////////////////////////
+	// コード補完機能を利用中の場合
+	//////////////////////////////////
+
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	if(ComplementWndInfo.hWnd){
+		int i,i2;
+		char *pTemp,temporary[VN_SIZE];
+
+		i=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+		if(i<ComplementWndInfo.iPos||ComplementWndInfo.iPos+ComplementWndInfo.iLength<i){
+			//参照文字列以外にカーソルが移動した場合はコード補完リストを破棄
+
+			DestroyWindow(ComplementWndInfo.hWnd);
+			ComplementWndInfo.hWnd=0;
+		}
+		if(ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND){
+			/////////////////////////////////////
+			// ペアステートメント補完
+			/////////////////////////////////////
+			//※リストを自動選択、場合により破棄
+
+			if(ComplementWndInfo.iLength==0){
+				//自動選択の指標となる文字列がないときは、補完ウィンドウを破棄する
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+				return;
+			}
+
+			pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
+			memcpy(pTemp,
+				MdiInfo[WndNum]->pMdiTextEdit->buffer+ComplementWndInfo.iPos,
+				ComplementWndInfo.iLength);
+			pTemp[ComplementWndInfo.iLength]=0;
+
+			for(i=0;i<ComplementWndInfo.MemberNum;i++){
+				ListView_GetItemText(ComplementWndInfo.hList,i,0,temporary,VN_SIZE);
+
+				if(memicmp(pTemp,temporary,ComplementWndInfo.iLength)==0){
+					if(lstrcmpi(pTemp,temporary)==0){
+						//完全一致の場合
+						SendMessage(ComplementWndInfo.hList,WM_KEYDOWN,VK_RETURN,0);
+					}
+					break;
+				}
+			}
+			if(i==ComplementWndInfo.MemberNum){
+				//エンドペアステートメントの先端部分と一致しなかったとき
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+			}
+
+			//アイテムを選択
+			ListView_SetItemState(ComplementWndInfo.hList,
+				i,
+				LVIS_SELECTED|LVIS_FOCUSED,
+				LVIS_SELECTED|LVIS_FOCUSED);
+
+			//必要であればスクロール
+			ListView_EnsureVisible(ComplementWndInfo.hList,i,0);
+
+			HeapDefaultFree(pTemp);
+		}
+		else{
+			/////////////////////////////////
+			// クラスメンバのコード補完機能
+			/////////////////////////////////
+			//※リストを自動選択
+
+			if(ComplementWndInfo.iLength==0){
+				//自動選択の指標となる文字列がないとき
+				return;
+			}
+
+			if(ComplementWndInfo.iLength<0){
+				//文字数がマイナス値になったとき（.や>が消されたとき）
+				//  補完ウィンドウを破棄する
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+				return;
+			}
+
+			pTemp=(char *)HeapAlloc(hHeap,0,ComplementWndInfo.iLength+1);
+			memcpy(pTemp,
+				MdiInfo[WndNum]->pMdiTextEdit->buffer+ComplementWndInfo.iPos,
+				ComplementWndInfo.iLength);
+			pTemp[ComplementWndInfo.iLength]=0;
+
+			for(i=0;i<ComplementWndInfo.MemberNum;i++){
+				ListView_GetItemText(ComplementWndInfo.hList,i,0,temporary,VN_SIZE);
+
+				i2=lstrcmpi(pTemp,temporary);
+				if(i2<=0) break;
+			}
+			if(i==ComplementWndInfo.MemberNum) i--;
+
+			//アイテムを選択
+			ListView_SetItemState(ComplementWndInfo.hList,
+				i,
+				LVIS_SELECTED|LVIS_FOCUSED,
+				LVIS_SELECTED|LVIS_FOCUSED);
+
+			//必要であればスクロール
+			ListView_EnsureVisible(ComplementWndInfo.hList,i,0);
+
+			HeapDefaultFree(pTemp);
+		}
+	}
+}
+BOOL TextEdit_ScrollCaret(int WndNum,BOOL bScrollOneStep_x,BOOL bShowCenter){
+	int x,y;
+	BOOL bScroll=0;
+
+	HWND hEdit;
+	hEdit=MdiInfo[WndNum]->pMdiTextEdit->hEdit;
+
+	x=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
+	y=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
+	GetScrollBaseCaretPos(MdiInfo[WndNum],&x,&y);
+
+	//垂直方向
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+	GetScrollInfo(hEdit,SB_VERT,&si);
+	if(bShowCenter==0){
+		//通常キャレットスクロール
+		if(y<0){
+			//上へスクロール
+
+			si.nPos+=y;
+			SetScrollInfo(hEdit,SB_VERT,&si,1);
+			InvalidateRect(hEdit,NULL,0);
+			bScroll=1;
+		}
+		if(si.nPage&&y>(int)si.nPage-1){
+			//下へスクロール
+
+			si.nPos+=y-si.nPage;
+
+			SetScrollInfo(hEdit,SB_VERT,&si,1);
+			InvalidateRect(hEdit,NULL,0);
+			bScroll=1;
+		}
+	}
+	else{
+		//上部にキャレットがくるようにスクロール
+
+		if(y<0||
+			si.nPage&&y>(int)si.nPage-1){
+
+			si.nPos+=y-si.nPage/3;
+			SetScrollInfo(hEdit,SB_VERT,&si,1);
+			InvalidateRect(hEdit,NULL,0);
+			bScroll=1;
+		}
+	}
+
+
+	//水平方向
+	GetScrollInfo(hEdit,SB_HORZ,&si);
+	if(x<0){
+		si.nPos+=x-1;
+		if(!bScrollOneStep_x) si.nPos-=si.nPage/4;
+		if(si.nPos<0) si.nPos=0;
+		SetScrollInfo(hEdit,SB_HORZ,&si,1);
+		InvalidateRect(hEdit,NULL,0);
+		bScroll=1;
+	}
+	if(si.nPage&&x>(int)si.nPage){
+		si.nPos+=x-si.nPage;
+		if(!bScrollOneStep_x) si.nPos+=si.nPage/3;
+		SetScrollInfo(hEdit,SB_HORZ,&si,1);
+		InvalidateRect(hEdit,NULL,0);
+		bScroll=1;
+	}
+
+	return bScroll;
+}
+
+void CaretPos_LooseToNatural(int WndNum,int loose_x,int loose_y,POINT *pCaretPos){
+	int i,i2,LastPos;
+	int x,y;
+	char *pBuf;
+
+	//負数の場合は0をセット
+	if(loose_x<0) loose_x=0;
+	if(loose_y<0) loose_y=0;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	// 行の確認
+	LastPos=0;
+	for(i=0,x=0,y=0;;i++,x++){
+		if(y>=loose_y){
+			pCaretPos->y=y;
+			break;
+		}
+		if(pBuf[i]=='\0'){
+			pCaretPos->y=y;
+			i=LastPos;
+			loose_x = INT_MAX;
+
+			//上下キャレット移動時の左右位置保持機能を解除
+			MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+			break;
+		}
+
+		if(IsRightTurn(pBuf,i,x)){
+			LastPos=i;
+
+			//右端で折り返す
+			y++;
+			x=-1;
+			i--;
+			continue;
+		}
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			LastPos=i+2;
+			y++;
+			i++;
+			x=-1;
+		}
+
+		if(pBuf[i]=='\t'){
+			//タブ文字
+			int tab;
+			tab=pobj_nv->TabSize;
+
+			if(x%tab==0) i2=tab;
+			else i2=tab-x%tab;
+			x+=i2-1;
+			continue;
+		}
+		else if(IsDBCSLeadByte(pBuf[i])){
+			//マルチバイト文字
+			x++;
+			i++;
+			continue;
+		}
+	}
+
+	//列の確認
+	x=0;
+	for(;;i++,x++){
+		if(IsRightTurn(pBuf,i,x)){
+			//折り返しよりも右側が指定場所のとき
+			pCaretPos->x=x;
+			break;
+		}
+
+		if(pBuf[i]=='\t'){
+			//タブ文字
+			int tab;
+			tab=pobj_nv->TabSize;
+
+			if(x%tab==0) i2=tab;
+			else i2=tab-x%tab;
+			if(x+i2-1>=loose_x){
+				//指定場所にキャレットが存在するとき（タブ内）
+				pCaretPos->x=x;
+				break;
+			}
+			x+=i2-1;
+			continue;
+		}
+		else if(IsDBCSLeadByte(pBuf[i])){
+			//マルチバイト文字
+			x++;
+			i++;
+			if(x>=loose_x){
+				//マルチバイト文字の間にキャレットが存在するとき
+				pCaretPos->x=x-1;
+				break;
+			}
+			continue;
+		}
+
+		if(x>=loose_x){
+			//指定場所にキャレットが存在するとき（通常）
+			pCaretPos->x=x;
+			break;
+		}
+
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0'){
+			//改行文字よりも右側が指定場所のとき
+			pCaretPos->x=x;
+			break;
+		}
+	}
+}
+
+void GetNaturalCaretPos_Click(int WndNum,int mouse_x,int mouse_y,POINT *pCaretPos){
+	/////////////////////////////
+	// キャレット移動（クリック）
+	/////////////////////////////
+
+
+	//ピクセル座標をカーソル座標（文字単位）に変更
+	mouse_x=(int)((double)mouse_x/(double)font_width+0.5);
+	mouse_y/=font_height;
+	GetNaturalBaseCaretPos(WndNum,&mouse_x,&mouse_y);
+
+	CaretPos_LooseToNatural(WndNum,mouse_x,mouse_y,pCaretPos);
+}
+void GetNaturalCaretPos_Left(int WndNum){
+	///////////////////////////
+	// キャレット移動（左キー）
+	///////////////////////////
+
+	int i;
+	int x,y;
+	char *pBuf;
+
+	POINT *pCaretPos;
+	pCaretPos=&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+
+	if(pCaretPos->x==0&&pCaretPos->y==0){
+		//ファイルの先頭から左へは行けない
+		return;
+	}
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	i=GetBufferIndexFromCaretPos(pBuf,
+		pCaretPos->x,
+		pCaretPos->y);
+
+	if(i>=2){
+		if(pBuf[i-2]=='\r'&&pBuf[i-1]=='\n'){
+			//列先頭から前行の終端へ
+			x=INT_MAX;
+			y=pCaretPos->y-1;
+			CaretPos_LooseToNatural(WndNum,
+				x,y,
+				pCaretPos);
+			return;
+		}
+	}
+
+	x=pCaretPos->x-1;
+	y=pCaretPos->y;
+
+	BOOL sw=0;
+	if(x<0){
+		x=INT_MAX;
+		y--;
+
+		sw=1;
+	}
+
+	CaretPos_LooseToNatural(WndNum,
+		x,y,
+		pCaretPos);
+
+	if(sw){
+		GetNaturalCaretPos_Left(WndNum);
+	}
+}
+void GetNaturalCaretPos_Right(int WndNum,POINT *pCaretPos){
+	///////////////////////////
+	// キャレット移動（右キー）
+	///////////////////////////
+
+	int i,i2;
+	char *pBuf;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	i=GetBufferIndexFromCaretPos(pBuf,
+		pCaretPos->x,
+		pCaretPos->y);
+
+	if(pBuf[i]=='\0'){
+		//ファイルの終端から右へは行けない
+		return;
+	}
+	else if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+		//改行コードから右へ
+		pCaretPos->x=0;
+		pCaretPos->y++;
+	}
+	else if(pBuf[i]=='\t'){
+		//タブ文字から右へ
+		int tab;
+		tab=pobj_nv->TabSize;
+
+		if(pCaretPos->x%tab==0) i2=tab;
+		else i2=tab-pCaretPos->x%tab;
+		pCaretPos->x+=i2;
+	}
+	else if(IsDBCSLeadByte(pBuf[i])){
+		//マルチバイト文字
+		pCaretPos->x+=2;
+	}
+	else{
+		//右へ（通常）
+		pCaretPos->x++;
+	}
+
+	//折り返し
+	int iMax_OneLine_TextLength;
+	iMax_OneLine_TextLength=40;
+	if(IsRightTurn(pBuf,i,pCaretPos->x)){
+		pCaretPos->x=0;
+		pCaretPos->y++;
+	}
+
+	CaretPos_LooseToNatural(WndNum,
+		pCaretPos->x,
+		pCaretPos->y,
+		pCaretPos);
+}
+void GetNaturalCaretPos_Up(int WndNum,POINT *pCaretPos){
+	///////////////////////////
+	// キャレット移動（上キー）
+	///////////////////////////
+
+	if(pCaretPos->y==0){
+		//1行目にキャレットがあるとき
+		pCaretPos->x = 0;
+
+		//上下キャレット移動時の左右位置保持機能を解除
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+		return;
+	}
+
+	//上下のキャレット移動時には、左右方向の位置を保持する
+	if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+	pCaretPos->y--;
+
+	CaretPos_LooseToNatural(WndNum,
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
+		pCaretPos->y,
+		pCaretPos);
+}
+void GetNaturalCaretPos_Down(int WndNum,POINT *pCaretPos){
+	///////////////////////////
+	// キャレット移動（下キー）
+	///////////////////////////
+
+	//上下のキャレット移動時には、左右方向の位置を保持する
+	if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+	pCaretPos->y++;
+
+	CaretPos_LooseToNatural(WndNum,
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
+		pCaretPos->y,
+		pCaretPos);
+}
+void GetNaturalCaretPos_PageUp(int WndNum,POINT *pCaretPos){
+	///////////////////////////////
+	// キャレット移動（PageUpキー）
+	///////////////////////////////
+
+	if(pCaretPos->y==0){
+		//1行目にキャレットがあるとき
+		return;
+	}
+
+	//上下のキャレット移動時には、左右方向の位置を保持する
+	if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_PAGE;
+	GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
+	pCaretPos->y-=si.nPage;
+	if(pCaretPos->y<0) pCaretPos->y=0;
+
+	CaretPos_LooseToNatural(WndNum,
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
+		pCaretPos->y,
+		pCaretPos);
+}
+void GetNaturalCaretPos_PageDown(int WndNum,POINT *pCaretPos){
+	///////////////////////////////
+	// キャレット移動（PageUpキー）
+	///////////////////////////////
+
+	//上下のキャレット移動時には、左右方向の位置を保持する
+	if(MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos==-1)
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=pCaretPos->x;
+
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_PAGE;
+	GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
+	pCaretPos->y+=si.nPage;
+
+	CaretPos_LooseToNatural(WndNum,
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos,
+		pCaretPos->y,
+		pCaretPos);
+}
Index: branches/egtra/ab5.0/abdev/abdev/ChildWndOnRebar.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ChildWndOnRebar.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ChildWndOnRebar.cpp	(revision 774)
@@ -0,0 +1,416 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+
+
+//ファイル選択コンボボックス
+HWND hDocCombo;
+
+//スタンダードツールバー
+HWND hStandardToolbarPager;				//ページャー
+ILuxToolbar *pobj_StandardToolbar;
+
+//デバッガツールバー
+HWND hDebuggerToolbarPager;				//ページャー
+ILuxToolbar *pobj_DebuggerToolbar;
+
+//ビルドツールバー
+HWND hReleaseToolbarPager;
+ILuxToolbar *pobj_ReleaseToolbar;
+
+//プラットフォーム選択コンボボックス
+HWND hSelectCompilerCombo;
+
+//WebSearchコンボボックス
+HWND hWebSearchCombo;
+
+
+
+
+/////////////////
+// レバー追加
+// ※Add～プロシージャを追加
+/////////////////
+
+
+/* 以下は各バンドのメッセージプロシージャ */
+
+//hDocCombo（Rebar）プロシージャ
+LRESULT CALLBACK DocComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldDocComboProc;
+	int i;
+	char str[MAX_PATH];
+	RECT rect;
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				SendMessage(hwnd,CB_GETLBTEXT,SendMessage(hwnd,CB_GETCURSEL,0,0),(long)str);
+				for(i=0;i<MdiInfo.size();i++){
+					if(lstrcmpi(str,MdiInfo[i]->title.c_str())==0) break;
+				}
+				BringWindowToTop(MdiInfo[i]->hwnd);
+			}
+			break;
+		case WM_LBUTTONDOWN:
+			GetClientRect(hwnd,&rect);
+			SetWindowPos(hwnd,NULL,0,0,rect.right,120,SWP_NOMOVE);
+			break;
+		case WM_RBUTTONUP:
+			pobj_Rebar->menu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+			break;
+	}
+	return CallWindowProc(OldDocComboProc,hwnd,message,wParam,lParam);
+}
+
+//hStandardToolbar（Rebar）プロシージャ
+LRESULT CALLBACK StandardToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern char CmdMsg[255];
+	extern WNDPROC OldStandardToolbarProc;
+	if(message==WM_RBUTTONUP){
+		pobj_Rebar->menu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+		InvalidateRect(hwnd,NULL,0);
+	}
+	return CallWindowProc(OldStandardToolbarProc,hwnd,message,wParam,lParam);
+}
+
+//hSelectCompilerCombo（Rebar）プロシージャ
+LRESULT CALLBACK SelectCompilerComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldSelectCompilerComboProc;
+	int i;
+	switch(message){
+		case WM_COMMAND:
+			if(HIWORD(wParam)==CBN_SELCHANGE){
+				i=SendMessage(hwnd,CB_GETCURSEL,0,0);
+
+				extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+				if( i == 0 )
+				{
+					selectingPlatform = ActiveBasic::Common::Platform::X86;
+				}
+				else if( i == 1 )
+				{
+					selectingPlatform = ActiveBasic::Common::Platform::X64;
+				}
+			}
+			break;
+		case WM_LBUTTONDOWN:
+			RECT rect;
+			GetClientRect(hwnd,&rect);
+			SetWindowPos(hwnd,NULL,0,0,rect.right,120,SWP_NOMOVE);
+			break;
+		case WM_RBUTTONUP:
+			pobj_Rebar->menu_popup(hwnd,LOWORD(lParam),HIWORD(lParam));
+			break;
+	}
+	return CallWindowProc(OldSelectCompilerComboProc,hwnd,message,wParam,lParam);
+}
+
+//hWebSearchCombo（Rebar）プロシージャ
+LRESULT CALLBACK WebSearchProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldWebSearchProc;
+	switch(message){
+		case WM_LBUTTONDOWN:
+			RECT rect;
+			GetClientRect(hwnd,&rect);
+			SetWindowPos(hwnd,NULL,0,0,rect.right,120,SWP_NOMOVE);
+			break;
+	}
+	return CallWindowProc(OldWebSearchProc,hwnd,message,wParam,lParam);
+}
+
+LRESULT CALLBACK WebSearchEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern WNDPROC OldWebSearchEditProc;
+	switch(message){
+		case WM_CHAR:
+			if(LOWORD(wParam)==VK_RETURN){
+				char *buffer,*temporary;
+				buffer=(char *)HeapAlloc(hHeap,0,MAX_PATH*3+1024);
+				temporary=(char *)HeapAlloc(hHeap,0,MAX_PATH*3+1024);
+
+				GetWindowText(hwnd,temporary,MAX_PATH);
+
+				int i=0;
+				while(temporary[i]==' ') i++;
+
+				char temp2[MAX_PATH];
+				strncpy(temp2,temporary+i,MAX_PATH);
+
+				i=lstrlen(temp2);
+				while(i>0){
+					if(temp2[i-1]==' ') i--;
+					else break;
+				}
+				temp2[i]=0;
+
+				//EUCに変換
+				nkf.pSetNkfOption("-wx");
+				nkf.pNkfConvert(buffer,temp2);
+
+				//URLエンコード
+				URLEncode(buffer);
+
+
+				//埋め込み型で表示
+				lstrcpy(temporary,"http://www.activebasic.com/application_search.php?query=");
+				lstrcat(temporary,buffer);
+				lstrcat(temporary,"&type=web&utf_sw=1");
+
+				pobj_SideWeb->GoPage(temporary);
+
+
+				AddFindData(GetParent(hwnd),pobj_nv->WebStr,temp2);
+
+				HeapDefaultFree(buffer);
+				HeapDefaultFree(temporary);
+			}
+			break;
+	}
+	return CallWindowProc(OldWebSearchEditProc,hwnd,message,wParam,lParam);
+}
+
+
+
+/*----- 以下はRebarの初期生成 -----*/
+
+//ドキュメント選択コンボボックスをレバーに追加
+HWND AddDocCombo(HWND hRebar,int num,char *lpszText){
+	extern HINSTANCE hInst;
+	extern HWND hDocCombo,hClient;
+	extern WNDPROC OldDocComboProc;
+	extern HFONT hStatusFont;
+	int i,i2;
+	HWND hTempWnd;
+	char buffer[MAX_PATH];
+
+	//コンボボックスを生成
+	hDocCombo=CreateWindow("COMBOBOX",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_SORT,
+		0,0,0,120,hRebar,NULL,hInst,NULL);
+
+	//サブクラス化
+	OldDocComboProc=(WNDPROC)GetWindowLongPtr(hDocCombo,GWLP_WNDPROC);
+	SetWindowLongPtr(hDocCombo,GWLP_WNDPROC,(long)DocComboProc);
+
+	//フォントを設定
+	SendMessage(hDocCombo,WM_SETFONT,(unsigned int)hStatusFont,0);
+
+	hTempWnd=GetWindow(hClient,GW_CHILD);
+	if(IsWindow(hTempWnd)){
+		for(i=0,i2=0;i<MdiInfo.size();i++){
+			if(MdiInfo[i]->hwnd){
+				GetWindowText(MdiInfo[i]->hwnd,buffer,MAX_PATH);
+				if(MdiInfo[i]->hwnd==hTempWnd) i2=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)buffer);
+				else SendMessage(hDocCombo,CB_ADDSTRING,0,(long)buffer);
+			}
+		}
+		SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+	}
+
+	lstrcpy(lpszText,"File:");
+	return hDocCombo;
+}
+
+//ファイル管理ツールバーをレバーに追加
+HWND AddStandardToolbar(HWND hRebar,int num,char *lpszText){
+	extern HWND hStandardToolbarPager;
+
+	//ページャーウィンドウを生成
+	hStandardToolbarPager=CreateWindow(WC_PAGESCROLLER,NULL,
+		WS_CHILD|WS_VISIBLE|PGS_HORZ,
+		0,0,0,0,
+		hRebar,NULL,hInst,NULL);
+
+
+	//LuxToolbarオブジェクトを生成
+	if(pobj_StandardToolbar) pobj_StandardToolbar->Release();
+	pobj_StandardToolbar=LuxToolbar_CreateInstance();
+	pobj_StandardToolbar->Create(hStandardToolbarPager);
+
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_StandardToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_StandardToolbar->Add(0,0,0)
+	//ボタン類を追加
+	ADD_TOOLBAR_BUTTON(IDM_NEW,IDI_NEW,"新規作成(Ctrl+N)");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_OPEN,IDI_OPEN,"開く(Ctrl+O)");
+	ADD_TOOLBAR_BUTTON(IDM_SAVE,IDI_SAVE,"保存(Ctrl+S)");
+	ADD_TOOLBAR_BUTTON(IDM_ALLSAVE,IDI_ALLSAVE,"すべて保存");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_CUT,IDI_CUT,"切り取り(Ctrl+X)");
+	ADD_TOOLBAR_BUTTON(IDM_COPY,IDI_COPY,"コピー(Ctrl+C)");
+	ADD_TOOLBAR_BUTTON(IDM_PASTE,IDI_PASTE,"貼り付け(Ctrl+V)");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_UNDO,IDI_UNDO,"元に戻す(Ctrl+Z)");
+	ADD_TOOLBAR_BUTTON(IDM_REDO,IDI_REDO,"やり直し(Ctrl+Y)");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_FIND,IDI_FIND,"検索(Ctrl+F)");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+
+	//ページャー設定
+	Pager_SetChild(hStandardToolbarPager,pobj_StandardToolbar->GetHandle());
+
+
+	//サブクラス化
+	extern WNDPROC OldStandardToolbarProc;
+	OldStandardToolbarProc=(WNDPROC)GetWindowLongPtr(pobj_StandardToolbar->GetHandle(),GWLP_WNDPROC);
+	SetWindowLongPtr(pobj_StandardToolbar->GetHandle(),GWLP_WNDPROC,(long)StandardToolbarProc);
+
+	lpszText[0]=0;
+	return hStandardToolbarPager;
+}
+
+//デバッガツールバーをレバーに追加
+HWND AddDebuggerToolbar(HWND hRebar,int num,char *lpszText){
+#ifndef THETEXT
+
+	extern HWND hDebuggerToolbarPager;
+
+	hDebuggerToolbarPager=CreateWindow(WC_PAGESCROLLER,NULL,
+		WS_CHILD|WS_VISIBLE|PGS_HORZ,
+		0,0,0,0,
+		hRebar,NULL,hInst,NULL);
+
+	//LuxToolbarオブジェクトを生成
+	if(pobj_DebuggerToolbar) pobj_DebuggerToolbar->Release();
+	pobj_DebuggerToolbar=LuxToolbar_CreateInstance();
+	pobj_DebuggerToolbar->Create(hDebuggerToolbarPager);
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_DebuggerToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_DebuggerToolbar->Add(0,0,0)
+	//ボタン類を追加
+	ADD_TOOLBAR_BUTTON(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE,"デバッグ ビルド(F7)");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_DEBUG,IDI_DEBUGRUN,"デバッグ実行(F5)");
+	ADD_TOOLBAR_BUTTON(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE,"デバッグを一時停止");
+	ADD_TOOLBAR_BUTTON(IDM_DEBUG_STOP,IDI_DEBUGSTOP,"デバッグを中断");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_STEP_IN,IDI_STEPIN,"ステップ イン(F11)");
+	ADD_TOOLBAR_BUTTON(IDM_STEP_OVER,IDI_STEPOVER,"ステップ オーバー(F10)");
+	ADD_TOOLBAR_BUTTON(IDM_STEP_CURSOR,IDI_STEPTOCURSOR,"カーソル行まで実行(Ctrl+F11)");
+	ADD_TOOLBAR_SEPARATOR;
+	ADD_TOOLBAR_BUTTON(IDM_BREAKPOINT,IDI_BREAKPOINT,"ブレークポイントの設置/解除(F9)");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+	//ページャー設定
+	Pager_SetChild(hDebuggerToolbarPager,pobj_DebuggerToolbar->GetHandle());
+
+	//サブクラス化
+	extern WNDPROC OldStandardToolbarProc;
+	OldStandardToolbarProc=(WNDPROC)GetWindowLongPtr(pobj_DebuggerToolbar->GetHandle(),GWLP_WNDPROC);
+	SetWindowLongPtr(pobj_DebuggerToolbar->GetHandle(),GWLP_WNDPROC,(long)StandardToolbarProc);
+
+	lpszText[0]=0;
+	return hDebuggerToolbarPager;
+#else //THETEXT
+	return 0;
+#endif //THETEXT
+}
+
+//リリースツールバーをレバーに追加
+HWND AddReleaseToolbar(HWND hRebar,int num,char *lpszText){
+#ifndef THETEXT
+
+	extern HWND hReleaseToolbarPager;
+
+	hReleaseToolbarPager=CreateWindow(WC_PAGESCROLLER,NULL,
+		WS_CHILD|WS_VISIBLE|PGS_HORZ,
+		0,0,0,0,
+		hRebar,NULL,hInst,NULL);
+
+	//LuxToolbarオブジェクトを生成
+	if(pobj_ReleaseToolbar) pobj_ReleaseToolbar->Release();
+	pobj_ReleaseToolbar=LuxToolbar_CreateInstance();
+	pobj_ReleaseToolbar->Create(hReleaseToolbarPager);
+
+#define ADD_TOOLBAR_BUTTON(id,iconID,lpszToolTip) pobj_ReleaseToolbar->Add(id,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0),lpszToolTip)
+#define ADD_TOOLBAR_SEPARATOR pobj_ReleaseToolbar->Add(0,0,0)
+	//ボタン類を追加
+	ADD_TOOLBAR_BUTTON(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE,"リリース コンパイル(F6)");
+	ADD_TOOLBAR_BUTTON(IDM_RELEASERUN,IDI_RELEASERUN,"実行");
+#undef ADD_TOOLBAR_SEPARATOR
+#undef ADD_TOOLBAR_BUTTON
+
+	//ページャー設定
+	Pager_SetChild(hReleaseToolbarPager,pobj_ReleaseToolbar->GetHandle());
+
+	//サブクラス化
+	extern WNDPROC OldStandardToolbarProc;
+	OldStandardToolbarProc=(WNDPROC)GetWindowLongPtr(pobj_ReleaseToolbar->GetHandle(),GWLP_WNDPROC);
+	SetWindowLongPtr(pobj_ReleaseToolbar->GetHandle(),GWLP_WNDPROC,(long)StandardToolbarProc);
+
+	lpszText[0]=0;
+	return hReleaseToolbarPager;
+#else //THETEXT
+	return 0;
+#endif //THETEXT
+}
+
+//コンパイラ選択コンボボックスをレバーに追加
+HWND AddBand_SelectCompiler(HWND hRebar,int num,char *lpszText){
+
+	//コンボボックスを生成
+	extern HINSTANCE hInst;
+	extern HWND hSelectCompilerCombo;
+	hSelectCompilerCombo=CreateWindow("COMBOBOX",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_SORT,
+		0,0,0,120,hRebar,NULL,hInst,NULL);
+
+	//サブクラス化
+	extern WNDPROC OldSelectCompilerComboProc;
+	OldSelectCompilerComboProc=(WNDPROC)GetWindowLongPtr(hSelectCompilerCombo,GWLP_WNDPROC);
+	SetWindowLongPtr(hSelectCompilerCombo,GWLP_WNDPROC,(long)SelectCompilerComboProc);
+
+	//フォントを設定
+	extern HFONT hStatusFont;
+	SendMessage(hSelectCompilerCombo,WM_SETFONT,(WPARAM)hStatusFont,0);
+
+	//コンボボックスに文字列を挿入
+	SendMessage(hSelectCompilerCombo,CB_ADDSTRING,0,(long)"Win32");
+	if(IsWow64()) SendMessage(hSelectCompilerCombo,CB_ADDSTRING,0,(long)"Win64");
+
+	//Win32を選択
+	SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
+
+	lpszText[0]=0;
+	return hSelectCompilerCombo;
+}
+
+HWND AddBand_WebSearch(HWND hRebar,int num,char *lpszText){
+	//コンボボックスを生成
+	extern HINSTANCE hInst;
+	extern HWND hWebSearchCombo;
+	hWebSearchCombo=CreateWindow("COMBOBOX",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE|CBS_DROPDOWN|CBS_HASSTRINGS|CBS_AUTOHSCROLL,
+		0,0,0,120,hRebar,NULL,hInst,NULL);
+
+	//サブクラス化
+	extern WNDPROC OldWebSearchProc;
+	OldWebSearchProc=(WNDPROC)GetWindowLongPtr(hWebSearchCombo,GWLP_WNDPROC);
+	SetWindowLongPtr(hWebSearchCombo,GWLP_WNDPROC,(long)WebSearchProc);
+	extern WNDPROC OldWebSearchEditProc;
+	OldWebSearchEditProc=(WNDPROC)GetWindowLongPtr(GetWindow(hWebSearchCombo,GW_CHILD),GWLP_WNDPROC);
+	SetWindowLongPtr(GetWindow(hWebSearchCombo,GW_CHILD),GWLP_WNDPROC,(long)WebSearchEditProc);
+
+	//フォントを設定
+	extern HFONT hStatusFont;
+	SendMessage(hWebSearchCombo,WM_SETFONT,(WPARAM)hStatusFont,0);
+
+	lstrcpy(lpszText,"WebSearch(F5):");
+
+
+
+	//Web検索文字列コンボボックスを初期化
+	int i;
+	SendMessage(hWebSearchCombo,CB_RESETCONTENT,0,0);
+	for(i=0;i<MAX_FINDLIST;i++){
+		if(pobj_nv->WebStr[i][0]=='\0') break;
+		SendMessage(hWebSearchCombo,CB_ADDSTRING,0,(long)pobj_nv->WebStr[i]);
+	}
+	SendMessage(hWebSearchCombo,CB_LIMITTEXT,8192,0);
+
+	return hWebSearchCombo;
+}
Index: branches/egtra/ab5.0/abdev/abdev/ClassTree.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ClassTree.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ClassTree.cpp	(revision 774)
@@ -0,0 +1,629 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+
+CClassTreeView *pobj_ClassTreeView;
+
+BOOL bSearchingClasses,bRetrySearchingClasses;
+
+
+int CClassTreeView::hash_default(LONG_PTR lpdata){
+	return lpdata%MAX_HASH;
+}
+void CClassTreeView::AddValidItem(HTREEITEM hItem,HTREEITEM hFileTreeItem){
+	//ハッシュ値を取得
+	int key;
+	key=hash_default((LONG_PTR)hItem);
+
+	//格納位置を取得
+	TREEHASH *pth;
+	pth=&tree_data[key];
+	while(pth->hItem){
+		if(pth->hItem==hItem){
+			//既に存在するときは抜け出す
+			return;
+		}
+		if(pth->pNextData==0){
+			pth->pNextData=(TREEHASH *)HeapAlloc(hHeap,0,sizeof(TREEHASH));
+			pth=pth->pNextData;
+			break;
+		}
+		pth=pth->pNextData;
+	}
+
+	pth->hItem=hItem;
+	pth->hFileTreeItem = hFileTreeItem;
+	pth->pNextData=0;
+}
+
+BOOL CClassTreeView::delete_check(HTREEITEM hItem){
+	//ハッシュ値を取得
+	int key;
+	key=hash_default((LONG_PTR)hItem);
+
+	TREEHASH *pth;
+	pth=&tree_data[key];
+	while(pth->hItem){
+		if(pth->hItem==hItem) return 1;
+
+		if(pth->pNextData==0) break;
+		pth=pth->pNextData;
+	}
+	return 0;
+}
+
+void CClassTreeView::DeleteInvalidItems(HTREEITEM hItem){
+	HTREEITEM hChildItem;
+	while(hItem){
+		if(!delete_check(hItem)){
+			HTREEITEM hTemp;
+			hTemp=hItem;
+
+			hItem=TreeView_GetNextSibling(hTreeWnd,hItem);
+
+			TreeView_DeleteItem(hTreeWnd,hTemp);
+			continue;
+		}
+
+		hChildItem=TreeView_GetChild(hTreeWnd,hItem);
+		if(hChildItem){
+			DeleteInvalidItems(hChildItem);
+		}
+
+		hItem=TreeView_GetNextSibling(hTreeWnd,hItem);
+	}
+}
+
+void CClassTreeView::DeleteTreeHash(TREEHASH *pth){
+	if(pth->hItem && (hNowFileTreeItem==(HTREEITEM)-1 || hNowFileTreeItem==pth->hFileTreeItem)){
+		if(pth->pNextData){
+			DeleteTreeHash(pth->pNextData);
+			HeapDefaultFree(pth->pNextData);
+			pth->pNextData=0;
+		}
+		pth->hItem=0;
+	}
+}
+
+
+HTREEITEM CClassTreeView::insert(HTREEITEM hParentItem,int flag,char *lpszName,HTREEITEM hFileTreeItem){
+	char temporary[255];
+
+	TVITEM tvItem;
+	tvItem.pszText=temporary;
+	tvItem.cchTextMax=255;
+	HTREEITEM hNextItem;
+	hNextItem=TreeView_GetChild(hTreeWnd,hParentItem);
+	while(hNextItem){
+		tvItem.mask=TVIF_HANDLE|TVIF_TEXT;
+		tvItem.hItem=hNextItem;
+		TreeView_GetItem(hTreeWnd,&tvItem);
+		if(lstrcmp(lpszName,tvItem.pszText)==0){
+			//既に挿入済みの場合
+			AddValidItem(hNextItem,hFileTreeItem);
+			return hNextItem;
+		}
+
+		hNextItem=TreeView_GetNextSibling(hTreeWnd,hNextItem);
+	}
+
+
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIS_EXPANDED ;
+	tv.hParent=hParentItem;
+	tv.item.pszText=lpszName;
+
+	if(flag==CTV_ROOT){
+		tv.item.iImage=3;
+		tv.item.iSelectedImage=3;
+	}
+	if(flag==CTV_FOLDER){
+		tv.item.iImage=0;
+		tv.item.iSelectedImage=0;
+	}
+	else if(flag==CTV_GLOBAL_PROC){
+		tv.item.iImage=5;
+		tv.item.iSelectedImage=5;
+	}
+	else if(flag==CTV_CLASS){
+		tv.item.iImage=2;
+		tv.item.iSelectedImage=2;
+	}
+	else if(flag==CTV_PUBLIC_MEMBER){
+		tv.item.iImage=4;
+		tv.item.iSelectedImage=4;
+	}
+	else if(flag==CTV_PUBLIC_METHOD){
+		tv.item.iImage=5;
+		tv.item.iSelectedImage=5;
+	}
+	else if(flag==CTV_PRIVATE_MEMBER){
+		tv.item.iImage=6;
+		tv.item.iSelectedImage=6;
+	}
+	else if(flag==CTV_PRIVATE_METHOD){
+		tv.item.iImage=7;
+		tv.item.iSelectedImage=7;
+	}
+
+	hNextItem=TreeView_InsertItem(hTreeWnd,&tv);
+	AddValidItem(hNextItem,hFileTreeItem);
+	return hNextItem;
+}
+
+
+
+CClassTreeView::CClassTreeView(){
+	memset(this,0,sizeof(CClassTreeView));
+}
+CClassTreeView::~CClassTreeView(){
+	while(bSearchingClasses) Sleep(10);
+
+	this->hNowFileTreeItem = (HTREEITEM)-1;
+
+	int i;
+	for(i=0;i<MAX_HASH;i++){
+		DeleteTreeHash(&tree_data[i]);
+	}
+
+	if(pobj_ClassTreeView->pProcInfo){
+		//プロシージャ情報のメモリを解放
+		for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
+			HeapDefaultFree(pobj_ClassTreeView->pProcInfo[i].name);
+		}
+		HeapDefaultFree(pobj_ClassTreeView->pProcInfo);
+		pobj_ClassTreeView->pProcInfo=0;
+	}
+}
+void CClassTreeView::init(HWND hwnd,HTREEITEM hFileTreeItem){
+	hTreeWnd=hwnd;
+
+	this->hNowFileTreeItem = hFileTreeItem;
+
+	int i;
+	for(i=0;i<MAX_HASH;i++){
+		DeleteTreeHash(&tree_data[i]);
+	}
+}
+
+void CClassTreeView::InsertRootFolder(void){
+	char temporary[VN_SIZE];
+	sprintf(temporary,"%s クラス",projectInfo.GetName().c_str());
+	hRootFolder=insert(
+		TVI_ROOT,
+		CTV_ROOT,
+		temporary,(HTREEITEM)-1);
+}
+void CClassTreeView::InsertGlobalProcedureFolder(void){
+	hGlobalProcedureFolder=insert(
+		hRootFolder,
+		CTV_FOLDER,
+		"グローバル関数",(HTREEITEM)-1);
+}
+
+HTREEITEM CClassTreeView::InsertGlobalProcedure(int flag,char *lpszName,HTREEITEM hFileTreeItem){
+	return pobj_ClassTreeView->insert(
+		hGlobalProcedureFolder,
+		CTV_GLOBAL_PROC,
+		lpszName,
+		hFileTreeItem);
+}
+
+HTREEITEM CClassTreeView::insert_code_item(HTREEITEM hParentItem,int flag,char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p){
+	int i4;
+	i4=NumberOfProcedures;
+	pProcInfo=(PROCINFO *)HeapReAlloc(hHeap,0,pProcInfo,sizeof(PROCINFO)*(i4+1));
+	pProcInfo[i4].name=(char *)HeapAlloc(hHeap,0,lstrlen(lpszName)+1);
+	lstrcpy(pProcInfo[i4].name,lpszName);
+	pProcInfo[i4].hFileTreeItem = hFileTreeItem;
+
+	//コード位置
+	pProcInfo[i4].code_pos=p;
+
+	//ツリーアイテムを挿入
+	HTREEITEM hTempItem;
+	hTempItem=insert(
+		hParentItem,
+		flag,
+		lpszName,
+		hFileTreeItem);
+
+	pProcInfo[i4].hTreeItem=hTempItem;
+
+	NumberOfProcedures++;
+
+	return hTempItem;
+}
+
+void CClassTreeView::InsertClassFolder(char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p){
+	hNowClassFolder=insert_code_item(hRootFolder,CTV_CLASS,lpszName,hFileTreeItem,pBuf,p);
+}
+void CClassTreeView::InsertClassMember(int flag,char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p){
+	insert_code_item(hNowClassFolder,flag,lpszName,hFileTreeItem,pBuf,p);
+}
+
+void CClassTreeView::finish(){
+	DeleteInvalidItems(TreeView_GetRoot(hTreeWnd));
+}
+
+
+void AnalysisClass(char *pBuf,int *p,HTREEITEM hFileTreeItem){
+	int i2;
+	i2=*p;
+
+
+	CClassInfo *pobj_ClassInfo;
+	pobj_ClassInfo=new CClassInfo();
+
+	pobj_ClassInfo->Analyze(pBuf,p);
+
+
+	//クラスフォルダを挿入
+	pobj_ClassTreeView->InsertClassFolder(
+		pobj_ClassInfo->ClassName,
+		hFileTreeItem,
+		pBuf,
+		i2);
+
+
+
+	///////////////////////////////
+	// メンバ及びメソッドを挿入
+	///////////////////////////////
+
+	int i;
+	for(i=0;i<pobj_ClassInfo->MemberNum;i++){
+		int flag;
+		if(pobj_ClassInfo->pMemberInfo[i].dwProc==0){
+			//メンバ変数
+			if(pobj_ClassInfo->pMemberInfo[i].dwAccess==ACCESS_PUBLIC){
+				//公開
+				flag=CTV_PUBLIC_MEMBER;
+			}
+			else{
+				//非公開
+				flag=CTV_PRIVATE_MEMBER;
+			}
+		}
+		else{
+			//メソッド
+			if(pobj_ClassInfo->pMemberInfo[i].dwAccess==ACCESS_PUBLIC){
+				//公開
+				flag=CTV_PUBLIC_METHOD;
+			}
+			else{
+				//非公開
+				flag=CTV_PRIVATE_METHOD;
+			}
+		}
+		pobj_ClassTreeView->InsertClassMember(flag,pobj_ClassInfo->pMemberInfo[i].pName,hFileTreeItem,pBuf,pobj_ClassInfo->pMemberInfo[i].code_pos);
+	}
+
+
+	delete pobj_ClassInfo;
+	pobj_ClassInfo=0;
+}
+
+
+void SetClassTreeFromOneFile_Buf( char *pBuf, HTREEITEM hFileTreeItem ){
+	int i2,i3,i4;
+	char temporary[GENERAL_SIZE];
+
+	for(i2=0;;i2++){
+		if(pBuf[i2]=='\0') break;
+		while(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'&&pBuf[i2+2]=='\r'&&pBuf[i2+3]=='\n') i2+=2;
+		if(i2==0||(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
+			if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n') i2+=2;
+			while(pBuf[i2]>='0'&&pBuf[i2]<='9') i2++;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+			i4=i2;
+			for(i3=0;;i2++,i3++){
+				if(!IsVariableChar(pBuf[i2])){
+					temporary[i3]=0;
+					break;
+				}
+				temporary[i3]=pBuf[i2];
+			}
+			if(pBuf[i2]=='\0') break;
+
+			if(lstrcmpi(temporary,"Class")==0||
+				lstrcmpi(temporary,"Type")==0||
+				lstrcmpi(temporary,"Interface")==0){
+
+				/////////////////////////////
+				// クラスの解析
+				/////////////////////////////
+				AnalysisClass(pBuf,&i4,hFileTreeItem);
+
+				i2=i4-1;
+				continue;
+			}
+
+			int sw;
+			if(lstrcmpi(temporary,"Sub")==0) sw=1;
+			else if(lstrcmpi(temporary,"Function")==0) sw=2;
+			else sw=0;
+
+			if(sw){
+				//Sub/Function
+				while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+				for(i3=0;;i2++,i3++){
+					if(!IsVariableChar(pBuf[i2])){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=pBuf[i2];
+				}
+
+				if(lstrcmpi(temporary,"Export")==0){
+					//Export修飾子はとばす
+					while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+					for(i3=0;;i2++,i3++){
+						if(!IsVariableChar(pBuf[i2])){
+							temporary[i3]=0;
+							break;
+						}
+						temporary[i3]=pBuf[i2];
+					}
+				}
+
+				i4=pobj_ClassTreeView->NumberOfProcedures;
+				pobj_ClassTreeView->pProcInfo=(PROCINFO *)HeapReAlloc(hHeap,0,pobj_ClassTreeView->pProcInfo,sizeof(PROCINFO)*(i4+1));
+				pobj_ClassTreeView->pProcInfo[i4].name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+				lstrcpy(pobj_ClassTreeView->pProcInfo[i4].name,temporary);
+				pobj_ClassTreeView->pProcInfo[i4].hFileTreeItem = hFileTreeItem;
+
+				//定義行の選択範囲
+				pobj_ClassTreeView->pProcInfo[i4].code_pos=i2;
+
+				//パラメータ部
+				while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+				if(pBuf[i2]=='('){
+					int IsStr,PareNum;
+					for(i2++,i3=0,IsStr=0,PareNum=0;;i2++,i3++){
+						if(pBuf[i2]=='\"') IsStr^=1;
+						if(pBuf[i2]=='('&&IsStr==0) PareNum++;
+						if(pBuf[i2]==')'&&IsStr==0){
+							PareNum--;
+							if(PareNum<0){
+								temporary[i3]=0;
+								break;
+							}
+						}
+						if(pBuf[i2]=='\0') break;
+						temporary[i3]=pBuf[i2];
+					}
+					//temporaryはパラメータの内容が格納されるが、不要
+				}
+
+				for(;;i2++){
+					if(IsCommandDelimitation(pBuf,i2)){
+						break;
+					}
+					if((pBuf[i2]=='a'||pBuf[i2]=='A')&&(pBuf[i2+1]=='s'||pBuf[i2+1]=='S')&&(pBuf[i2+2]==' '||pBuf[i2+2]=='\t')){
+						i2+=3;
+						while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+						for(i3=0;;i2++,i3++){
+							if(!IsVariableChar(pBuf[i2])){
+								temporary[i3]=0;
+								break;
+							}
+							temporary[i3]=pBuf[i2];
+						}
+						//temporaryには型情報が格納されるが、不要
+						break;
+					}
+				}
+
+				//ツリーアイテムを挿入
+				HTREEITEM hTempItem;
+				hTempItem=pobj_ClassTreeView->InsertGlobalProcedure(
+					CTV_GLOBAL_PROC,
+					pobj_ClassTreeView->pProcInfo[i4].name,
+					hFileTreeItem);
+				pobj_ClassTreeView->pProcInfo[i4].hTreeItem=hTempItem;
+
+				pobj_ClassTreeView->NumberOfProcedures++;
+
+				i2--;
+			}
+		}
+	}
+}
+void SetClassTreeFromOneFile( const ActiveBasic::PM::FM::File &file){
+	int WndNum;
+	HWND hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		WndNum=GetWndNum(hChild);
+		if( WndNum != -1 )
+		{
+			if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+				if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),file.GetFullPath().c_str())==0) break;
+			}
+			hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+		}
+	}
+
+	char *pBuf;
+	if(hChild){
+		//すでに指定されたファイルが開かれている場合
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+	}
+	else{
+		//開かれていない場合
+		pBuf=ReadBuffer(file.GetFullPath());
+		if(!pBuf) pBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+	}
+
+	SetClassTreeFromOneFile_Buf( pBuf, file.GetTreeItemHandle() );
+
+	if(!hChild) HeapDefaultFree(pBuf);
+}
+void SetClassTreeFromAllFile( ActiveBasic::PM::FM::Folder &folder )
+{
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		SetClassTreeFromAllFile( childFolder );
+	}
+
+	BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		SetClassTreeFromOneFile( file );
+	}
+}
+
+void SetProcedureTreeData(void *temp_hFileTreeItem)
+{
+	BOOL bExpand;
+	TVITEM tvItem;
+	SCROLLINFO si;
+
+	HTREEITEM hFileTreeItem = (HTREEITEM)temp_hFileTreeItem;
+
+	if(bSearchingClasses){
+		bRetrySearchingClasses=1;
+		_endthread();
+		return;
+	}
+	bSearchingClasses=1;
+
+	if(pobj_ClassTreeView->pProcInfo){
+wait_repeat:
+		Sleep(700);
+		if(bRetrySearchingClasses){
+			bRetrySearchingClasses=0;
+			goto wait_repeat;
+		}
+
+		PROCINFO *pNewProcInfo;
+		pNewProcInfo=(PROCINFO *)HeapAlloc(hHeap,0,pobj_ClassTreeView->NumberOfProcedures*sizeof(PROCINFO));
+		int NewProcNum;
+		NewProcNum=0;
+
+		//プロシージャ情報のメモリを解放
+		for(int i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
+			if(hFileTreeItem==(HTREEITEM)-1 || hFileTreeItem==pobj_ClassTreeView->pProcInfo[i].hFileTreeItem){
+				HeapDefaultFree(pobj_ClassTreeView->pProcInfo[i].name);
+			}
+			else{
+				pNewProcInfo[NewProcNum]=pobj_ClassTreeView->pProcInfo[i];
+				NewProcNum++;
+			}
+		}
+		HeapDefaultFree(pobj_ClassTreeView->pProcInfo);
+
+		pobj_ClassTreeView->pProcInfo=pNewProcInfo;
+		pobj_ClassTreeView->NumberOfProcedures=NewProcNum;
+	}
+	else{
+		pobj_ClassTreeView->pProcInfo=(PROCINFO *)HeapAlloc(hHeap,0,1);
+		pobj_ClassTreeView->NumberOfProcedures=0;
+	}
+
+	extern HWND hProcedureTreeView;
+	tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
+	if(tvItem.hItem){
+		TreeView_GetItem(hProcedureTreeView,&tvItem);
+		if(tvItem.state&TVIS_EXPANDED){
+			bExpand=1;
+
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS;
+			GetScrollInfo(hProcedureTreeView,SB_VERT,&si);
+		}
+		else bExpand=0;
+	}
+	else bExpand=1;
+
+
+	pobj_ClassTreeView->init(hProcedureTreeView,hFileTreeItem);
+
+	//ルートフォルダ
+	pobj_ClassTreeView->InsertRootFolder();
+
+	//グローバル関数フォルダ
+	pobj_ClassTreeView->InsertGlobalProcedureFolder();
+
+
+	//描画をロック
+	LockWindowUpdate(hProcedureTreeView);
+
+	if( projectInfo.IsOpened() ){
+		// プロジェクトが開かれているとき
+		if(hFileTreeItem==(HTREEITEM)-1){
+			boost::mutex::scoped_lock lock( projectInfo.fileSystem.mutex );
+
+			//プロジェクトのすべてのファイルを解析
+			SetClassTreeFromAllFile( projectInfo.fileSystem.root );
+
+			//不要になったアイテムを除去
+			//pobj_ClassTreeView->finish();
+		}
+		else{
+			/////////////////////////////////
+			// 編集中のファイルのみを解析
+			/////////////////////////////////
+
+			SetClassTreeFromOneFile( projectInfo.fileSystem.root.FindFile( hFileTreeItem ) );
+		}
+	}
+	else{
+		// 編集中の単体ファイルを解析
+
+		HWND hChild=GetWindow(hClient,GW_CHILD);
+		int WndNum=GetWndNum(hChild);
+		if( WndNum == -1 )
+		{
+			char *pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+			SetClassTreeFromOneFile_Buf( pBuf, (HTREEITEM)-1 );
+		}
+	}
+
+	//不要になったアイテムを除去
+	pobj_ClassTreeView->finish();
+
+	//描画ロックを解除
+	LockWindowUpdate(0);
+
+
+	if(bExpand){
+		TreeView_Expand(hProcedureTreeView,pobj_ClassTreeView->hRootFolder,TVE_EXPAND);
+
+		SetScrollInfo(hProcedureTreeView,SB_VERT,&si,1);
+	}
+
+
+	bSearchingClasses=0;
+	if(bRetrySearchingClasses){
+		bRetrySearchingClasses=0;
+		ResetClassTree(hFileTreeItem);
+	}
+
+	if(pobj_ClassTreeView->bCloseSwitch){
+		//コード解析中に終了ボタンが押されたとき
+		PostMessage(hOwner,WM_CLOSE,0,0);
+	}
+	if(pobj_ClassTreeView->bShowSwitch){
+		//コード解析中にクラスビューがダブルクリックされたとき
+		extern HWND hProjectViewTab;
+		PostMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
+		pobj_ClassTreeView->bShowSwitch=0;
+	}
+
+	_endthread();
+}
+void ResetClassTree(HTREEITEM hFileTreeItem){
+	_beginthread(SetProcedureTreeData,0,(void *)hFileTreeItem);
+}
Index: branches/egtra/ab5.0/abdev/abdev/CodeFormatter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/CodeFormatter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/CodeFormatter.cpp	(revision 774)
@@ -0,0 +1,251 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+// インデント関連
+
+int IsIndentAdditionCommand_FromBuffer(char *buffer);
+int IsIndentDecreaseCommand_FromBuffer(char *buffer);
+
+char *CodeFormatter(char *lpszReadBuffer){
+	int WndNum;
+	WndNum=GetNowWndNum();
+
+	if(MdiInfo[WndNum]->DocType!=WNDTYPE_BASIC){
+		goto NonFormater;
+	}
+
+	char *lpszTempReadBuffer;
+	lpszTempReadBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
+	lstrcpy(lpszTempReadBuffer,lpszReadBuffer);
+
+	//CRLFをLFに変換
+	ChangeReturnCode(lpszTempReadBuffer);
+
+	DeleteComment(lpszTempReadBuffer);
+
+	//カッコの相互関係をチェック
+	if(!CheckParenthesis(lpszTempReadBuffer)){
+		HeapDefaultFree(lpszTempReadBuffer);
+		goto NonFormater;
+	}
+
+
+
+	////////////////////////////////////
+	// インデントの初期TAB文字数を取得
+	////////////////////////////////////
+
+	char *pBuf;
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//カーソルバッファ位置を取得
+	int i,i2;
+	i=GetBufferIndexFromCaretPos(pBuf,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+	int StartX=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
+
+	//現在の行のインデントをコピー（iFirstIndent_Speciallyにタブ数を格納）
+	int iFirstIndent_Specially=0;
+	for(i2=i;i2>0;i2--){
+		if(pBuf[i2-1]=='\r'&&pBuf[i2]=='\n'){
+
+			i=i2-1;
+
+			i2++;
+
+			int x=0;
+			while(pBuf[i2]=='\t'&&x<StartX){
+				i2++;
+				x++;
+				iFirstIndent_Specially++;
+			}
+
+			break;
+		}
+	}
+
+	//前の行のインデントをコピー（iIndentにタブ数を格納）
+	for(;i>0;i--){
+		if(
+			pBuf[i-1]=='\r'&&pBuf[i]=='\n'&&
+			(!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n'))
+			){
+			i++;
+			break;
+		}
+	}
+
+	int iIndent;
+	for(iIndent=0;;iIndent++){
+		if(pBuf[i+iIndent]!='\t') break;
+	}
+
+	if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
+		//インデント追加のコマンドかどうかを判断
+		if(IsIndentAdditionCommand_FromBuffer(pBuf+i+iIndent)) iIndent++;
+	}
+
+
+
+	//////////////////////////////
+	// 各行のTAB文字数を計算
+	//////////////////////////////
+
+	int *pTabs,LineCount=0;
+	pTabs=(int *)HeapAlloc(hHeap,0,(lstrlen(lpszTempReadBuffer)+1)*sizeof(int));
+
+	char *pTemp;
+	pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(lpszTempReadBuffer)+1);
+
+	i=0;
+	BOOL bInterface=0;
+	while(1){
+		while(lpszTempReadBuffer[i]=='\t'||lpszTempReadBuffer[i]==' ') i++;
+
+		int PareNum,BracketNum;
+		PareNum=0,BracketNum=0;
+
+		pTabs[LineCount]=0;
+
+		int MultiLine=0;
+		for(i2=0;;i++,i2++){
+
+			if(lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]=='[') PareNum++;
+			else if(lpszTempReadBuffer[i-1]==')'||lpszTempReadBuffer[i-1]==']') PareNum--;
+
+			if(lpszTempReadBuffer[i]=='\n'||lpszTempReadBuffer[i]=='\0'){
+				if((lpszTempReadBuffer[i-1]=='('||lpszTempReadBuffer[i-1]==',')&&lpszTempReadBuffer[i]){
+					//パラメータ改行
+
+					i++;
+					MultiLine++;
+
+					pTabs[LineCount+MultiLine]=PareNum;
+
+					while(lpszTempReadBuffer[i]=='\n'){
+						i++;
+						MultiLine++;
+
+						pTabs[LineCount+MultiLine]=PareNum;
+					}
+					continue;
+				}
+				if(lpszTempReadBuffer[i-1]=='_'&&lpszTempReadBuffer[i]){
+					//任意改行
+					i++;
+					i2--;
+
+					MultiLine++;
+
+					pTabs[LineCount+MultiLine]=1;
+					continue;
+				}
+
+				pTemp[i2]=0;
+				break;
+			}
+			pTemp[i2]=lpszTempReadBuffer[i];
+		}
+
+
+		//インデント減少コマンドかどうかを判定
+		int f;
+		if(f=IsIndentDecreaseCommand_FromBuffer(pTemp)){
+			if(iIndent>0) iIndent--;
+			if(f==2){
+				if(iIndent>0) iIndent--;
+			}
+
+			if(f==3) bInterface=0;
+		}
+
+		if(iFirstIndent_Specially!=-1){
+			if(iIndent-iFirstIndent_Specially<0) iFirstIndent_Specially=iIndent;
+
+			pTabs[LineCount]+=iIndent-iFirstIndent_Specially;
+
+			iFirstIndent_Specially=-1;
+		}
+		else pTabs[LineCount]+=iIndent;
+		LineCount++;
+
+		while(MultiLine){
+			pTabs[LineCount]+=iIndent;
+			LineCount++;
+
+			MultiLine--;
+		}
+
+
+
+		//インデント増加コマンドかどうかを判定
+		if((f=IsIndentAdditionCommand_FromBuffer(pTemp))&&bInterface==0){
+			iIndent++;
+			if(f==2) iIndent++;
+
+			if(f==3) bInterface=1;
+		}
+
+
+		if(lpszTempReadBuffer[i]=='\0') break;
+		i++;
+	}
+
+
+
+	//////////////////////////
+	// インデント整形
+	//////////////////////////
+
+	char *lpszNewBuffer,temp2[1024];
+	lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+8192);
+	lpszNewBuffer[0]=0;
+
+	i=0;
+	bInterface=0;
+	LineCount=0;
+	while(1){
+		while(lpszReadBuffer[i]=='\t'||lpszReadBuffer[i]==' ') i++;
+
+		for(i2=0;;i++,i2++){
+
+			if(IS_RETURN(lpszReadBuffer,i)||lpszReadBuffer[i]=='\0'){
+				pTemp[i2]=0;
+				break;
+			}
+			pTemp[i2]=lpszReadBuffer[i];
+		}
+
+
+		memset(temp2,'\t',pTabs[LineCount]);
+		temp2[pTabs[LineCount]]=0;
+		LineCount++;
+
+		lstrcat(lpszNewBuffer,temp2);
+		lstrcat(lpszNewBuffer,pTemp);
+
+
+
+		if(lpszReadBuffer[i]=='\0') break;
+		i+=2;
+
+		lstrcat(lpszNewBuffer,"\r\n");
+	}
+
+	HeapDefaultFree(pTemp);
+	HeapDefaultFree(lpszTempReadBuffer);
+
+	HeapDefaultFree(pTabs);
+
+	return lpszNewBuffer;
+
+
+
+NonFormater:
+	//インデント整形は行わない
+	lpszNewBuffer=(char *)HeapAlloc(hHeap,0,lstrlen(lpszReadBuffer)+1);
+	lstrcpy(lpszNewBuffer,lpszReadBuffer);
+	return lpszNewBuffer;
+}
Index: branches/egtra/ab5.0/abdev/abdev/Common.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Common.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Common.h	(revision 774)
@@ -0,0 +1,1093 @@
+#pragma once
+
+#define OEMRESOURCE
+#define _CRT_SECURE_NO_DEPRECATE	//セキュリティ警告を出さない
+#define _CRT_NONSTDC_NO_DEPRECATE
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <commctrl.h>
+#include "htmlhelp.h"
+#include <shlobj.h>
+#include <zmouse.h>
+#include <math.h>
+#include <limits.h>
+#include <process.h>
+#include <wininet.h>
+
+#include "nkf_class.h"
+#include "WebSearch.h"
+#include "ruler.h"
+#include "TabCtrl.h"
+#include "ExtensionLink.h"
+#include "HtmlAnalysis.h"
+#include "FileTree.h"
+#include "menu.h"
+#include "LuxCtrl.h"
+#include "MdiTextEdit.h"
+#include "BREGEXP.H"
+#include "../compiler_x86/CommandValue.h"
+
+
+#include "Attach.h"
+#include "Debugger.h"
+
+
+#pragma comment(lib, "wininet.lib")
+
+
+
+#ifdef THETEXT
+
+////////////////////////////
+// TheTextのバージョン情報
+////////////////////////////
+#define APPLICATION_NAME "TheText"
+#define VERSION_APPLI_NAME APPLICATION_NAME
+#define VERSION_STRING "1.02"
+
+#else
+
+/////////////////////////////////////////////////
+// ActiveBasic/ProjectEditorのバージョン情報
+/////////////////////////////////////////////////
+#define APPLICATION_NAME "ActiveBasic 5.0"
+#define VERSION_APPLI_NAME APPLICATION_NAME
+#define VERSION_STRING "5.0.0.5"
+
+#endif
+
+
+
+#ifndef IMAGE_FILE_MACHINE_AMD64
+#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
+#endif
+
+
+#if defined(JPN)
+
+#ifdef THETEXT
+//TheText日本語
+#include "../res_TheText/resource.h"
+#include "common_msg_jpn.h"
+#else
+//日本語
+#include "../res/resource.h"
+#include "common_msg_jpn.h"
+#endif
+
+#else
+//英語
+#include "../res_e/resource.h"
+#include "common_msg_eng.h"
+#endif
+
+//アイコンリソース
+#include "../icon_res/resource.h"
+
+
+
+
+#define GENERAL_SIZE	8192
+#define MAX_ARRAYDIM	16
+
+#define MAX_WNDNUM 255
+
+
+#ifdef _AMD64_
+#else
+typedef long LONG_PTR;
+typedef DWORD ULONG_PTR;
+#endif
+
+//ファイルタイプ
+#define FT_BASICPROGRAM	1
+#define FT_SUBPROGRAM	2
+#define FT_TEXT			3
+#define FT_PROJECT		4
+#define FT_ICON			5
+#define FT_HTML			6
+#define FT_OTHER		0
+
+#define BMPNUM_STANDARDTOOLBAR	10		//hDefaultToolbarのビットマップ数
+#define SEPNUM_STANDARDTOOLBAR	4		//hDefaultToolbarのセパレータ数
+#define BMPNUM_DEBUGGERTOOLBAR		8		//hDebuggerToolbarのビットマップ数
+#define SEPNUM_DEBUGGERTOOLBAR		2		//hDebuggerToolbarのセパレータ数
+#define BMPNUM_RADTOOLBAR		18		//コントロール挿入用ツールバーのビットマップ数（区切り用BMPを最後の1つに用意する）
+#define SEPNUM_RADTOOLBAR		3		//コントロール挿入用ツールバーのセパレータ数
+
+//MDIクライアントウィンドウ下のドキュメントウィンドウタイプ
+#define WNDTYPE_BASIC		1
+#define WNDTYPE_TEXT		2
+#define	WNDTYPE_RAD			3
+#define WNDTYPE_MENU		4
+#define WNDTYPE_ICONEDIT	5
+#define WNDTYPE_HTML		6
+
+#define IS_DOCUMENT_TEXT(a) (a==WNDTYPE_BASIC||a==WNDTYPE_TEXT||a==WNDTYPE_HTML)
+
+#define IS_RETURN(buffer,p) (buffer[p]=='\r'&&buffer[p+1]=='\n')
+#define IS_BLANK(c) (c==' '||c=='\t')
+
+//Rebarコントロールの個数（レバー追加）
+#define MAX_REBARBANDS			5
+
+//RebarコントロールのID（レバー追加）
+#define ID_DOCCOMBO				1
+#define ID_STANDARDTOOLBAR		2
+#define ID_RELEASETOOLBAR		3
+#define ID_DEBUGGERTOOLBAR		4
+#define ID_SELECTCOMPILERCOMBO	5
+#define ID_WEB_SEARCH			6
+
+//検索コンボボックスの最大リスト数
+#define MAX_FINDLIST	20
+
+#define ID_FIRSTCHILD 100
+
+
+//タブカラー
+#define TABCOLOR_GRAY		RGB(230,230,230)	//灰色
+#define TABCOLOR_WHITE		RGB(255,255,255)	//白
+#define TABCOLOR_RED		RGB(255,200,200)	//赤
+#define TABCOLOR_GREEN		RGB(200,255,200)	//緑
+#define TABCOLOR_BLUE		RGB(200,220,255)	//青
+#define TABCOLOR_YELLOW		RGB(255,255,180)	//黄色
+
+
+#define WM_RESETCARETPOS		WM_USER+80	//オートスクロールスレッドからのキャレット設定
+
+#define WM_SEARCH_TAB_CREATE	WM_USER+90	//Web検索のタブアイテムの生成メッセージ
+#define WM_SEARCH_TAB_CLOSE		WM_USER+91	//Web検索のタブアイテムの破棄メッセージ
+
+//SideWeb
+#define WM_BROWS_CREATE  WM_USER+100
+#define WM_BROWS_DESTROY WM_USER+101
+#define WM_BROWS_GO      WM_USER+102
+#define WM_BROWS_NAVI    WM_USER+103
+
+
+
+#define MAX_HASH 32768
+
+
+//////////////////////////////////
+// メインウィンドウのタイマーID
+
+#define ID_TIMER_BACKUP	10
+#define ID_DEBUGSAFTY	20
+
+// ここまで
+//////////////////////////////////
+
+
+
+extern HANDLE hHeap;
+extern HINSTANCE hInst,hResInst,hIconResInst;
+extern HWND hOwner;
+extern HWND hClient;
+extern int ScreenX,ScreenY;
+extern char pj_editor_Dir[MAX_PATH];
+
+
+//アルファブレンド用のAPI
+#define WS_EX_LAYERED 0x00080000
+#define LWA_ALPHA 0x00000002
+typedef BOOL (WINAPI *FWINLAYER)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );
+
+
+
+//新規プロジェクトのベース
+#define BASE_VOID	0
+#define BASE_PROMPT 1
+#define BASE_NORMAL 2
+
+struct POINTANDSIZE{
+	POINT pos;
+	SIZE size;
+};
+
+
+
+//////////////////////////////////////////
+// リソース ヘッダ（アイコン、カーソル用）
+typedef struct{
+	WORD idReserved;
+	WORD idType;
+	WORD idCount;
+}ICONDIR,CURSORDIR;
+
+////////////////////////////
+//.icoファイルのヘッダ情報
+struct ICONDIRENTRY{
+	BYTE bWidth;
+	BYTE bHeight;
+	BYTE bColorCount;
+	BYTE bReserved;
+	WORD wPlanes;
+	WORD wBitCount;
+	DWORD dwBytesInRes;
+	DWORD dwImageOffset;
+};
+
+
+/////////////////////
+//MDIウィンドウ情報
+
+#define MAX_UNDONUM 300//512未完成
+#define MAX_ICONEDIT_UNDONUM 32
+
+#define TEXTEDIT_UNDO_KEY		1
+#define TEXTEDIT_UNDO_PASTE		2
+#define TEXTEDIT_UNDO_SELKEY	3
+struct TEXTEDIT_UNDOSTATE{
+	int NowPos;
+	int Command[MAX_UNDONUM];
+	char *KeyStr[MAX_UNDONUM];
+	char *DelStr[MAX_UNDONUM];
+	CHARRANGE Range[MAX_UNDONUM];
+	CHARRANGE DelRange[MAX_UNDONUM];
+};
+
+struct RAD_UNDOSTATE_NAME{
+	std::string name;
+};
+#define RAD_UNDO_INSERTWND	1
+#define RAD_UNDO_DELETEWND	2
+#define RAD_UNDO_INSERTITEM	3
+#define RAD_UNDO_DELETEITEM	4
+#define RAD_UNDO_NAME		5
+#define RAD_UNDO_CAPTION	6
+#define RAD_UNDO_FONT		7
+#define RAD_UNDO_BGCOLOR	8
+#define RAD_UNDO_WINDOWMENU	9
+#define RAD_UNDO_ICONRES	10
+#define RAD_UNDO_STYLE		11
+#define RAD_UNDO_EXSTYLE	12
+#define RAD_UNDO_POSITION	13
+#define RAD_UNDO_IMAGESTATE	14
+#define RAD_UNDO_TYPE		15
+struct RAD_UNDOSTATE{
+	int NowPos;
+	int Command[MAX_UNDONUM];
+	int SelectItemNum[MAX_UNDONUM];
+	DWORD lpdwData[MAX_UNDONUM];
+};
+
+#define MAX_RAD_SELITEM	255
+struct MDIRADINFO{
+	//Radツール用
+
+	HWND hTools;
+
+	HWND hProperty;
+	HWND hProp_Dlg;
+
+	HWND hSupport;
+
+	HWND hRad;
+
+	HBITMAP hBitmap;
+	HBITMAP hOldBitmap;
+	HDC hMemDC;
+	int SelectingItem[MAX_RAD_SELITEM];
+	int ButtonSelect;
+
+	//ウィンドウクライアント領域
+	POINT ClientPos;
+	SIZE ClientSize;
+
+	//変更情報
+	RAD_UNDOSTATE undo;
+};
+
+struct MDIMENUINFO{
+	HWND hList;
+	HWND hMenuEdit;
+	HWND hEdit_Dlg;
+};
+
+#define ICONTYPE_16_16	0
+#define ICONTYPE_16_256	1
+#define ICONTYPE_32_16	2
+#define ICONTYPE_32_256	3
+struct ICONEDIT_UNDOSTATE{
+	int NowPos;
+	BYTE *lpData[MAX_ICONEDIT_UNDONUM];
+};
+struct MDIICONEDITINFO{
+	HWND hMain;
+	HWND hToolDlg;
+	HWND hButtonsDlg;
+	HWND hColorDlg;
+
+	HDC memdc;
+	HBITMAP hMemBmp;
+
+	HBITMAP hSelectingBmp;
+	int SelectLevel;
+	RECT DraggingRect;
+
+	int num;
+	int SelectIconNum;
+	union{
+		BYTE *pIconImage[8];	//アイコンのイメージデータ配列（マップ配列、カラー配列、マスク配列）
+		BITMAPINFOHEADER *pBmpHdr[8];
+	};
+	DWORD dwBytesInRes[8];
+
+	DWORD NowTool;
+	COLORREF MainColor;
+	COLORREF SubColor;
+
+	ICONEDIT_UNDOSTATE undo[8];
+	BOOL bModify;
+};
+
+struct FILEIDENTITY{
+	DWORD VolumeSerialNumber;
+	DWORD FileIndexHigh;
+	DWORD FileIndexLow;
+};
+
+inline bool IsFileIdentityValid(FILEIDENTITY const& fi){
+	return fi.VolumeSerialNumber != 0
+		&& fi.FileIndexHigh != 0
+		&& fi.FileIndexLow != 0;
+}
+
+inline bool operator ==(FILEIDENTITY const& lhs, FILEIDENTITY const& rhs)
+{
+	return lhs.VolumeSerialNumber == rhs.VolumeSerialNumber
+		&& lhs.FileIndexHigh == rhs.FileIndexHigh
+		&& lhs.FileIndexLow == rhs.FileIndexLow;
+}
+
+struct MDIINFO{
+	HWND hwnd;
+	int DocType;
+	std::string title;
+	std::string path;
+	FILEIDENTITY FileIdentity;
+
+	union{
+		MDIRADINFO *MdiRadInfo;
+		MDIMENUINFO *MdiMenuInfo;
+		MDIICONEDITINFO *MdiIconEditInfo;
+		CMdiTextEdit *pMdiTextEdit;
+	};
+
+	char *IndentStr;
+};
+extern std::vector<MDIINFO *> MdiInfo;
+
+//RADツールのマウスドラッグ
+#define FRAME_CHANGEPOS_START	1 //----- ここから -----
+#define FRAME_UPPER_LEFT	1
+#define FRAME_UPPER_RIGHT	2
+#define FRAME_LOWER_LEFT	3
+#define FRAME_LOWER_RIGHT	4
+#define FRAME_LEFT			5
+#define FRAME_RIGHT			6
+#define FRAME_UPPER			7
+#define FRAME_LOWER			8
+#define FRAME_INSIDE		9
+#define FRAME_CHANGEPOS_END		9 //----- ここまで -----
+#define ITEM_MAKING			10
+#define SELECTING_FRAME		11
+
+//アイテムの大きさの限界値
+#define MIN_ITEM_X	12
+#define MIN_ITEM_Y	9
+
+//選択アイテム
+#define SELECT_WINDOW	-1
+#define NON_TOOL		-1
+
+struct RADINFO{
+	int NowDragging;
+	POINT DragStartPos;
+	RECT DragStartRect[MAX_RAD_SELITEM];
+	RECT DraggingRect[MAX_RAD_SELITEM];
+	RECT OldDraggingRect[MAX_RAD_SELITEM];
+};
+
+
+//////////////////
+//リソース情報
+extern HTREEITEM hCursorTreeItemForProjectView;
+extern HTREEITEM hBitmapTreeItemForProjectView;
+extern HTREEITEM hIconTreeItemForProjectView;
+
+
+////////////////////
+//プロジェクト情報
+
+#define PROJECT_VERSION	10
+
+struct PROCINFO{
+	char *name;
+	HTREEITEM hTreeItem;
+
+	HTREEITEM hFileTreeItem;
+
+	int code_pos;
+};
+struct INCPROCINFO{
+	char *name;
+	char *Parms;
+	char *type;
+};
+
+//ダイアログアイテムの種類
+#define CT_BUTTON		1
+#define CT_CHECKBOX		2
+#define CT_COMBOBOX		3
+#define CT_EDIT			4
+#define CT_GROUPBOX		5
+#define CT_HSCROLLBAR	6
+#define CT_IMAGEBOX		7
+#define CT_LISTBOX		8
+#define CT_LISTVIEW		9
+#define CT_RADIOBUTTON	10
+#define CT_STATIC		11
+#define CT_TREEVIEW		12
+#define CT_VSCROLLBAR	13
+#define CT_UPDOWN		14
+#define CT_PROGRESSBAR	15
+#define CT_TRACKBAR		16
+#define CT_MENU			99
+
+//イベント タイプ
+#define EVENTTYPE_DEFAULT	0
+#define EVENTTYPE_MENU		1
+#define EVENTTYPE_MMSYS		2
+
+
+struct NEWPROJECTINFO{
+	char name[MAX_PATH];
+	DWORD dwTypeID;
+	_int8 ShowHelloWorld;
+	DWORD dwOption;
+};
+struct MENU_INFO{
+	char *IdName;
+	char *caption;
+	UINT type;
+	UINT state;
+
+	int NumberOfMenu;
+	MENU_INFO *pMenuInfo;
+
+	HTREEITEM hTreeItem;
+};
+#define MT_EXE	0	//EXEモジュールタイプ
+#define MT_DLL	1	//DLLモジュールタイプ
+#define MT_SLL	2	//SLLモジュールタイプ
+#define PJ_OP_SOURCE_MASK	0x00FFFFFF
+#define PJ_OP_MMSYSTEM		0x00000001
+#define PJ_OP_COMMCTRL		0x00000002
+#define PJ_OP_RICHEDIT		0x00000004
+#define PJ_OP_WINSOCK		0x00000008
+#define PJ_OP_STRICT		0x00010000	// #strictディレクティブは今は使われていない
+#define PJ_OP_RC_MANIFEST	0x00020000
+#define PJ_OP_UNICODE		0x00040000
+
+
+
+struct SAVEREBAR{
+	int RebarID;
+	int RebarLength;
+	int IsBandBreak;
+};
+
+struct ITEMEVENTINFO{
+	char *IdName;
+	char **pEventNames;
+	int ClassID;
+	int EventNum;
+};
+
+#define PARAMETER_HINT_MAX_SIZE 8192
+struct METHODCHECKINFO{
+	HWND hWnd;
+	LOGFONT LogFont;
+	HFONT hFont;
+	HFONT hBoldFont;
+	char BeforeMethodName[VN_SIZE];
+	char msg[PARAMETER_HINT_MAX_SIZE];
+	int ParmNum;
+	int HeadPos;
+};
+
+
+/////////////////////
+// コード補完機能
+/////////////////////
+
+#define ACCESS_NON					0
+#define ACCESS_PRIVATE				1
+#define ACCESS_PUBLIC				2
+#define ACCESS_PROTECTED			3
+#define ACCESS_PAIRCOMMAND			4
+#define ACCESS_HTML_GENERAL_PARAM	5
+#define ACCESS_HTML_PARAM			6
+struct MEMBERINFO{
+	//クラス名
+	char *pName;
+	DWORD dwProc;
+	DWORD dwAccess;
+
+	int code_pos;
+};
+struct COMPLEMENT_WINDOW_INFO{
+	HWND hWnd;
+	HWND hList;
+
+	int iPos;
+	int iLength;
+
+	MEMBERINFO *pMemberInfo;
+	int MemberNum;
+
+	//ペアステートメントのインデント格納用
+	char szIndent[255];
+};
+
+
+
+class CSettingFile{
+	BOOL GetDataLine(const char *name,char *parms);
+protected:
+	char *buffer;
+
+	BOOL GetWholeValue(const char *name,int *pi32data);
+	bool GetBoolean( const char *name,bool &b );
+	BOOL Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3);
+	BOOL GetRGBValue(char *name,COLORREF *prgb);
+	BOOL GetStringValue(char *name,char *str);
+	BOOL GetRectValue(char *name,RECT *prc);
+	BOOL GetLogFont(char *name,LOGFONT *plf);
+	BOOL GetRebarBand(SAVEREBAR *psr,int num);
+
+	void SetWholeValue( const char *name,long i32data);
+	void SetBoolean( const char *name,bool b);
+	void Set3WholeValue(char *name,long d1,long d2,long d3);
+	void SetRGBValue(char *name,COLORREF rgb);
+	void SetStringValue(char *name,char *str);
+	void SetRectValue(char *name,RECT *prc);
+	void SetLogFont(char *name,LOGFONT *plf);
+	void SetRebarBand(SAVEREBAR *psr,int num);
+};
+#include "DesignTheme.h"
+
+
+
+//ProjectEditor.cpp
+void HeapDefaultFree(LPVOID lpMem);
+void ToBigChar(char str[]);
+int GetWndNum(HWND hChild);
+int GetNowWndNum(void);
+void SendTextEditResizeEvent(HWND hwnd);
+void RedrawAllWindow(void);
+int DocumentModifyCheck(HWND hChild);
+void SetStatusText(char *MenuText);
+void ResetState_UndoMenu(void);
+void ResetState_EditMenu(void);
+void ResetState_DocMenu(void);
+void DuplicateTitleCheck(char *lpszTitle);
+HWND NewTextEditWindow(char const *filepath,_int8 DocumentType,COLORREF TabColor=TABCOLOR_GRAY);
+void CloseDocWindow(int WndNum);
+void ResizeTextEditWnd(HWND hwnd,int cx,int cy);
+#define FLAG_DBLCLK		1
+#define FLAG_BEAMCURSOR	2
+int RegWndClass(WNDPROC WndProc,char *lpClassName,HBRUSH hBackBrush,DWORD dwFlag);
+
+//Backup.cpp
+void CreateBackupDir(void);
+void backup(void *dummy);
+BOOL restore(void);
+
+//DialogBoxes.cpp
+void SetPosCenter(HWND hParent,HWND hwnd);
+void SetPosCenter(HWND hwnd);
+BOOL SetFontDialog(HWND hwnd,LOGFONT *lf,BOOL bFixedPitchOnly,int *lpiPointSize=0);
+void DlgNewProjectWizard(HWND hwnd);
+BOOL CALLBACK DlgNewFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void DlgProjectOptionSetting(HWND hwnd);
+void DlgOptionSetting(HWND hwnd);
+BOOL CALLBACK DialogAbout(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//FileOperation.cpp
+char *ReadBuffer( const std::string &path );
+char *ReadBuffer_NonErrMsg( const std::string &path );
+_int8 WriteBuffer(const std::string &path,const char *buffer,int length, bool isEnableError = true);
+_int8 WriteBuffer_NonErrMsg(const std::string &path,char *buffer,int length);
+void GetRelationalPath(char *path,char *dir);
+void GetFullPath(char *path,const char *dir);
+void RemoveDirectoryStrong(const char *dirPath);
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,_int8 IsOpen);
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle);
+int GetFileExtension( const char *path );
+HWND OpenFileWithExtension( const std::string &filePath );
+BOOL SaveDocument(HWND hChild,char *SaveFileName);
+BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath);
+bool IsExistFile( const char *FilePath );
+bool IsExistDirectory( const char *DirPath );
+
+//rebar.cpp
+#define MAX_BAND 255
+typedef HWND (*AddBandProc)(HWND hRebar,int num,char *lpszText);
+class CDBRebarBand{
+	int BandId[MAX_BAND];
+	AddBandProc pAddProc[MAX_BAND];
+	int iMaxBandNum;
+public:
+	HWND hRebar;
+	CDBRebarBand();
+	~CDBRebarBand();
+	void add(int band_id,AddBandProc add_proc);
+	HWND call_add(int band_id,int num,char *lpszText);
+};
+class CMainRebar{
+	CDBRebarBand *pobj_DBRebarBand;
+
+	void SetupRebar(HWND hwnd);
+public:
+	HWND hParent;
+	HWND hRebar;
+
+	CMainRebar(HWND hwnd_parent);
+	~CMainRebar();
+
+	void ResetInitRebar();
+	void ResetRebar();
+	void SaveRebarState(void);
+	void ChangeRebarBand(int BandID);
+	void menu_popup(HWND hwnd,int PosX,int PosY);
+};
+extern CMainRebar *pobj_Rebar;
+void ResetRebarData(void);
+LRESULT CALLBACK DefaultToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK DocComboProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK DebuggerToolbarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//SubOperation.cpp
+void ScreenToClient(HWND hwnd,RECT *pRect);
+void ClientToScreen(HWND hwnd,RECT *pRect);
+BOOL IsWow64(void);
+void URLEncode(LPSTR pszSrc);
+void Digit(int num,char *buffer);
+void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect);
+void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2);
+void KillSpaces(char *str1,char *str2);
+void RemoveStringQuotes(char *str);
+void SlideString(char *str,int slide);
+void SlideBuffer(char *buffer,int length,int slide);
+BOOL IsVariableTopChar(char c);
+BOOL IsVariableChar(char c);
+BOOL IsCommandBackDelimitation(char *buffer,int pos);
+BOOL IsCommandDelimitation(char *buffer,int p);
+char *ComparisonString( char *str1, char *str2, bool isBigSmall, bool isWordUnit );
+int GetOneParameter(char *Parameter,int pos,char *retAns);
+int GetStringInPare(char *buffer,char *ReadBuffer);
+int GetStringInBracket(char *buffer,char *ReadBuffer);
+void JumpBlank(char *pBuf,int *piPos);
+BOOL CheckParenthesis(char *buffer);
+DWORD GetValue(char *value);
+HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HBITMAP CreateVertGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HBITMAP CreateHorzGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2);
+HICON CreateGrayIcon(HICON hBaseIcon);
+void GetSize(SIZE *pSize,RECT *pRect);
+BOOL HitTest(RECT *pRect,POINT *pPos);
+BOOL Rectangle(HDC hdc,RECT *pRect);
+void ComboBox_SetSelText(HWND hCombo,char *lpszText);
+void SetCursorByState(int state);
+void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw);
+BOOL SetupProjectEditor(void);
+void EndProjectEditor(void);
+BOOL SetRunning(HWND hChild);
+BOOL IsNeedCompile( const std::string &filepath, BOOL bDebug );
+std::string GetLastErrorString();
+
+//DocumentAdvice.cpp
+void MenuAdvice(WPARAM msg);
+void ShowToolTipText(LPTOOLTIPTEXT TipText);
+char *IncludeFiles(char *buffer);
+void AddParameterHints_ToProject(char *path);
+
+
+
+/////////////////////
+// テキスト エディタ
+/////////////////////
+
+#define CONTROL_TAB_SPACE_DEFAULT		10	//エディタ画面左端のコントロールタブ（通常）
+
+//DrawBuffer.cpp
+void TextEdit_DrawBuffer(HDC hdc,int WndNum,bool drawDirectly=false);
+
+//TextEditor.cpp
+int GetControlTabSpace(int WndNum,int *piCount=0);
+void ResetTextEditFont(HWND hwnd);
+void SetTextEditWordColor(int WndNum);
+BOOL IsHiragana(char *pBuf);
+BOOL IsAlphabet(char c);
+BOOL IsReturnCode(char *pBuf);
+void ResetScrollbar(int WndNum,int max_x,int max_y);
+#define WORDCARET_BEFORE 1
+#define WORDCARET_AFTER  2
+void TextEdit_GetWordCaret(HWND hwnd,int WndNum,POINT *pPos,int *piStart,int *piEnd,BOOL bBeforeAfterFlag);
+void CancelBeforeAutoIndent(int WndNum);
+LRESULT CALLBACK TextEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//Caret.cpp
+BOOL IsRightTurn(char *pBuf,int i,int now_x);
+int GetBufferIndexFromCaretPos(char *pBuf,int now_x,int now_y);
+void GetCaretPosFromBufferIndex(char *pBuf,int index,POINT *pCaretPos);
+void TextEdit_GetSel(int WndNum,CHARRANGE *pCharRange);
+void TextEdit_GetSelText(int WndNum,CHARRANGE *pCharRange,char *buffer);
+void GetScrollBaseCaretPos(MDIINFO *pMdiInfo,int *pNaturalBaseX,int *pNaturalBaseY);
+void GetNaturalBaseCaretPos(int WndNum,int *pScrollBaseX,int *pScrollBaseY);
+void TextEdit_SetSel(int WndNum,int StartIndex,int EndIndex,BOOL bShowCenter=0);
+void TextEdit_SelectOneLine(int WndNum,int code_pos,BOOL bShowCenter=0);
+void ResetCaretPos(int WndNum,BOOL bInputAndReset=0);
+BOOL TextEdit_ScrollCaret(int WndNum,BOOL bScrollOneStep_x,BOOL bShowCenter=0);
+void CaretPos_LooseToNatural(int WndNum,int loose_x,int loose_y,POINT *pCaretPos);
+void GetNaturalCaretPos_Click(int WndNum,int mouse_x,int mouse_y,POINT *pCaretPos);
+void GetNaturalCaretPos_Left(int WndNum);
+void GetNaturalCaretPos_Right(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_Up(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_Down(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_PageUp(int WndNum,POINT *pCaretPos);
+void GetNaturalCaretPos_PageDown(int WndNum,POINT *pCaretPos);
+
+//Replace.cpp
+void TextEdit_Replace(int WndNum,char *str,BOOL bRedraw);
+void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw);
+void TextEdit_Convert(int id);
+
+//TextEditor_UndoRedo.cpp
+void TextEdit_UndoCommand(int WndNum);
+void TextEdit_RedoCommand(int WndNum);
+void TextEdit_NoticeChanging(int WndNum,int Command,char *KeyStr,char *DelStr,CHARRANGE *Range,CHARRANGE *DelRange);
+void TextEdit_DeleteUndoData(TEXTEDIT_UNDOSTATE *pUndoState,int pos);
+
+//Search.cpp
+void AddFindData(HWND hwnd,char ppData[MAX_FINDLIST][MAX_PATH],char *str);
+BOOL CALLBACK DlgFind(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgPermutation(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//analysis.cpp
+BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType);
+BOOL CheckReferType(char *ClassName,BOOL bArray,char *VarArray,int VarRefType);
+void GetOriginalClassName(char *ClassName);
+int GetClassPos(char *pBuf,char *ClassName,DWORD *pdwClassType);
+BOOL GetClassNameFromClassMember(char *pBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray);
+void GetCodeAreaType(char *pBuf,int iPos,int *piProcPos,char *NowClass);
+BOOL GetVariableClassName(char *pEditBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray);
+
+//EndPairCommandComplement.cpp
+BOOL GetEndPairCommandInfo(char *buffer,int p);
+BOOL IsNeedNewIndentCommand(char *name);
+void GetWithObjectVariable(char *buffer,int p,char *pObjectVar);
+
+//Complement.cpp
+void DeleteComplementInfo(void);
+BOOL GetComplementInfo(char *variable,char *pEditBuf,int iPos);
+void CodeComplement(int WndNum,int iPos);
+LRESULT CALLBACK ComplementWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//ParameterHint.cpp
+char *GetUserSourceCode(void);
+void ChangeReturnCode(char *buffer);
+void DeleteComment(char *buffer);
+LRESULT CALLBACK MethodCheckWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void ShowParameterHint(int WndNum);
+
+//CodeFormatter.cpp
+char *CodeFormatter(char *lpszReadBuffer);
+
+#ifdef THETEXT
+//StringCount.cpp
+BOOL CALLBACK DlgStringCount(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+#endif
+
+//Print.cpp
+class CPage{
+public:
+	PAGESETUPDLG psd;
+	CPage();
+	~CPage();
+
+	BOOL SetupDlg(void);
+};
+extern CPage obj_Page;
+LRESULT CALLBACK PreviewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Preview(void);
+void Printout(void);
+
+//History.cpp
+#define IS_FILEHISTORY_COMMAND(a) (100<=a&&a<=199)
+class CHistory{
+	int iNum;
+	int iMaxHistoryNum;
+
+	int m_BaseID;
+public:
+	char *lpszPath[255];
+
+	CHistory(int BaseID);
+	~CHistory();
+
+	void load( const std::string &path );
+	void save( const std::string &path );
+
+	void add(char *path);
+	void insert(const char *path);
+
+	void ResetFileMenu(CSubMenuEx *pobj_SubMenu,BOOL bOwnerDraw);
+};
+
+
+
+
+//////////////////////
+/* プロジェクト解析 */
+
+//CClassInfo.cpp
+class CClassInfo{
+public:
+	char ClassName[VN_SIZE];
+	MEMBERINFO *pMemberInfo;
+	int MemberNum;
+	CClassInfo();
+	~CClassInfo();
+	int Analyze(char *pBuf,int *p);
+};
+
+//ClassTree.cpp
+struct TREEHASH{
+	HTREEITEM hItem;
+	HTREEITEM hFileTreeItem;
+	TREEHASH *pNextData;
+};
+#define CTV_ROOT			1	//ルート
+#define CTV_FOLDER			2	//フォルダ
+#define CTV_GLOBAL_PROC		3	//プロシージャ
+#define CTV_CLASS			4	//クラス
+#define CTV_PUBLIC_MEMBER	5	//公開cメンバ変数
+#define CTV_PUBLIC_METHOD	6	//公開メソッド
+#define CTV_PRIVATE_MEMBER	7	//非公開メンバ変数
+#define CTV_PRIVATE_METHOD	8	//非公開メソッド
+class CClassTreeView{
+	HWND hTreeWnd;
+	HTREEITEM hNowFileTreeItem;
+	TREEHASH tree_data[MAX_HASH];
+
+	HTREEITEM hGlobalProcedureFolder;
+	HTREEITEM hNowClassFolder;
+
+	int hash_default(LONG_PTR lpdata);
+
+	void AddValidItem(HTREEITEM hItem,HTREEITEM hFileTreeItem);
+	BOOL delete_check(HTREEITEM hItem);
+	void DeleteInvalidItems(HTREEITEM hItem);
+	void DeleteTreeHash(TREEHASH *pth);
+
+	HTREEITEM insert(HTREEITEM hParentItem,int flag,char *lpszName,HTREEITEM hFileTreeItem);
+
+public:
+	HTREEITEM hRootFolder;
+
+	int NumberOfProcedures;
+	PROCINFO *pProcInfo;
+
+	BOOL bCloseSwitch;
+	BOOL bShowSwitch;
+
+	CClassTreeView();
+	~CClassTreeView();
+	void init(HWND hwnd,HTREEITEM hFileTreeItem);
+
+	void InsertRootFolder(void);
+	void InsertGlobalProcedureFolder(void);
+	HTREEITEM InsertGlobalProcedure(int flag,char *lpszName,HTREEITEM hFileTreeItem);
+	HTREEITEM insert_code_item(HTREEITEM hParentItem,int flag,char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p);
+	void InsertClassFolder(char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p);
+	void InsertClassMember(int flag,char *lpszName,HTREEITEM hFileTreeItem,char *pBuf,int p);
+	void finish();
+};
+extern CClassTreeView *pobj_ClassTreeView;
+void ResetClassTree(HTREEITEM hFileTreeItem);
+
+//ProjectControl.cpp
+void ResizeProjectView_ToolWindow(void);
+LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void ShowFileView();
+void ShowClassView();
+void ShowMaterialView();
+LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Project_File_Insert(char *path);
+void Project_File_Delete(HTREEITEM hTreeItem);
+void MakeNewProject(void);
+BOOL ProjectModifyCheck(BOOL bRun);
+void MakeWorkFile(void);
+void SaveProject(void);
+BOOL SetProjectToRun(void);
+BOOL IsNeedCompileForProject(BOOL bDebug);
+
+//WindowControl.cpp
+int GetWndInfoNum( const std::string &name );
+ActiveBasic::PM::WindowInfo *GetWndInfo( const std::string &name );
+HGLOBAL Rad_GetChildInfoClipboardData(int WndNum,int WndInfoNum);
+void Rad_PasteChildInfoClipboardData(int WndNum,HGLOBAL hGlobal);
+char *PermutationWndPgmTemplate(char *pBuf,const char *pPjName, char *pWndName, char *pHandleName, char *pProcName);
+const std::string PermutationWndPgmTemplate( const std::string &templateFilePath, const std::string &projectName, std::string &windowName, std::string &handleName, std::string &procName );
+void GetItemClassName(char *buffer,int Control);
+void SaveWindowProgram();
+void SaveWindowFile(char const *path, const ActiveBasic::PM::WindowInfos &windowInfos);
+_int8 OpenWindowFile(char *path);
+void GetDefaultWindowFont(LOGFONT *LogFont);
+void Project_Window_Insert(void);
+void Project_Window_Delete(int WndInfoNum);
+
+//Resource.cpp
+void Project_CursorResInsert(void);
+void Project_Cursor_Delete(int CursorInfoNum);
+void Project_Cursor_RenameID(int CursorInfoNum);
+void Project_BitmapResInsert(void);
+void Project_Bitmap_Delete(int IconInfoNum);
+void Project_Bitmap_RenameID(int BitmapInfoNum);
+void Project_IconResInsert(void);
+void Project_Icon_Delete(int IconInfoNum);
+void Project_Icon_RenameID(int IconInfoNum);
+BOOL CALLBACK DlgProject_ResourceID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+///////////////////
+/* RADウィンドウ */
+
+//RadProc.cpp
+void NewRadWindow( const ActiveBasic::PM::WindowInfo &windowInfo );
+int InsertDlgItem(int WndNum,int WndInfoNum,int ItemNum,POINT *pPos,SIZE *pSize,const char *IdName,const char *caption,DWORD style_or_WndNum,DWORD ExStyle,int Control,ActiveBasic::PM::ImageReferenceType::EnumType ImageType,const char *ImagePath,DWORD dwInsertType);
+void DeleteDlgItem(int WndNum,int WndInfoNum,int ItemNum,BOOL bNoticeChanging);
+void CursorPos_GlobalToLocal(HWND hwnd,long *x,long *y);
+void DrawSelectingRect(HWND hwnd,int WndNum,int WndInfoNum,int ButtonSelect);
+void ChangePropertyWindow(int WndNum,int WndInfoNum);
+void ResetScrollbarOfRadEditor(int WndNum,int weight,int height);
+LRESULT CALLBACK RadWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void ResizeToRadToolWindows(int WndNum,int weight,int height);
+LRESULT CALLBACK MDIClientWindow_Rad(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//DrawWindow.cpp
+void DrawRadWindow(int WndNum,const ActiveBasic::PM::WindowInfo *pWindowInfo);
+
+//Rad_UndoRedo.cpp
+void Rad_UndoCommand(int WndNum);
+void Rad_RedoCommand(int WndNum);
+void Rad_DeleteUndoData(int WndNum,int pos);
+void Rad_NoticeChanging(int WndNum,int Command,int SelectItemNum,DWORD dwData);
+
+//RadToolsAndPropertyProc.cpp
+LRESULT CALLBACK RadToolsWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgRadProperty_Item_RenameCaption(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_CheckBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ComboBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_EditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_GroupBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ImageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ListBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ListViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ProgressBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_RadioButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_ScrollBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_StaticProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_TrackBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_TreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK RadProperty_UpDownProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK RadPropertyWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//MessageCallOperation.cpp
+char **GetProcedureNamesOfMessageCall(int WndInfoNum,ITEMEVENTINFO **ppItemEventInfo,int *num,BOOL *pbAlways);
+void SelectProcedureOfMessageCall(int WndInfoNum,char *ProcedureName,char *Parameter);
+BOOL CALLBACK DlgEventCode(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//RadSupport.cpp
+LRESULT CALLBACK TestWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void SetSupportDlgData(int WndNum, const ActiveBasic::PM::WindowInfo &windowInfo );
+BOOL CALLBACK DlgRadSupport(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+////////////////////
+/* MENUウィンドウ */
+
+//MenuProc.cpp
+int GetMenuInfoNum(const std::string &name);
+void HeapMenuDataFree(MENU_INFO *pMenuInfo,int ItemNum,int *NumberOfFreedItem);
+BOOL CALLBACK DlgProject_MenuID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void Project_Menu_Insert(void);
+void Project_Menu_Delete(int MenuInfoNum);
+void NewMenuWindow(MENU_INFO *pMenuInfo);
+BOOL CALLBACK MenuEditDlg(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK MenuEditWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK MDIClientWindow_Menu(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+
+
+//////////////////////////////////
+/* アイコン エディタ ウィンドウ */
+
+//IconEditor.cpp
+void AddIconType(int WndNum,int IconType);
+void DeleteIconType(int WndNum);
+void NewIconEditWindow(const char *filepath);
+void SaveIconFile(char *filepath,HWND hwnd);
+LRESULT CALLBACK MDIClientWindow_IconEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Main.cpp
+HGLOBAL IconEdit_GetChildInfoClipboardData(int WndNum);
+void IconEdit_PasteChildInfoClipboardData(int WndNum,HBITMAP hBmp);
+void IconEdit_PasteImage(int WndNum);
+void DrawIconToMemBmp(int WndNum,RECT *pRect);
+void IconEdit_EraseRect(int WndNum,RECT *pRect);
+LRESULT CALLBACK IconEditWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Tool.cpp
+BOOL CALLBACK DlgIconButtons(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+BOOL CALLBACK DlgIconToolProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_Color.cpp
+BOOL CALLBACK DlgIconColorProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+//IconEditor_UndoRedo.cpp
+void IconEdit_UndoCommand(int WndNum);
+void IconEdit_RedoCommand(int WndNum);
+void IconEdit_NoticeChanging(int WndNum);
+
+
+
+
+
+#include "NonVolatile.h"
+
+
+
+
+#ifdef _DEBUG
+/*Debug*/
+
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hHeap,DWORD dwFlags,DWORD dwBytes);
+LPVOID CheckHeapReAlloc(HANDLE hHeap,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes);
+
+#define DeleteObject CheckDeleteObject
+BOOL CheckDeleteObject(HGDIOBJ hObject);
+
+#endif
Index: branches/egtra/ab5.0/abdev/abdev/Complement.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Complement.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Complement.cpp	(revision 774)
@@ -0,0 +1,785 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+///////////////////////////
+// コード補完機能
+///////////////////////////
+
+BOOL GetComplementClass(char *pBuf,char *ClassName,char *nest,BOOL bInherits){
+	extern HANDLE hHeap;
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	extern char *pHeaderBuf;
+	extern char *pUserSource;
+	int i,i2;
+	char temporary[8192];
+	DWORD dwClassType;
+	BOOL bRet;
+
+
+	/////////////////////////////////////////
+	// ソースコードからクラス定義位置を取得
+	/////////////////////////////////////////
+	i=GetClassPos(pBuf,ClassName,&dwClassType);
+	if(pBuf[i]=='\0') return 0;
+
+
+	if(nest[0]){
+		////////////////////
+		// 入れ子構造の場合
+		////////////////////
+
+		//クラス、配列の構成要素を解析する
+		char VarName[VN_SIZE];		//変数名
+		char array[VN_SIZE];		//第1次配列
+		char lpPtrOffset[VN_SIZE];	//第2次配列
+		char NestMember[VN_SIZE];	//入れ子メンバ
+		int RefType;				//"."参照のときは0、"->"参照のときは1
+		lstrcpy(VarName,nest);
+		if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+		//メンバ変数の型であるクラスの名前を取得
+		char ClassName[VN_SIZE];
+		BOOL bArray;
+		if(!GetClassNameFromClassMember(pBuf,i,VarName,ClassName,&bArray)) return 0;
+
+		//TypeDef宣言を考慮してオリジナルなクラス名を取得
+		GetOriginalClassName(ClassName);
+
+		if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
+
+		//ユーザーのソースコードをサーチ
+		bRet=GetComplementClass(pUserSource,ClassName,NestMember,0);
+		if(!bRet){
+			//失敗したときはbasic.sbpをサーチ
+			bRet=GetComplementClass(pHeaderBuf,ClassName,NestMember,0);
+		}
+		return bRet;
+	}
+
+
+	////////////////////////
+	// メンバ情報を取得
+	////////////////////////
+	DWORD dwAccess;
+	DWORD dwProc;
+
+	//アクセス制限の初期値をセット
+	if(dwClassType==ESC_CLASS) dwAccess=ACCESS_PRIVATE;
+	else dwAccess=ACCESS_PUBLIC;
+
+	if(memicmp(pBuf+i,"Inherits",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+		i+=9;
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		//継承を行う場合
+		for(i2=0;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		//ユーザーのソースコードをサーチ
+		bRet=GetComplementClass(pUserSource,temporary,"",1);
+		if(!bRet){
+			//失敗したときはbasic.sbpをサーチ
+			bRet=GetComplementClass(pHeaderBuf,temporary,"",1);
+		}
+
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				i+=i2;
+				break;
+			}
+		}
+		JumpBlank(pBuf,&i);
+	}
+
+	//メンバ変数、関数を取得
+	while(1){
+		if(pBuf[i]=='\0') break;
+		if(memicmp(pBuf+i,"End",3)==0){
+			/*	End Class
+				End Type
+				の検出 */
+			i2=i+3;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+			if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
+				memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
+				memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break;
+		}
+
+		if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
+			memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+			//メンバ関数のとき
+			if(pBuf[i]=='a'||pBuf[i]=='A'){
+				i+=9;
+				dwProc=ESC_ABSTRACT;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='v'||pBuf[i]=='V'){
+				i+=8;
+				dwProc=ESC_VIRTUAL;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='o'||pBuf[i]=='O'){
+				i+=9;
+				dwProc=ESC_OVERRIDE;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='f'||pBuf[i]=='F'){
+				i+=9;
+				dwProc=ESC_FUNCTION;
+			}
+			else if(pBuf[i]=='s'||pBuf[i]=='S'){
+				i+=4;
+				dwProc=ESC_SUB;
+			}
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		else{
+			//メンバ変数のとき
+			dwProc=0;
+		}
+
+		//変数名または関数名を取得
+		if(pBuf[i]=='~'){
+			temporary[0]='~';
+			i2=1;
+			i++;
+		}
+		else i2=0;
+		for(;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		if(bInherits){
+			//継承元の場合はコンストラクタ、デストラクタを除去
+			if(temporary[0]=='~') goto next;
+			if(lstrcmp(temporary,ClassName)==0) goto next;
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			if(pBuf[i]=='\''||(pBuf[i]=='/'&&pBuf[i+1]=='*')){
+				//コメント中
+				JumpBlank(pBuf,&i);
+				break;
+			}
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				i+=i2;
+				break;
+			}
+		}
+		JumpBlank(pBuf,&i);
+
+		//重複チェック（オーバーライド関数の除去）
+		for(i2=0;i2<ComplementWndInfo.MemberNum;i2++){
+			if(lstrcmp(ComplementWndInfo.pMemberInfo[i2].pName,temporary)==0) goto next;
+		}
+
+		//アクセスを変更
+		if(lstrcmpi(temporary,"Private")==0){
+			dwAccess=ACCESS_PRIVATE;
+			continue;
+		}
+		if(lstrcmpi(temporary,"Public")==0){
+			dwAccess=ACCESS_PUBLIC;
+			continue;
+		}
+		if(lstrcmpi(temporary,"Protected")==0){
+			dwAccess=ACCESS_PROTECTED;
+			continue;
+		}
+
+		ComplementWndInfo.pMemberInfo=
+			(MEMBERINFO *)HeapReAlloc(hHeap,
+				0,
+				ComplementWndInfo.pMemberInfo,
+				(ComplementWndInfo.MemberNum+1)*sizeof(MEMBERINFO));
+
+		//メンバ名
+		ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].pName=
+			(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+		lstrcpy(ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].pName,
+			temporary);
+
+		//メンバの種類（変数、Virtual、Sub、Function）
+		ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].dwProc=dwProc;
+
+		//アクセシビリティ
+		ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].dwAccess=dwAccess;
+
+		ComplementWndInfo.MemberNum++;
+next:
+		if(dwProc){
+			//Abstract定義以外はEnd Sub、End Functionをサーチする
+			if(dwProc==ESC_ABSTRACT) continue;
+			if(dwClassType==ESC_INTERFACE) continue;
+
+			while(1){
+				if(pBuf[i]=='\0'){
+					i2=0;
+					break;
+				}
+
+				if(memicmp(pBuf+i,"End",3)==0){
+					/*	End Sub
+						End Function
+						の検出 */
+					i+=3;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+					if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
+						memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
+						i2=1;
+						break;
+					}
+
+					if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
+						memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
+						memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
+						i2=0;
+						break;
+					}
+				}
+
+				//次の行をサーチ
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+			}
+
+			if(i2==0){
+				//コード解析が不正に終了
+				return 1;
+			}
+
+			//次の行をサーチ
+			for(;;i++){
+				if(pBuf[i]=='\0') break;
+				i2=IsCommandDelimitation(pBuf,i);
+				if(i2){
+					i+=i2;
+					break;
+				}
+			}
+			JumpBlank(pBuf,&i);
+		}
+	}
+
+	return 1;
+}
+
+void DeleteComplementInfo(void){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i;
+
+	for(i=0;i<ComplementWndInfo.MemberNum;i++)
+		HeapDefaultFree(ComplementWndInfo.pMemberInfo[i].pName);
+
+	HeapDefaultFree(ComplementWndInfo.pMemberInfo);
+}
+BOOL GetComplementInfo(char *variable,char *pEditBuf,int iPos){
+	extern HANDLE hHeap;
+
+	//ユーザーが作成したソースコードを取得
+	extern char *pUserSource;
+	pUserSource=GetUserSourceCode();
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	int RefType;				//"."参照のときは0、"->"参照のときは1
+	lstrcpy(VarName,variable);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)){
+		HeapDefaultFree(pUserSource);
+		pUserSource=0;
+		return 0;
+	}
+
+
+	////////////////////////////////
+	// オブジェクトのクラス名を取得
+	////////////////////////////////
+	char ClassName[VN_SIZE];
+	BOOL bArray;
+	if(!GetVariableClassName(pEditBuf,iPos,VarName,ClassName,&bArray)){
+		HeapDefaultFree(pUserSource);
+		pUserSource=0;
+		return 0;
+	}
+
+	//TypeDef宣言を考慮してオリジナルなクラス名を取得
+	GetOriginalClassName(ClassName);
+
+	if(!CheckReferType(ClassName,bArray,array,RefType)){
+		HeapDefaultFree(pUserSource);
+		pUserSource=0;
+		return 0;
+	}
+
+
+	////////////////////
+	// クラス情報を取得
+	////////////////////
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+
+	ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
+	ComplementWndInfo.MemberNum=0;
+
+	//ユーザーのソースコードをサーチ
+	BOOL bRet;
+	bRet=GetComplementClass(pUserSource,ClassName,NestMember,0);
+	if(!bRet){
+		//失敗したときはbasic.sbpをサーチ
+		extern char *pHeaderBuf;
+		bRet=GetComplementClass(pHeaderBuf,ClassName,NestMember,0);
+	}
+
+	HeapDefaultFree(pUserSource);
+	pUserSource=0;
+
+	if(!bRet||ComplementWndInfo.MemberNum==0){
+		//見つからなかったとき
+		DeleteComplementInfo();
+		return 0;
+	}
+
+	return 1;
+}
+void CodeComplement(int WndNum,int iPos){
+	int i,i2;
+
+	//エディタ画面左端のコントロールタブ
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	extern int font_width,font_height;
+	POINT pos;
+	pos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+	GetScrollBaseCaretPos(MdiInfo[WndNum],(int *)&pos.x,(int *)&pos.y);
+
+	pos.x=(pos.x-1)*font_width    +iControlTabSpace;
+	pos.y=(pos.y+1)*font_height;
+
+	ClientToScreen(MdiInfo[WndNum]->pMdiTextEdit->hEdit,&pos);
+
+	extern HINSTANCE hInst;
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	ComplementWndInfo.hWnd=CreateWindowEx(WS_EX_DLGMODALFRAME,
+		"ComplementWindow",NULL,
+		WS_POPUP|WS_CLIPCHILDREN,
+		pos.x,pos.y,100,100,
+		hOwner,NULL,hInst,0);
+
+	///////////////////////////
+	// リストビューの初期化
+	///////////////////////////
+	extern METHODCHECKINFO MethodCheckInfo;
+	int height,max_width,listitem_height;
+	max_width=0;
+
+	// リストアイテムを追加
+	LV_ITEM lvItem;
+	lvItem.mask = LVIF_TEXT|LVIF_IMAGE;
+	for(i=0;i<ComplementWndInfo.MemberNum;i++){
+		lvItem.pszText=ComplementWndInfo.pMemberInfo[i].pName;
+		lvItem.iItem=0;
+		lvItem.iSubItem=0;
+
+		if(ComplementWndInfo.pMemberInfo[i].dwAccess==ACCESS_PAIRCOMMAND){
+			//ペアステートメント補完リストアイテム
+			lvItem.iImage=4;
+		}
+		else if(ComplementWndInfo.pMemberInfo[i].dwAccess==ACCESS_HTML_GENERAL_PARAM){
+			//HTMLタグのパラメータ
+			lvItem.iImage=5;
+		}
+		else if(ComplementWndInfo.pMemberInfo[i].dwAccess==ACCESS_HTML_PARAM){
+			//HTMLタグのパラメータ
+			lvItem.iImage=6;
+		}
+		else if(ComplementWndInfo.pMemberInfo[i].dwProc==0){
+			//メンバ変数
+			if(ComplementWndInfo.pMemberInfo[i].dwAccess!=ACCESS_PUBLIC)
+				lvItem.iImage=0;
+			else
+				lvItem.iImage=1;
+		}
+		else{
+			//メンバ関数
+			if(ComplementWndInfo.pMemberInfo[i].dwAccess!=ACCESS_PUBLIC)
+				lvItem.iImage=2;
+			else
+				lvItem.iImage=3;
+		}
+		ListView_InsertItem(ComplementWndInfo.hList,&lvItem);
+
+		i2=ListView_GetStringWidth(ComplementWndInfo.hList,
+			ComplementWndInfo.pMemberInfo[i].pName);
+
+		if(max_width<i2) max_width=i2;
+	}
+
+	RECT rc;
+	ListView_GetItemRect(ComplementWndInfo.hList,0,&rc,LVIR_BOUNDS);
+	listitem_height=rc.bottom-rc.top;
+	height=listitem_height*ComplementWndInfo.MemberNum;
+
+	//ウィンドウサイズとクライアント領域サイズの差を計算
+	RECT rc_Window,rc_Client;
+	SIZE size;
+	int dx,dy;
+	GetWindowRect(ComplementWndInfo.hWnd, &rc_Window);
+	GetClientRect(ComplementWndInfo.hWnd, &rc_Client);
+	dx = (rc_Window.right - rc_Window.left) - (rc_Client.right - rc_Client.left);
+	dy = (rc_Window.bottom - rc_Window.top) - (rc_Client.bottom - rc_Client.top);
+
+#define MAX_COMPLEMENT_LISTNUM 15
+	size.cx=max_width+dx+30;	//※30はアイコンの幅を含む余白
+	size.cy=height+dy;
+	if(size.cy>listitem_height*MAX_COMPLEMENT_LISTNUM+dy){
+		size.cy=listitem_height*MAX_COMPLEMENT_LISTNUM+dy;
+
+		//垂直スクロールバーの幅を考慮する
+		size.cx+=GetSystemMetrics(SM_CXVSCROLL);
+	}
+	else{
+		//スクロールバーを使用しないようにする
+		i=GetWindowLongPtr(ComplementWndInfo.hList,GWL_STYLE);
+		i|=LVS_NOSCROLL;
+		i&=~(WS_VSCROLL|WS_HSCROLL);
+		SetWindowLongPtr(ComplementWndInfo.hList,GWL_STYLE,i);
+	}
+
+	if(pos.x+size.cx>ScreenX){
+		pos.x=ScreenX-size.cx;
+	}
+	if(pos.y+size.cy>ScreenY-30){
+		pos.y-=size.cy+font_height;
+	}
+
+	//サイズ変更
+	MoveWindow(ComplementWndInfo.hWnd,
+		pos.x,pos.y,
+		size.cx,size.cy,0);
+
+	//チラツキを抑えながら、補完リストを表示する
+	ShowWindow(ComplementWndInfo.hWnd,SW_SHOWNOACTIVATE);
+
+	ComplementWndInfo.iPos=iPos;
+}
+
+
+
+////////////////////////////////
+// コード補完ウィンドウ
+////////////////////////////////
+
+void DrawComplementListView(HWND hListView,HDC hdc){
+	//コード補完リストビューの独自描画
+	int i;
+	RECT rc;
+	char temporary[1024];
+
+	RECT rcClient;
+	GetClientRect(hListView,&rcClient);
+
+	HFONT hFont;
+	hFont=(HFONT)SendMessage(hListView,WM_GETFONT,0,0);
+
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(hdc,hFont);
+
+	SetBkMode(hdc,OPAQUE);
+
+	for(i=0;i<ListView_GetItemCount(hListView);i++){
+		LVITEM lvItem;
+		lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
+		lvItem.iItem=i;
+		lvItem.iSubItem=0;
+		lvItem.pszText=temporary;
+		lvItem.cchTextMax=1024;
+		lvItem.stateMask=LVIS_SELECTED;
+		ListView_GetItem(hListView,&lvItem);
+
+		COLORREF colorBack;
+		if(lvItem.state&LVIS_SELECTED){
+			//選択中
+			colorBack=RGB(50,80,255);
+		}
+		else{
+			//選択されていない
+			colorBack=ListView_GetBkColor(hListView);
+		}
+
+
+		/////////////////////
+		// アイコンを描画
+		/////////////////////
+		ListView_GetItemRect(hListView,i,&rc,LVIR_ICON);
+
+		HIMAGELIST hImageList;
+		hImageList=ListView_GetImageList(hListView,LVSIL_SMALL);
+
+		ImageList_Draw(hImageList,lvItem.iImage,hdc,rc.left,rc.top,ILD_NORMAL);
+
+
+		/////////////////////
+		// 文字列を描画
+		/////////////////////
+
+		//背景色で下地を準備
+		ListView_GetItemRect(hListView,i,&rc,LVIR_ICON);
+		rc.left=rc.right;
+		rc.right=rcClient.right;
+		if(lvItem.state&LVIS_SELECTED){
+			//選択されている
+
+			//グラデーションビットマップを生成
+			SIZE size;
+			GetSize(&size,&rc);
+			HBITMAP hBackBmp;
+			hBackBmp=CreateGradationBitmap(&size,RGB(130,150,210),RGB(50,80,190));
+
+			HDC memdc;
+			memdc=CreateCompatibleDC(hdc);
+			SelectObject(memdc,hBackBmp);
+
+			BitBlt(hdc,rc.left,rc.top,size.cx,size.cy,memdc,0,0,SRCCOPY);
+
+			DeleteDC(memdc);
+			DeleteObject(hBackBmp);
+
+			SetTextColor(hdc,RGB(255,255,255));
+			SetBkMode(hdc,TRANSPARENT);
+		}
+		else{
+			//選択されていない
+			HBRUSH hBrush;
+			hBrush=CreateSolidBrush(colorBack);
+			FillRect(hdc,&rc,hBrush);
+			DeleteObject(hBrush);
+
+			SetTextColor(hdc,RGB(0,0,0));
+			SetBkMode(hdc,OPAQUE);
+			SetBkColor(hdc,colorBack);
+		}
+
+		ListView_GetItemRect(hListView,i,&rc,LVIR_LABEL);
+		rc.left+=5;
+		DrawText(hdc,lvItem.pszText,lstrlen(lvItem.pszText),&rc,DT_LEFT|DT_SINGLELINE|DT_VCENTER);
+	}
+
+	SelectObject(hdc,hOldFont);
+}
+
+WNDPROC OldComplementListViewProc;
+
+LRESULT CALLBACK ComplementListViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i,WndNum;
+	char temporary[VN_SIZE],temp2[VN_SIZE];
+
+	switch(message){
+		case WM_SETFOCUS:
+		case WM_RBUTTONDOWN:
+		case WM_RBUTTONDBLCLK:
+			//フォーカスをエディタに戻す
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+			SetFocus(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+			return 0;
+		case WM_KEYDOWN:
+			if(LOWORD(wParam)==VK_RETURN) goto DblClk;
+			else if(LOWORD(wParam)==VK_ESCAPE){
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+			}
+			break;
+		case WM_LBUTTONDOWN:
+			//フォーカスをエディタに戻す
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+			SetFocus(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+
+			LVHITTESTINFO lvHitTest;
+			lvHitTest.pt.x=0;
+			lvHitTest.pt.y=HIWORD(lParam);
+			ListView_HitTest(hwnd,&lvHitTest);
+
+			//アイテムを選択
+			ListView_SetItemState(hwnd,lvHitTest.iItem,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
+			return 0;
+		case WM_LBUTTONDBLCLK:
+DblClk:
+
+			//選択されたアイテムを取得
+			for(i=0;i<ComplementWndInfo.MemberNum;i++){
+				if(ListView_GetItemState(ComplementWndInfo.hList,i,LVIS_SELECTED)) break;
+			}
+			if(i!=ComplementWndInfo.MemberNum){
+				ListView_GetItemText(hwnd,i,0,temporary,VN_SIZE);
+
+				WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+				if(ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND){
+					//ペアステートメント補完
+
+					for(i=ComplementWndInfo.iPos-1;;i--){
+						if(MdiInfo[WndNum]->pMdiTextEdit->buffer[i]!='\t'){
+							i++;
+							break;
+						}
+					}
+
+					GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+						i,
+						&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+					//インデント
+					lstrcpy(temp2,ComplementWndInfo.szIndent);
+					if(IsNeedNewIndentCommand(temporary)) lstrcat(temp2,"\t");
+
+					lstrcat(temp2,temporary);
+
+					//リプレース前に補完機能を破棄する
+					DestroyWindow(ComplementWndInfo.hWnd);
+					ComplementWndInfo.hWnd=0;
+
+					TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
+				}
+				else{
+					//クラスメンバ補完
+
+					GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+						ComplementWndInfo.iPos,
+						&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+					//リプレース前に補完機能を破棄する
+					DestroyWindow(ComplementWndInfo.hWnd);
+					ComplementWndInfo.hWnd=0;
+
+					TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+				}
+			}
+
+			return 0;
+
+		case WM_PAINT:
+			HDC hdc;
+			PAINTSTRUCT ps;
+			hdc=BeginPaint(hwnd,&ps);
+			DrawComplementListView(hwnd,hdc);
+			EndPaint(hwnd,&ps);
+			return 0;
+	}
+	return CallWindowProc(OldComplementListViewProc,hwnd,message,wParam,lParam);
+}
+
+LRESULT CALLBACK ComplementWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	static HWND hListView;
+	static HIMAGELIST hImageList;
+
+	switch(message){
+		case WM_CREATE:
+
+			////////////////////////
+			// リストビューを作成
+			////////////////////////
+
+			hListView=CreateWindow(WC_LISTVIEW,0,
+				WS_CHILD|WS_VISIBLE|WS_VSCROLL|     LVS_SMALLICON|LVS_SINGLESEL|LVS_SORTASCENDING|LVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hwnd,NULL,hInst,0);
+			OldComplementListViewProc=(WNDPROC)GetWindowLongPtr(hListView,GWLP_WNDPROC);
+			SetWindowLongPtr(hListView,GWLP_WNDPROC,(long)ComplementListViewProc);
+
+			//フォントをセット
+			extern METHODCHECKINFO MethodCheckInfo;
+			SendMessage(hListView,WM_SETFONT,(long)MethodCheckInfo.hFont,0);
+
+			ComplementWndInfo.hList=hListView;
+
+			//背景色をセット
+			COLORREF rgb;
+			if(ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND){
+				//ペアステートメント補完
+				rgb=RGB(245,245,255);
+			}
+			else{
+				//クラスメンバ補完
+				rgb=RGB(255,245,240);
+			}
+			ListView_SetBkColor(hListView,rgb);
+			ListView_SetTextBkColor(hListView,rgb);
+
+
+			////////////////////////
+			// イメージリストを作成
+			////////////////////////
+
+			hImageList=ImageList_Create(16, 16, ILC_COLOR24, 7, 0);
+			ListView_SetImageList(hListView, hImageList, LVSIL_SMALL);
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_PAIRSTATEMENT)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_HTML_GENERAL_PARAMETER)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_HTML_PARAMETER)));
+
+			return 0;
+		case WM_SIZE:
+			MoveWindow(hListView,0,0,LOWORD(lParam),HIWORD(lParam),0);
+			return 0;
+		case WM_DESTROY:
+			DeleteComplementInfo();
+			ImageList_Destroy(hImageList);
+			return 0;
+
+		case WM_NOTIFY:
+			NMLISTVIEW *nmListView;
+			nmListView=(NMLISTVIEW *)lParam;
+			if(nmListView->hdr.hwndFrom==hListView){
+				if(nmListView->hdr.code==LVN_ITEMCHANGED){
+					InvalidateRect(hListView,NULL,0);
+					return 1;
+				}
+			}
+			break;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/Debugger.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Debugger.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Debugger.cpp	(revision 774)
@@ -0,0 +1,522 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+CDebugger *pobj_Debugger;
+
+#define WM_DEBUG_CONTINUE	WM_USER+200
+#define WM_STEP_IN			WM_USER+201
+#define WM_STEP_OVER		WM_USER+202
+#define WM_STEP_CURSOR		WM_USER+203
+#define WM_DEBUG_STOP		WM_USER+204
+#define WM_DEBUG_PAUSE		WM_USER+205
+
+CDebugger::CDebugger(){
+	hwnd=0;
+	bDebugging=0;
+}
+CDebugger::~CDebugger(){
+}
+
+BOOL CDebugger::IsDebugging(void){
+	return bDebugging;
+}
+BOOL CDebugger::IsDebuggerView(void){
+	if(hwnd) return 1;
+	return 0;
+}
+
+void CDebugger::resize(int x,int y,int cx,int cy){
+	MoveWindow(hwnd,x,y,cx,cy,1);
+}
+
+void CDebugger::ResetCommandEnabled(void){
+	if(bDebugging==0){
+		BOOL bEnableDocument=0, bBreakPoint=0;
+
+		HWND hChild;
+		hChild=GetWindow(hClient,GW_CHILD);
+
+		if( projectInfo.IsOpened() ){
+			//有効（プロジェクトを開いているとき）
+			bEnableDocument=1;
+		}
+		else{
+			if(IsWindow(hChild)){
+				if(MdiInfo[GetWndNum(hChild)]->DocType==WNDTYPE_BASIC){
+					//有効（Basicプログラムファイルを開いているとき）
+					bEnableDocument=1;
+				}
+			}
+		}
+
+		if(IsWindow(hChild)){
+			if(MdiInfo[GetWndNum(hChild)]->DocType==WNDTYPE_BASIC){
+				//ブレークポイント有効（Basicプログラムファイルを開いているとき）
+				bBreakPoint=1;
+			}
+		}
+
+		int MenuMsg;
+		if(bEnableDocument) MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+		else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+
+		//リリースコンパイル
+		pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MenuMsg);
+		pobj_ReleaseToolbar->EnableItem(IDM_RELEASECOMPILE,bEnableDocument);
+
+		//リリース実行
+		pobj_MainMenu->EnableItem(IDM_RELEASERUN,MenuMsg);
+		pobj_ReleaseToolbar->EnableItem(IDM_RELEASERUN,bEnableDocument);
+
+		//デバッグコンパイル
+		pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MenuMsg);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,bEnableDocument);
+
+		//デバッグ実行
+		pobj_MainMenu->EnableItem(IDM_DEBUG,MenuMsg);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,bEnableDocument);
+
+		if(bEnableDocument==0){
+			//ステップ実行
+			pobj_MainMenu->EnableItem(IDM_STEP_IN,MenuMsg);
+			pobj_MainMenu->EnableItem(IDM_STEP_OVER,MenuMsg);
+			pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MenuMsg);
+			pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,bEnableDocument);
+			pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,bEnableDocument);
+			pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,bEnableDocument);
+
+			//デバッグの一時停止
+			pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MenuMsg);
+			pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,bEnableDocument);
+
+			//デバッグの中断
+			pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MenuMsg);
+			pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,bEnableDocument);
+		}
+
+		if(bBreakPoint) MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+		else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+
+		//ブレークポイント
+		pobj_MainMenu->EnableItem(IDM_BREAKPOINT,MenuMsg);
+		pobj_DebuggerToolbar->EnableItem(IDM_BREAKPOINT,bBreakPoint);
+
+
+
+
+		//プラットフォームセレクト
+		extern HWND hSelectCompilerCombo;
+		EnableWindow(hSelectCompilerCombo,bEnableDocument);
+	}
+}
+
+void CDebugger::SaftyCheck(void){
+	extern HWND hCompileView;
+	if(!IsWindow(hCompileView)){
+		SendMessage(hOwner,WM_DESTROYDEBUGGERVIEW,0,0);
+		SendMessage(hOwner,WM_DESTROYDEBUGGERBASE,0,0);
+		SendMessage(hOwner,WM_DESTROYCOMPILEVIEW,0,0);
+	}
+}
+
+
+
+/////////////////////////////////////////
+// デバッグ開始
+/////////////////////////////////////////
+void CDebugger::begin(void){
+	bDebugging=1;
+
+	if(pobj_MainMenu){
+		//リリースコンパイルを無効化
+		pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_RELEASECOMPILE,0);
+
+		//デバッグコンパイルを無効化
+		pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,0);
+
+		//デバッグ実行を無効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,0);
+
+		//ステップ実行を無効化
+		pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,0);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,0);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,0);
+
+		//デバッグの一時停止を有効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,1);
+
+		//デバッグの中断を有効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,1);
+	}
+}
+
+
+/////////////////////////////////////////
+// デバッグ終了
+/////////////////////////////////////////
+void CDebugger::end(void){
+	bDebugging=0;
+
+	if(pobj_MainMenu){
+		//リリースコンパイルを有効化
+		pobj_MainMenu->EnableItem(IDM_RELEASECOMPILE,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_RELEASECOMPILE,1);
+
+		//デバッグコンパイルを有効化
+		pobj_MainMenu->EnableItem(IDM_DEBUGCOMPILE,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUGCOMPILE,1);
+
+		//デバッグ実行を有効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,1);
+
+		//ステップ実行を無効化
+		pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,0);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,0);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,0);
+
+		//デバッグの一時停止を無効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,0);
+
+		//デバッグの中断を無効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG_STOP,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_STOP,0);
+	}
+}
+
+
+/////////////////////////////////////////
+// 一時停止（ウォッチウィンドウが立ち上がる）
+/////////////////////////////////////////
+void CDebugger::watch_start(HWND hDebuggerView){
+	hwnd=hDebuggerView;
+
+	if(pobj_MainMenu){
+		//継続を有効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG,1);
+
+		//ステップ実行を有効化
+		pobj_MainMenu->EnableItem(IDM_STEP_IN,MF_BYCOMMAND|MF_ENABLED);
+		pobj_MainMenu->EnableItem(IDM_STEP_OVER,MF_BYCOMMAND|MF_ENABLED);
+		pobj_MainMenu->EnableItem(IDM_STEP_CURSOR,MF_BYCOMMAND|MF_ENABLED);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_IN,1);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_OVER,1);
+		pobj_DebuggerToolbar->EnableItem(IDM_STEP_CURSOR,1);
+
+		//デバッグの一時停止を無効化
+		pobj_MainMenu->EnableItem(IDM_DEBUG_PAUSE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_DebuggerToolbar->EnableItem(IDM_DEBUG_PAUSE,0);
+	}
+}
+
+
+/////////////////////////////////////////
+// デバッグを再開
+/////////////////////////////////////////
+void CDebugger::watch_quit(void){
+	hwnd=0;
+
+	begin();
+}
+
+
+void CDebugger::DebugContinue(void){
+	if(hwnd) SendMessage(hwnd,WM_DEBUG_CONTINUE,0,0);
+}
+void CDebugger::StepIn(void){
+	if(hwnd) SendMessage(hwnd,WM_STEP_IN,0,0);
+}
+void CDebugger::StepOver(void){
+	if(hwnd) SendMessage(hwnd,WM_STEP_OVER,0,0);
+}
+void CDebugger::StepToCursor(void){
+	if(hwnd){
+		int WndNum;
+		WndNum=GetNowWndNum();
+		if(WndNum==-1) return;
+
+		char temporary[MAX_PATH];
+		sprintf(temporary,"\"%s\",%d",MdiInfo[WndNum]->path.c_str(),MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+		char temp2[MAX_PATH];
+		GetTempPath(MAX_PATH,temp2);
+		if(temp2[lstrlen(temp2)-1]!='\\') lstrcat(temp2,"\\");
+		lstrcat(temp2,"ab_breakpoint.tmp");
+
+		WriteBuffer(temp2,temporary,lstrlen(temporary));
+
+		SendMessage(hwnd,WM_STEP_CURSOR,0,0);
+	}
+}
+void CDebugger::DebugStop(void){
+	extern HWND hCompileView;
+	SendMessage(hCompileView,WM_DEBUG_STOP,0,0);
+}
+void CDebugger::DebugPause(void){
+	extern HWND hCompileView;
+	SendMessage(hCompileView,WM_DEBUG_PAUSE,0,0);
+}
+
+
+
+
+
+
+//////////////////////////
+// ブレークポイント
+//////////////////////////
+
+BreakPointsPerFile::BreakPointsPerFile(const char *lpszFileName,int iLineNum){
+	this->lpszFileName=(char *)HeapAlloc(hHeap,0,lstrlen(lpszFileName)+1);
+	lstrcpy(this->lpszFileName,lpszFileName);
+
+	piLine=(int *)HeapAlloc(hHeap,0,sizeof(int));
+	piLine[0]=iLineNum;
+	num=1;
+}
+BreakPointsPerFile::~BreakPointsPerFile(){
+	HeapDefaultFree(lpszFileName);
+	HeapDefaultFree(piLine);
+}
+void BreakPointsPerFile::add(int iLineNum){
+	piLine=(int *)HeapReAlloc(hHeap,0,piLine,(num+1)*sizeof(int));
+
+	int i;
+	for(i=0;i<num;i++){
+		if(piLine[i]>iLineNum){
+			for(int i2=num;i2>i;i2--){
+				piLine[i2]=piLine[i2-1];
+			}
+			break;
+		}
+	}
+
+	piLine[i]=iLineNum;
+	num++;
+}
+void BreakPointsPerFile::remove(int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(iLineNum==piLine[i]) break;
+	}
+	if(i==num) return;
+
+	num--;
+	for(;i<num;i++){
+		piLine[i]=piLine[i+1];
+	}
+}
+BOOL BreakPointsPerFile::check(int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(iLineNum==piLine[i]) return 1;
+	}
+	return 0;
+}
+
+void BreakPointsPerFile::replace(LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr){
+	int i;
+
+	//削除される行範囲を取得
+	int DelStartLine=0;
+	for(i=0;i<pDelRange->cpMin;i++){
+		if(IsReturnCode(lpszBuffer+i)){
+			DelStartLine++;
+		}
+	}
+
+	int DelEndLine=DelStartLine;
+	for(;i<pDelRange->cpMax;i++){
+		if(IsReturnCode(lpszBuffer+i)){
+			DelEndLine++;
+		}
+	}
+
+	//ブレークポイントを消去
+	for(i=0;i<num;i++){
+		if(DelStartLine<piLine[i]&&piLine[i]<DelEndLine){
+			remove(piLine[i]);
+		}
+	}
+
+
+	//新しく挿入される文字列の行数を計算する
+	int NewLineNum=0;
+	for(i=0;lpszNewStr[i];i++){
+		if(IsReturnCode(lpszNewStr+i)){
+			NewLineNum++;
+		}
+	}
+
+
+	//オフセットを計算
+	int offset=DelStartLine-DelEndLine+NewLineNum;
+
+
+	//挿入行以降の行にて、オフセットを反映される
+	for(i=0;i<num;i++){
+		if(DelStartLine<=piLine[i]){
+			piLine[i]+=offset;
+		}
+	}
+}
+
+
+
+CDBBreakPoint::CDBBreakPoint(){
+	ppItem=(BreakPointsPerFile **)HeapAlloc(hHeap,0,1);
+	num=0;
+}
+CDBBreakPoint::~CDBBreakPoint(){
+	int i;
+	for(i=0;i<num;i++){
+		delete ppItem[i];
+	}
+	HeapDefaultFree(ppItem);
+}
+void CDBBreakPoint::insert( const char *lpszFileName,int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(ppItem[i]->lpszFileName,lpszFileName)==0){
+			ppItem[i]->add(iLineNum);
+			return;
+		}
+	}
+
+	if(i==num){
+		ppItem=(BreakPointsPerFile **)HeapReAlloc(hHeap,0,ppItem,(num+1)*sizeof(BreakPointsPerFile *));
+		ppItem[num]=new BreakPointsPerFile(lpszFileName,iLineNum);
+		num++;
+	}
+}
+void CDBBreakPoint::remove( const char *lpszFileName,int iLineNum){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(lpszFileName,ppItem[i]->lpszFileName)==0){
+			ppItem[i]->remove(iLineNum);
+			break;
+		}
+	}
+	if(i==num) return;
+
+	if(ppItem[i]->num==0){
+		delete ppItem[i];
+
+		num--;
+		for(;i<num;i++){
+			ppItem[i]=ppItem[i+1];
+		}
+	}
+}
+
+void CDBBreakPoint::Event_BreakPoint(void){
+	int WndNum;
+	WndNum=GetNowWndNum();
+	if(WndNum==-1) return;
+
+	if( !Jenga::Common::Path( MdiInfo[WndNum]->path ).IsExistFile() )
+	{
+		return;
+	}
+
+	int i,i2,sw=0;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),ppItem[i]->lpszFileName)==0){
+			for(i2=0;i2<ppItem[i]->num;i2++){
+				if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==ppItem[i]->piLine[i2]){
+					sw=1;
+					break;
+				}
+			}
+			break;
+		}
+	}
+
+	if(sw==0){
+		//ブレークポイントを追加
+		insert(MdiInfo[WndNum]->path.c_str(),MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+	}
+	else{
+		//ブレークポイントを削除
+		remove(MdiInfo[WndNum]->path.c_str(),MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+	}
+
+	if(pobj_Debugger->IsDebugging()){
+		SaveToTempFile();
+
+		//デバッガにブレークポイント更新のメッセージを送る
+		//未完成
+	}
+
+	//エディタを再描画
+	InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
+}
+void CDBBreakPoint::SaveToTempFile(void){
+	char *buffer;
+	int length=0;
+	buffer=(char *)HeapAlloc(hHeap,0,65535);
+	buffer[0]=0;
+	int i,i2;
+	for(i=0;i<num;i++){
+		sprintf(buffer+length,"\"%s\"",ppItem[i]->lpszFileName);
+		length+=lstrlen(buffer+length);
+
+		for(i2=0;i2<ppItem[i]->num;i2++){
+			sprintf(buffer+length,",%d",ppItem[i]->piLine[i2]);
+			length+=lstrlen(buffer+length);
+		}
+
+		lstrcpy(buffer+length,"\n");
+		length+=lstrlen(buffer+length);
+	}
+
+	char temporary[MAX_PATH];
+	GetTempPath(MAX_PATH,temporary);
+	if(temporary[lstrlen(temporary)-1]!='\\') lstrcat(temporary,"\\");
+	lstrcat(temporary,"ab_breakpoint.tmp");
+
+	ATL::CHandle hFile(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL));
+	if(hFile==INVALID_HANDLE_VALUE){
+		hFile.Detach();
+		return;
+	}
+	DWORD dwAccBytes;
+	WriteFile(hFile,buffer,lstrlen(buffer),&dwAccBytes,NULL);
+
+	HeapDefaultFree(buffer);
+}
+
+
+BreakPointsPerFile *CDBBreakPoint::EnumLines(const char *lpszFilePath){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(lpszFilePath,ppItem[i]->lpszFileName)==0){
+			return ppItem[i];
+		}
+	}
+	return 0;
+}
+
+void CDBBreakPoint::replace(const char *lpszFilePath,LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr){
+	int i;
+	for(i=0;i<num;i++){
+		if(lstrcmpi(ppItem[i]->lpszFileName,lpszFilePath)==0){
+			ppItem[i]->replace(lpszBuffer,pDelRange,pRange,lpszNewStr);
+			return;
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/Debugger.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Debugger.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Debugger.h	(revision 774)
@@ -0,0 +1,83 @@
+
+class CDebugger{
+	BOOL bDebugging;
+public:
+	HWND hwnd;
+
+	CDebugger::CDebugger();
+	CDebugger::~CDebugger();
+
+	BOOL IsDebugging(void);
+	BOOL IsDebuggerView(void);
+
+	void resize(int x,int y,int cx,int cy);
+
+	void ResetCommandEnabled(void);
+
+	void SaftyCheck(void);
+
+	void begin(void);
+	void end(void);
+	void watch_start(HWND hDebuggerView);
+	void watch_quit(void);
+
+
+	/////////////////////////////////
+	// イベントによるアプリ間通信
+	/////////////////////////////////
+
+	void DebugContinue(void);
+	void StepIn(void);
+	void StepOver(void);
+	void StepToCursor(void);
+
+	void DebugStop(void);
+	void DebugPause(void);
+};
+
+extern CDebugger *pobj_Debugger;
+
+
+
+
+
+/////////////////////////////////
+// ブレークポイント
+/////////////////////////////////
+
+class BreakPointsPerFile{
+public:
+	char *lpszFileName;
+
+	int *piLine;
+	int num;
+
+	BreakPointsPerFile(const char *lpszFileName,int iLineNum);
+	~BreakPointsPerFile();
+
+	void add(int iLineNum);
+	void remove(int iLineNum);
+
+	BOOL check(int iLineNum);
+
+	void replace(LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr);
+};
+
+class CDBBreakPoint{
+	BreakPointsPerFile **ppItem;
+	int num;
+
+public:
+	CDBBreakPoint();
+	~CDBBreakPoint();
+
+	void insert( const char *lpszFileName,int iLineNum);
+	void remove( const char *lpszFileName,int iLineNum);
+
+	void Event_BreakPoint(void);
+	void SaveToTempFile(void);
+
+	BreakPointsPerFile *EnumLines(const char *lpszFilePath);
+
+	void replace(const char *lpszFilePath,LPSTR lpszBuffer,CHARRANGE *pDelRange,CHARRANGE *pRange,LPSTR lpszNewStr);
+};
Index: branches/egtra/ab5.0/abdev/abdev/DesignTheme.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DesignTheme.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DesignTheme.cpp	(revision 774)
@@ -0,0 +1,194 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+
+CDBTheme *pobj_DBTheme;
+
+
+CTheme::CTheme(char *path,char *name){
+	bActive=0;
+	lstrcpy(m_name,name);
+	if(path==0) return;
+
+	buffer=ReadBuffer(path);
+
+
+	//通常の文字色
+	GetRGBValue("rgbDefault",&TextColorInfo.rgbDefault);
+
+	//コメント文字色
+	GetRGBValue("rgbComment",&TextColorInfo.rgbComment);
+
+	//特殊ステートメント
+	GetRGBValue("rgbStatement",&TextColorInfo.rgbStatement);
+
+	//文字列色
+	GetRGBValue("rgbString",&TextColorInfo.rgbString);
+
+	//背景色（カーソル行）
+	GetRGBValue("rgbCursorBack",&TextColorInfo.rgbCursorBack);
+
+	//背景色（一般）
+	GetRGBValue("rgbBackground",&TextColorInfo.rgbBackground);
+
+	//背景画像
+	if(!GetStringValue("BackgroundImagePath",szBackgroundImagePath)) szBackgroundImagePath[0]=0;
+
+	HeapDefaultFree(buffer);
+}
+CTheme::CTheme(){
+	bActive=0;
+	lstrcpy(m_name,THEMENAME_USER);
+}
+CTheme::~CTheme(){
+}
+
+void CTheme::save(){
+	buffer=(char *)HeapAlloc(hHeap,0,65536);
+	buffer[0]=0;
+
+
+	//通常の文字色
+	SetRGBValue("rgbDefault",TextColorInfo.rgbDefault);
+
+	//コメント文字色
+	SetRGBValue("rgbComment",TextColorInfo.rgbComment);
+
+	//特殊ステートメント
+	SetRGBValue("rgbStatement",TextColorInfo.rgbStatement);
+
+	//文字列色
+	SetRGBValue("rgbString",TextColorInfo.rgbString);
+
+	//背景色（カーソル行）
+	SetRGBValue("rgbCursorBack",TextColorInfo.rgbCursorBack);
+
+	//背景色（一般）
+	SetRGBValue("rgbBackground",TextColorInfo.rgbBackground);
+
+	//背景画像
+	SetStringValue("BackgroundImagePath",szBackgroundImagePath);
+
+	char path[MAX_PATH];
+	sprintf(path,"%sTheme\\%s",pj_editor_Dir,m_name);
+	if(!IsExistFile(path)){
+		CreateDirectory(path,NULL);
+	}
+
+	sprintf(path,"%sTheme\\%s\\design.ini",pj_editor_Dir,m_name);
+	WriteBuffer(path,buffer,lstrlen(buffer));
+
+	HeapDefaultFree(buffer);
+}
+
+
+CDBTheme::CDBTheme(){
+	hBackBmp=0;
+
+	iNum=0;
+	ppobj_Theme=(CTheme **)HeapAlloc(hHeap,0,1);
+
+	char temporary[MAX_PATH];
+	sprintf(temporary,"%sTheme\\*",pj_editor_Dir);
+
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind!=INVALID_HANDLE_VALUE){
+		do{
+			if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
+				if(!(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0)){
+					//ディレクトリのとき
+					sprintf(temporary,"%sTheme\\%s\\design.ini",pj_editor_Dir,wfd.cFileName);
+					if(IsExistFile(temporary)){
+						add(temporary,wfd.cFileName);
+					}
+				}
+			}
+			else{
+				//ファイルのとき
+				//無視
+			}
+		}while(FindNextFile(hFind,&wfd));
+	}
+}
+CDBTheme::~CDBTheme(){
+	int i;
+	for(i=0;i<iNum;i++){
+		delete ppobj_Theme[i];
+	}
+	HeapDefaultFree(ppobj_Theme);
+
+	unlock();
+}
+
+CTheme *CDBTheme::dupli_check(char *name){
+	//重複チェック
+	int i;
+	for(i=0;i<iNum;i++){
+		if(lstrcmpi(ppobj_Theme[i]->m_name,name)==0){
+			return ppobj_Theme[i];
+		}
+	}
+	return 0;
+}
+
+CTheme *CDBTheme::add(char *path,char *name){
+	ppobj_Theme=(CTheme **)HeapReAlloc(hHeap,0,ppobj_Theme,(iNum+1)*sizeof(CTheme *));
+	ppobj_Theme[iNum]=new CTheme(path,name);
+	iNum++;
+
+	return ppobj_Theme[iNum-1];
+}
+void CDBTheme::ResetTheme_ToComboBox(HWND hCombo){
+	int i;
+	for(i=0;i<iNum;i++){
+		SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)ppobj_Theme[i]->m_name);
+	}
+
+	//選択する
+	for(i=0;i<iNum;i++){
+		if(lstrcmp(ppobj_Theme[i]->m_name,pobj_nv->szActiveTheme)==0){
+			i=SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)ppobj_Theme[i]->m_name);
+			SendMessage(hCombo,CB_SETCURSEL,i,0);
+			break;
+		}
+	}
+}
+CTheme *CDBTheme::GetActiveTheme(){
+	int i;
+	for(i=0;i<iNum;i++){
+		if(lstrcmp(ppobj_Theme[i]->m_name,pobj_nv->szActiveTheme)==0){
+			return ppobj_Theme[i];
+		}
+	}
+	return 0;
+}
+
+void CDBTheme::lock(void){
+	CTheme *pobj_Theme;
+	pobj_Theme=GetActiveTheme();
+
+	if(pobj_Theme->szBackgroundImagePath[0]=='\0'){
+		hBackBmp=0;
+		return;
+	}
+
+	char szThemeDir[MAX_PATH];
+	sprintf(szThemeDir,"%sTheme\\%s\\",pj_editor_Dir,pobj_Theme->m_name);
+
+	char temporary[MAX_PATH];
+	lstrcpy(temporary,pobj_Theme->szBackgroundImagePath);
+	GetFullPath(temporary,szThemeDir);
+
+	hBackBmp=(HBITMAP)LoadImage(0,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+	BITMAP Bitmap;
+	GetObject(hBackBmp,sizeof(BITMAP),&Bitmap);
+	sizeBackBmp.cx=Bitmap.bmWidth;
+	sizeBackBmp.cy=Bitmap.bmHeight;
+}
+void CDBTheme::unlock(void){
+	if(hBackBmp) DeleteObject(hBackBmp);
+}
Index: branches/egtra/ab5.0/abdev/abdev/DesignTheme.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DesignTheme.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DesignTheme.h	(revision 774)
@@ -0,0 +1,53 @@
+
+
+#define THEMENAME_CLASSIC	"Classic"
+#define THEMENAME_USER		"User Setting"
+
+
+struct TEXTEDIT_COLOR_INFO{
+	COLORREF rgbDefault;		//通常の文字
+	COLORREF rgbComment;		//コメント
+	COLORREF rgbStatement;		//特殊ステートメント
+	COLORREF rgbString;			//文字列
+	COLORREF rgbCursorBack;		//背景色（カーソル行）
+	COLORREF rgbBackground;		//背景色（一般）
+};
+extern TEXTEDIT_COLOR_INFO tci;
+
+
+class CTheme:public CSettingFile{
+public:
+	BOOL bActive;
+	char m_name[MAX_PATH];
+	TEXTEDIT_COLOR_INFO TextColorInfo;
+	char szBackgroundImagePath[MAX_PATH];
+
+	CTheme(char *path,char *name);
+	CTheme();
+	~CTheme();
+
+	void save(void);
+};
+
+class CDBTheme{
+public:
+	int iNum;
+	CTheme **ppobj_Theme;
+
+	CDBTheme();
+	~CDBTheme();
+	CTheme *dupli_check(char *name);
+
+	CTheme *add(char *path,char *name);
+
+	void ResetTheme_ToComboBox(HWND hCombo);
+
+	CTheme *GetActiveTheme();
+
+	HBITMAP hBackBmp;
+	SIZE sizeBackBmp;
+	void lock(void);
+	void unlock(void);
+};
+
+extern CDBTheme *pobj_DBTheme;
Index: branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp	(revision 774)
@@ -0,0 +1,2054 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+HRESULT ApplyDialogTexture( HWND );
+
+//タブ用
+BOOL SetSwitch[32];
+
+
+void SetPosCenter(HWND hParent,HWND hwnd){
+	RECT owrect,rect;
+	int x,y;
+
+	if(IsWindow(hParent)) GetWindowRect(hParent,&owrect);
+	else{
+		owrect.left=0;
+		owrect.top=0;
+		owrect.right=ScreenX;
+		owrect.bottom=ScreenY;
+	}
+	GetWindowRect(hwnd,&rect);
+	x=((owrect.right-owrect.left)-(rect.right-rect.left))/2+owrect.left;
+	y=((owrect.bottom-owrect.top)-(rect.bottom-rect.top))/2+owrect.top;
+	SetWindowPos(hwnd,0,x,y,0,0,SWP_NOSIZE);
+}
+void SetPosCenter(HWND hwnd){
+	SetPosCenter(hOwner,hwnd);
+}
+BOOL SetFontDialog(HWND hwnd,LOGFONT *lf,BOOL bFixedPitchOnly,int *lpiPointSize){
+	CHOOSEFONT cf;
+	LOGFONT lfDummy;
+
+	lfDummy=*lf;
+	memset(&cf,0,sizeof(CHOOSEFONT));
+	cf.lStructSize=sizeof(CHOOSEFONT);
+	cf.hwndOwner=hwnd;
+	cf.lpLogFont=&lfDummy;
+	cf.Flags=CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT;
+	if(bFixedPitchOnly) cf.Flags|=CF_FIXEDPITCHONLY|CF_NOVERTFONTS;
+	cf.nFontType=SCREEN_FONTTYPE;
+	cf.lpTemplateName = TEXT("Font select");
+
+	if(!ChooseFont(&cf)) return 0;
+
+	*lf = lfDummy;
+
+	if(lpiPointSize) *lpiPointSize=cf.iPointSize;
+
+	return 1;
+}
+
+
+
+//////////////////////////////////
+// プロジェクト新規作成ウィザード
+//////////////////////////////////
+
+//プロジェクト作成項目
+#if defined(JPN)
+//日本語
+#define TEXT_BASE_NORMAL	"ノーマル ウィンドウをベースに、GUIアプリケーションを作成します。"
+#define TEXT_BASE_PROMPT	"プロンプト ウィンドウをベースに、N88BASIC互換プログラムを作成します。"
+#define TEXT_BASE_DOSPROMPT	"コンソール アプリケーションを作成します。Windows上で稼動するDOSプロンプトでの入出力が可能になります。"
+#define TEXT_NOBASE			"空のプロジェクトを作成します。"
+#define TEXT_DIRECTX		"DirectXに対応したアプリケーションを作成します。2Dまたは3Dの描画を高速に行うことができ、ゲームアプリケーションなどの開発に最適です。"
+#define TEXT_DLL			"ダイナミック リンク ライブラリ(DLL)を作成します。"
+#define TEXT_SLL			"静的 リンク ライブラリ(lib)を作成します。"
+#else
+//英語
+#define TEXT_BASE_NORMAL	"You can make a GUI application of a normal window base."
+#define TEXT_BASE_PROMPT	"You can make a N88 compatible program of a prompt window base."
+#define TEXT_BASE_DOSPROMPT	"You can make a console application."
+#define TEXT_NOBASE			"Empty project is created."
+#define TEXT_DIRECTX		"You can make a DirectX application. It can draw 2D or 3D graphics at high speed and it is useful to a game programing."
+#define TEXT_DLL			"You can make a DLL(Dynamic Link Library)."
+#endif
+
+void GetCheckTextBuffer(char *buffer){
+	extern NEWPROJECTINFO NewProjectInfo;
+	int i;
+
+#if defined(JPN)
+	//日本語
+	lstrcpy(buffer,"作成するプロジェクトの内容を確認して \"完了\" ボタンを押して下さい。\r\n\r\n");
+	i=lstrlen(buffer);
+	sprintf(buffer+i,"プロジェクト名: \"%s\"\r\n",NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+	sprintf(buffer+i,"ワーク ディレクトリ: \"%s\\%s\"\r\n\r\n",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+		lstrcpy(buffer+i,"ノーマル ウィンドウを持つEXE形式の実行ファイルを作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wnd … ウィンドウ デザイン保存用\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"MainWnd.ab … メイン ウィンドウのイベント プロシージャ用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
+		lstrcpy(buffer+i,"プロンプト ウィンドウを持つEXE形式の実行ファイルを作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
+		lstrcpy(buffer+i,"EXE形式のコンソール アプリケーションを作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
+		lstrcpy(buffer+i,"EXE形式の実行ファイルを作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		lstrcpy(buffer+i,"EXE形式の実行ファイルを作成します。同時に、DirectXの操作に必要なソースコードを生成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_graphics.sbp … DirectGraphicsサポート用ソースコード ファイル\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_input.sbp … DirectInputサポート用ソースコード ファイル\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_music.sbp … DirectMusicサポート用ソースコード ファイル\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_DLL){
+		lstrcpy(buffer+i,"ダイナミック リンク ライブラリ(DLL)を作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_SLL){
+		lstrcpy(buffer+i,"静的 リンク ライブラリ(lib)を作成します。\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- 以下のファイルが生成されます ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … プロジェクト ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … インデックス ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … メイン ソースコード ファイル\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … 作業状況の管理用\r\n",NewProjectInfo.name);
+	}
+#else
+	//英語
+	lstrcpy(buffer,"Please check following points and click the \"Finish\" button.\r\n\r\n");
+	i=lstrlen(buffer);
+	sprintf(buffer+i,"Project Name: \"%s\"\r\n",NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+	sprintf(buffer+i,"Work Directory: \"%s\\%s\"\r\n\r\n",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_NORMAL);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Project file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wnd … Data of Window Design\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"MainWnd.ab … Data of Event Procedures of the Main Window\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_PROMPT);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_BASE_DOSPROMPT);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_NOBASE);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_DIRECTX);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_graphics.sbp … DirectGraphics is supported at this source file\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_input.sbp … DirectInput is supported at this source file\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_music.sbp … DirectMusic is supported at this source file\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_DLL){
+		sprintf(buffer+i,"%s\r\n\r\n",TEXT_DLL);
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"--- Creation Files ---\r\n");
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.pj … Creation Files\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.idx … Index file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.ab … Main Source Code file\r\n",NewProjectInfo.name);
+		i+=lstrlen(buffer+i);
+		sprintf(buffer+i,"%s.wrk … Data of Work State\r\n",NewProjectInfo.name);
+	}
+#endif
+}
+INT_PTR CALLBACK DlgNewProject_Page3(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	char buffer[GENERAL_SIZE];
+	LPPSHNOTIFY lpPshNotify;
+	switch(message){
+		case WM_NOTIFY:
+			lpPshNotify=(LPPSHNOTIFY)lParam;
+			switch(lpPshNotify->hdr.code){
+				case PSN_SETACTIVE:
+					PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_FINISH|PSWIZB_BACK);
+
+					GetCheckTextBuffer(buffer);
+
+					SetDlgItemText(hwnd,IDC_PROJECTINFO,buffer);
+					SetTimer(hwnd,1,10,0);
+					return 1;
+				case PSN_WIZFINISH:
+					MakeNewProject();
+					return 1;
+			}
+			break;
+		case WM_TIMER:
+			KillTimer(hwnd,1);
+			SendDlgItemMessage(hwnd,IDC_PROJECTINFO,EM_SETSEL,0,0);
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgNewProject_Page2(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern NEWPROJECTINFO NewProjectInfo;
+	LPPSHNOTIFY lpPshNotify;
+	switch(message){
+		case WM_NOTIFY:
+			lpPshNotify=(LPPSHNOTIFY)lParam;
+			switch(lpPshNotify->hdr.code){
+				case PSN_SETACTIVE:
+					//DirectXアプリのときはMMSYSをチェック
+					if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+						SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_SETCHECK,BST_CHECKED,0);
+						EnableWindow(GetDlgItem(hwnd,IDC_API_MMSYS),0);
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_API_MMSYS),1);
+					}
+
+					PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_NEXT|PSWIZB_BACK);
+					return 1;
+				case PSN_WIZNEXT:
+					NewProjectInfo.dwOption=PJ_OP_RC_MANIFEST;
+					if(SendDlgItemMessage(hwnd,IDC_UNICODE,BM_GETCHECK,0,0))
+						NewProjectInfo.dwOption|=PJ_OP_UNICODE;
+					if(SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_GETCHECK,0,0))
+						NewProjectInfo.dwOption|=PJ_OP_COMMCTRL;
+					if(SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_GETCHECK,0,0))
+						NewProjectInfo.dwOption|=PJ_OP_MMSYSTEM;
+					if(SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_GETCHECK,0,0))
+						NewProjectInfo.dwOption|=PJ_OP_RICHEDIT;
+					if(SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_GETCHECK,0,0))
+						NewProjectInfo.dwOption|=PJ_OP_WINSOCK;
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+void AppImage_ShowOrHide(HWND hDlg,int id){
+	int nCmd;
+
+	if(id==IDC_EXE_WINDOWBASE) nCmd=SW_SHOW;
+	else nCmd=SW_HIDE;
+	ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_WINDOW),nCmd);
+
+	if(id==IDC_EXE_PROMPTBASE) nCmd=SW_SHOW;
+	else nCmd=SW_HIDE;
+	ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_PROMPT),nCmd);
+
+	if(id==IDC_EXE_DOSPROMPTBASE) nCmd=SW_SHOW;
+	else nCmd=SW_HIDE;
+	ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_DOSPROMPT),nCmd);
+
+	if(id==IDC_EXE_NOBASE) nCmd=SW_SHOW;
+	else nCmd=SW_HIDE;
+	ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_NON),nCmd);
+
+	if(id==IDC_EXE_DIRECTX) nCmd=SW_SHOW;
+	else nCmd=SW_HIDE;
+	ShowWindow(GetDlgItem(hDlg,IDC_IMAGE_DIRECTX),nCmd);
+}
+INT_PTR CALLBACK DlgNewProject_Page1(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern NEWPROJECTINFO NewProjectInfo;
+	int i;
+	char temporary[MAX_PATH];
+	LPPSHNOTIFY lpPshNotify;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(GetParent(hwnd));
+
+			SetDlgItemText(hwnd,IDC_DIRPATH,pobj_nv->ProjectSaveDir);
+			SendDlgItemMessage(hwnd,IDC_EXE_WINDOWBASE,BM_SETCHECK,BST_CHECKED,0);
+			SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_NORMAL);
+
+			break;
+		case WM_COMMAND:
+			if(HIWORD(wParam)==EN_CHANGE){
+				if(GetWindowTextLength(GetDlgItem(hwnd,IDC_PROJECTNAME))==0||
+					GetWindowTextLength(GetDlgItem(hwnd,IDC_DIRPATH))==0){
+					PropSheet_SetWizButtons(GetParent(hwnd),0);
+				}
+				else PropSheet_SetWizButtons(GetParent(hwnd),PSWIZB_NEXT);
+			}
+			switch(LOWORD(wParam)){
+				case IDC_PATHBROWSE:
+					//"ディレクトリを選択して下さい"
+					if(!GetFolder(hwnd,temporary,STRING_DIRECTORY_SELECT)) return 1;
+					SetDlgItemText(hwnd,IDC_DIRPATH,temporary);
+					return 1;
+				case IDC_EXE_WINDOWBASE:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_NORMAL);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+					return 1;
+				case IDC_EXE_PROMPTBASE:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_PROMPT);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+					return 1;
+				case IDC_EXE_DOSPROMPTBASE:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_BASE_DOSPROMPT);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),1);
+					return 1;
+				case IDC_EXE_NOBASE:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_NOBASE);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+					return 1;
+				case IDC_EXE_DIRECTX:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_DIRECTX);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+					return 1;
+				case IDC_DLL:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_DLL);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+					return 1;
+				case IDC_SLL:
+					AppImage_ShowOrHide(hwnd,LOWORD(wParam));
+
+					SetDlgItemText(hwnd,IDC_HELPTEXT_OFBASE,TEXT_SLL);
+					EnableWindow(GetDlgItem(hwnd,IDC_SHOWHELLOWORLD),0);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			lpPshNotify=(LPPSHNOTIFY)lParam;
+			switch(lpPshNotify->hdr.code){
+				case PSN_SETACTIVE:
+					SendMessage(hwnd,WM_COMMAND,MAKELONG(0,EN_CHANGE),0);
+					return 1;
+				case PSN_WIZNEXT:
+					GetDlgItemText(hwnd,IDC_PROJECTNAME,NewProjectInfo.name,MAX_PATH);
+					if(!IsVariableTopChar(NewProjectInfo.name[0])){
+						//"プロジェクト名の先頭文字はアルファベット（A～Z、a～z）またはアンダーバー（_）でなければなりません。"
+						MessageBox(hwnd,STRING_ERROR_PROJECTTOPCHAR,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+						SetWindowLongPtr(hwnd,DWLP_MSGRESULT,-1);
+						return 1;
+					}
+					for(i=1;;i++){
+						if(NewProjectInfo.name[i]=='\0') break;
+						if(!IsVariableChar(NewProjectInfo.name[i])){
+							//"プロジェクト名に不正な文字コードが含まれています。"
+							MessageBox(hwnd,STRING_ERROR_PROJECTNAME,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+							SetWindowLongPtr(hwnd,DWLP_MSGRESULT,-1);
+							return 1;
+						}
+					}
+					GetDlgItemText(hwnd,IDC_DIRPATH,pobj_nv->ProjectSaveDir,MAX_PATH);
+
+					//ベース選択
+					if(SendDlgItemMessage(hwnd,IDC_EXE_WINDOWBASE,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_EXE_WINDOWBASE;
+					else if(SendDlgItemMessage(hwnd,IDC_EXE_PROMPTBASE,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_EXE_PROMPTBASE;
+					else if(SendDlgItemMessage(hwnd,IDC_EXE_DOSPROMPTBASE,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_EXE_DOSPROMPTBASE;
+					else if(SendDlgItemMessage(hwnd,IDC_EXE_NOBASE,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_EXE_NOBASE;
+					else if(SendDlgItemMessage(hwnd,IDC_EXE_DIRECTX,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_EXE_DIRECTX;
+					else if(SendDlgItemMessage(hwnd,IDC_DLL,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_DLL;
+					else if(SendDlgItemMessage(hwnd,IDC_SLL,BM_GETCHECK,0,0))
+						NewProjectInfo.dwTypeID=IDC_SLL;
+
+					//"Hello World!"を表示するか
+					if(SendDlgItemMessage(hwnd,IDC_SHOWHELLOWORLD,BM_GETCHECK,0,0)) NewProjectInfo.ShowHelloWorld=1;
+					else NewProjectInfo.ShowHelloWorld=0;
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+void DlgNewProjectWizard(HWND hwnd){
+#define MAX_NEWPROJECTPAGE 3
+	PROPSHEETHEADER psh;
+	PROPSHEETPAGE psp;
+	HPROPSHEETPAGE hpsp[MAX_NEWPROJECTPAGE];
+	int i;
+
+	psp.dwSize=sizeof(PROPSHEETPAGE);
+	psp.hInstance=hResInst;
+	psp.dwFlags=PSP_DEFAULT;
+
+	//各ページのセッティング
+	i=0;
+	psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE1);
+	psp.pfnDlgProc=DlgNewProject_Page1;
+	hpsp[i]=CreatePropertySheetPage(&psp);
+	i++;
+	psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE2);
+	psp.pfnDlgProc=DlgNewProject_Page2;
+	hpsp[i]=CreatePropertySheetPage(&psp);
+	i++;
+	psp.pszTemplate=MAKEINTRESOURCE(IDD_NEWPROJECT_PAGE3);
+	psp.pfnDlgProc=DlgNewProject_Page3;
+	hpsp[i]=CreatePropertySheetPage(&psp);
+
+	memset(&psh,0,sizeof(PROPSHEETHEADER));
+	psh.dwSize=sizeof(PROPSHEETHEADER);
+	psh.dwFlags=PSH_WIZARD;
+	psh.phpage=hpsp;
+	psh.hwndParent=hwnd;
+	psh.nPages=MAX_NEWPROJECTPAGE;
+	PropertySheet(&psh);
+}
+
+#define CATEGORY_TEXT_BASIC	"Basic"
+#define CATEGORY_TEXT_TEXT	"テキスト"
+#define CATEGORY_TEXT_OTHER "その他"
+
+#define CATEGORY_BASIC	1
+#define CATEGORY_TEXT	2
+#define CATEGORY_OTHER	3
+void ResetNewFileTypeListView(HWND hListView,int fCategory){
+	ListView_DeleteAllItems(hListView);
+
+	LV_ITEM lvItem;
+	lvItem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
+	lvItem.iItem=0;
+	lvItem.iSubItem=0;
+
+	if(fCategory==CATEGORY_BASIC){
+		lvItem.pszText="Basic ソース ファイル";
+		lvItem.iImage=0;
+		lvItem.lParam=FT_BASICPROGRAM;
+		ListView_InsertItem(hListView,&lvItem);
+		lvItem.iItem++;
+
+		lvItem.pszText="プロジェクト";
+		lvItem.iImage=2;
+		lvItem.lParam=FT_PROJECT;
+		ListView_InsertItem(hListView,&lvItem);
+	}
+	else if(fCategory==CATEGORY_TEXT){
+		lvItem.pszText="テキスト ファイル";
+		lvItem.iImage=3;
+		lvItem.lParam=FT_TEXT;
+		ListView_InsertItem(hListView,&lvItem);
+		lvItem.iItem++;
+
+		lvItem.pszText="HTML ファイル";
+		lvItem.iImage=4;
+		lvItem.lParam=FT_HTML;
+		ListView_InsertItem(hListView,&lvItem);
+	}
+	else if(fCategory==CATEGORY_OTHER){
+		lvItem.pszText="アイコン ファイル";
+		lvItem.iImage=5;
+		lvItem.lParam=FT_ICON;
+		ListView_InsertItem(hListView,&lvItem);
+	}
+
+	ListView_SetItemState(hListView,0,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
+}
+
+#ifndef THETEXT
+INT_PTR CALLBACK DlgNewFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern char NewFileName[MAX_PATH];
+
+	static HIMAGELIST hImageList;
+	static HWND hTree;
+	static HWND hListView;
+	int i;
+	LVITEM lvItem;
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+
+			///////////////////////////////////
+			// カテゴリツリービューを初期化
+			///////////////////////////////////
+			HTREEITEM hBasicTreeItem;
+
+			hTree=GetDlgItem(hwnd,IDC_CATEGORY_TREE);
+
+			TV_INSERTSTRUCT tv;
+			tv.hInsertAfter=TVI_LAST;
+			tv.item.mask=TVIF_TEXT;
+			tv.hParent=TVI_ROOT;
+
+			tv.item.pszText=CATEGORY_TEXT_BASIC;
+			hBasicTreeItem=TreeView_InsertItem(hTree,&tv);
+			tv.item.pszText=CATEGORY_TEXT_TEXT;
+			TreeView_InsertItem(hTree,&tv);
+			tv.item.pszText=CATEGORY_TEXT_OTHER;
+			TreeView_InsertItem(hTree,&tv);
+
+			TreeView_SelectItem(hTree,hBasicTreeItem);
+
+
+
+			/////////////////////////////////////////
+			// ファイルタイプ リストビューを初期化
+			/////////////////////////////////////////
+
+			hListView=GetDlgItem(hwnd,IDC_FILETYPELIST);
+
+			hImageList=ImageList_Create(32, 32, ILC_COLOR24|ILC_MASK, 6, 0);
+			ListView_SetImageList(hListView, hImageList, LVSIL_NORMAL);
+			ImageList_AddIcon(hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_FILE_BAS)));
+			ImageList_AddIcon(hImageList, LoadIcon(hInst, MAKEINTRESOURCE(IDI_FILE_SBP)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_PJ)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_TEXT)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_HTML)));
+			ImageList_AddIcon(hImageList, LoadIcon(hResInst, MAKEINTRESOURCE(IDI_NEWFILE_ICON)));
+
+
+			ResetNewFileTypeListView(hListView,CATEGORY_BASIC);
+
+
+			SetFocus(GetDlgItem(hwnd,IDC_FILETYPELIST));
+
+			if( projectInfo.IsOpened() ){
+				SendDlgItemMessage(hwnd,IDC_ADDTOPROJECT,BM_SETCHECK,BST_CHECKED,0);
+			}
+
+			SendMessage(hwnd,WM_COMMAND,IDC_ADDTOPROJECT,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+							lvItem.mask=LVIF_PARAM;
+							lvItem.iItem=i;
+							lvItem.iSubItem=0;
+							ListView_GetItem(hListView,&lvItem);
+							break;
+						}
+					}
+					if(i==ListView_GetItemCount(hListView)) return 1;
+
+					//ファイルタイプ
+					i=lvItem.lParam;
+
+					//プロジェクトへ追加するかどうか
+					if(IsWindowEnabled(GetDlgItem(hwnd,IDC_ADDTOPROJECT))){
+						if(SendDlgItemMessage(hwnd,IDC_ADDTOPROJECT,BM_GETCHECK,0,0)){
+							i|=0x00008000;
+							GetDlgItemText(hwnd,IDC_FILENAME,NewFileName,MAX_PATH);
+
+							if(NewFileName[0]=='\0'){
+								MessageBox(hwnd,"ファイル名を入力してください。",APPLICATION_NAME,MB_OK);
+								return 1;
+							}
+						}
+					}
+
+					EndDialog(hwnd,i);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,-1);
+					return 1;
+				case IDC_ADDTOPROJECT:
+					if(IsWindowEnabled(GetDlgItem(hwnd,IDC_ADDTOPROJECT))&&
+						SendDlgItemMessage(hwnd,IDC_ADDTOPROJECT,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_FILENAME),1);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_FILENAME),1);
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_FILENAME),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_FILENAME),0);
+					}
+					return 1;
+			}
+			break;
+
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hTree&&hdr->code==TVN_SELCHANGED){
+				NMTREEVIEW *lpnmTree;
+				lpnmTree=(NMTREEVIEW *)lParam;
+
+				char temporary[255];
+				TVITEM tvItem;
+				tvItem.mask=TVIF_TEXT|TVIF_HANDLE;
+				tvItem.hItem=lpnmTree->itemNew.hItem;
+				tvItem.pszText=temporary;
+				tvItem.cchTextMax=255;
+				TreeView_GetItem(hTree,&tvItem);
+
+				if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_BASIC)==0)
+					ResetNewFileTypeListView(hListView,CATEGORY_BASIC);
+				else if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_TEXT)==0)
+					ResetNewFileTypeListView(hListView,CATEGORY_TEXT);
+				else if(lstrcmpi(tvItem.pszText,CATEGORY_TEXT_OTHER)==0)
+					ResetNewFileTypeListView(hListView,CATEGORY_OTHER);
+			}
+			if(hdr->hwndFrom==hListView){
+				if(hdr->code==LVN_ITEMCHANGED){
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+							lvItem.mask=LVIF_PARAM;
+							lvItem.iItem=i;
+							lvItem.iSubItem=0;
+							ListView_GetItem(hListView,&lvItem);
+							break;
+						}
+					}
+					if(i!=ListView_GetItemCount(hListView)&& projectInfo.IsOpened() &&(
+						lvItem.lParam==FT_BASICPROGRAM||
+						lvItem.lParam==FT_SUBPROGRAM
+						)){
+						EnableWindow(GetDlgItem(hwnd,IDC_ADDTOPROJECT),1);
+					}
+					else EnableWindow(GetDlgItem(hwnd,IDC_ADDTOPROJECT),0);
+
+					SendMessage(hwnd,WM_COMMAND,IDC_ADDTOPROJECT,0);
+				}
+				else if(hdr->code==NM_DBLCLK){
+					SendMessage(hwnd,WM_COMMAND,IDOK,0);
+				}
+			}
+			return 0;
+
+		case WM_DESTROY:
+			ImageList_Destroy(hImageList);
+			return 0;
+	}
+	return 0;
+}
+#endif
+
+
+//プロジェクトオプション項目
+#define MAX_PJSETDLG 4
+DWORD temp_dwPjOption;
+char temp_lpszOutputRelease[MAX_PATH];
+char temp_lpszOutputDebug[MAX_PATH];
+char temp_szManifestPath[MAX_PATH];
+char temp_szDebugCmdLine[8192];
+char temp_szDebugExePath[MAX_PATH];
+
+void SaveSetting_DlgPjOption(void){
+	if(SetSwitch[0]){
+		//出力ファイル
+		lstrcpy(projectInfo.lpszOutput_Release,temp_lpszOutputRelease);
+		lstrcpy(projectInfo.lpszOutput_Debug,temp_lpszOutputDebug);
+
+		//コメントの有無
+		projectInfo.dwOption=temp_dwPjOption;
+	}
+	if(SetSwitch[1]){
+		//Win32API
+		projectInfo.dwOption=temp_dwPjOption;
+	}
+	if(SetSwitch[2]){
+		//マニフェスト
+
+		//パス
+		lstrcpy(projectInfo.szManifestPath,temp_szManifestPath);
+
+		projectInfo.dwOption=temp_dwPjOption;
+
+		projectInfo.ModifuOfResource=1;
+	}
+	if(SetSwitch[3]){
+		//デバッグ
+
+		//コマンドライン
+		lstrcpy(projectInfo.szCmdLine,temp_szDebugCmdLine);
+
+		//デバッグセッション用の実行可能ファイル
+		lstrcpy(projectInfo.szExePath,temp_szDebugExePath);
+	}
+
+	projectInfo.modify=1;
+}
+INT_PTR CALLBACK DlgProjectOption_Whole(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	NMHDR *nmhdr;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(GetParent(hwnd));
+
+			SetSwitch[0]=1;
+
+			//出力ファイル
+			SetDlgItemText(hwnd,IDC_EDIT_RELEASE,projectInfo.lpszOutput_Release);
+			SetDlgItemText(hwnd,IDC_EDIT_DEBUG,projectInfo.lpszOutput_Debug);
+
+			//Unicode
+			if(temp_dwPjOption&PJ_OP_UNICODE)
+				SendDlgItemMessage(hwnd,IDC_UNICODE,BM_SETCHECK,BST_CHECKED,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				GetDlgItemText(hwnd,IDC_EDIT_RELEASE,temp_lpszOutputRelease,MAX_PATH);
+				GetDlgItemText(hwnd,IDC_EDIT_DEBUG,temp_lpszOutputDebug,MAX_PATH);
+
+				//Unicode
+				if(SendDlgItemMessage(hwnd,IDC_UNICODE,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_UNICODE;
+				else temp_dwPjOption&=~PJ_OP_UNICODE;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+			}
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgProjectOption_Win32API(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	NMHDR *nmhdr;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetSwitch[1]=1;
+
+			if(temp_dwPjOption&PJ_OP_MMSYSTEM)
+				SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_SETCHECK,BST_CHECKED,0);
+			if(temp_dwPjOption&PJ_OP_COMMCTRL)
+				SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_SETCHECK,BST_CHECKED,0);
+			if(temp_dwPjOption&PJ_OP_RICHEDIT)
+				SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_SETCHECK,BST_CHECKED,0);
+			if(temp_dwPjOption&PJ_OP_WINSOCK)
+				SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_SETCHECK,BST_CHECKED,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				if(SendDlgItemMessage(hwnd,IDC_API_MMSYS,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_MMSYSTEM;
+				else temp_dwPjOption&=~PJ_OP_MMSYSTEM;
+				if(SendDlgItemMessage(hwnd,IDC_API_COMMCTRL,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_COMMCTRL;
+				else temp_dwPjOption&=~PJ_OP_COMMCTRL;
+				if(SendDlgItemMessage(hwnd,IDC_API_RICHEDIT,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_RICHEDIT;
+				else temp_dwPjOption&=~PJ_OP_RICHEDIT;
+				if(SendDlgItemMessage(hwnd,IDC_API_WINSOCK,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_WINSOCK;
+				else temp_dwPjOption&=~PJ_OP_WINSOCK;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+			}
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgProjectOption_Manifest(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_INITDIALOG:
+			SetSwitch[2]=1;
+
+			//パス
+			SetDlgItemText(hwnd,IDC_PATH,projectInfo.szManifestPath);
+
+			//マニフェストをリソースに埋め込む
+			if(temp_dwPjOption&PJ_OP_RC_MANIFEST)
+				SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_SETCHECK,BST_CHECKED,0);
+
+			SendMessage(hwnd,WM_COMMAND,IDC_RC_MANIFEST,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_RC_MANIFEST:
+					if(SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PATH),1);
+						EnableWindow(GetDlgItem(hwnd,IDC_PATH),1);
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PATH),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_PATH),0);
+					}
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			NMHDR *nmhdr;
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+
+				//パス
+				GetDlgItemText(hwnd,IDC_PATH,temp_szManifestPath,MAX_PATH);
+
+				//マニフェストをリソースに埋め込む
+				if(SendDlgItemMessage(hwnd,IDC_RC_MANIFEST,BM_GETCHECK,0,0))
+					temp_dwPjOption|=PJ_OP_RC_MANIFEST;
+				else temp_dwPjOption&=~PJ_OP_RC_MANIFEST;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+			}
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgProjectOption_Debug(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	NMHDR *nmhdr;
+	char temporary[MAX_PATH];
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetSwitch[3]=1;
+
+			if( projectInfo.GetModuleType() != ActiveBasic::Common::TargetModuleType::Dll )
+			{
+				EnableWindow(GetDlgItem(hwnd,IDC_EXE_PATH),0);
+				EnableWindow(GetDlgItem(hwnd,IDC_DIR),0);
+			}
+
+			SetDlgItemText(hwnd,IDC_CMD_LINE,projectInfo.szCmdLine);
+			SetDlgItemText(hwnd,IDC_EXE_PATH,projectInfo.szExePath);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_DIR:
+					extern LPSTR ExeFileFilter;
+					if(!GetFilePathDialog(hwnd,temporary,ExeFileFilter,"DLLデバッグ用の実行可能ファイルを指定してください",1)) break;
+
+					SetDlgItemText(hwnd,IDC_EXE_PATH,temporary);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				GetDlgItemText(hwnd,IDC_CMD_LINE,temp_szDebugCmdLine,8192);
+				GetDlgItemText(hwnd,IDC_EXE_PATH,temp_szDebugExePath,MAX_PATH);
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting_DlgPjOption();
+			}
+			return 1;
+	}
+	return 0;
+}
+void DlgProjectOptionSetting(HWND hwnd){
+	PROPSHEETHEADER psh;
+	PROPSHEETPAGE psp[MAX_PJSETDLG];
+	HPROPSHEETPAGE hpsp[MAX_PJSETDLG];
+	int i;
+	memset(&SetSwitch,0,MAX_PJSETDLG);
+
+	//各ページのセッティング
+	i=0;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION1);
+	psp[i].pfnDlgProc=(DLGPROC)DlgProjectOption_Whole;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION2);
+	psp[i].pfnDlgProc=(DLGPROC)DlgProjectOption_Win32API;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION3);
+	psp[i].pfnDlgProc=(DLGPROC)DlgProjectOption_Manifest;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_PJ_OPTION4);
+	psp[i].pfnDlgProc=(DLGPROC)DlgProjectOption_Debug;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+
+	temp_dwPjOption=projectInfo.dwOption;
+
+	memset(&psh,0,sizeof(PROPSHEETHEADER));
+	psh.dwSize=sizeof(PROPSHEETHEADER);
+	psh.dwFlags=PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW;
+	psh.phpage=hpsp;
+	psh.hwndParent=hwnd;
+	psh.pszCaption=STRING_PROJECTOPTION;	//"プロジェクト オプション"
+	psh.nPages=MAX_PJSETDLG;
+	psh.nStartPage=0;
+	psh.ppsp=psp;
+	PropertySheet(&psh);
+}
+
+
+/////////////////////
+// オプション項目
+/////////////////////
+
+BOOL bOptionWhole;
+BOOL bOptionEditor;
+BOOL bOptionColor;
+BOOL bOptionToolbar;
+BOOL bOptionRad;
+BOOL temp_bSaveCheckProject;
+BOOL temp_bLineAdjust;
+BOOL temp_bSaveTabToHead;
+LOGFONT temp_lf,temp_HintFont;
+int temp_TabSize;
+BOOL temp_bEditor_LineNumber;
+BOOL temp_bEditor_Ruler;
+BOOL temp_bEditor_CaretLine_BackGround;
+int temp_iMaxOneLineTextLength;
+BOOL temp_bAutoIndent;
+BOOL temp_bPasteIndent;
+DWORD temp_dwParameterHint;
+BOOL temp_bShowComplementWnd;
+int temp_BackNum_PairStatementComplement;
+BOOL temp_bSaveFindStr;
+
+CTheme obj_temp_Theme;
+
+
+void SaveSetting(void){
+	int i;
+	if(bOptionWhole){
+		//実行時の、プロジェクトの保存確認の有無
+		pobj_nv->bSaveCheckProject=temp_bSaveCheckProject;
+
+		//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+		pobj_nv->bSaveTabToHead=temp_bSaveTabToHead;
+	}
+	if(bOptionEditor){
+		//フォント
+		pobj_nv->lf=temp_lf;
+
+		//タブサイズ
+		pobj_nv->TabSize=temp_TabSize;
+
+		//エディタの行番号を表示するかどうか
+		pobj_nv->bEditor_LineNumber=temp_bEditor_LineNumber;
+
+		//エディタのルーラーを表示するかどうか
+		pobj_nv->bEditor_Ruler=temp_bEditor_Ruler;
+
+		//カーソル行を強調表示するかどうか
+		pobj_nv->bEditor_CaretLine_BackGround=temp_bEditor_CaretLine_BackGround;
+
+		//自動折り返し時の一行あたりの文字数
+		pobj_nv->iMaxOneLineTextLength=temp_iMaxOneLineTextLength;
+
+		//コード補完機能
+		pobj_nv->bShowComplementWnd=temp_bShowComplementWnd;
+
+		pobj_nv->BackNum_PairStatementComplement=temp_BackNum_PairStatementComplement;
+
+		//パラメータ ヒント
+		pobj_nv->dwParameterHint=temp_dwParameterHint;
+
+		//パラメータ ヒント フォント
+		extern METHODCHECKINFO MethodCheckInfo;
+		MethodCheckInfo.LogFont=temp_HintFont;
+		DeleteObject(MethodCheckInfo.hFont);
+		DeleteObject(MethodCheckInfo.hBoldFont);
+
+		MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+		i=MethodCheckInfo.LogFont.lfWeight;
+		MethodCheckInfo.LogFont.lfWeight=FW_BOLD;
+		MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+		MethodCheckInfo.LogFont.lfWeight=i;
+
+		//自動インデント
+		pobj_nv->bAutoIndent=temp_bAutoIndent;
+
+		//貼り付け時のインデント調整
+		pobj_nv->bPasteIndent=temp_bPasteIndent;
+
+		//検索・置換文字列を保存するかどうか
+		pobj_nv->bSaveFindStr=temp_bSaveFindStr;
+
+		RedrawAllWindow();		//すべてのウィンドウを再描画
+	}
+	if(bOptionColor){
+		//カラーデザインを更新
+		CTheme *pobj_Theme;
+		pobj_Theme=pobj_DBTheme->dupli_check(obj_temp_Theme.m_name);
+		*pobj_Theme=obj_temp_Theme;
+		if(lstrcmp(pobj_Theme->m_name,THEMENAME_USER)==0){
+			//ユーザー設定の場合は自動的にファイルに保存する
+			pobj_Theme->save();
+		}
+
+		//再描画
+		SetTextEditColorDesign(&tci,pobj_Theme,1);
+	}
+	if(bOptionRad){
+		//ライン アジャスタ
+		pobj_nv->bLineAdjust=temp_bLineAdjust;
+	}
+	return;
+}
+INT_PTR CALLBACK Dlg_Option_Whole(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	NMHDR *nmhdr;
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(GetParent(hwnd));
+
+			bOptionWhole=1;
+
+			//実行時の、プロジェクトの保存確認の有無
+			if(pobj_nv->bSaveCheckProject) SendDlgItemMessage(hwnd,IDC_SAVECHECK,BM_SETCHECK,BST_CHECKED,0);
+
+			//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+			if(pobj_nv->bSaveTabToHead) SendDlgItemMessage(hwnd,IDC_SAVE_TAB_TO_HEAD,BM_SETCHECK,BST_CHECKED,0);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_LINKFILE:
+					ExtensionLink(hwnd);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				//実行時の、プロジェクトの保存確認の有無
+				if(SendDlgItemMessage(hwnd,IDC_SAVECHECK,BM_GETCHECK,0,0)) temp_bSaveCheckProject=1;
+				else temp_bSaveCheckProject=0;
+
+				//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+				if(SendDlgItemMessage(hwnd,IDC_SAVE_TAB_TO_HEAD,BM_GETCHECK,0,0)) temp_bSaveTabToHead=1;
+				else temp_bSaveTabToHead=0;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting();
+			}
+			return 1;
+		case WM_HELP:
+			HELPINFO *lpHelpInfo;
+			lpHelpInfo = (HELPINFO *)lParam;
+
+			HH_POPUP hp;
+			memset(&hp, 0, sizeof(HH_POPUP));
+			hp.cbStruct = sizeof(HH_POPUP);
+			hp.pt.x = lpHelpInfo->MousePos.x;
+			hp.pt.y = lpHelpInfo->MousePos.y+10;
+			hp.clrForeground = RGB(0, 0, 0);
+			hp.clrBackground = -1;
+			hp.rcMargins.left = -1;
+			hp.rcMargins.right = -1;
+			hp.rcMargins.top = -1;
+			hp.rcMargins.bottom = -1;
+			hp.idString = 0;
+			hp.pszFont="MS Sans Serif,10";
+
+			switch(lpHelpInfo->iCtrlId){
+				case IDC_SAVECHECK:
+#if defined(JPN)
+					//日本語
+					hp.pszText="このチェックボックスをオンにすると、プロジェクトが未保存の状態であるとき、コンパイル時に保存確認のダイアログボックスが表示されるようになります。\nチェックをオフにすると、プロジェクトはコンパイル時に自動的に保存されます（デフォルトはオフです）。";
+#else
+					//英語
+					hp.pszText="When the compiling button is clicked, if this check is on, the DialogBox to save modification is displayed.\nIf this check is off, the project is saved automatically(Default).";
+#endif
+					break;
+				case IDC_LINKFILE:
+#if defined(JPN)
+					//日本語
+					hp.pszText="ファイルの関連付けを行います。";
+#else
+					//英語
+					hp.pszText="Relate the files.";
+#endif
+					break;
+				default:
+					hp.pszText="";
+					break;
+			}
+			HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK Dlg_Option_Editor(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern METHODCHECKINFO MethodCheckInfo;
+	char str[255];
+	NMHDR *nmhdr;
+	switch(message){
+		case WM_INITDIALOG:
+			bOptionEditor=1;
+
+			//フォント
+			sprintf(str,"%s",pobj_nv->lf.lfFaceName);
+			SetDlgItemText(hwnd,IDC_SETFONT,str);
+			temp_lf=pobj_nv->lf;
+
+			//タブサイズ
+			sprintf(str,"%d",pobj_nv->TabSize);
+			SetDlgItemText(hwnd,IDC_TABSIZE,str);
+
+			//エディタの行番号を表示するかどうか
+			if(pobj_nv->bEditor_LineNumber) SendDlgItemMessage(hwnd,IDC_LINENUMBER,BM_SETCHECK,BST_CHECKED,0);
+
+			//エディタのルーラーを表示するかどうか
+			if(pobj_nv->bEditor_Ruler) SendDlgItemMessage(hwnd,IDC_RULER,BM_SETCHECK,BST_CHECKED,0);
+
+			//カーソル行を強調表示するかどうか
+			if(pobj_nv->bEditor_CaretLine_BackGround) SendDlgItemMessage(hwnd,IDC_CARETLINE_BACKGROUND,BM_SETCHECK,BST_CHECKED,0);
+
+#ifdef THETEXT
+			//自動折り返し時の一行あたりの文字数
+			sprintf(str,"%d",pobj_nv->iMaxOneLineTextLength);
+			SetDlgItemText(hwnd,IDC_MAX_ONELINE_TEXT_LENGTH,str);
+#endif
+
+			//自動インデント
+			if(pobj_nv->bAutoIndent) SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_SETCHECK,BST_CHECKED,0);
+
+			//貼り付け時のインデント調整
+			if(pobj_nv->bPasteIndent) SendDlgItemMessage(hwnd,IDC_PASTEINDENT,BM_SETCHECK,BST_CHECKED,0);
+
+			//コード補完
+			if(pobj_nv->bShowComplementWnd)
+				SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_SETCHECK,BST_CHECKED,0);
+
+			//ペアステートメント補完
+			SendDlgItemMessage(hwnd,IDC_BACKNUM,EM_SETLIMITTEXT,4,0);
+			if(pobj_nv->BackNum_PairStatementComplement){
+				SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_SETCHECK,BST_CHECKED,0);
+				sprintf(str,"%d",pobj_nv->BackNum_PairStatementComplement);
+				SetDlgItemText(hwnd,IDC_BACKNUM,str);
+			}
+
+			SendMessage(hwnd,WM_COMMAND,IDC_COMPLEMENT,0);
+
+			//パラメータ ヒント
+			if(pobj_nv->dwParameterHint){
+				SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_SETCHECK,BST_CHECKED,0);
+				if(pobj_nv->dwParameterHint==1)
+					SendDlgItemMessage(hwnd,IDC_POPUP,BM_SETCHECK,BST_CHECKED,0);
+				else
+					SendDlgItemMessage(hwnd,IDC_STATUSBAR,BM_SETCHECK,BST_CHECKED,0);
+				SendMessage(hwnd,WM_COMMAND,IDC_PARAMHINT,0);
+			}
+			else SendDlgItemMessage(hwnd,IDC_POPUP,BM_SETCHECK,BST_CHECKED,0);
+
+			//パラメータ ヒント フォント
+			sprintf(str,"%s",MethodCheckInfo.LogFont.lfFaceName);
+			SetDlgItemText(hwnd,IDC_HINTFONT,str);
+			temp_HintFont=MethodCheckInfo.LogFont;
+
+			//検索・置換文字列を保存するかどうか
+			if(pobj_nv->bSaveFindStr) SendDlgItemMessage(hwnd,IDC_SAVE_FINDSTR,BM_SETCHECK,BST_CHECKED,0);
+
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_SETFONT:
+					if(!SetFontDialog(hwnd,&temp_lf,1)) return 1;
+					sprintf(str,"%s",temp_lf.lfFaceName);
+					SetDlgItemText(hwnd,IDC_SETFONT,str);
+					return 1;
+				case IDC_HINTFONT:
+					if(!SetFontDialog(hwnd,&temp_HintFont,0)) return 1;
+					sprintf(str,"%s",temp_HintFont.lfFaceName);
+					SetDlgItemText(hwnd,IDC_HINTFONT,str);
+					return 1;
+
+				case IDC_ISAUTOINDENT:
+				case IDC_COMPLEMENT:
+					if(SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_GETCHECK,0,0)&&
+						SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_PAIRSTATEMENT),1);
+						SendMessage(hwnd,WM_COMMAND,IDC_PAIRSTATEMENT,0);
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_PAIRSTATEMENT),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),0);
+					}
+					return 1;
+
+				case IDC_PAIRSTATEMENT:
+					if(SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),1);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),1);
+
+						if(GetWindowTextLength(GetDlgItem(hwnd,IDC_BACKNUM))==0)
+							SetDlgItemText(hwnd,IDC_BACKNUM,"100");
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_BACKNUM),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_PAIRSTATEMENT),0);
+					}
+					return 1;
+
+				case IDC_PARAMHINT:
+					if(SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_POPUP),1);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATUSBAR),1);
+						if(SendDlgItemMessage(hwnd,IDC_POPUP,BM_GETCHECK,0,0)){
+							EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),1);
+							EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),1);
+						}
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_POPUP),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATUSBAR),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),0);
+						EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),0);
+					}
+					return 1;
+				case IDC_POPUP:
+					EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),1);
+					EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),1);
+					return 1;
+				case IDC_STATUSBAR:
+					EnableWindow(GetDlgItem(hwnd,IDC_STATIC_HINTFONT),0);
+					EnableWindow(GetDlgItem(hwnd,IDC_HINTFONT),0);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				GetDlgItemText(hwnd,IDC_TABSIZE,str,255);
+				sscanf(str,"%d",&temp_TabSize);
+
+				//エディタの行番号を表示するかどうか
+				if(SendDlgItemMessage(hwnd,IDC_LINENUMBER,BM_GETCHECK,0,0)) temp_bEditor_LineNumber=1;
+				else temp_bEditor_LineNumber=0;
+
+				//エディタのルーラーを表示するかどうか
+				if(SendDlgItemMessage(hwnd,IDC_RULER,BM_GETCHECK,0,0)) temp_bEditor_Ruler=1;
+				else temp_bEditor_Ruler=0;
+
+				//カーソル行を強調表示するかどうか
+				if(SendDlgItemMessage(hwnd,IDC_CARETLINE_BACKGROUND,BM_GETCHECK,0,0)) temp_bEditor_CaretLine_BackGround=1;
+				else temp_bEditor_CaretLine_BackGround=0;
+
+#ifdef THETEXT
+				//自動折り返し時の一行あたりの文字数
+				GetDlgItemText(hwnd,IDC_MAX_ONELINE_TEXT_LENGTH,str,255);
+				sscanf(str,"%d",&temp_iMaxOneLineTextLength);
+				if(temp_iMaxOneLineTextLength<=0){
+					temp_iMaxOneLineTextLength=75;
+				}
+#endif
+
+				//自動インデント
+				if(SendDlgItemMessage(hwnd,IDC_ISAUTOINDENT,BM_GETCHECK,0,0)) temp_bAutoIndent=1;
+				else temp_bAutoIndent=0;
+
+				//貼り付け時のインデント調整
+				if(SendDlgItemMessage(hwnd,IDC_PASTEINDENT,BM_GETCHECK,0,0)) temp_bPasteIndent=1;
+				else temp_bPasteIndent=0;
+
+				//コード補完機能
+				if(SendDlgItemMessage(hwnd,IDC_COMPLEMENT,BM_GETCHECK,0,0))
+					temp_bShowComplementWnd=1;
+				else temp_bShowComplementWnd=0;
+
+				//ペアステートメント補完
+				if(IsWindowEnabled(GetDlgItem(hwnd,IDC_PAIRSTATEMENT))){
+					if(SendDlgItemMessage(hwnd,IDC_PAIRSTATEMENT,BM_GETCHECK,0,0)){
+						GetDlgItemText(hwnd,IDC_BACKNUM,str,255);
+						sscanf(str,"%d",&temp_BackNum_PairStatementComplement);
+					}
+					else temp_BackNum_PairStatementComplement=0;
+				}
+				else temp_BackNum_PairStatementComplement=0;
+
+				//パラメータヒント
+				if(SendDlgItemMessage(hwnd,IDC_PARAMHINT,BM_GETCHECK,0,0)){
+					if(SendDlgItemMessage(hwnd,IDC_POPUP,BM_GETCHECK,0,0)) temp_dwParameterHint=1;
+					else temp_dwParameterHint=2;
+				}
+				else temp_dwParameterHint=0;
+
+				if(SendDlgItemMessage(hwnd,IDC_SAVE_FINDSTR,BM_GETCHECK,0,0))
+					temp_bSaveFindStr=1;
+				else temp_bSaveFindStr=0;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting();
+			}
+			return 1;
+
+		case WM_HELP:
+			HELPINFO *lpHelpInfo;
+			lpHelpInfo = (HELPINFO *)lParam;
+
+			HH_POPUP hp;
+			memset(&hp, 0, sizeof(HH_POPUP));
+			hp.cbStruct = sizeof(HH_POPUP);
+			hp.pt.x = lpHelpInfo->MousePos.x;
+			hp.pt.y = lpHelpInfo->MousePos.y+10;
+			hp.clrForeground = RGB(0, 0, 0);
+			hp.clrBackground = -1;
+			hp.rcMargins.left = -1;
+			hp.rcMargins.right = -1;
+			hp.rcMargins.top = -1;
+			hp.rcMargins.bottom = -1;
+			hp.idString = 0;
+			hp.pszFont="MS Sans Serif,10";
+
+			switch(lpHelpInfo->iCtrlId){
+				case IDC_STATIC_SETFONT:
+				case IDC_SETFONT:
+#if defined(JPN)
+					//日本語
+					hp.pszText="エディタで使用するフォントを選択することができます。";
+#else
+					//英語
+					hp.pszText="Choose the font displayed on the editor";
+#endif
+					break;
+				case IDC_STATIC_TABSIZE:
+				case IDC_TABSIZE:
+#if defined(JPN)
+					//日本語
+					hp.pszText="タブサイズを指定します。デフォルト値は4です。";
+#else
+					//英語
+					hp.pszText="Set the tab size. Value of default is 4.";
+#endif
+					break;
+				case IDC_ISAUTOINDENT:
+#if defined(JPN)
+					//日本語
+					hp.pszText="このチェックをオンにすると、必要に応じて、自動的にインデント用のタブ文字が挿入されます。";
+#else
+					//英語
+					hp.pszText="If this check is on, the indent tabs will be inserted automatically.";
+#endif
+					break;
+				case IDC_COMPLEMENT:
+#if defined(JPN)
+					//日本語
+					hp.pszText="このチェックをオンにすると、クラスまたは構造体のメンバを入力するときに、予想されるキーワードがリスト表示されます。";
+#else
+					//英語
+					hp.pszText="If this check is on, the member expected is displayed in a list when inputting the member of the class object.";
+#endif
+					break;
+				case IDC_PARAMHINT:
+#if defined(JPN)
+					//日本語
+					hp.pszText="このチェックをオンにすると、関数またはステートメントを入力するときに、該当するパラメータのヒント文字列が表示されます。文字列の表示方法はポップアップまたはステータスバーのいずれかを選択することができます。";
+#else
+					//英語
+					hp.pszText="If this check is on, parameter hint is displayed when inputting a function or a statement.";
+#endif
+					break;
+				case IDC_POPUP:
+#if defined(JPN)
+					//日本語
+					hp.pszText="パラメータヒントをポップアップ表示するときは、ここをチェックします。";
+#else
+					//英語
+					hp.pszText="If this check is on, parameter hint is displayed on a popup window.";
+#endif
+					break;
+				case IDC_STATUSBAR:
+#if defined(JPN)
+					//日本語
+					hp.pszText="パラメータヒントをステータスバーに表示するときは、ここをチェックします。";
+#else
+					//英語
+					hp.pszText="If this check is on, parameter hint is displayed in a status bar.";
+#endif
+					break;
+				case IDC_STATIC_HINTFONT:
+				case IDC_HINTFONT:
+#if defined(JPN)
+					//日本語
+					hp.pszText="ポップアップ表示されるパラメータヒントのフォントを指定します。";
+#else
+					//英語
+					hp.pszText="Choose the font displayed on the popup hint.";
+#endif
+					break;
+				default:
+					hp.pszText="";
+					break;
+			}
+			HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+			return 1;
+	}
+	return 0;
+}
+COLORREF GetColorFromSelection(int iPos,TEXTEDIT_COLOR_INFO *ptci){
+	if(iPos==0) return ptci->rgbComment;
+	else if(iPos==1) return ptci->rgbString;
+	else if(iPos==2) return ptci->rgbDefault;
+	else if(iPos==3) return ptci->rgbStatement;
+	else if(iPos==4) return ptci->rgbCursorBack;
+	else if(iPos==5) return ptci->rgbBackground;
+	return 0;
+}
+void SetColorFromSelection(int iPos,COLORREF rgb,TEXTEDIT_COLOR_INFO *ptci){
+	if(iPos==0) ptci->rgbComment=rgb;
+	else if(iPos==1) ptci->rgbString=rgb;
+	else if(iPos==2) ptci->rgbDefault=rgb;
+	else if(iPos==3) ptci->rgbStatement=rgb;
+	else if(iPos==4) ptci->rgbCursorBack=rgb;
+	else if(iPos==5) ptci->rgbBackground=rgb;
+}
+#ifdef THETEXT
+char szNewThemeName[MAX_PATH];
+BOOL bThemeOverwirte;
+BOOL CALLBACK DlgOptionThemeSave(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			SendMessage(hwnd,WM_COMMAND,IDC_NAME,0);
+			SetFocus(GetDlgItem(hwnd,IDC_NAME));
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDC_NAME,szNewThemeName,MAX_PATH);
+
+					if(SendDlgItemMessage(hwnd,IDC_OVERWRITE,BM_GETCHECK,0,0))
+						bThemeOverwirte=1;
+					else bThemeOverwirte=0;
+
+					if(pobj_DBTheme->dupli_check(szNewThemeName)){
+						if(!bThemeOverwirte){
+							char temporary[MAX_PATH];
+							sprintf(temporary,"テーマ \"%s\" は既に存在します。「上書きを許可する」をチェックした後、保存してください。",szNewThemeName);
+							MessageBox(hwnd,temporary,APPLICATION_NAME,MB_OK);
+							return 1;
+						}
+					}
+
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+				case IDC_NAME:
+					if(GetWindowTextLength(GetDlgItem(hwnd,IDC_NAME)))
+						EnableWindow(GetDlgItem(hwnd,IDOK),1);
+					else EnableWindow(GetDlgItem(hwnd,IDOK),0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+#endif
+INT_PTR CALLBACK Dlg_Option_Color(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int iPos;
+	CTheme *pobj_Theme;
+	char temporary[MAX_PATH];
+	switch(message){
+		case WM_INITDIALOG:
+			bOptionColor=1;
+
+			//一時保存値を初期化
+			pobj_Theme=pobj_DBTheme->GetActiveTheme();
+			obj_temp_Theme=*pobj_Theme;
+
+			//指定する部分
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"コメント");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"ダブルクォート内の文字列");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"通常の文字");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"特殊ステートメント");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"背景色（カーソル行）");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_ADDSTRING,0,(LPARAM)"背景色（一般）");
+			SendDlgItemMessage(hwnd,IDC_TARGET,CB_SETCURSEL,0,0);
+
+
+			//テーマ名をコンボボックスにセット
+			pobj_DBTheme->ResetTheme_ToComboBox(GetDlgItem(hwnd,IDC_THEME));
+
+
+			SendMessage(hwnd,WM_COMMAND,MAKELONG(IDC_THEME,CBN_SELCHANGE),0);
+			break;
+
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+#ifdef THETEXT
+				case IDC_SAVE:
+					if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_OPTION_THEME_SAVE),hwnd,(DLGPROC)DlgOptionThemeSave)) return 1;
+
+					pobj_Theme=pobj_DBTheme->dupli_check(szNewThemeName);
+					if(pobj_Theme){
+					}
+					else{
+						//新規に追加
+						pobj_Theme=pobj_DBTheme->add(0,szNewThemeName);
+					}
+					*pobj_Theme=obj_temp_Theme;
+					lstrcpy(pobj_Theme->m_name,szNewThemeName);
+
+					//ファイルに保存
+					pobj_Theme->save();
+
+					//テーマ コンボボックスのカーソル位置をセット
+					ComboBox_SetSelText(GetDlgItem(hwnd,IDC_THEME),szNewThemeName);
+
+					return 1;
+#endif //THETEXT
+				case IDC_THEME:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						if(!SendDlgItemMessage(hwnd,IDC_THEME,CB_GETLBTEXT,
+							SendDlgItemMessage(hwnd,IDC_THEME,CB_GETCURSEL,0,0),
+							(LPARAM)temporary)) return 1;
+
+						pobj_Theme=pobj_DBTheme->dupli_check(temporary);
+						obj_temp_Theme=*pobj_Theme;
+
+						InvalidateRect(GetDlgItem(hwnd,IDC_SAMPLE),NULL,0);
+						InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+					}
+					return 1;
+				case IDC_TARGET:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+					}
+					return 1;
+				case IDC_COLOR_BUTTON:
+					iPos=SendDlgItemMessage(hwnd,IDC_TARGET,CB_GETCURSEL,0,0);
+
+					CHOOSECOLOR cc;
+					static COLORREF CustColors[16];
+					cc.lStructSize=sizeof(CHOOSECOLOR);
+					cc.hwndOwner=hwnd;
+					cc.rgbResult=GetColorFromSelection(iPos,&obj_temp_Theme.TextColorInfo);
+					cc.lpCustColors=CustColors;
+					cc.Flags=CC_FULLOPEN | CC_RGBINIT;
+					if(!ChooseColor(&cc)) return 1;
+
+					SetColorFromSelection(iPos,cc.rgbResult,&obj_temp_Theme.TextColorInfo);
+
+					InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+					InvalidateRect(GetDlgItem(hwnd,IDC_SAMPLE),NULL,0);
+
+					lstrcpy(obj_temp_Theme.m_name,THEMENAME_USER);
+
+					//ユーザー設定を選択
+					ComboBox_SetSelText(GetDlgItem(hwnd,IDC_THEME),THEMENAME_USER);
+					return 1;
+			}
+			break;
+
+		case WM_NOTIFY:
+			NMHDR *nmhdr;
+			nmhdr=(NMHDR *)lParam;
+
+			if(nmhdr->code==PSN_APPLY) SaveSetting();
+			return 1;
+
+		case WM_DRAWITEM:
+			LPDRAWITEMSTRUCT pds;
+			pds=(LPDRAWITEMSTRUCT)lParam;
+
+			HBRUSH hBrush,hOldBrush;
+
+			if(wParam==IDC_COLOR_BUTTON){
+				iPos=SendDlgItemMessage(hwnd,IDC_TARGET,CB_GETCURSEL,0,0);
+
+				//////////////
+				// 色を描画
+				//////////////
+
+				//ペンとブラシを生成
+				HPEN hPen,hOldPen;
+				hPen=(HPEN)GetStockObject(WHITE_PEN);
+				if(IsWindowEnabled(GetDlgItem(hwnd,IDC_COLOR_BUTTON)))
+					hBrush=CreateSolidBrush(GetColorFromSelection(iPos,&obj_temp_Theme.TextColorInfo));
+				else
+					hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+
+				//塗りつぶす
+				hOldPen=(HPEN)SelectObject(pds->hDC,hPen);
+				hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+				Rectangle(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom);
+				SelectObject(pds->hDC,hOldPen);
+				SelectObject(pds->hDC,hOldBrush);
+
+				//ブラシを破棄
+				DeleteObject(hBrush);
+			}
+			else if(wParam==IDC_SAMPLE){
+				TEXTEDIT_COLOR_INFO ColorInfo;
+				ColorInfo=obj_temp_Theme.TextColorInfo;
+
+				//背景色で塗りつぶす
+				hBrush=CreateSolidBrush(ColorInfo.rgbBackground);
+				hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+				PatBlt(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom,PATCOPY);
+				SelectObject(pds->hDC,hOldBrush);
+				DeleteObject(hBrush);
+
+				//フォントを選択
+				extern HFONT hFont_TextEdit;
+				HFONT hOldFont;
+				hOldFont=(HFONT)SelectObject(pds->hDC,hFont_TextEdit);
+
+				///////////////////
+				// サンプルを描画
+				///////////////////
+
+				extern int font_width,font_height;
+				int x=0,y=0;
+
+#ifdef THETEXT
+#define SAMPLESTR_STATEMENT "div"
+#define SAMPLESTR_COMMENT "<!-- この行にカーソルがあります -->"
+#define SAMPLESTR_DEFAULT "<    style=               >Hello World!</   >"
+#define SAMPLESTR_STRING "\"color:#123456\""
+
+				y+=font_height;
+
+				//"<    style=               >Hello World!</   >"
+				SetTextColor(pds->hDC,ColorInfo.rgbDefault);
+				SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+				TextOut(pds->hDC,x,y,SAMPLESTR_DEFAULT,lstrlen(SAMPLESTR_DEFAULT));
+
+				//div
+				x=font_width*1;
+				SetTextColor(pds->hDC,ColorInfo.rgbStatement);
+				TextOut(pds->hDC,x,y,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+				x=font_width*41;
+				TextOut(pds->hDC,x,y,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+
+				//"color:#123456"
+				x=font_width*11;
+				SetTextColor(pds->hDC,ColorInfo.rgbString);
+				TextOut(pds->hDC,x,y,SAMPLESTR_STRING,lstrlen(SAMPLESTR_STRING));
+
+				x=0;
+				y+=font_height*2;
+
+				//"'この行にカーソルがあります
+				hBrush=CreateSolidBrush(ColorInfo.rgbCursorBack);
+				hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+				PatBlt(pds->hDC,x,y,pds->rcItem.right,font_height,PATCOPY);
+				SelectObject(pds->hDC,hOldBrush);
+				DeleteObject(hBrush);
+
+				SetTextColor(pds->hDC,ColorInfo.rgbComment);
+				SetBkColor(pds->hDC,ColorInfo.rgbCursorBack);
+				TextOut(pds->hDC,x,y,SAMPLESTR_COMMENT,lstrlen(SAMPLESTR_COMMENT));
+#else
+#define SAMPLESTR_STATEMENT "#console"
+#define SAMPLESTR_COMMENT "'この行にカーソルがあります"
+#define SAMPLESTR_DEFAULT "Print "
+#define SAMPLESTR_STRING "\"Hello World!\""
+
+				//"#console"
+				SetTextColor(pds->hDC,ColorInfo.rgbStatement);
+				SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+				TextOut(pds->hDC,0,0,SAMPLESTR_STATEMENT,lstrlen(SAMPLESTR_STATEMENT));
+				y+=font_height*2;
+
+				//"'この行にカーソルがあります
+				hBrush=CreateSolidBrush(ColorInfo.rgbCursorBack);
+				hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+				PatBlt(pds->hDC,x,y,pds->rcItem.right,font_height,PATCOPY);
+				SelectObject(pds->hDC,hOldBrush);
+				DeleteObject(hBrush);
+
+				SetTextColor(pds->hDC,ColorInfo.rgbComment);
+				SetBkColor(pds->hDC,ColorInfo.rgbCursorBack);
+				TextOut(pds->hDC,x,y,SAMPLESTR_COMMENT,lstrlen(SAMPLESTR_COMMENT));
+				y+=font_height*2;
+
+				//Print
+				SetTextColor(pds->hDC,ColorInfo.rgbDefault);
+				SetBkColor(pds->hDC,ColorInfo.rgbBackground);
+				TextOut(pds->hDC,x,y,SAMPLESTR_DEFAULT,lstrlen(SAMPLESTR_DEFAULT));
+				x+=lstrlen(SAMPLESTR_DEFAULT)*font_width;
+
+				//"Hello World!"
+				SetTextColor(pds->hDC,ColorInfo.rgbString);
+				TextOut(pds->hDC,x,y,SAMPLESTR_STRING,lstrlen(SAMPLESTR_STRING));
+#endif
+
+				SelectObject(pds->hDC,hOldFont);
+			}
+			return 0;
+
+		case WM_HELP:
+			HELPINFO *lpHelpInfo;
+			lpHelpInfo = (HELPINFO *)lParam;
+
+			HH_POPUP hp;
+			memset(&hp, 0, sizeof(HH_POPUP));
+			hp.cbStruct = sizeof(HH_POPUP);
+			hp.pt.x = lpHelpInfo->MousePos.x;
+			hp.pt.y = lpHelpInfo->MousePos.y+10;
+			hp.clrForeground = RGB(0, 0, 0);
+			hp.clrBackground = -1;
+			hp.rcMargins.left = -1;
+			hp.rcMargins.right = -1;
+			hp.rcMargins.top = -1;
+			hp.rcMargins.bottom = -1;
+			hp.idString = 0;
+			hp.pszFont="MS Sans Serif,10";
+
+			switch(lpHelpInfo->iCtrlId){
+				case IDC_TARGET:
+					hp.pszText="どの部分の色を設定するかを選択します。";
+					break;
+				default:
+					hp.pszText="";
+					break;
+			}
+			HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK Dlg_Option_Toolbar(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_INITDIALOG:
+			bOptionToolbar=1;
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_RESETTOOLBAR:
+					//"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか？"
+					if(IDCANCEL==MessageBox(hwnd,STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+					//レバーコントロールを再生成
+					pobj_Rebar->ResetInitRebar();
+
+					//メニュー状態を設定
+					ResetState_DocMenu();
+					return 1;
+			}
+			break;
+
+		case WM_HELP:
+			HELPINFO *lpHelpInfo;
+			lpHelpInfo = (HELPINFO *)lParam;
+
+			HH_POPUP hp;
+			memset(&hp, 0, sizeof(HH_POPUP));
+			hp.cbStruct = sizeof(HH_POPUP);
+			hp.pt.x = lpHelpInfo->MousePos.x;
+			hp.pt.y = lpHelpInfo->MousePos.y+10;
+			hp.clrForeground = RGB(0, 0, 0);
+			hp.clrBackground = -1;
+			hp.rcMargins.left = -1;
+			hp.rcMargins.right = -1;
+			hp.rcMargins.top = -1;
+			hp.rcMargins.bottom = -1;
+			hp.idString = 0;
+			hp.pszFont="MS Sans Serif,10";
+
+			switch(lpHelpInfo->iCtrlId){
+				case IDC_RESETTOOLBAR:
+#if defined(JPN)
+					//日本語
+					hp.pszText="ツールバーの配置を初期状態に戻します。";
+#else
+					//英語
+					hp.pszText="Reset the state of the toolbar.";
+#endif
+					break;
+				default:
+					hp.pszText="";
+					break;
+			}
+			HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+			return 1;
+	}
+	return 0;
+}
+INT_PTR CALLBACK Dlg_Option_Rad(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	NMHDR *nmhdr;
+	switch(message){
+		case WM_INITDIALOG:
+
+			bOptionRad=1;
+
+			//ライン アジャスタ
+			if(pobj_nv->bLineAdjust) SendDlgItemMessage(hwnd,IDC_LINEADJUST,BM_SETCHECK,BST_CHECKED,0);
+
+			break;
+		case WM_NOTIFY:
+			nmhdr=(NMHDR *)lParam;
+			if(nmhdr->code==PSN_APPLY||nmhdr->code==PSN_KILLACTIVE){
+				if(SendDlgItemMessage(hwnd,IDC_LINEADJUST,BM_GETCHECK,0,0)) temp_bLineAdjust=1;
+				else temp_bLineAdjust=0;
+
+				if(nmhdr->code==PSN_APPLY) SaveSetting();
+			}
+			return 1;
+
+		case WM_HELP:
+			HELPINFO *lpHelpInfo;
+			lpHelpInfo = (HELPINFO *)lParam;
+
+			HH_POPUP hp;
+			memset(&hp, 0, sizeof(HH_POPUP));
+			hp.cbStruct = sizeof(HH_POPUP);
+			hp.pt.x = lpHelpInfo->MousePos.x;
+			hp.pt.y = lpHelpInfo->MousePos.y+10;
+			hp.clrForeground = RGB(0, 0, 0);
+			hp.clrBackground = -1;
+			hp.rcMargins.left = -1;
+			hp.rcMargins.right = -1;
+			hp.rcMargins.top = -1;
+			hp.rcMargins.bottom = -1;
+			hp.idString = 0;
+			hp.pszFont="MS Sans Serif,10";
+
+			switch(lpHelpInfo->iCtrlId){
+				case IDC_LINEADJUST:
+#if defined(JPN)
+					//日本語
+					hp.pszText="このチェックボックスをオンにすると、ラインアジャスタ機能が有効になります。ラインアジャスタ機能をオンにすると、マウスを使ってコントロールの移動を行う際に他のコントロール同士との位置合わせが容易に行えるようになります。";
+#else
+					//英語
+					hp.pszText="If this check is on, line adjuster becomes effective.";
+#endif
+					break;
+				default:
+					hp.pszText="";
+					break;
+			}
+			HtmlHelp(hwnd, 0, HH_DISPLAY_TEXT_POPUP, (DWORD)&hp);
+			return 1;
+	}
+	return 0;
+}
+void DlgOptionSetting(HWND hwnd){
+	PROPSHEETHEADER psh;
+#define MAX_SETDLG 32
+	PROPSHEETPAGE psp[MAX_SETDLG];
+	HPROPSHEETPAGE hpsp[MAX_SETDLG];
+	int i;
+
+	bOptionWhole=0;
+	bOptionEditor=0;
+	bOptionColor=0;
+	bOptionToolbar=0;
+	bOptionRad=0;
+
+	i=0;
+
+	//各ページのセッティング
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_WHOLE);
+	psp[i].pfnDlgProc=(DLGPROC)Dlg_Option_Whole;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_EDITOR);
+	psp[i].pfnDlgProc=(DLGPROC)Dlg_Option_Editor;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_COLOR);
+	psp[i].pfnDlgProc=(DLGPROC)Dlg_Option_Color;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_TOOLBAR);
+	psp[i].pfnDlgProc=(DLGPROC)Dlg_Option_Toolbar;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+
+#ifndef THETEXT
+	//RADツールに関するオプションはProjectEditorのみ表示
+	i++;
+	psp[i].dwSize=sizeof(PROPSHEETPAGE);
+	psp[i].dwFlags=PSP_DEFAULT;
+	psp[i].hInstance=hResInst;
+	psp[i].pszTemplate=MAKEINTRESOURCE(IDD_OPTION_RAD);
+	psp[i].pfnDlgProc=(DLGPROC)Dlg_Option_Rad;
+	hpsp[i]=CreatePropertySheetPage(&psp[i]);
+#endif
+
+
+	i++;
+
+
+
+	memset(&psh,0,sizeof(PROPSHEETHEADER));
+	psh.dwSize=sizeof(PROPSHEETHEADER);
+	psh.dwFlags=PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW;
+	psh.phpage=hpsp;
+	psh.hwndParent=hwnd;
+	psh.pszCaption=STRING_OPTION;	//"オプション"
+	psh.nPages=i;
+	psh.nStartPage=0;
+	psh.ppsp=psp;
+	PropertySheet(&psh);
+}
+INT_PTR CALLBACK DialogAbout(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	if(message==WM_INITDIALOG){
+		SetPosCenter(hwnd);
+
+		SetDlgItemText(hwnd,IDC_STATIC_NAME,VERSION_APPLI_NAME);
+
+		char temporary[1024];
+		sprintf(temporary,"Version %s",VERSION_STRING);
+		SetDlgItemText(hwnd,IDC_STATIC_VERSION,temporary);
+
+
+#ifndef THETEXT
+		//ライブラリ開発チーム
+		LoadString(hResInst,IDS_DEV_GROUP,temporary,1024);
+		SetDlgItemText(hwnd,IDC_DEV_GROUP,temporary);
+#endif
+		ApplyDialogTexture(hwnd);
+	}
+	if(message==WM_COMMAND){
+		switch(LOWORD(wParam)){
+			case IDCANCEL:
+				EndDialog(hwnd,NULL);
+				return 1;
+		}
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/DocumentAdvice.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DocumentAdvice.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DocumentAdvice.cpp	(revision 774)
@@ -0,0 +1,273 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+void MenuAdvice(WPARAM msg){
+	/////////////////////////////////////////////////////
+	// コマンド解説（ステータスバーに表示されるテキスト）
+	/////////////////////////////////////////////////////
+	extern char CmdMsg[255];
+
+#if defined(JPN)
+	//日本語
+	if(LOWORD(msg)==IDM_NEW) SetStatusText("新規にプロジェクトまたはドキュメントを作成します");
+	else if(LOWORD(msg)==IDM_OPEN) SetStatusText("既存のドキュメントを開きます");
+	else if(LOWORD(msg)==IDM_CLOSE) SetStatusText("作業中のファイルを閉じます");
+	else if(LOWORD(msg)==IDM_SAVE) SetStatusText("作業中のファイルを保存します");
+	else if(LOWORD(msg)==IDM_NEWSAVE) SetStatusText("作業中のファイルを新しい名前を付けて保存します");
+	else if(LOWORD(msg)==IDM_ALLSAVE) SetStatusText("開いているファイルをすべて保存します");
+	else if(LOWORD(msg)==IDM_PROJECT_OPEN) SetStatusText("既存のプロジェクトを開きます");
+	else if(LOWORD(msg)==IDM_PROJECT_SAVE) SetStatusText("作業中のプロジェクトを保存します");
+	else if(LOWORD(msg)==IDM_PROJECT_CLOSE) SetStatusText("作業中のプロジェクトを閉じます");
+	else if(LOWORD(msg)==IDM_EXIT) SetStatusText("アプリケーションの終了と内容の保存確認をします");
+	else if(LOWORD(msg)==IDM_UNDO) SetStatusText("直前の操作を元にもどします");
+	else if(LOWORD(msg)==IDM_REDO) SetStatusText("前の未完了操作を繰り返します");
+	else if(LOWORD(msg)==IDM_CUT) SetStatusText("選択範囲を切り取り、クリップボードへコピーします");
+	else if(LOWORD(msg)==IDM_COPY) SetStatusText("選択範囲をクリップボードへコピーします");
+	else if(LOWORD(msg)==IDM_PASTE) SetStatusText("挿入位置にクリップボードの内容を挿入します");
+	else if(LOWORD(msg)==IDM_DELETE) SetStatusText("選択範囲を削除します");
+	else if(LOWORD(msg)==IDM_ALLSELECT) SetStatusText("ファイル全体を選択します");
+	else if(LOWORD(msg)==IDM_FIND) SetStatusText("作業中のドキュメント内を検索します");
+	else if(LOWORD(msg)==IDM_PERMUTATION) SetStatusText("指定した文字列を他の文字列で置換します");
+
+#ifdef THETEXT
+	else if(LOWORD(msg)==IDM_STRING_COUNT) SetStatusText("作業中ドキュメントの文字数をカウントします");
+#endif
+
+	else if(LOWORD(msg)==IDM_PROJECTVIEW) SetStatusText("プロジェクトビューの表示/非表示を切り替えます");
+	else if(LOWORD(msg)==IDM_PROJECT_OPTION) SetStatusText("プロジェクトオプションの設定を行います");
+	else if(LOWORD(msg)==IDM_TOPMOST) SetStatusText("エディタの最前面表示ON/OFFを切り替えます");
+	else if(LOWORD(msg)==IDM_SET) SetStatusText("エディタオプションの設定を行います");
+	else if(LOWORD(msg)==IDM_DEBUG) SetStatusText("プログラムをデバッグ用にコンパイルし、デバッグ実行します");
+	else if(LOWORD(msg)==IDM_DEBUGCOMPILE) SetStatusText("プログラムをデバッグ用にコンパイルします");
+	else if(LOWORD(msg)==IDM_RELEASECOMPILE) SetStatusText("プログラムをリリース用にコンパイルします");
+	else if(LOWORD(msg)==IDM_TOPIC) SetStatusText("ヘルプファイルを開きます");
+	else if(LOWORD(msg)==IDM_ABOUT) SetStatusText("ActiveBasicのバージョン情報を表示します");
+	else SetStatusText(CmdMsg);
+#else
+	//英語
+	if(LOWORD(msg)==IDM_NEW) SetStatusText("Create a new document");
+	else if(LOWORD(msg)==IDM_OPEN) SetStatusText("Open an existing document");
+	else if(LOWORD(msg)==IDM_CLOSE) SetStatusText("Close the active document");
+	else if(LOWORD(msg)==IDM_SAVE) SetStatusText("Save the active document");
+	else if(LOWORD(msg)==IDM_NEWSAVE) SetStatusText("Save the active document with a new name");
+	else if(LOWORD(msg)==IDM_ALLSAVE) SetStatusText("Save all the modified documents");
+	else if(LOWORD(msg)==IDM_PROJECT_OPEN) SetStatusText("Open an existing project");
+	else if(LOWORD(msg)==IDM_PROJECT_SAVE) SetStatusText("Save the active project");
+	else if(LOWORD(msg)==IDM_PROJECT_CLOSE) SetStatusText("Close the active project");
+	else if(LOWORD(msg)==IDM_EXIT) SetStatusText("Quit the application, prompts you to save modified documents");
+	else if(LOWORD(msg)==IDM_UNDO) SetStatusText("Undo the last action");
+	else if(LOWORD(msg)==IDM_REDO) SetStatusText("Redo the previously undone action");
+	else if(LOWORD(msg)==IDM_CUT) SetStatusText("Cut the selection and puts it on the Clipboard");
+	else if(LOWORD(msg)==IDM_COPY) SetStatusText("Copy the selection and puts it on the Clipboard");
+	else if(LOWORD(msg)==IDM_PASTE) SetStatusText("Insert Clipboard contents");
+	else if(LOWORD(msg)==IDM_DELETE) SetStatusText("Erase the selection");
+	else if(LOWORD(msg)==IDM_ALLSELECT) SetStatusText("Select the entire document");
+	else if(LOWORD(msg)==IDM_FIND) SetStatusText("Search for text in the active document");
+	else if(LOWORD(msg)==IDM_PERMUTATION) SetStatusText("Replace occurrences of search std::string");
+	else if(LOWORD(msg)==IDM_PROJECTVIEW) SetStatusText("Show or hide ProjectView");
+	else if(LOWORD(msg)==IDM_PROJECT_OPTION) SetStatusText("Set project options");
+	else if(LOWORD(msg)==IDM_TOPMOST) SetStatusText("Mark ProjectEditor stay on top of the other applications");
+	else if(LOWORD(msg)==IDM_SET) SetStatusText("Set editor options");
+	else if(LOWORD(msg)==IDM_DEBUG) SetStatusText("Debug the program");
+	else if(LOWORD(msg)==IDM_DEBUGCOMPILE) SetStatusText("Compile the program for debugging");
+	else if(LOWORD(msg)==IDM_RELEASECOMPILE) SetStatusText("Compile the program for release");
+	else if(LOWORD(msg)==IDM_TOPIC) SetStatusText("Open the Help topics");
+	else if(LOWORD(msg)==IDM_ABOUT) SetStatusText("Display information about ActiveBasic");
+	else SetStatusText(CmdMsg);
+#endif
+}
+
+void ShowToolTipText(LPTOOLTIPTEXT TipText){
+	////////////////////////////////////////////////////////////////////////////
+	// ツールチップ（ツールバーにポイントしたときにポップアップされるテキスト）
+	////////////////////////////////////////////////////////////////////////////
+
+#if defined(JPN)
+	//日本語
+	if(TipText->hdr.idFrom==IDM_NEW) TipText->lpszText="新規作成 (Ctrl+N)";
+	else if(TipText->hdr.idFrom==IDM_OPEN) TipText->lpszText="開く (Ctrl+O)";
+	else if(TipText->hdr.idFrom==IDM_SAVE) TipText->lpszText="保存 (Ctrl+S)";
+	else if(TipText->hdr.idFrom==IDM_ALLSAVE) TipText->lpszText="すべて保存";
+	else if(TipText->hdr.idFrom==IDM_CUT) TipText->lpszText="切り取り (Ctrl+X)";
+	else if(TipText->hdr.idFrom==IDM_COPY) TipText->lpszText="コピー (Ctrl+C)";
+	else if(TipText->hdr.idFrom==IDM_PASTE) TipText->lpszText="貼り付け (Ctrl+V)";
+	else if(TipText->hdr.idFrom==IDM_UNDO) TipText->lpszText="元に戻す (Ctrl+Z)";
+	else if(TipText->hdr.idFrom==IDM_REDO) TipText->lpszText="やり直し (Ctrl+Y)";
+	else if(TipText->hdr.idFrom==IDM_FIND) TipText->lpszText="検索 (Ctrl+F)";
+	else if(TipText->hdr.idFrom==IDM_DEBUG) TipText->lpszText="デバッグ実行 (F5)";
+	else if(TipText->hdr.idFrom==IDM_DEBUGCOMPILE) TipText->lpszText="デバッグ ビルド (F7)";
+	else if(TipText->hdr.idFrom==IDM_RELEASECOMPILE) TipText->lpszText="リリース ビルド (F6)";
+#else
+	//英語
+	if(TipText->hdr.idFrom==IDM_NEW) TipText->lpszText="New Document (Ctrl+N)";
+	else if(TipText->hdr.idFrom==IDM_OPEN) TipText->lpszText="Open Document (Ctrl+O)";
+	else if(TipText->hdr.idFrom==IDM_SAVE) TipText->lpszText="Save Document (Ctrl+S)";
+	else if(TipText->hdr.idFrom==IDM_ALLSAVE) TipText->lpszText="Save All Document";
+	else if(TipText->hdr.idFrom==IDM_CUT) TipText->lpszText="Cut (Ctrl+X)";
+	else if(TipText->hdr.idFrom==IDM_COPY) TipText->lpszText="Copy (Ctrl+C)";
+	else if(TipText->hdr.idFrom==IDM_PASTE) TipText->lpszText="Paste (Ctrl+V)";
+	else if(TipText->hdr.idFrom==IDM_UNDO) TipText->lpszText="Undo (Ctrl+Z)";
+	else if(TipText->hdr.idFrom==IDM_REDO) TipText->lpszText="Redo (Ctrl+Y)";
+	else if(TipText->hdr.idFrom==IDM_FIND) TipText->lpszText="Find (Ctrl+F)";
+	else if(TipText->hdr.idFrom==IDM_DEBUG) TipText->lpszText="Run for Debugging (F2)";
+	else if(TipText->hdr.idFrom==IDM_DEBUGCOMPILE) TipText->lpszText="Compile for Debugging (F4)";
+	else if(TipText->hdr.idFrom==IDM_RELEASECOMPILE) TipText->lpszText="Compile for Release (F7)";
+#endif
+	MenuAdvice(TipText->hdr.idFrom);
+}
+
+char *reflexive_Include(char *buffer,char ***pppFilePath,int *pFileNum,const char *pDefaultDir){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,sw1,sw2,FileSize;
+	char temporary[MAX_PATH],temp2[MAX_PATH+255],*temp3;
+	DWORD AccBytes;
+
+	//重複チェック用
+	char **ppFilePath;
+	int FileNum;
+	ppFilePath=*pppFilePath;
+	FileNum=*pFileNum;
+
+	for(i=0;;i++){
+		if( ( memcmp(buffer+i,"#include",8)==0 || memcmp(buffer+i,"#require",8)==0 )&&(!IsVariableChar(buffer[i+8]))){
+			i2=i+8;
+			while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+			sw1=0;
+			if(buffer[i2]=='\"') i2++;
+			else if(buffer[i2]=='<'){
+				i2++;
+				sw1=1;
+			}
+			for(i3=0;;i2++,i3++){
+				if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||(buffer[i2]=='\r'&&buffer[i2+1]=='\n')||buffer[i2]=='\0'){
+					temporary[i3]=0;
+					break;
+				}
+				temporary[i3]=buffer[i2];
+			}
+			while((!(buffer[i2]=='\r'&&buffer[i2+1]=='\n'))&&buffer[i2]!='\0') i2++;
+
+			if(sw1){
+				sprintf(temp2,"%sInclude\\%s",pj_editor_Dir,temporary);
+				lstrcpy(temporary,temp2);
+			}
+			else{
+				GetFullPath(temporary,pDefaultDir);
+			}
+
+
+			//////////////////
+			// 重複チェック
+			//////////////////
+			for(i3=0,sw2=0;i3<FileNum;i3++){
+				if(lstrcmpi(ppFilePath[i3],temporary)==0){
+					//重複したとき
+					sw2=1;
+					break;
+				}
+			}
+			if(sw2){
+				//重複したときは無視する
+				i=i2;
+				continue;
+			}
+			ppFilePath=(char **)HeapReAlloc(hHeap,0,ppFilePath,(FileNum+1)*sizeof(char *));
+			ppFilePath[FileNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(ppFilePath[FileNum],temporary);
+			FileNum++;
+
+#define MEM_SPACE 1024 //強制終了を防ぐためのゆとりスペース
+			for(i3=0;i3<MdiInfo.size();i3++){
+				if(MdiInfo[i3]->hwnd){
+					if(lstrcmpi(temporary,MdiInfo[i3]->path.c_str())==0) break;
+				}
+			}
+			if(i3==MdiInfo.size()){
+				//ファイルから開く
+				ATL::CHandle fh(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+				if(fh==INVALID_HANDLE_VALUE){
+					fh.Detach();
+					goto finish;
+				}
+
+				FileSize=GetFileSize(fh,NULL);
+
+				temp3=(char *)HeapAlloc(hHeap,0,FileSize+MEM_SPACE);
+				ReadFile(fh,temp3,FileSize,&AccBytes,NULL);
+				temp3[FileSize]=0;
+
+			}
+			else{
+				//エディタから読み取る
+				FileSize=lstrlen(MdiInfo[i3]->pMdiTextEdit->buffer);
+
+				temp3=(char *)HeapAlloc(hHeap,0,FileSize+MEM_SPACE);
+				memcpy(temp3,MdiInfo[i3]->pMdiTextEdit->buffer,FileSize);
+				temp3[FileSize]=0;
+			}
+
+			//新しい参照ディレクトリを取得
+			char DefaultDir[MAX_PATH+1024];
+			_splitpath(temporary,DefaultDir,temp2,0,0);
+			lstrcat(DefaultDir,temp2);
+
+			//インクルードの再帰呼び出し
+			temp3=reflexive_Include(temp3,&ppFilePath,&FileNum,DefaultDir);
+			FileSize=lstrlen(temp3);
+
+			i4=lstrlen(buffer)+FileSize-(i2-i);
+			if(FileSize>(i2-i)) buffer=(char *)HeapReAlloc(hHeap,0,buffer,i4+1+MEM_SPACE);
+			SlideString(buffer+i2,FileSize-(i2-i));
+
+			memcpy(buffer+i,temp3,FileSize);
+
+			HeapDefaultFree(temp3);
+
+			i--;
+			continue;
+		}
+
+		for(;;i++){
+			if(buffer[i]=='\0') break;
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+				i++;
+				break;
+			}
+		}
+		if(buffer[i]=='\0') break;
+	}
+
+finish:
+
+	//重複チェック用
+	*pppFilePath=ppFilePath;
+	*pFileNum=FileNum;
+
+	return buffer;
+}
+
+char *IncludeFiles(char *buffer){
+	extern HANDLE hHeap;
+	int i;
+
+	//参照ディレクトリ
+	const char *pDefaultDir;
+	if( projectInfo.IsOpened() )
+		pDefaultDir=projectInfo.GetWorkDir().GetPath().c_str();
+	else pDefaultDir=pj_editor_Dir;
+
+	//重複チェック用
+	char **ppFilePath;
+	int FileNum;
+	ppFilePath=(char **)HeapAlloc(hHeap,0,1);
+	FileNum=0;
+
+	buffer=reflexive_Include(buffer,&ppFilePath,&FileNum,pDefaultDir);
+
+	for(i=0;i<FileNum;i++){
+		HeapDefaultFree(ppFilePath[i]);
+	}
+	HeapDefaultFree(ppFilePath);
+	return buffer;
+}
Index: branches/egtra/ab5.0/abdev/abdev/DrawBuffer.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DrawBuffer.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DrawBuffer.cpp	(revision 774)
@@ -0,0 +1,634 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+extern HFONT hFont_TextEdit;
+extern int font_width,font_height;
+
+class CDrawReserve{
+	int x,y;
+	COLORREF NowColor,NowBackColor;
+	int bNowUnder;
+	char *lpszBuffer;
+	int length;
+	int m_WndNum;
+	HDC hdc;
+	HBITMAP hMemBmp,hOldBitmap;
+	HFONT hOldFont;
+	SIZE ClientSize;
+	int iControlTabSpace;
+	int iOnePage_CharHeight;
+	int iLineNumberTextCount;
+	int iMax_OneLine_TextLength;
+public:
+	HDC memdc;
+	CDrawReserve(int WndNum,HDC _hDC,int cx,int cy,int ctrl_tab_space,int nMaxOnePageChar,int linenum_textcount,bool drawDirectly){
+		m_WndNum=WndNum;
+		x=-1;
+		y=-1;
+		bNowUnder=0;
+		ClientSize.cx=cx;
+		ClientSize.cy=cy;
+		iControlTabSpace=ctrl_tab_space;
+		iOnePage_CharHeight=nMaxOnePageChar;
+		iMax_OneLine_TextLength=cx/font_width+1;
+		iLineNumberTextCount=linenum_textcount;
+		if(drawDirectly){
+			hdc=0;
+			memdc=_hDC; // メモリDCを使わず、直接描画する
+		}
+		else{
+			hdc=_hDC;
+			memdc=CreateCompatibleDC(hdc);
+			hMemBmp=CreateCompatibleBitmap(hdc,cx,cy);
+			hOldBitmap=(HBITMAP)SelectObject(memdc,hMemBmp);
+		}
+
+		//背景色でメモリ画面を初期化
+		HBRUSH hBrush,hOldBrush;
+		hBrush=CreateSolidBrush(tci.rgbBackground);
+		hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+		PatBlt(memdc,ctrl_tab_space,0,cx-ctrl_tab_space,cy,PATCOPY);
+		DeleteObject(hBrush);
+
+		//背景ビットマップ
+#ifdef THETEXT
+		if(pobj_DBTheme->hBackBmp){
+			HDC memdc2;
+			memdc2=CreateCompatibleDC(memdc);
+			SelectObject(memdc2,pobj_DBTheme->hBackBmp);
+			BitBlt(memdc,
+				cx-(pobj_DBTheme->sizeBackBmp.cx),
+				cy-(pobj_DBTheme->sizeBackBmp.cy),
+				pobj_DBTheme->sizeBackBmp.cx,pobj_DBTheme->sizeBackBmp.cy,
+				memdc2,0,0,SRCCOPY);
+			DeleteDC(memdc2);
+		}
+#endif
+
+		//フォントを設定
+		extern HFONT hFont_TextEdit;
+		hOldFont=(HFONT)SelectObject(memdc,hFont_TextEdit);
+
+		lpszBuffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+		length=0;
+	}
+	~CDrawReserve(){
+		SelectObject(memdc,hOldFont);
+		if(hdc){
+			SelectObject(memdc,hOldBitmap);
+			DeleteObject(hMemBmp);
+
+			DeleteDC(memdc);
+		}
+		HeapDefaultFree(lpszBuffer);
+	}
+
+	void draw(){
+		if(length==0) return;
+		SetTextColor(memdc,NowColor);
+		if(NowBackColor==tci.rgbBackground){
+			SetBkMode(memdc,TRANSPARENT);
+		}
+		else{
+			SetBkMode(memdc,OPAQUE);
+			SetBkColor(memdc,NowBackColor);
+		}
+
+		HFONT hBeforeFont;
+		if(bNowUnder){
+			//下線付きフォントに設定
+			extern HFONT hFont_HyperLink_TextEdit;
+			hBeforeFont=(HFONT)SelectObject(memdc,hFont_HyperLink_TextEdit);
+		}
+
+		int offset=0;
+		if(x<0){
+			offset=-x;
+
+			//左端の全角文字の文字化けを避けるために10バイトの余裕を作る
+			offset-=10;
+			if(offset<0) offset=0;
+
+			length-=offset;
+			if(length<0) return;
+		}
+
+		if(length>iMax_OneLine_TextLength+10){
+			length=iMax_OneLine_TextLength+10;
+		}
+
+		int i;
+		int *lpDxWidths;
+		lpDxWidths=(int *)malloc((length+1)*sizeof(int));
+		for(i=0;i<length+1;i++){
+			lpDxWidths[i]=font_width;
+		}
+		ExtTextOut(memdc,
+			(x+offset)*(font_width)     +iControlTabSpace,
+			y*font_height,
+			0,NULL,
+			lpszBuffer+offset,length,
+			lpDxWidths);
+
+		if(bNowUnder){
+			SelectObject(memdc,hBeforeFont);
+		}
+
+		free(lpDxWidths);
+	}
+
+	void DrawReserve(int nXStart,int nYStart,COLORREF NextColor,COLORREF NextBackColor,BOOL bUnder,LPSTR lpString,int cbString){
+		if(nYStart!=y || NextColor!=NowColor || NextBackColor!=NowBackColor || bUnder!=bNowUnder){
+			//描画
+			draw();
+
+			x=nXStart;
+			y=nYStart;
+			NowColor=NextColor;
+			NowBackColor=NextBackColor;
+			bNowUnder=bUnder;
+
+			lpszBuffer[0]=0;
+			length=0;
+		}
+
+		//予約
+		lpszBuffer=(char *)HeapReAlloc(hHeap,0,lpszBuffer,length+cbString+1);
+		memcpy(lpszBuffer+length,lpString,cbString);
+		length+=cbString;
+		lpszBuffer[length]=0;
+	}
+
+	void finish(int BaseY){
+		draw();
+
+		HBRUSH hBrush,hOldBrush;
+		if(pobj_nv->bEditor_LineNumber){
+			hBrush=CreateSolidBrush(RGB(220,220,220));
+			hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+
+
+			/////////////////////////////////////////////////////
+			// エディタ画面左端のコントロールタブの行番号を描画
+			/////////////////////////////////////////////////////
+
+			//灰色で塗りつぶす
+			PatBlt(memdc,
+				0,
+				0,
+				iControlTabSpace,
+				ClientSize.cy,
+				PATCOPY);
+
+			extern HFONT hFont_LineNumber;
+			int LineNumberFontHeight;
+
+			HFONT hOldFont;
+			hOldFont=(HFONT)SelectObject(memdc,hFont_LineNumber);
+			SetTextColor(memdc,RGB(60,60,60));
+			SetBkColor(memdc,RGB(220,220,220));
+
+			SIZE size;
+			GetTextExtentPoint32(memdc,"A",1,&size);
+			LineNumberFontHeight=size.cy;
+
+
+			//ブレークポイントの描画を準備
+			BreakPointsPerFile *pobj_FileBreakPoint=0;
+			if( projectInfo.IsOpened() ){
+				pobj_FileBreakPoint=
+					projectInfo.pobj_DBBreakPoint->EnumLines(MdiInfo[m_WndNum]->path.c_str());
+			}
+			else{
+				extern CDBBreakPoint *pobj_DBBreakPoint;
+				pobj_FileBreakPoint=pobj_DBBreakPoint->EnumLines(MdiInfo[m_WndNum]->path.c_str());
+			}
+
+
+			int i,i2;
+			char temporary[255],temp2[255];
+			if(y<iOnePage_CharHeight) i2=y;
+			else i2=iOnePage_CharHeight;
+			for(i=0;i<=i2;i++){
+
+				BOOL bBreakPoint;
+				bBreakPoint=0;
+				if(pobj_FileBreakPoint){
+					if(pobj_FileBreakPoint->check(i-BaseY)){
+						bBreakPoint=1;
+					}
+				}
+
+				if(bBreakPoint){
+					DrawIconEx(memdc,3,i*font_height+(font_height-16)/2,
+						(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(IDI_BREAKPOINT_FLAG),IMAGE_ICON,16,16,LR_SHARED),
+						16,16,0,NULL,DI_NORMAL);
+				}
+				else{
+					sprintf(temp2,"%%%dd:",iLineNumberTextCount);
+					sprintf(temporary,temp2,(i-BaseY)+1);
+
+					TextOut(memdc,
+						3,
+						i*font_height+(font_height-LineNumberFontHeight)/2,
+						temporary,
+						lstrlen(temporary));
+				}
+			}
+
+			SelectObject(memdc,hOldFont);
+
+
+			//ブラシを破棄
+			SelectObject(memdc,hOldBrush);
+			DeleteObject(hBrush);
+		}
+		else{
+			////////////////////////////////////////////
+			// エディタ画面左端のコントロールタブを描画
+			// ※行番号は非表示
+			////////////////////////////////////////////
+
+			hBrush=CreateSolidBrush(RGB(220,220,220));
+			hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+
+			PatBlt(memdc,
+				0,
+				0,
+				iControlTabSpace,
+				ClientSize.cy,
+				PATCOPY);
+
+			SelectObject(memdc,hOldBrush);
+			DeleteObject(hBrush);
+		}
+
+
+		//メモリDCを使用している場合、その内容を画面に描画
+		if (hdc){
+			BitBlt(hdc,0,0,ClientSize.cx,ClientSize.cy,memdc,0,0,SRCCOPY);
+		}
+	}
+};
+
+void TextEdit_DrawBuffer(HDC hdc,int WndNum,bool drawDirectly){
+	int i,i2;
+	int x,y;
+	int BaseX,BaseY,CharX;
+	char *pBuf,temporary[255];
+	HWND hEdit;
+
+
+	//背景モード、カラーの設定
+	COLORREF DefaultBackColor,CaretBackColor;
+	DefaultBackColor=tci.rgbBackground;
+
+	RECT ClientRect;
+	hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
+	GetClientRect(hEdit,&ClientRect);
+
+	//エディタ画面左端のコントロールタブ
+	int iControlTabSpace;
+	int iLineNumberTextCount;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+	iLineNumberTextCount=MdiInfo[WndNum]->pMdiTextEdit->iLineNumberTextCount;
+
+	//一ページ中に表示できる行数を取得
+	int OnePage_CharHeight;
+	OnePage_CharHeight=(ClientRect.bottom/font_height)+1;
+
+	//描画用クラス
+	CDrawReserve obj_dr(
+		WndNum,
+		hdc,
+		ClientRect.right-ClientRect.left,ClientRect.bottom-ClientRect.top,
+		iControlTabSpace,
+		OnePage_CharHeight,
+		iLineNumberTextCount,
+		drawDirectly || GetSystemMetrics(SM_REMOTESESSION));
+
+
+	//テキストバッファをコード内で参照しやすいようにポインタ変数を利用する
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//選択範囲を取得
+	CHARRANGE CharRange;
+	TextEdit_GetSel(WndNum,&CharRange);
+
+	//ベース描画ポジションを取得(文字単位)
+	BaseX=0;
+	BaseY=0;
+	GetScrollBaseCaretPos(MdiInfo[WndNum],&BaseX,&BaseY);
+
+	if(pobj_nv->bEditor_CaretLine_BackGround){
+		//カーソル行の色を変える
+		CaretBackColor=tci.rgbCursorBack;
+	}
+	else{
+		//カーソル行の色を変えない
+		CaretBackColor=tci.rgbBackground;
+	}
+	HBRUSH hCaretBackBrush;
+	hCaretBackBrush=CreateSolidBrush(CaretBackColor);
+
+	BOOL IsStr=0;
+	DWORD dwComment=0;
+	BOOL bMultiLineComment;
+	COLORREF NextColor,NextBackColor;
+	int MaxX=0;
+	x=BaseX;
+	y=BaseY;
+	CharX=0;	//左端から何文字目かを示す
+	int bHyperLinkUnderBar=0;	//ハイパーリンク用下線の表示スイッチ
+	for(i=0;;i++){
+		if(pBuf[i]=='\0'){
+			if(0<=y&&y<=OnePage_CharHeight){
+				if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==y-BaseY){
+					////////////////////////////////////
+					// カーソル行では余白を塗りつぶす
+					////////////////////////////////////
+
+					HBRUSH hTempBrush;
+					hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+					//終端コードよりも右側はブラシで塗りつぶす
+					PatBlt(obj_dr.memdc,
+						x*font_width     +iControlTabSpace,
+						y*font_height,
+						ClientRect.right-(x*font_width     +iControlTabSpace),
+						font_height,
+						PATCOPY);
+
+					//カーソル行
+					SelectObject(obj_dr.memdc,hTempBrush);
+				}
+
+				//行番号が末端行にも表示されるようにするために描画予約を行う
+				obj_dr.DrawReserve(
+					x,
+					y,
+					NULL,
+					NULL,
+					bHyperLinkUnderBar,
+					"",0);
+			}
+
+			if(MaxX<CharX) MaxX=CharX;
+
+			break;
+		}
+
+		if(IsRightTurn(pBuf,i,x)){
+			/////////////////
+			// 自動折り返し
+			/////////////////
+
+			if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==y-BaseY){
+				///////////////////////////////////////////////////////////
+				//改行コードよりも右側は白いブラシで塗りつぶす（カーソル行用）
+				///////////////////////////////////////////////////////////
+
+				HBRUSH hTempBrush;
+
+				//カーソル行
+				hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+				PatBlt(obj_dr.memdc,
+					x*font_width     +iControlTabSpace,
+					y*font_height,
+					ClientRect.right-(x*font_width     +iControlTabSpace),
+					font_height,
+					PATCOPY);
+
+				//カーソル行
+				SelectObject(obj_dr.memdc,hTempBrush);
+			}
+
+			y++;
+
+			x=BaseX;
+			CharX=0;
+			i--;
+			continue;
+		}
+
+		if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
+
+			if(pBuf[i]=='\"'&&dwComment==0) IsStr^=1;
+
+			//複数行に渡るコメントを考慮
+			if( memicmp( pBuf+i, ActiveBasic::IDE::Program::ablang->GetSyntax().commentMultiBegin.c_str(), ActiveBasic::IDE::Program::ablang->GetSyntax().commentMultiBegin.size() ) == 0
+				&& IsStr == 0
+				&& dwComment == 0 )
+			{
+				// /*
+				dwComment=12;
+				bMultiLineComment=1;
+			}
+			if( memicmp( pBuf+i, ActiveBasic::IDE::Program::ablang->GetSyntax().commentMultiEnd.c_str(), ActiveBasic::IDE::Program::ablang->GetSyntax().commentMultiEnd.size() ) == 0
+				&& dwComment == 10
+				&& bMultiLineComment )
+			{
+				// */
+				dwComment=3;
+			}
+
+			//単行コメント
+			if( memicmp( pBuf+i, ActiveBasic::IDE::Program::ablang->GetSyntax().commentSingle.c_str(), ActiveBasic::IDE::Program::ablang->GetSyntax().commentSingle.size() ) == 0
+				&& dwComment == 0
+				&& IsStr == 0 )
+			{
+				// '
+				dwComment=10;
+				bMultiLineComment=0;
+			}
+
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+				//単行コメント中での改行は、コメントを解除
+				if(dwComment&&bMultiLineComment==0){
+					IsStr=0;
+					dwComment=0;
+				}
+			}
+			if(dwComment!=0&&dwComment!=10) dwComment--;
+		}
+		if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML){
+			//複数行に渡るコメントを考慮
+			if(pBuf[i]=='<'&&pBuf[i+1]=='!'&&pBuf[i+2]=='-'&&pBuf[i+3]=='-'&&IsStr==0&&dwComment==0){
+				dwComment=10;
+			}
+			if(pBuf[i]=='-'&&pBuf[i+1]=='-'&&pBuf[i+2]=='>'&&
+				dwComment){
+				dwComment=4;
+			}
+			if(dwComment!=0&&dwComment!=10) dwComment--;
+		}
+
+		//ハイパーリンク用下線
+		if(MdiInfo[WndNum]->pMdiTextEdit->iUnderStart<=i&&i<MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd)
+			bHyperLinkUnderBar=1;
+		else bHyperLinkUnderBar=0;
+
+		if(0<=y&&y<=OnePage_CharHeight){
+			//////////////////////////////////
+			// 表示中ページでは文字単位で描画
+			//////////////////////////////////
+			//※i2に描画する文字数を格納する
+
+			NextBackColor=DefaultBackColor;
+			if(dwComment){
+				//複数行に渡るコメント
+				NextColor=tci.rgbComment;
+			}
+			else{
+				//通常カラー
+				NextColor=MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i];
+			}
+
+			if(CharRange.cpMin<=i&&i<CharRange.cpMax){
+				//選択されているバッファは反転表示する
+				NextColor=NextColor^0x00FFFFFF;
+				NextBackColor=NextBackColor^0x00FFFFFF;
+			}
+			else{
+				if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==y-BaseY){
+					//カーソル行
+					NextBackColor=CaretBackColor;
+				}
+			}
+
+			if(IsDBCSLeadByte(pBuf[i])){
+				//マルチバイト文字
+				i2=2;
+				obj_dr.DrawReserve(
+					x,
+					y,
+					NextColor,
+					NextBackColor,
+					bHyperLinkUnderBar,
+					pBuf+i,i2);
+
+				i++;
+			}
+			else if(pBuf[i]=='\t'){
+				//タブ文字
+				int tab;
+				tab=pobj_nv->TabSize;
+
+				if((x-BaseX)%tab==0) i2=tab;
+				else i2=tab-(x-BaseX)%tab;
+				memset(temporary,' ',i2);
+				temporary[i2]=0;
+
+				obj_dr.DrawReserve(
+					x,
+					y,
+					NextColor,
+					NextBackColor,
+					bHyperLinkUnderBar,
+					temporary,i2);
+			}
+			else if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+				//改行文字は1スペースだけ空白を描画しておく（反転表示をするため）
+				i2=1;
+				temporary[0]=' ';
+				temporary[1]=0;
+				obj_dr.DrawReserve(
+					x,
+					y,
+					NextColor,
+					NextBackColor,
+					bHyperLinkUnderBar,
+					temporary,i2);
+
+
+				if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==y-BaseY){
+					///////////////////////////////////////////////////////////
+					//改行コードよりも右側は白いブラシで塗りつぶす（カーソル行用）
+					///////////////////////////////////////////////////////////
+
+					HBRUSH hTempBrush;
+
+					//カーソル行
+					hTempBrush=(HBRUSH)SelectObject(obj_dr.memdc,hCaretBackBrush);
+
+					PatBlt(obj_dr.memdc,
+						(x+i2)*font_width     +iControlTabSpace,
+						y*font_height,
+						ClientRect.right-((x+i2)*font_width     +iControlTabSpace),
+						font_height,
+						PATCOPY);
+
+					//カーソル行
+					SelectObject(obj_dr.memdc,hTempBrush);
+				}
+			}
+			else{
+				//通常のキャラ文字
+				i2=1;
+				obj_dr.DrawReserve(
+					x,
+					y,
+					NextColor,
+					NextBackColor,
+					bHyperLinkUnderBar,
+					pBuf+i,i2);
+			}
+		}
+		else{
+			////////////////////////////////////////
+			// 非表示ページでは文字数の計算だけ行う
+			////////////////////////////////////////
+			//※i2に描画する文字数を格納する
+
+			if(IsDBCSLeadByte(pBuf[i])){
+				//マルチバイト文字
+				i2=2;
+				i++;
+			}
+			else if(pBuf[i]=='\t'){
+				//タブ文字
+				int tab;
+				tab=pobj_nv->TabSize;
+
+				if((x-BaseX)%tab==0) i2=tab;
+				else i2=tab-(x-BaseX)%tab;
+			}
+			else{
+				//通常のキャラ文字（改行文字を含む）
+				i2=1;
+			}
+		}
+
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			y++;
+
+			if(MaxX<CharX) MaxX=CharX;
+
+			x=BaseX;
+			CharX=0;
+
+			i++;
+		}
+		else{
+			x+=i2;
+			CharX+=i2;
+		}
+	}
+
+	obj_dr.finish(BaseY);
+
+	DeleteObject(hCaretBackBrush);
+
+
+	//////////////////////////////////
+	// スクロールバーの範囲をセット
+	//////////////////////////////////
+
+	if(pobj_nv->bRightTurn){
+		MaxX=0;
+	}
+
+	ResetScrollbar(WndNum,MaxX,(-BaseY)+y);
+}
Index: branches/egtra/ab5.0/abdev/abdev/DrawWindow.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DrawWindow.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/DrawWindow.cpp	(revision 774)
@@ -0,0 +1,1782 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+void DrawLineInClient(int WndNum,long StartX,long StartY,long EndX,long EndY){
+	MoveToEx(MdiInfo[WndNum]->MdiRadInfo->hMemDC,
+		StartX+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+		StartY+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+		NULL);
+	LineTo(MdiInfo[WndNum]->MdiRadInfo->hMemDC,
+		EndX+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+		EndY+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y);
+}
+void DrawRectangleInClient(int WndNum,long left,long top,long right,long bottom,COLORREF RGB_Pen,COLORREF RGB_Brush,BOOL bBrushing){
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+
+	hPen=CreatePen(PS_SOLID,0,RGB_Pen);
+	if(bBrushing) hBrush=CreateSolidBrush(RGB_Brush);
+	else hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
+	hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+	hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hBrush);
+
+	Rectangle(MdiInfo[WndNum]->MdiRadInfo->hMemDC,
+		left+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+		top+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+		right+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+		bottom+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y);
+
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldBrush);
+	DeleteObject(hPen);
+	if(bBrushing) DeleteObject(hBrush);
+}
+void DrawButtonEdge(int WndNum,POINT *pPos,SIZE *pSize){
+	HPEN hPen,hOldPen;
+
+	//光源方向の縁
+	hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+	hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+	DrawLineInClient(WndNum,
+		pPos->x, pPos->y,
+		pPos->x+pSize->cx-1, pPos->y);
+	DrawLineInClient(WndNum,
+		pPos->x, pPos->y,
+		pPos->x, pPos->y+pSize->cy-1);
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+	DeleteObject(hPen);
+
+	//影側の縁
+	hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DDKSHADOW));
+	hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+	DrawLineInClient(WndNum,
+		pPos->x, pPos->y+pSize->cy-1,
+		pPos->x+pSize->cx, pPos->y+pSize->cy-1);
+	DrawLineInClient(WndNum,
+		pPos->x+pSize->cx-1, pPos->y,
+		pPos->x+pSize->cx-1, pPos->y+pSize->cy-1);
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+	DeleteObject(hPen);
+
+	hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+	hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+	DrawLineInClient(WndNum,
+		pPos->x+1, pPos->y+pSize->cy-2,
+		pPos->x+pSize->cx-1, pPos->y+pSize->cy-2);
+	DrawLineInClient(WndNum,
+		pPos->x+pSize->cx-2, pPos->y+1,
+		pPos->x+pSize->cx-2, pPos->y+pSize->cy-2);
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+	DeleteObject(hPen);
+
+	//内部
+	DrawRectangleInClient(WndNum,
+		pPos->x+1,pPos->y+1,
+		pPos->x+pSize->cx-2,pPos->y+pSize->cy-2,
+		GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+	pPos->x+=3;
+	pPos->y+=2;
+	pSize->cx-=5;
+	pSize->cy-=4;
+}
+void DrawItemEdgeByExStyle(int WndNum,int ExStyle,POINT *pPos,SIZE *pSize){
+	HPEN hPen,hOldPen;
+	RECT rect;
+
+	if(ExStyle&WS_EX_DLGMODALFRAME){
+		///////////////////////////
+		//モーダル フレーム境界線
+
+		rect.left=pPos->x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+		rect.top=pPos->y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+		rect.right=pPos->x+pSize->cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+		rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+		DrawEdge(MdiInfo[WndNum]->MdiRadInfo->hMemDC,&rect,EDGE_RAISED,BF_RECT);
+		pPos->x+=2;
+		pPos->y+=2;
+		pSize->cx-=4;
+		pSize->cy-=4;
+
+		//細枠
+		DrawRectangleInClient(WndNum,
+			pPos->x,pPos->y,
+			pPos->x+pSize->cx,pPos->y+pSize->cy,
+			GetSysColor(COLOR_ACTIVEBORDER),0,0);
+
+		pPos->x+=1;
+		pPos->y+=1;
+		pSize->cx-=2;
+		pSize->cy-=2;
+	}
+	else if(ExStyle&WS_EX_STATICEDGE){
+		//////////////////////
+		//スタティック境界線
+
+		//影側の色
+		hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		DrawLineInClient(WndNum,
+			pPos->x,
+			pPos->y,
+			pPos->x,
+			pPos->y+pSize->cy-1);
+		DrawLineInClient(WndNum,
+			pPos->x,
+			pPos->y,
+			pPos->x+pSize->cx-1,
+			pPos->y);
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		//光源方向の縁
+		hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		DrawLineInClient(WndNum,
+			pPos->x,
+			pPos->y+pSize->cy-1,
+			pPos->x+pSize->cx-1,
+			pPos->y+pSize->cy-1);
+		DrawLineInClient(WndNum,
+			pPos->x+pSize->cx-1,
+			pPos->y,
+			pPos->x+pSize->cx-1,
+			pPos->y+pSize->cy);
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		pPos->x+=1;
+		pPos->y+=1;
+		pSize->cx-=2;
+		pSize->cy-=2;
+	}
+	if(ExStyle&WS_EX_CLIENTEDGE){
+		//////////////////////
+		//クライアント境界線
+
+		rect.left=pPos->x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+		rect.top=pPos->y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+		rect.right=pPos->x+pSize->cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+		rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+		DrawEdge(MdiInfo[WndNum]->MdiRadInfo->hMemDC,&rect,EDGE_SUNKEN,BF_RECT);
+		pPos->x+=2;
+		pPos->y+=2;
+		pSize->cx-=4;
+		pSize->cy-=4;
+	}
+}
+void DrawScrollBar(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
+	int i,i2;
+	HPEN hPen,hOldPen;
+	COLORREF rgb;
+	POINT pos;
+	SIZE size;
+
+	if(bSwitch==0){
+		//水平スクロールバー
+
+		//左ボタン
+		if(pSize->cx>16*2){
+			pos=*pPos;
+			size.cx=16;
+			size.cy=pSize->cy;
+		}
+		else{
+			pos=*pPos;
+			size.cx=pSize->cx/2;
+			size.cy=pSize->cy;
+		}
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.y+(size.cy/2);
+			for(i=0;i<4;i++,i2--){
+				DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.y+(size.cy/2);
+		for(i=0;i<4;i++,i2--){
+			DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		//右ボタン
+		if(pSize->cx>16*2){
+			pos.x=pPos->x+pSize->cx-16;
+			pos.y=pPos->y;
+			size.cx=16;
+			size.cy=pSize->cy;
+		}
+		else{
+			pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
+			pos.y=pPos->y;
+			size.cx=pSize->cx/2;
+			size.cy=pSize->cy;
+		}
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.y+(size.cy/2);
+			for(i=3;i>=0;i--,i2--){
+				DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.y+(size.cy/2);
+		for(i=3;i>=0;i--,i2--){
+			DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		if(pSize->cx>16*3){
+			if(!(style&WS_DISABLED)){
+				pos.x=pPos->x+16;
+				pos.y=pPos->y;
+				size.cx=16;
+				size.cy=pSize->cy;
+				DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+				//内部
+				DrawRectangleInClient(WndNum,
+					pos.x,pos.y,
+					pos.x+size.cx,pos.y+size.cy,
+					GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+				pos.x=pPos->x+16*2;
+				pos.y=pPos->y;
+				size.cx=pSize->cx-16*3;
+				size.cy=pSize->cy;
+			}
+			else{
+				pos.x=pPos->x+16;
+				pos.y=pPos->y;
+				size.cx=pSize->cx-16*2;
+				size.cy=pSize->cy;
+			}
+		}
+		else if(pSize->cx>16*2){
+			pos.x=pPos->x+16;
+			pos.y=pPos->y;
+			size.cx=pSize->cx-16*2;
+			size.cy=pSize->cy;
+		}
+		else{
+			pos.x=pPos->x+pSize->cx/2;
+			pos.y=pPos->y;
+			size.cx=pSize->cx%2;
+			size.cy=pSize->cy;
+		}
+	}
+	else{
+		//垂直スクロールバー
+
+		//上ボタン
+		if(pSize->cy>16*2){
+			pos=*pPos;
+			size.cy=16;
+			size.cx=pSize->cx;
+		}
+		else{
+			pos=*pPos;
+			size.cy=pSize->cy/2;
+			size.cx=pSize->cx;
+		}
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		pos.y++;
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.x+(size.cx/2)-1;
+			for(i=0;i<4;i++,i2--){
+				DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.x+(size.cx/2)-1;
+		for(i=0;i<4;i++,i2--){
+			DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		//下ボタン
+		if(pSize->cy>16*2){
+			pos.x=pPos->x;
+			pos.y=pPos->y+pSize->cy-16;
+			size.cx=pSize->cx;
+			size.cy=16;
+		}
+		else{
+			pos.x=pPos->x;
+			pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
+			size.cx=pSize->cx;
+			size.cy=pSize->cy/2;
+		}
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		pos.x--;
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.x+(size.cx/2);
+			for(i=3;i>=0;i--,i2--){
+				DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.x+(size.cx/2);
+		for(i=3;i>=0;i--,i2--){
+			DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		if(pSize->cy>16*3){
+			if(!(style&WS_DISABLED)){
+				pos.x=pPos->x;
+				pos.y=pPos->y+16;
+				size.cx=pSize->cx;
+				size.cy=16;
+				DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+				//内部
+				DrawRectangleInClient(WndNum,
+					pos.x,pos.y,
+					pos.x+size.cx,pos.y+size.cy,
+					GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+				pos.x=pPos->x;
+				pos.y=pPos->y+16*2;
+				size.cx=pSize->cx;
+				size.cy=pSize->cy-16*3;
+			}
+			else{
+				pos.x=pPos->x;
+				pos.y=pPos->y+16;
+				size.cx=pSize->cx;
+				size.cy=pSize->cy-16*2;
+			}
+		}
+		else if(pSize->cy>16*2){
+			pos.x=pPos->x;
+			pos.y=pPos->y+16;
+			size.cx=pSize->cx;
+			size.cy=pSize->cy-16*2;
+		}
+		else{
+			pos.x=pPos->x;
+			pos.y=pPos->y+pSize->cy/2;
+			size.cx=pSize->cx;
+			size.cy=pSize->cy%2;
+		}
+	}
+
+	if(size.cx){
+		int x,y;
+		HBITMAP hBitmap;
+		BITMAPINFO BitmapInfo;
+		BYTE *pByte;
+
+		memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+		BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+		BitmapInfo.bmiHeader.biWidth=size.cx;
+		BitmapInfo.bmiHeader.biHeight=size.cy;
+		BitmapInfo.bmiHeader.biPlanes=1;
+		BitmapInfo.bmiHeader.biBitCount=24;
+
+		hBitmap=CreateDIBSection(MdiInfo[WndNum]->MdiRadInfo->hMemDC,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
+		i=BitmapInfo.bmiHeader.biWidth*3;
+		if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+		for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
+			if(y%2==0) rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=RGB(255,255,255);
+			for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
+				i2=y*i+x*3;
+				pByte[i2+2]=LOBYTE(LOWORD(rgb));
+				pByte[i2+1]=HIBYTE(LOWORD(rgb));
+				pByte[i2]=LOBYTE(HIWORD(rgb));
+				if(rgb==RGB(255,255,255)) rgb=GetSysColor(COLOR_3DFACE);
+				else rgb=RGB(255,255,255);
+			}
+		}
+		SetDIBitsToDevice(MdiInfo[WndNum]->MdiRadInfo->hMemDC,
+			pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+			pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+			BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight,
+			0,0,
+			0,BitmapInfo.bmiHeader.biHeight,
+			pByte,
+			&BitmapInfo,
+			DIB_RGB_COLORS);
+		DeleteObject(hBitmap);
+	}
+}
+void DrawUpDownControl(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
+	int i,i2;
+	HPEN hPen,hOldPen;
+	COLORREF rgb;
+	POINT pos;
+	SIZE size;
+
+	if(bSwitch==0){
+		//水平
+
+		//左ボタン
+		pos=*pPos;
+		size.cx=pSize->cx/2;
+		size.cy=pSize->cy;
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.y+(size.cy/2);
+			for(i=0;i<4;i++,i2--){
+				DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.y+(size.cy/2);
+		for(i=0;i<4;i++,i2--){
+			DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		//右ボタン
+		pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
+		pos.y=pPos->y;
+		size.cx=pSize->cx/2;
+		size.cy=pSize->cy;
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.y+(size.cy/2);
+			for(i=3;i>=0;i--,i2--){
+				DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.y+(size.cy/2);
+		for(i=3;i>=0;i--,i2--){
+			DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+	}
+	else{
+		//垂直
+
+		//上ボタン
+		pos=*pPos;
+		size.cy=pSize->cy/2;
+		size.cx=pSize->cx;
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		pos.y++;
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.x+(size.cx/2)-1;
+			for(i=0;i<4;i++,i2--){
+				DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.x+(size.cx/2)-1;
+		for(i=0;i<4;i++,i2--){
+			DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+
+		//下ボタン
+		pos.x=pPos->x;
+		pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
+		size.cx=pSize->cx;
+		size.cy=pSize->cy/2;
+		DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
+
+		//内部
+		DrawRectangleInClient(WndNum,
+			pos.x,pos.y,
+			pos.x+size.cx,pos.y+size.cy,
+			GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+		pos.x--;
+		if(style&WS_DISABLED){
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+			hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+			pos.x++;
+			pos.y++;
+			i2=pos.x+(size.cx/2);
+			for(i=3;i>=0;i--,i2--){
+				DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+			}
+			SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+			DeleteObject(hPen);
+			rgb=GetSysColor(COLOR_GRAYTEXT);
+			pos.x--;
+			pos.y--;
+		}
+		else rgb=GetSysColor(COLOR_BTNTEXT);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hPen);
+		i2=pos.x+(size.cx/2);
+		for(i=3;i>=0;i--,i2--){
+			DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
+		}
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldPen);
+		DeleteObject(hPen);
+	}
+}
+void DrawWindowScrollBar(int WndNum,DWORD style,POINT *pPos,SIZE *pSize){
+	POINT pos;
+	SIZE size;
+	if(style&WS_HSCROLL){
+		pos.x=pPos->x;
+		pos.y=pPos->y+pSize->cy-GetSystemMetrics(SM_CYVSCROLL);
+		if(style&WS_VSCROLL) size.cx=pSize->cx-GetSystemMetrics(SM_CXVSCROLL);
+		else size.cx=pSize->cx;
+		size.cy=GetSystemMetrics(SM_CYVSCROLL);
+		DrawScrollBar(WndNum,style,0,&pos,&size);
+	}
+	if(style&WS_VSCROLL){
+		pos.x=pPos->x+pSize->cx-GetSystemMetrics(SM_CXHSCROLL);
+		pos.y=pPos->y;
+		size.cx=GetSystemMetrics(SM_CXHSCROLL);
+		if(style&WS_HSCROLL) size.cy=pSize->cy-GetSystemMetrics(SM_CYHSCROLL);
+		else size.cy=pSize->cy;
+		DrawScrollBar(WndNum,style,1,&pos,&size);
+	}
+}
+void DrawOEMImage(HDC hdc,POINT *pPos,SIZE *pSize,DWORD dwImage){
+	HBITMAP hBmp,hOldBmp;
+	HDC memdc;
+
+	//未完成（XPのみに対応？）
+
+	memdc=CreateCompatibleDC(hdc);
+	hBmp=LoadBitmap(NULL,(LPSTR)dwImage);
+	hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
+	BitBlt(hdc,pPos->x,pPos->y,pSize->cx,pSize->cy,memdc,0,0,SRCCOPY);
+	SelectObject(memdc,hOldBmp);
+	DeleteDC(memdc);
+	DeleteObject(hBmp);
+}
+void DesigningWindow(int WndNum,HDC hdc,POINT *pBasePos,const ActiveBasic::PM::WindowInfo *pWindowInfo){
+	int i,i2,i3,i4;
+	double red,green,blue,d_red,d_green,d_blue;
+	char temporary[MAX_PATH];
+	COLORREF rgb;
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+	HFONT hFont,hOldFont;
+	HANDLE hImage;
+	RECT InsideRect,rect,rc2;
+	POINT pos,pos2;
+	SIZE size,size2;
+
+	HGLOBAL hResource;
+	BITMAPINFO *pBitmapInfo;
+	BYTE *pByte,*pByte2;
+
+
+	////////////////////////
+	//ウィンドウの縁を描画
+	InsideRect.left=pBasePos->x;
+	InsideRect.top=pBasePos->y;
+	InsideRect.right=InsideRect.left+pWindowInfo->size.cx;
+	InsideRect.bottom=InsideRect.top+pWindowInfo->size.cy;
+
+	if(pWindowInfo->GetStyle()&(WS_BORDER|WS_THICKFRAME)){
+		DrawEdge(hdc,&InsideRect,EDGE_RAISED,BF_RECT);
+
+		InsideRect.left+=2;
+		InsideRect.top+=2;
+		InsideRect.right-=2;
+		InsideRect.bottom-=2;
+	}
+
+
+	////////////
+	//枠を描画
+	if(pWindowInfo->GetStyle()&(WS_BORDER|WS_THICKFRAME)){
+		//細枠
+		hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_ACTIVEBORDER));
+		hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+		Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+
+		InsideRect.left+=1;
+		InsideRect.top+=1;
+		InsideRect.right-=1;
+		InsideRect.bottom-=1;
+
+		//サイズ変更枠
+		if(pWindowInfo->GetStyle()&WS_THICKFRAME){
+			Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+
+			InsideRect.left+=1;
+			InsideRect.top+=1;
+			InsideRect.right-=1;
+			InsideRect.bottom-=1;
+		}
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+	}
+
+
+	//Draw...InClient関数のため
+	MdiInfo[WndNum]->MdiRadInfo->ClientPos.x=0;
+	MdiInfo[WndNum]->MdiRadInfo->ClientPos.y=0;
+
+	if(pWindowInfo->GetStyle()&(WS_CAPTION&(~WS_BORDER))){
+		//////////////////////
+		//タイトルバーを描画
+
+		//背景を描画（グラデーション可）
+		i=GetSysColor(COLOR_ACTIVECAPTION);
+		OSVERSIONINFO OsVersionInfo;
+		OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
+		GetVersionEx(&OsVersionInfo);
+		if((OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT&&OsVersionInfo.dwMajorVersion>=5)||
+			(OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS&&LOWORD(OsVersionInfo.dwBuildNumber)>=1998)){
+#define COLOR_GRADIENTACTIVECAPTION 27
+			i2=GetSysColor(COLOR_GRADIENTACTIVECAPTION);
+		}
+		else i2=i;
+		if(pWindowInfo->GetExStyle()&WS_EX_TOOLWINDOW)
+			i3=GetSystemMetrics(SM_CYSMCAPTION);
+		else i3=GetSystemMetrics(SM_CYCAPTION);
+		d_red=((double)((i2&0xFF)-(i&0xFF)))/(double)(InsideRect.right-InsideRect.left);
+		d_green=((double)(((i2>>8)&0xFF))-((i>>8)&0xFF))/(double)(InsideRect.right-InsideRect.left);
+		d_blue=((double)(((i2>>16)&0xFF))-((i>>16)&0xFF))/(double)(InsideRect.right-InsideRect.left);
+
+		red=(double)(i&0xFF);
+		green=(double)((i>>8)&0xFF);
+		blue=(double)((i>>16)&0xFF);
+		for(i4=InsideRect.left;i4<InsideRect.right;i4++){
+			hPen=CreatePen(PS_SOLID,0,RGB((_int8)red,(_int8)green,(_int8)blue));
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+			MoveToEx(hdc,i4,InsideRect.top,NULL);
+			LineTo(hdc,i4,InsideRect.top+i3-1);
+			SelectObject(hdc,hOldPen);
+			DeleteObject(hPen);
+			red+=d_red;
+			green+=d_green;
+			blue+=d_blue;
+		}
+
+		//タイトルテキストの描画
+		LOGFONT LogFont;
+		SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),&LogFont,0);
+		hFont=CreateFontIndirect(&LogFont);
+		hOldFont=(HFONT)SelectObject(hdc,hFont);
+		SetTextColor(hdc,GetSysColor(COLOR_CAPTIONTEXT));
+		rect.left=InsideRect.left+20;
+		rect.top=InsideRect.top;
+		rect.right=InsideRect.right;
+		rect.bottom=InsideRect.top+i3;
+		DrawText(hdc,pWindowInfo->GetCaption().c_str(),pWindowInfo->GetCaption().size(),&rect,DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
+		SelectObject(hdc,hOldFont);
+		DeleteObject(hFont);
+
+		//ボタン
+		if(pWindowInfo->GetStyle()&WS_SYSMENU){
+			//終了ボタン
+			size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+			size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+			pos.x=InsideRect.right-2-size.cx;
+			pos.y=InsideRect.top+2;
+			DrawButtonEdge(WndNum,&pos,&size);
+
+			hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_TITLE_BUTTON_CLOSE),RT_BITMAP));
+			pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
+			pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
+
+			i2=pBitmapInfo->bmiHeader.biWidth*3;
+			if(i2%sizeof(LONG)!=0) i2+=sizeof(LONG)-(i2%sizeof(LONG));
+			pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biHeight*i2);
+			int x,y;
+			for(y=0;y<pBitmapInfo->bmiHeader.biHeight;y++){
+				if(y%2==0) rgb=GetSysColor(COLOR_3DFACE);
+				else rgb=RGB(255,255,255);
+				for(x=0;x<pBitmapInfo->bmiHeader.biWidth;x++){
+					i4=y*i2+x*3;
+					rgb=RGB(pByte[i4+2],pByte[i4+1],pByte[i4]);
+					if(rgb==RGB(0,0,0)){
+						rgb=GetSysColor(COLOR_BTNTEXT);
+						pByte2[i4+2]=LOBYTE(LOWORD(rgb));
+						pByte2[i4+1]=HIBYTE(LOWORD(rgb));
+						pByte2[i4]=LOBYTE(HIWORD(rgb));
+					}
+					else if(rgb==RGB(255,255,255)){
+						rgb=GetSysColor(COLOR_3DFACE);
+						pByte2[i4+2]=LOBYTE(LOWORD(rgb));
+						pByte2[i4+1]=HIBYTE(LOWORD(rgb));
+						pByte2[i4]=LOBYTE(HIWORD(rgb));
+					}
+				}
+			}
+			SetStretchBltMode(hdc,COLORONCOLOR);
+			StretchDIBits(hdc,
+				pos.x+(int)((double)size.cx*0.17), pos.y+(int)((double)size.cy*0.17),
+				(int)((double)size.cx*0.65)+1, (int)((double)size.cy*0.65)+1,
+				0,0,
+				pBitmapInfo->bmiHeader.biWidth,pBitmapInfo->bmiHeader.biHeight,
+				pByte2,
+				pBitmapInfo,
+				DIB_RGB_COLORS,SRCCOPY);
+			GlobalFree(pByte2);
+
+			if(pWindowInfo->GetStyle()&WS_MAXIMIZEBOX||pWindowInfo->GetStyle()&WS_MINIMIZEBOX){
+				//最大化ボタン
+				size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+				size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+				pos.x=InsideRect.right-size.cx*2-4;
+				pos.y=InsideRect.top+2;
+				DrawButtonEdge(WndNum,&pos,&size);
+				if(!(pWindowInfo->GetStyle()&WS_MAXIMIZEBOX)){
+					pos.x++;
+					pos.y++;
+					hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+					hOldPen=(HPEN)SelectObject(hdc,hPen);
+					hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+					Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
+					MoveToEx(hdc,pos.x,pos.y+1,NULL);
+					LineTo(hdc,pos.x+size.cx-2,pos.y+1);
+					SelectObject(hdc,hOldPen);
+					SelectObject(hdc,hOldBrush);
+					DeleteObject(hPen);
+					pos.x--;
+					pos.y--;
+					rgb=GetSysColor(COLOR_GRAYTEXT);
+				}
+				else rgb=GetSysColor(COLOR_BTNTEXT);
+				hPen=CreatePen(PS_SOLID,0,rgb);
+				hOldPen=(HPEN)SelectObject(hdc,hPen);
+				hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+				Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
+				MoveToEx(hdc,pos.x,pos.y+1,NULL);
+				LineTo(hdc,pos.x+size.cx-2,pos.y+1);
+				SelectObject(hdc,hOldPen);
+				SelectObject(hdc,hOldBrush);
+				DeleteObject(hPen);
+
+				//最小化ボタン
+				size.cx=GetSystemMetrics(SM_CXSIZE)-2;
+				size.cy=GetSystemMetrics(SM_CYSIZE)-4;
+				pos.x=InsideRect.right-size.cx*3-4;
+				pos.y=InsideRect.top+2;
+				DrawButtonEdge(WndNum,&pos,&size);
+				if(!(pWindowInfo->GetStyle()&WS_MINIMIZEBOX)){
+					pos.x++;
+					pos.y++;
+					hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+					hOldPen=(HPEN)SelectObject(hdc,hPen);
+					MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
+					LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
+					MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
+					LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
+					SelectObject(hdc,hOldPen);
+					DeleteObject(hPen);
+					pos.x--;
+					pos.y--;
+					rgb=GetSysColor(COLOR_GRAYTEXT);
+				}
+				else rgb=GetSysColor(COLOR_BTNTEXT);
+				hPen=CreatePen(PS_SOLID,0,rgb);
+				hOldPen=(HPEN)SelectObject(hdc,hPen);
+				MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
+				LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
+				MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
+				LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
+				SelectObject(hdc,hOldPen);
+				DeleteObject(hPen);
+			}
+		}
+
+		InsideRect.top+=i3;
+	}
+
+	if( pWindowInfo->HasMenu() )
+	{
+		//メニューラインを3DFACEで描画
+		rgb=GetSysColor(COLOR_3DFACE);
+		i=GetSystemMetrics(SM_CYMENU);
+		hPen=CreatePen(PS_SOLID,0,rgb);
+		hBrush=CreateSolidBrush(rgb);
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+		Rectangle(hdc,
+			InsideRect.left,InsideRect.top-1,InsideRect.right,InsideRect.top+i);
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+
+		InsideRect.top+=i;
+	}
+
+	//クライアント左上ポジションを設定
+	MdiInfo[WndNum]->MdiRadInfo->ClientPos.x=InsideRect.left;
+	MdiInfo[WndNum]->MdiRadInfo->ClientPos.y=InsideRect.top;
+
+	//ExStyleによる縁を描画
+	pos.x=0;
+	pos.y=0;
+	size.cx=InsideRect.right-InsideRect.left;
+	size.cy=InsideRect.bottom-InsideRect.top;
+	DrawItemEdgeByExStyle(WndNum,pWindowInfo->GetExStyle(),&pos,&size);
+
+	//スクロールバーを描画
+	DrawWindowScrollBar(WndNum,pWindowInfo->GetStyle(),&pos,&size);
+
+	//クライアント領域のサイズを設定
+	MdiInfo[WndNum]->MdiRadInfo->ClientSize=size;
+
+
+	//////////////
+	//背景を描画
+	if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE){
+		//3DFACE
+		hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DFACE));
+		hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+		Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+	}
+	else if(pWindowInfo->GetBackgroundColor()<=0){
+		//色指定
+		hPen=CreatePen(PS_SOLID,0,-pWindowInfo->GetBackgroundColor());
+		hBrush=CreateSolidBrush(-pWindowInfo->GetBackgroundColor());
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+		Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+	}
+	else if(pWindowInfo->GetBackgroundColor()>=0x1000){
+		//ビットマップ
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+		{
+			if( projectInfo.resourceManager.bitmapResources[pWindowInfo->GetBackgroundColor()-0x1000].idName == resourceItem.idName )
+			{
+				lstrcpy(temporary,resourceItem.filepath.c_str());
+				lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+				hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+				hBrush=CreatePatternBrush((HBITMAP)hImage);
+				hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+				SetBrushOrgEx(hdc,InsideRect.left,InsideRect.top,&pos);
+				PatBlt(hdc,
+					InsideRect.left, InsideRect.top,
+					InsideRect.right-InsideRect.left, InsideRect.bottom-InsideRect.top,PATCOPY);
+				SetBrushOrgEx(hdc,pos.x,pos.y,0);
+				SelectObject(hdc,hOldBrush);
+				DeleteObject(hBrush);
+				DeleteObject(hImage);
+
+				break;
+			}
+		}
+	}
+
+
+	////////////////////////////////////////////
+	//子ウィンドウ（ダイアログアイテム）を描画
+	hFont=CreateFontIndirect(&pWindowInfo->LogFont);
+	BOOST_FOREACH( ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+	{
+		pos=pChildInfo->pos;
+		size=pChildInfo->size;
+
+		//ExStyleによる縁を描画
+		DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
+
+		if(pChildInfo->Control==CT_BUTTON){
+			////////////////////////
+			// Button コントロール
+
+			if((pChildInfo->GetStyle()&0x0000000F)==BS_DEFPUSHBUTTON){
+				//標準のボタンの場合（黒枠描画）
+				DrawRectangleInClient(WndNum,
+					pos.x, pos.y,
+					pos.x+size.cx, pos.y+size.cy,
+					RGB(0,0,0),0,0);
+				pos.x++;
+				pos.y++;
+				size.cx-=2;
+				size.cy-=2;
+			}
+
+			//ボタンの縁を描画
+			DrawButtonEdge(WndNum,&pos,&size);
+
+			if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
+				//キャプション テキスト
+
+				rect.left=pos.x+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.top=pos.y+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.right=pos.x+size.cx-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+
+				if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
+				else i4=DT_SINGLELINE;
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+				else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
+				else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
+				else i2=DT_CENTER;
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+				else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
+				else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
+				else i3=DT_VCENTER;
+
+				hOldFont=(HFONT)SelectObject(hdc,hFont);
+				if(pChildInfo->GetStyle()&WS_DISABLED){
+					SetTextColor(hdc,RGB(255,255,255));
+					rc2.left=rect.left+1;
+					rc2.top=rect.top+1;
+					rc2.right=rect.right+1;
+					rc2.bottom=rect.bottom+1;
+					DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
+					SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+				}
+				else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+				DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
+				SelectObject(hdc,hOldFont);
+			}
+		}
+		else if(pChildInfo->Control==CT_CHECKBOX){
+			//////////////////////////
+			// CheckBox コントロール
+
+			if(pChildInfo->GetStyle()&BS_PUSHLIKE){
+				//ボタンの縁を描画
+				DrawButtonEdge(WndNum,&pos,&size);
+			}
+			else{
+				//チェックボックスを描画
+				size2.cx=13;
+				size2.cy=13;
+				if(pChildInfo->GetStyle()&BS_LEFTTEXT)
+					pos2.x=pos.x+size.cx-size2.cx;
+				else pos2.x=pos.x;
+				if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER||
+					(pChildInfo->GetStyle()&BS_VCENTER)==0)
+					pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
+				else if(pChildInfo->GetStyle()&BS_TOP)
+					pos2.y=pos.y+1;
+				else if(pChildInfo->GetStyle()&BS_BOTTOM)
+					pos2.y=pos.y+size.cy-size2.cy-1;
+				DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
+
+				if(pChildInfo->GetStyle()&WS_DISABLED)
+					rgb=GetSysColor(COLOR_3DFACE);
+				else rgb=GetSysColor(COLOR_WINDOW);
+				DrawRectangleInClient(WndNum,pos2.x, pos2.y,
+					pos2.x+size2.cx, pos2.y+size2.cy,
+					rgb,rgb,1);
+				if(!(pChildInfo->GetStyle()&BS_LEFTTEXT)) pos.x+=17;
+				else pos.x++;
+				size.cx-=17;
+			}
+
+			if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
+				//キャプション テキスト
+				rect.left=pos.x+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.top=pos.y+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.right=pos.x+size.cx-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+
+				if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
+				else i4=DT_SINGLELINE;
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+				else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
+				else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
+				else i2=DT_LEFT;
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+				else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
+				else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
+				else i3=DT_VCENTER;
+
+				hOldFont=(HFONT)SelectObject(hdc,hFont);
+				if(pChildInfo->GetStyle()&WS_DISABLED){
+					SetTextColor(hdc,RGB(255,255,255));
+					rc2.left=rect.left+1;
+					rc2.top=rect.top+1;
+					rc2.right=rect.right+1;
+					rc2.bottom=rect.bottom+1;
+					DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
+					SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+				}
+				else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+				DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
+				SelectObject(hdc,hOldFont);
+			}
+		}
+		else if(pChildInfo->Control==CT_COMBOBOX){
+			//////////////////////////
+			// ComboBox コントロール
+
+			pos2=pos;
+			size2.cx=size.cx;
+			size2.cy=20;
+			DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
+
+			//内部
+			if(pChildInfo->GetStyle()&WS_DISABLED)
+				rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=GetSysColor(COLOR_WINDOW);
+			DrawRectangleInClient(WndNum,
+				pos2.x,pos2.y,
+				pos2.x+size2.cx,pos2.y+size2.cy,
+				rgb,rgb,1);
+
+			if((pChildInfo->GetStyle()&0x000F)==CBS_SIMPLE){
+				pos.y+=20;
+				size.cy-=20;
+				DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos,&size);
+
+				//内部
+				rgb=GetSysColor(COLOR_WINDOW);
+				DrawRectangleInClient(WndNum,
+					pos.x,pos.y,
+					pos.x+size.cx,pos.y+size.cy,
+					rgb,rgb,1);
+			}
+			else{
+				//下ボタン
+				pos2.x+=size2.cx-16;
+				size2.cx=16;
+				size2.cy=16;
+				DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos2,&size2);
+
+				//内部
+				DrawRectangleInClient(WndNum,
+					pos2.x,pos2.y,
+					pos2.x+size2.cx,pos2.y+size2.cy,
+					GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
+
+				pos2.x--;
+				if(pChildInfo->GetStyle()&WS_DISABLED){
+					hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
+					hOldPen=(HPEN)SelectObject(hdc,hPen);
+					pos2.x++;
+					pos2.y++;
+					i3=pos2.x+(size2.cx/2);
+					for(i2=3;i2>=0;i2--,i3--){
+						DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
+					}
+					SelectObject(hdc,hOldPen);
+					DeleteObject(hPen);
+					rgb=GetSysColor(COLOR_GRAYTEXT);
+					pos2.x--;
+					pos2.y--;
+				}
+				else rgb=GetSysColor(COLOR_BTNTEXT);
+				hPen=CreatePen(PS_SOLID,0,rgb);
+				hOldPen=(HPEN)SelectObject(hdc,hPen);
+				i3=pos2.x+(size2.cx/2);
+				for(i2=3;i2>=0;i2--,i3--){
+					DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
+				}
+				SelectObject(hdc,hOldPen);
+				DeleteObject(hPen);
+			}
+		}
+		else if(pChildInfo->Control==CT_EDIT){
+			//////////////////////
+			// Edit コントロール
+
+			//内部
+			if(pChildInfo->GetStyle()&WS_DISABLED||pChildInfo->GetStyle()&ES_READONLY)
+				rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=GetSysColor(COLOR_WINDOW);
+			DrawRectangleInClient(WndNum,
+				pos.x,pos.y,
+				pos.x+size.cx,pos.y+size.cy,
+				rgb,rgb,1);
+
+			//キャプション テキスト
+			rect.left=pos.x+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.top=pos.y+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+			rect.right=pos.x+size.cx-1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.bottom=pos.y+size.cy-1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+
+			if(pChildInfo->GetStyle()&ES_MULTILINE) i4=0;
+			else i4=DT_SINGLELINE;
+
+			//ビットを考慮してES_LEFTを最後に検討する
+			if(pChildInfo->GetStyle()&ES_CENTER) i2=DT_CENTER;
+			else if(pChildInfo->GetStyle()&ES_RIGHT) i2=DT_RIGHT;
+			else i2=DT_LEFT;
+
+			//文字色を設定
+			if(pChildInfo->GetStyle()&WS_DISABLED)
+				SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+			else
+				SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+
+			hOldFont=(HFONT)SelectObject(hdc,hFont);
+			DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2);
+			SelectObject(hdc,hOldFont);
+		}
+
+		else if(pChildInfo->Control==CT_GROUPBOX){
+			///////////////////////////////////
+			// グループ ボックス コントロール
+
+			hOldFont=(HFONT)SelectObject(hdc,hFont);
+			GetTextExtentPoint32(hdc,pChildInfo->GetCaption().c_str(),pChildInfo->GetCaption().size(),&size2);
+
+			//枠を描画
+			rect.left=pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.top=pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+(size2.cy/2);
+			rect.right=pos.x+size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.bottom=pos.y+size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+			DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
+
+			//ビットを考慮してBS_CENTERを最初に検討する
+			if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER){
+				rect.left=pos.x+(size.cx/2)-(size2.cx/2)-3;
+				rect.right=rect.left+size2.cx+4;
+			}
+			else if(pChildInfo->GetStyle()&BS_RIGHT){
+				rect.right=pos.x+size.cx-7;
+				rect.left=rect.right-size2.cx-4;
+			}
+			else{
+				rect.left=pos.x+7;
+				rect.right=rect.left+size2.cx+4;
+			}
+			rect.top=pos.y;
+			rect.bottom=pos.y+size2.cy;
+
+			if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=-pWindowInfo->GetBackgroundColor();
+			DrawRectangleInClient(WndNum,rect.left,rect.top,rect.right,rect.bottom,rgb,rgb,1);
+
+			if(!((pChildInfo->GetStyle()&BS_ICON)||(pChildInfo->GetStyle()&BS_BITMAP))){
+				rect.left+=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.top+=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.right+=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.bottom+=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.left+=2;
+				rect.right-=2;
+
+				//テキストを描画
+				if(pChildInfo->GetStyle()&WS_DISABLED){
+					SetTextColor(hdc,RGB(255,255,255));
+					rc2.left=rect.left+1;
+					rc2.top=rect.top+1;
+					rc2.right=rect.right+1;
+					rc2.bottom=rect.bottom+1;
+					DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,DT_SINGLELINE);
+					SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+				}
+				else
+					SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+				DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,DT_SINGLELINE);
+			}
+			SelectObject(hdc,hOldFont);
+		}
+
+		else if(pChildInfo->Control==CT_HSCROLLBAR){
+			////////////////////////////////////
+			// 水平スクロールバー コントロール
+			DrawScrollBar(WndNum,pChildInfo->GetStyle(),0,&pos,&size);
+		}
+
+		else if(pChildInfo->Control==CT_IMAGEBOX){
+			/////////////////////
+			// イメージ ボックス
+			HDC memdc;
+
+			if((pChildInfo->GetStyle()&0x0000000F)==SS_BLACKFRAME)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_GRAYFRAME)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),0,0);
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_WHITEFRAME)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),0,0);
+			else if((pChildInfo->GetStyle()&0x0000001F)==SS_ETCHEDFRAME){
+				rect.left=pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.top=pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.right=pos.x+size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.bottom=pos.y+size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
+			}
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_BLACKRECT)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DDKSHADOW),1);
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_GRAYRECT)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DSHADOW),1);
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_WHITERECT)
+				DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),RGB(255,255,255),1);
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_ICON)
+			{
+				if(pChildInfo->image.IsFile())
+				{
+					lstrcpy(temporary,pChildInfo->image.path.c_str());
+				}
+				else
+				{
+					bool isMatch = false;
+					BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+					{
+						if( resourceItem.idName == pChildInfo->image.path )
+						{
+							isMatch = true;
+							lstrcpy(temporary,resourceItem.filepath.c_str());
+							break;
+						}
+					}
+					if( !isMatch )
+					{
+						goto NonIconImage;
+					}
+				}
+				lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+				hImage=LoadImage(NULL,temporary,IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+				if(hImage){
+					pChildInfo->size.cx=32+(pChildInfo->size.cx-size.cx);
+					pChildInfo->size.cy=32+(pChildInfo->size.cy-size.cy);
+					pos=pChildInfo->pos;
+					size=pChildInfo->size;
+
+					//ExStyleによる縁を再描画
+					DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
+
+					DrawIcon(hdc,
+						pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+						pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+						(HICON)hImage);
+					DestroyIcon((HICON)hImage);
+				}
+				else{
+NonIconImage:
+					DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+					hOldFont=(HFONT)SelectObject(hdc,hFont);
+					rect.left=pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+					rect.top=pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+					rect.right=pos.x+size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+					rect.bottom=pos.y+size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+					SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+					DrawText(hdc,"icon...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
+					SelectObject(hdc,hOldFont);
+				}
+			}
+			else if((pChildInfo->GetStyle()&0x0000000F)==SS_BITMAP){
+				BITMAP Bitmap;
+
+				if(pChildInfo->image.IsFile())
+				{
+					lstrcpy(temporary,pChildInfo->image.path.c_str());
+				}
+				else{
+					bool isMatch = false;
+					BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+					{
+						if( resourceItem.idName == pChildInfo->image.path )
+						{
+							lstrcpy(temporary,resourceItem.filepath.c_str());
+							isMatch = true;
+							break;
+						}
+					}
+					if( !isMatch )
+					{
+						goto NonBitmapImage;
+					}
+				}
+				lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+				hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+				if(hImage){
+					GetObject(hImage,sizeof(BITMAP),&Bitmap);
+
+					pChildInfo->size.cx=Bitmap.bmWidth+(pChildInfo->size.cx-size.cx);
+					pChildInfo->size.cy=Bitmap.bmHeight+(pChildInfo->size.cy-size.cy);
+					pos=pChildInfo->pos;
+					size=pChildInfo->size;
+
+					//ExStyleによる縁を再描画
+					DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
+
+					memdc=CreateCompatibleDC(hdc);
+					SelectObject(memdc,hImage);
+					BitBlt(hdc,
+						pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+						pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+						size.cx, size.cy,
+						memdc, 0,0,
+						SRCCOPY);
+					DeleteDC(memdc);
+					DeleteObject(hImage);
+				}
+				else{
+NonBitmapImage:
+					DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
+					hOldFont=(HFONT)SelectObject(hdc,hFont);
+					rect.left=pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+					rect.top=pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+					rect.right=pos.x+size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+					rect.bottom=pos.y+size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+					SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
+					DrawText(hdc,"bmp...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
+					SelectObject(hdc,hOldFont);
+				}
+			}
+		}
+
+		else if(pChildInfo->Control==CT_LISTBOX){
+			/////////////////////////
+			// ListBox コントロール
+
+			//内部
+			if(pChildInfo->GetStyle()&WS_DISABLED)
+				rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=GetSysColor(COLOR_WINDOW);
+			DrawRectangleInClient(WndNum,
+				pos.x,pos.y,
+				pos.x+size.cx,pos.y+size.cy,
+				rgb,rgb,1);
+
+			if(pChildInfo->GetStyle()&LBS_DISABLENOSCROLL)
+				DrawWindowScrollBar(WndNum,pChildInfo->GetStyle()|WS_DISABLED,&pos,&size);
+		}
+
+		else if(pChildInfo->Control==CT_LISTVIEW){
+			//////////////////////////
+			// ListView コントロール
+
+			//内部
+			if(pChildInfo->GetStyle()&WS_DISABLED)
+				rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=GetSysColor(COLOR_WINDOW);
+			DrawRectangleInClient(WndNum,
+				pos.x,pos.y,
+				pos.x+size.cx,pos.y+size.cy,
+				rgb,rgb,1);
+
+			if((pChildInfo->GetStyle()&LVS_REPORT)&&
+				(!((pChildInfo->GetStyle()&LVS_LIST)==LVS_LIST))){
+				//レポート ビュー
+				size.cy=16;
+				DrawButtonEdge(WndNum,&pos,&size);
+			}
+		}
+
+		else if(pChildInfo->Control==CT_PROGRESSBAR){
+			/////////////////////////////
+			// ProgressBar コントロール
+
+			//内部
+			pos.x++;
+			pos.y++;
+			size.cx-=2;
+			size.cy-=2;
+			rgb=GetSysColor(COLOR_ACTIVECAPTION);
+			if(pChildInfo->GetStyle()&PBS_SMOOTH){
+				if(pChildInfo->GetStyle()&PBS_VERTICAL){
+					pos.y+=(long)((double)size.cy*0.3);
+					DrawRectangleInClient(WndNum,
+						pos.x,pos.y,
+						pos.x+size.cx,pos.y+(long)((double)size.cy*0.7),
+						rgb,rgb,1);
+				}
+				else{
+					DrawRectangleInClient(WndNum,
+						pos.x,pos.y,
+						pos.x+(long)((double)size.cx*0.7),pos.y+size.cy,
+						rgb,rgb,1);
+				}
+			}
+			else{
+				if(pChildInfo->GetStyle()&PBS_VERTICAL){
+					pos.y+=(long)((double)size.cy*0.3);
+					i3=(size.cx*2)/3;
+					i2=(int)((double)size.cy*0.7);
+					for(;i2>i3;i2-=i3+2){
+						DrawRectangleInClient(WndNum,
+							pos.x,pos.y+i2-i3,
+							pos.x+size.cx,pos.y+i2,
+							rgb,rgb,1);
+					}
+				}
+				else{
+					i3=(size.cy*2)/3;
+					i4=(int)((double)size.cx*0.7);
+					for(i2=0;i2+i3<i4;i2+=i3+2){
+						DrawRectangleInClient(WndNum,
+							pos.x+i2,pos.y,
+							pos.x+i2+i3,pos.y+size.cy,
+							rgb,rgb,1);
+					}
+				}
+			}
+		}
+
+		else if(pChildInfo->Control==CT_RADIOBUTTON){
+			/////////////////////////////
+			// RadioButton コントロール
+
+			if(pChildInfo->GetStyle()&BS_PUSHLIKE){
+				//ボタンの縁を描画
+				DrawButtonEdge(WndNum,&pos,&size);
+			}
+			else{
+				//ラジオボタンを描画
+				size2.cx=12;
+				size2.cy=12;
+				if(pChildInfo->GetStyle()&BS_LEFTTEXT)
+					pos2.x=pos.x+size.cx-size2.cx;
+				else pos2.x=pos.x+1;
+				if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER||
+					(pChildInfo->GetStyle()&BS_VCENTER)==0)
+					pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
+				else if(pChildInfo->GetStyle()&BS_TOP)
+					pos2.y=pos.y+1;
+				else if(pChildInfo->GetStyle()&BS_BOTTOM)
+					pos2.y=pos.y+size.cy-size2.cy-1;
+
+				hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_RADIOBUTTON),RT_BITMAP));
+				pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
+				pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
+				pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight*3);
+				for(i2=0,i3=0;i2<pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight;i2++,i3+=3){
+					rgb=RGB(pByte[i3+2],pByte[i3+1],pByte[i3]);
+
+					if(rgb==RGB(255,255,0)){
+						if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
+						else rgb=-pWindowInfo->GetBackgroundColor();
+					}
+
+					//影側
+					else if(rgb==RGB(0,0,0)) rgb=GetSysColor(COLOR_3DSHADOW);
+					else if(rgb==RGB(255,0,0)) rgb=GetSysColor(COLOR_3DDKSHADOW);
+
+					//光源側
+					else if(rgb==RGB(0,0,255)) rgb=GetSysColor(COLOR_3DLIGHT);
+					else if(rgb==RGB(0,255,0)) rgb=GetSysColor(COLOR_3DHIGHLIGHT);
+
+					//内部
+					else if(rgb==RGB(255,255,255)){
+						if(pChildInfo->GetStyle()&WS_DISABLED) rgb=GetSysColor(COLOR_3DFACE);
+					}
+
+					pByte2[i3+2]=LOBYTE(LOWORD(rgb));
+					pByte2[i3+1]=HIBYTE(LOWORD(rgb));
+					pByte2[i3]=LOBYTE(HIWORD(rgb));
+				}
+				SetDIBitsToDevice(hdc,
+					pos2.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+					pos2.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y,
+					pBitmapInfo->bmiHeader.biWidth, pBitmapInfo->bmiHeader.biHeight,
+					0,0,
+					0,pBitmapInfo->bmiHeader.biHeight,
+					pByte2,
+					pBitmapInfo,
+					DIB_RGB_COLORS);
+				GlobalFree(pByte2);
+
+				if(!(pChildInfo->GetStyle()&BS_LEFTTEXT)) pos.x+=17;
+				else pos.x++;
+				size.cx-=17;
+			}
+
+			if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
+				//キャプション テキスト
+				rect.left=pos.x+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.top=pos.y+1+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+				rect.right=pos.x+size.cx-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+				rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+
+				if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
+				else i4=DT_SINGLELINE;
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
+				else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
+				else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
+				else i2=DT_LEFT;
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
+				else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
+				else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
+				else i3=DT_VCENTER;
+
+				hOldFont=(HFONT)SelectObject(hdc,hFont);
+				if(pChildInfo->GetStyle()&WS_DISABLED){
+					SetTextColor(hdc,RGB(255,255,255));
+					rc2.left=rect.left+1;
+					rc2.top=rect.top+1;
+					rc2.right=rect.right+1;
+					rc2.bottom=rect.bottom+1;
+					DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
+					SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+				}
+				else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+				DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
+				SelectObject(hdc,hOldFont);
+			}
+		}
+
+		else if(pChildInfo->Control==CT_STATIC){
+			////////////////////////
+			// Static コントロール
+
+			//キャプション テキスト
+			rect.left=pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.top=pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+			rect.right=pos.x+size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+			rect.bottom=pos.y+size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+
+			//ビットを考慮してSS_LEFTを最後に検討する
+			if(pChildInfo->GetStyle()&SS_CENTER) i2=DT_CENTER;
+			else if(pChildInfo->GetStyle()&SS_RIGHT) i2=DT_RIGHT;
+			else i2=DT_LEFT;
+
+			hOldFont=(HFONT)SelectObject(hdc,hFont);
+			if(pChildInfo->GetStyle()&WS_DISABLED){
+				SetTextColor(hdc,RGB(255,255,255));
+				rc2.left=rect.left+1;
+				rc2.top=rect.top+1;
+				rc2.right=rect.right+1;
+				rc2.bottom=rect.bottom+1;
+				DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i2);
+				SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
+			}
+			else
+				SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
+
+			//折り返すかどうか
+			if(!(pChildInfo->GetStyle()&SS_LEFTNOWORDWRAP)){
+				i2|=DT_WORDBREAK;
+			}
+
+			DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i2);
+			SelectObject(hdc,hOldFont);
+		}
+
+		else if(pChildInfo->Control==CT_TRACKBAR){
+			//////////////////////////
+			// TrackBar コントロール
+
+			if(pChildInfo->GetStyle()&TBS_VERT){
+				pos.x+=2;
+				size.cx-=2;
+				if(size.cx>21) size.cx=21;
+				pos.y+=8;
+				size.cy-=16;
+
+				rect.left=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)-2;
+				rect.right=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)+2;
+				rect.top=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pos.y;
+				rect.bottom=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pos.y+size.cy;
+				DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
+
+				size.cy=size.cx/2;
+				DrawButtonEdge(WndNum,&pos,&size);
+			}
+			else{
+				pos.x+=8;
+				size.cx-=16;
+				pos.y+=2;
+				size.cy-=2;
+				if(size.cy>21) size.cy=21;
+
+				rect.left=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pos.x;
+				rect.right=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pos.x+size.cx;
+				rect.top=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)-2;
+				rect.bottom=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)+2;
+				DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
+
+				size.cx=size.cy/2;
+				DrawButtonEdge(WndNum,&pos,&size);
+			}
+		}
+
+		else if(pChildInfo->Control==CT_TREEVIEW){
+			//////////////////////////
+			// TreeView コントロール
+
+			//内部
+			if(pChildInfo->GetStyle()&WS_DISABLED)
+				rgb=GetSysColor(COLOR_3DFACE);
+			else rgb=GetSysColor(COLOR_WINDOW);
+			DrawRectangleInClient(WndNum,
+				pos.x,pos.y,
+				pos.x+size.cx,pos.y+size.cy,
+				rgb,rgb,1);
+		}
+
+		else if(pChildInfo->Control==CT_UPDOWN){
+			///////////////////////////////
+			// アップ ダウン コントロール
+			if(pChildInfo->GetStyle()&UDS_HORZ)
+				DrawUpDownControl(WndNum,pChildInfo->GetStyle(),0,&pos,&size);
+			else DrawUpDownControl(WndNum,pChildInfo->GetStyle(),1,&pos,&size);
+		}
+
+		else if(pChildInfo->Control==CT_VSCROLLBAR){
+			////////////////////////////////////
+			// 垂直スクロールバー コントロール
+			DrawScrollBar(WndNum,pChildInfo->GetStyle(),1,&pos,&size);
+		}
+	}
+	DeleteObject(hFont);
+}
+void DrawRadWindow(int WndNum,const ActiveBasic::PM::WindowInfo *pWindowInfo){
+	HBRUSH hOldBrush;
+	POINT pos;
+
+	SetBkMode(MdiInfo[WndNum]->MdiRadInfo->hMemDC,TRANSPARENT);
+
+	hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,GetStockObject(WHITE_BRUSH));
+	PatBlt(MdiInfo[WndNum]->MdiRadInfo->hMemDC,0,0,ScreenX*2,ScreenY*2,PATCOPY);
+	SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,hOldBrush);
+
+	pos.x=LEVER_THICK;
+	pos.y=LEVER_THICK;
+	DesigningWindow(WndNum,MdiInfo[WndNum]->MdiRadInfo->hMemDC,&pos,pWindowInfo);
+
+	InvalidateRect(MdiInfo[WndNum]->MdiRadInfo->hRad,NULL,0);
+}
Index: branches/egtra/ab5.0/abdev/abdev/EndPairCommandComplement.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/EndPairCommandComplement.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/EndPairCommandComplement.cpp	(revision 774)
@@ -0,0 +1,484 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+///////////////////////////////////////////////////////////////////
+// ここから、ペアステートメント補完を行うための関数郡
+///////////////////////////////////////////////////////////////////
+
+int GetStartCommandId_FromBuffer(char *buffer){
+	int i;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		if(!IsVariableChar(buffer[i])){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=buffer[i];
+	}
+
+	if(lstrcmpi(temporary,"If")==0){
+		//If文の場合はブロック形式の有無を判定
+
+		int IsStr=0;
+		for(;;i++){
+			if(buffer[i]=='\"') IsStr^=1;
+			if((buffer[i]=='\''||IsCommandDelimitation(buffer,i))&&IsStr==0){
+				i--;
+				break;
+			}
+		}
+
+		while(buffer[i]==' '||buffer[i]=='\t') i--;
+
+		if(memicmp(buffer+i-3,"Then",4)==0){
+			//ブロック形式のIf
+			return COM_IF;
+		}
+		else{
+			//一行のみのIf
+			return 0;
+		}
+	}
+
+	if(lstrcmpi(temporary,"Virtual")==0||
+		lstrcmpi(temporary,"Override")==0||
+		lstrcmpi(temporary,"Static")==0){
+		if(temporary[0]=='s'||temporary[0]=='S')
+			i=7;
+		else if(temporary[0]=='v'||temporary[0]=='V')
+			i=8;
+		else i=9;
+
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+		int i2;
+		for(i2=0;;i++,i2++){
+			if(!IsVariableChar(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+
+		if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
+		if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
+		return 0;
+	}
+
+	if(lstrcmpi(temporary,"Class")==0) return COM_CLASS;
+	if(lstrcmpi(temporary,"Interface")==0) return COM_INTERFACE;
+	if(lstrcmpi(temporary,"Do")==0) return COM_DO;
+	if(lstrcmpi(temporary,"Enum")==0) return COM_ENUM;
+	if(lstrcmpi(temporary,"For")==0) return COM_FOR;
+	if(lstrcmpi(temporary,"Foreach")==0) return COM_FOR;
+	if(lstrcmpi(temporary,"Function")==0) return COM_FUNCTION;
+	if(lstrcmpi(temporary,"Namespace")==0) return COM_NAMESPACE;
+	if(lstrcmpi(temporary,"Select")==0) return COM_SELECT;
+	if(lstrcmpi(temporary,"Sub")==0) return COM_SUB;
+	if(lstrcmpi(temporary,"Try")==0) return COM_TRY;
+	if(lstrcmpi(temporary,"Type")==0) return COM_TYPE;
+	if(lstrcmpi(temporary,"While")==0) return COM_WHILE;
+	if(lstrcmpi(temporary,"With")==0) return COM_WITH;
+
+	return 0;
+}
+int GetEndCommandId_FromBuffer(char *buffer){
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	for(i=0,i2=0;;i++,i2++){
+		if(!IsVariableChar(buffer[i])){
+			temporary[i2]=0;
+
+			if(lstrcmpi(temporary,"End")==0&&
+				(buffer[i]==' '||buffer[i]=='\t')){
+				while(buffer[i]==' '||buffer[i]=='\t') i++;
+				i--;
+				i2--;
+				continue;
+			}
+
+			break;
+		}
+		temporary[i2]=buffer[i];
+	}
+
+	if(lstrcmpi(temporary,"EndClass")==0) return COM_CLASS;
+	if(lstrcmpi(temporary,"EndInterface")==0) return COM_INTERFACE;
+	if(lstrcmpi(temporary,"Loop")==0) return COM_DO;
+	if(lstrcmpi(temporary,"EndEnum")==0) return COM_ENUM;
+	if(lstrcmpi(temporary,"Next")==0) return COM_FOR;
+	if(lstrcmpi(temporary,"EndFunction")==0) return COM_FUNCTION;
+	if(lstrcmpi(temporary,"EndIf")==0) return COM_IF;
+	if(lstrcmpi(temporary,"EndNamespace")==0) return COM_NAMESPACE;
+	if(lstrcmpi(temporary,"EndSelect")==0) return COM_SELECT;
+	if(lstrcmpi(temporary,"EndSub")==0) return COM_SUB;
+	if(lstrcmpi(temporary,"EndTry")==0) return COM_TRY;
+	if(lstrcmpi(temporary,"EndType")==0) return COM_TYPE;
+	if(lstrcmpi(temporary,"Wend")==0) return COM_WHILE;
+	if(lstrcmpi(temporary,"EndWith")==0) return COM_WITH;
+
+	return 0;
+}
+void GetNameOfEndCommand(int CmdId,char *buffer){
+	switch(CmdId){
+		case COM_CLASS:
+			lstrcpy(buffer,"End Class");
+			break;
+		case COM_INTERFACE:
+			lstrcpy(buffer,"End Interface");
+			break;
+		case COM_DO:
+			lstrcpy(buffer,"Loop");
+			break;
+		case COM_ENUM:
+			lstrcpy(buffer,"End Enum");
+			break;
+		case COM_FOR:
+			lstrcpy(buffer,"Next");
+			break;
+		case COM_FUNCTION:
+			lstrcpy(buffer,"End Function");
+			break;
+		case COM_IF:
+			lstrcpy(buffer,"End If");
+			break;
+		case COM_NAMESPACE:
+			lstrcpy(buffer,"End Namespace");
+			break;
+		case COM_SELECT:
+			lstrcpy(buffer,"End Select");
+			break;
+		case COM_SUB:
+			lstrcpy(buffer,"End Sub");
+			break;
+		case COM_TRY:
+			lstrcpy(buffer,"End Try");
+			break;
+		case COM_TYPE:
+			lstrcpy(buffer,"End Type");
+			break;
+		case COM_WHILE:
+			lstrcpy(buffer,"Wend");
+			break;
+		case COM_WITH:
+			lstrcpy(buffer,"End With");
+			break;
+	}
+}
+BOOL IsIntoStringQuotes(char *buffer,int i){
+	int i2;
+
+	i2=i;
+	while(i2&&buffer[i2]!='\n') i2--;
+	if(i2==-1) i2=0;
+	if(buffer[i2]=='\n') i2++;
+
+	int IsStr=0;
+	for(;i2<i;i2++){
+		if(buffer[i2]=='\"') IsStr^=1;
+	}
+	return IsStr;
+}
+BOOL GetEndPairCommandInfo(char *buffer,int p){
+	int i,i2,i3,CmdId;
+	char epcName[32];
+	char indent[255],LineNum;
+
+	int stack[255];
+	int sp;
+
+	CmdId=0;
+	LineNum=0;
+	sp=-1;
+
+	i=p;
+
+	//入力中の行を除く
+	for(i--;i>=0;i--){
+		i2=IsCommandDelimitation(buffer,i);
+		if(i2) break;
+	}
+
+	while(1){
+
+		//i2に一行前の先頭位置を格納
+		for(i--;i>=0;i--){
+			i2=IsCommandDelimitation(buffer,i);
+			if(i2){
+				if(IsIntoStringQuotes(buffer,i)){
+					//文字列中の場合
+					continue;
+				}
+
+				if(i2==1) i2=i+1;
+				else{
+					i2=i+2;
+					LineNum++;
+
+					if(LineNum>pobj_nv->BackNum_PairStatementComplement){
+						//設定された行数を超えた場合
+						return 0;
+					}
+				}
+
+				break;
+			}
+		}
+		if(i==-1) i2=i+1;
+
+		//インデント文字列をindentにコピー
+		for(i3=0;;i2++,i3++){
+			if(buffer[i2]!='\t'){
+				indent[i3]=0;
+				break;
+			}
+			indent[i3]=buffer[i2];
+		}
+
+		//空白文字を飛び越す
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+		//終了コマンドを取得（End Class、End Sub、Next、Wendなど…）
+		i3=GetEndCommandId_FromBuffer(buffer+i2);
+		if(i3){
+			sp++;
+			stack[sp]=i3;
+		}
+
+		//開始コマンドを取得（Class、Sub、For、Whileなど…）
+		i3=GetStartCommandId_FromBuffer(buffer+i2);
+		if(i3){
+			if(sp==-1){
+				CmdId=i3;
+				break;
+			}
+
+			if(stack[sp]!=i3) return 0;
+			sp--;
+		}
+
+		if(i<=0) break;
+	}
+
+	if(!CmdId) return 0;
+
+	extern HANDLE hHeap;
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	if(CmdId==COM_IF){
+		//Else、ElseIf、End Ifをリストに追加
+
+		///////////////////////
+		// 補完情報
+		///////////////////////
+
+		ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*2);
+		ComplementWndInfo.MemberNum=2;
+
+		ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,5);
+		lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"Else");
+		ComplementWndInfo.pMemberInfo[0].dwProc=0;
+		ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,7);
+		lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"End If");
+		ComplementWndInfo.pMemberInfo[1].dwProc=0;
+		ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+	}
+	else if(CmdId==COM_CLASS){
+		ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
+		ComplementWndInfo.MemberNum=4;
+
+		ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
+		lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Class");
+		ComplementWndInfo.pMemberInfo[0].dwProc=0;
+		ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
+		lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Private");
+		ComplementWndInfo.pMemberInfo[1].dwProc=0;
+		ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,10);
+		lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Protected");
+		ComplementWndInfo.pMemberInfo[2].dwProc=0;
+		ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[3].pName=(char *)HeapAlloc(hHeap,0,7);
+		lstrcpy(ComplementWndInfo.pMemberInfo[3].pName,"Public");
+		ComplementWndInfo.pMemberInfo[3].dwProc=0;
+		ComplementWndInfo.pMemberInfo[3].dwAccess=ACCESS_PAIRCOMMAND;
+	}
+	else if(CmdId==COM_SELECT){
+		ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
+		ComplementWndInfo.MemberNum=2;
+
+		ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
+		lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Select");
+		ComplementWndInfo.pMemberInfo[0].dwProc=0;
+		ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,8);
+		lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Case");
+		ComplementWndInfo.pMemberInfo[1].dwProc=0;
+		ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+	}
+	else if(CmdId==COM_TRY){
+		ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO)*4);
+		ComplementWndInfo.MemberNum=3;
+
+		ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,10);
+		lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,"End Try");
+		ComplementWndInfo.pMemberInfo[0].dwProc=0;
+		ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[1].pName=(char *)HeapAlloc(hHeap,0,10);
+		lstrcpy(ComplementWndInfo.pMemberInfo[1].pName,"Catch");
+		ComplementWndInfo.pMemberInfo[1].dwProc=0;
+		ComplementWndInfo.pMemberInfo[1].dwAccess=ACCESS_PAIRCOMMAND;
+
+		ComplementWndInfo.pMemberInfo[2].pName=(char *)HeapAlloc(hHeap,0,8);
+		lstrcpy(ComplementWndInfo.pMemberInfo[2].pName,"Finally");
+		ComplementWndInfo.pMemberInfo[2].dwProc=0;
+		ComplementWndInfo.pMemberInfo[2].dwAccess=ACCESS_PAIRCOMMAND;
+	}
+	else{
+		//その他のコマンド
+
+		//エンドペアステートメントの名前を取得
+		GetNameOfEndCommand(CmdId,epcName);
+
+
+		///////////////////////
+		// 補完情報
+		///////////////////////
+
+		ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,sizeof(MEMBERINFO));
+		ComplementWndInfo.MemberNum=1;
+
+		ComplementWndInfo.pMemberInfo[0].pName=(char *)HeapAlloc(hHeap,0,lstrlen(epcName)+1);
+		lstrcpy(ComplementWndInfo.pMemberInfo[0].pName,epcName);
+
+		ComplementWndInfo.pMemberInfo[0].dwProc=0;
+		ComplementWndInfo.pMemberInfo[0].dwAccess=ACCESS_PAIRCOMMAND;
+	}
+	lstrcpy(ComplementWndInfo.szIndent,indent);
+
+
+	return 1;
+}
+BOOL IsNeedNewIndentCommand(char *name){
+	if(lstrcmpi(name,"Case")==0) return 1;
+	return 0;
+}
+
+
+
+///////////////////////////////////////////////
+// Withで構成されるオブジェクト識別子を取得
+///////////////////////////////////////////////
+
+void GetWithObjectVariable(char *buffer,int p,char *pObjectVar){
+	int i,i2,i3,i4,CmdId;
+	char LineNum;
+	char temporary[VN_SIZE];
+
+	int stack[255];
+	int sp;
+
+	CmdId=0;
+	LineNum=0;
+	sp=-1;
+	pObjectVar[0]=0;
+
+	i=p;
+
+	//入力中の行を除く
+	for(i--;i>=0;i--){
+		i2=IsCommandDelimitation(buffer,i);
+		if(i2) break;
+	}
+
+	while(1){
+
+		//i2に一行前の先頭位置を格納
+		for(i--;i>=0;i--){
+			i2=IsCommandDelimitation(buffer,i);
+			if(i2){
+				if(i2==1) i2=i+1;
+				else{
+					i2=i+2;
+					LineNum++;
+
+					if(LineNum>pobj_nv->BackNum_PairStatementComplement){
+						//設定された行数を超えた場合
+						return;
+					}
+				}
+
+				break;
+			}
+		}
+		if(i==-1) i2=i+1;
+
+		//インデントを飛び越す
+		while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+		//終了コマンドを取得（End Class、End Sub、Next、Wendなど…）
+		CmdId=GetEndCommandId_FromBuffer(buffer+i2);
+		if(CmdId){
+			sp++;
+			stack[sp]=CmdId;
+		}
+
+		//開始コマンドを取得（Class、Sub、For、Whileなど…）
+		CmdId=GetStartCommandId_FromBuffer(buffer+i2);
+		if(CmdId){
+			if(sp==-1){
+				if(CmdId==COM_WITH){
+					//オブジェクト識別子を付加
+					i2+=5;
+					while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+					for(i3=0;;i2++,i3++){
+						if(buffer[i2]=='-'&&buffer[i2+1]=='>'){
+							temporary[i3++]=buffer[i2++];
+							temporary[i3]=buffer[i2];
+							continue;
+						}
+						if(buffer[i2]=='['){
+							i4=GetStringInBracket(temporary+i3,buffer+i2);
+							i2+=i4-1;
+							i3+=i4-1;
+							continue;
+						}
+						if(buffer[i2]=='('){
+							i4=GetStringInPare(temporary+i3,buffer+i2);
+							i2+=i4-1;
+							i3+=i4-1;
+							continue;
+						}
+						if(!(IsVariableChar(buffer[i2])||buffer[i2]=='.')){
+							temporary[i3]=0;
+							break;
+						}
+						temporary[i3]=buffer[i2];
+					}
+					lstrcat(temporary,pObjectVar);
+					lstrcpy(pObjectVar,temporary);
+				}
+			}
+			else{
+				if(stack[sp]!=CmdId){
+					pObjectVar[0]=0;
+					break;
+				}
+				sp--;
+			}
+		}
+
+		if(i<=0) break;
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/ExtensionLink.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ExtensionLink.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ExtensionLink.cpp	(revision 774)
@@ -0,0 +1,604 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+
+#ifndef ListView_SetCheckState
+   #define ListView_SetCheckState(hwndLV, i, fCheck) \
+      ListView_SetItemState(hwndLV, i, \
+      INDEXTOSTATEIMAGEMASK((fCheck)+1), LVIS_STATEIMAGEMASK)
+#endif
+
+
+
+COneExt::COneExt(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color){
+	m_bReg=bReg;
+	lstrcpy(m_szExtension,lpszExtension);
+	lstrcpy(m_szNote,lpszNote);
+	m_bWindowsSearch=bWindowsSearch;
+	TabColor=tab_color;
+}
+COneExt::~COneExt(){
+}
+
+CExtLink::CExtLink(){
+	ppobj_ExtItems=(COneExt **)malloc(1);
+	iExtItemNum=0;
+}
+CExtLink::~CExtLink(){
+	int i;
+	for(i=0;i<iExtItemNum;i++){
+		delete ppobj_ExtItems[i];
+	}
+	free(ppobj_ExtItems);
+	ppobj_ExtItems=0;
+}
+
+void CExtLink::load( const std::string &path )
+{
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg(path);
+	if(buffer){
+		int i=0;
+		char temporary[64],temp2[255],temp3[64],temp4[64];
+		while(1){
+			//関連付けをおこなうかどうかのチェック
+			BOOL bReg;
+			i=GetOneParameter(buffer,i,temporary);
+			if(temporary[0]=='\0') break;
+			bReg=atoi(temporary);
+
+			//拡張子
+			i=GetOneParameter(buffer,i,temporary);
+			if(temporary[0]=='\0') break;
+
+			//説明
+			i=GetOneParameter(buffer,i,temp2);
+			if(temp2[0]=='\0') break;
+
+			//Windows検索
+			i=GetOneParameter(buffer,i,temp3);
+			if(temp3[0]=='\0') break;
+
+			//タブの色
+			i=GetOneParameter(buffer,i,temp4);
+			if(temp4[0]=='\0') break;
+
+			DWORD dwColor;
+			sscanf(temp4,"%x",&dwColor);
+
+			add(bReg,temporary,temp2,atoi(temp3),(COLORREF)dwColor);
+
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+				i+=2;
+			}
+			else break;
+		}
+
+		HeapDefaultFree(buffer);
+	}
+	else{
+		//デフォルト値をセット
+		SetInitData();
+	}
+}
+void CExtLink::save( const std::string &path )
+{
+	int i;
+	char buffer[8192];
+	buffer[0]=0;
+	for(i=0;i<iExtItemNum;i++){
+		sprintf(buffer+lstrlen(buffer),"%d,%s,%s,%d,%x\r\n",
+			ppobj_ExtItems[i]->m_bReg,
+			ppobj_ExtItems[i]->m_szExtension,
+			ppobj_ExtItems[i]->m_szNote,
+			ppobj_ExtItems[i]->m_bWindowsSearch,
+			ppobj_ExtItems[i]->TabColor);
+	}
+
+	//保存
+	WriteBuffer(path,buffer,lstrlen(buffer));
+}
+
+BOOL CExtLink::add(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color){
+	//重複チェック
+	int i;
+	for(i=0;i<iExtItemNum;i++){
+		if(lstrcmpi(ppobj_ExtItems[i]->m_szExtension,lpszExtension)==0){
+			return 0;
+		}
+	}
+
+	ppobj_ExtItems=(COneExt **)realloc(ppobj_ExtItems,(iExtItemNum+1)*sizeof(COneExt*));
+	ppobj_ExtItems[iExtItemNum]=new COneExt(bReg,lpszExtension,lpszNote,bWindowsSearch,tab_color);
+	iExtItemNum++;
+
+	return 1;
+}
+void CExtLink::del(char *lpszExtension){
+	int i;
+	for(i=0;i<iExtItemNum;i++){
+		if(lstrcmpi(lpszExtension,ppobj_ExtItems[i]->m_szExtension)==0)
+			break;
+	}
+	if(i==iExtItemNum) return;
+
+	delete ppobj_ExtItems[i];
+
+	iExtItemNum--;
+	for(;i<iExtItemNum;i++){
+		ppobj_ExtItems[i]=ppobj_ExtItems[i+1];
+	}
+}
+
+void CExtLink::SetInitData(void){
+	///////////////////////////////////
+	// 初期立ち上げ時用の値をセット
+	///////////////////////////////////
+
+#ifdef THETEXT
+	add(1,"txt","テキスト ドキュメント",1,TABCOLOR_GRAY);
+	add(0,"htm","HTML ドキュメント",1,TABCOLOR_BLUE);
+	add(0,"html","HTML ドキュメント",1,TABCOLOR_BLUE);
+	add(1,"cgi","CGI ドキュメント",1,TABCOLOR_GREEN);
+	add(1,"pl","Perl ドキュメント",1,TABCOLOR_GREEN);
+	add(1,"php","PHP ドキュメント",1,TABCOLOR_RED);
+	add(1,"tpl","テンプレート ドキュメント",1,TABCOLOR_YELLOW);
+#else
+	add(1,"ab","Basic ソースコード",1,TABCOLOR_BLUE);
+	add(1,"abp","Basic ソースコード",1,TABCOLOR_BLUE);
+	add(1,"bas","Basic ソースコード",1,TABCOLOR_BLUE);
+	add(1,"sbp","サブソースコード",1,TABCOLOR_GREEN);
+	add(1,"pj","ActiveBasic プロジェクト ドキュメント",0,TABCOLOR_GRAY);
+#endif
+}
+
+void CExtLink::ResetListView(HWND hListView){
+	ListView_DeleteAllItems(hListView);
+
+	int i;
+	for(i=0;  i < pobj_nv->pobj_ExtLink->iExtItemNum;  i++){
+		LV_ITEM item;
+
+		//拡張子
+		item.mask=LVIF_TEXT;
+		item.pszText=ppobj_ExtItems[i]->m_szExtension;
+		item.iItem=i;
+		item.iSubItem=0;
+		ListView_InsertItem(hListView,&item);
+
+		//説明
+		item.pszText=ppobj_ExtItems[i]->m_szNote;
+		item.iItem=i;
+		item.iSubItem++;
+		ListView_SetItem(hListView,&item);
+
+		//Windows検索
+		if(ppobj_ExtItems[i]->m_bWindowsSearch)
+			item.pszText="有効";
+		else item.pszText="無効";
+		item.iItem=i;
+		item.iSubItem++;
+		ListView_SetItem(hListView,&item);
+
+		//タブの色
+		if(ppobj_ExtItems[i]->TabColor==TABCOLOR_GRAY)			item.pszText="灰色";
+		else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_WHITE)	item.pszText="白";
+		else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_RED)		item.pszText="赤";
+		else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_GREEN)	item.pszText="緑";
+		else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_BLUE)		item.pszText="青";
+		else if(ppobj_ExtItems[i]->TabColor==TABCOLOR_YELLOW)	item.pszText="黄色";
+		else item.pszText="ユーザー設定";
+		item.iItem=i;
+		item.iSubItem++;
+		ListView_SetItem(hListView,&item);
+
+		//チェックマーク
+		ListView_SetCheckState(hListView,i,ppobj_ExtItems[i]->m_bReg);
+	}
+}
+
+COLORREF CExtLink::GetTabColorFromFilePath( const std::string &filepath )
+{
+	//拡張子を識別し、タブの色を決定
+	char szExt[255],*lpszTemp;
+	_splitpath(filepath.c_str(),NULL,NULL,NULL,szExt);
+	if(szExt[0]=='.') lpszTemp=szExt+1;
+	else lpszTemp=szExt;
+	for(int i=0;i<iExtItemNum;i++){
+		if(lstrcmpi(lpszTemp,ppobj_ExtItems[i]->m_szExtension)==0){
+			return ppobj_ExtItems[i]->TabColor;
+		}
+	}
+	return TABCOLOR_GRAY;
+}
+
+
+BOOL CALLBACK DlgFileLinkAdd(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static COneExt *pobj_OneExt;
+
+	static int TabColor;
+	switch(message){
+		case WM_INITDIALOG:
+			if(lParam){
+				pobj_OneExt=(COneExt *)lParam;
+
+				SetDlgItemText(hwnd,IDC_EXTENSION,pobj_OneExt->m_szExtension);
+				SetDlgItemText(hwnd,IDC_NOTE,pobj_OneExt->m_szNote);
+				TabColor=pobj_OneExt->TabColor;
+
+				if(pobj_OneExt->m_bWindowsSearch)
+					SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_SETCHECK,BST_CHECKED,0);
+				else
+					SendDlgItemMessage(hwnd,IDC_SEARCH_OFF,BM_SETCHECK,BST_CHECKED,0);
+
+				EnableWindow(GetDlgItem(hwnd,IDC_EXTENSION),0);
+
+				SetFocus(GetDlgItem(hwnd,IDC_NOTE));
+			}
+			else{
+				pobj_OneExt=0;
+				TabColor=TABCOLOR_GRAY;
+
+				SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_SETCHECK,BST_CHECKED,0);
+
+				SetFocus(GetDlgItem(hwnd,IDC_EXTENSION));
+			}
+
+			SendMessage(hwnd,WM_COMMAND,IDC_EXTENSION,0);
+
+			break;
+		case WM_DRAWITEM:
+			LPDRAWITEMSTRUCT pds;
+			pds=(LPDRAWITEMSTRUCT)lParam;
+
+			HBRUSH hBrush,hOldBrush;
+
+			if(wParam==IDC_COLOR_BUTTON){
+				//////////////
+				// 色を描画
+				//////////////
+
+				//ペンとブラシを生成
+				HPEN hPen,hOldPen;
+				hPen=(HPEN)GetStockObject(WHITE_PEN);
+				hBrush=CreateSolidBrush(TabColor);
+
+				//塗りつぶす
+				hOldPen=(HPEN)SelectObject(pds->hDC,hPen);
+				hOldBrush=(HBRUSH)SelectObject(pds->hDC,hBrush);
+				Rectangle(pds->hDC,0,0,pds->rcItem.right,pds->rcItem.bottom);
+				SelectObject(pds->hDC,hOldPen);
+				SelectObject(pds->hDC,hOldBrush);
+
+				//ブラシを破棄
+				DeleteObject(hBrush);
+			}
+			return 1;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					char szExtension[64];
+					GetDlgItemText(hwnd,IDC_EXTENSION,szExtension,64);
+
+					char szNote[255];
+					GetDlgItemText(hwnd,IDC_NOTE,szNote,255);
+
+					BOOL bWindowsSearch;
+					if(SendDlgItemMessage(hwnd,IDC_SEARCH_ON,BM_GETCHECK,0,0))
+						bWindowsSearch=1;
+					else bWindowsSearch=0;
+
+					if(pobj_OneExt){
+						//変更
+						lstrcpy(pobj_OneExt->m_szNote,szNote);
+						pobj_OneExt->m_bWindowsSearch=bWindowsSearch;
+						pobj_OneExt->TabColor=TabColor;
+					}
+					else{
+						//追加
+						if(!pobj_nv->pobj_ExtLink->add(1,szExtension,szNote,bWindowsSearch,TabColor)){
+							char temporary[255];
+							sprintf(temporary,"拡張子 %s は既にリストに存在します。",szExtension);
+							MessageBox(hwnd,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+
+							return 1;
+						}
+					}
+
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+				case IDC_COLOR_BUTTON:
+					POINT pos;
+					GetCursorPos(&pos);
+					extern HMENU hTabColorMenu;
+					TrackPopupMenu(hTabColorMenu,TPM_LEFTALIGN,pos.x,pos.y,0,hwnd,0);
+					return 1;
+
+				case IDC_EXTENSION:
+					if(GetWindowTextLength(GetDlgItem(hwnd,IDC_EXTENSION)))
+						EnableWindow(GetDlgItem(hwnd,IDOK),1);
+					else
+						EnableWindow(GetDlgItem(hwnd,IDOK),0);
+					return 1;
+
+				case IDM_USER_COLOR:
+					COLORREF colorUser;
+					colorUser=TabColor;
+					{
+						CHOOSECOLOR cc;
+						COLORREF CusColors[16]={
+							RGB(255,255,255),
+							RGB(0,0,0),
+							RGB(128,128,128),
+							RGB(192,192,192),
+							RGB(128,0,0),
+							RGB(255,0,0),
+							RGB(128,128,0),
+							RGB(255,255,0),
+							RGB(0,128,0),
+							RGB(0,255,0),
+							RGB(0,128,128),
+							RGB(0,255,255),
+							RGB(0,0,128),
+							RGB(0,0,255),
+							RGB(128,0,128),
+							RGB(255,0,255)};
+						cc.lStructSize=sizeof(CHOOSECOLOR);
+						cc.hwndOwner=hwnd;
+						cc.rgbResult=colorUser;
+						cc.lpCustColors=CusColors;
+						cc.Flags=CC_RGBINIT|CC_FULLOPEN;
+						if(!ChooseColor(&cc)){
+							return 0;
+						}
+						colorUser=cc.rgbResult;
+					}
+				case IDM_GRAY:
+				case IDM_WHITE:
+				case IDM_RED:
+				case IDM_GREEN:
+				case IDM_BLUE:
+				case IDM_YELLOW:
+					if(LOWORD(wParam)==IDM_GRAY)	TabColor=TABCOLOR_GRAY;
+					if(LOWORD(wParam)==IDM_WHITE)	TabColor=TABCOLOR_WHITE;
+					if(LOWORD(wParam)==IDM_RED)		TabColor=TABCOLOR_RED;
+					if(LOWORD(wParam)==IDM_GREEN)	TabColor=TABCOLOR_GREEN;
+					if(LOWORD(wParam)==IDM_BLUE)	TabColor=TABCOLOR_BLUE;
+					if(LOWORD(wParam)==IDM_YELLOW)	TabColor=TABCOLOR_YELLOW;
+					if(LOWORD(wParam)==IDM_USER_COLOR) TabColor=colorUser;
+					InvalidateRect(GetDlgItem(hwnd,IDC_COLOR_BUTTON),NULL,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+
+BOOL CALLBACK DlgLinkFile(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i;
+	HWND hListView;
+	char temporary[255];
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+
+
+			///////////////////////////
+			// カラムの設定
+			///////////////////////////
+
+			//拡張スタイル
+			DWORD dwStyle;
+			hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+			dwStyle=ListView_GetExtendedListViewStyle(hListView);
+			dwStyle|=LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES;
+			ListView_SetExtendedListViewStyle(hListView,dwStyle);
+
+			LV_COLUMN ListView_Column;
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			ListView_Column.cx=50;
+			ListView_Column.pszText="拡張子";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=150;
+			ListView_Column.pszText="説明";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=90;
+			ListView_Column.pszText="Windows検索";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+			ListView_Column.cx=80;
+			ListView_Column.pszText="タブの色";
+			ListView_Column.iSubItem++;
+			ListView_InsertColumn(hListView,ListView_Column.iSubItem,&ListView_Column);
+
+
+			pobj_nv->pobj_ExtLink->ResetListView(hListView);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_ADD_BUTTON:
+					if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_EXTENSION_ADD),hwnd,(DLGPROC)DlgFileLinkAdd,0)) return 1;
+
+					pobj_nv->pobj_ExtLink->ResetListView(GetDlgItem(hwnd,IDC_EXTENSION_LIST));
+
+					return 1;
+				case IDC_EDIT_BUTTON:
+					hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+							break;
+						}
+					}
+					if(i==ListView_GetItemCount(hListView)) return 1;
+
+					if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_EXTENSION_ADD),hwnd,(DLGPROC)DlgFileLinkAdd,(LPARAM)pobj_nv->pobj_ExtLink->ppobj_ExtItems[i])) return 1;
+
+					pobj_nv->pobj_ExtLink->ResetListView(GetDlgItem(hwnd,IDC_EXTENSION_LIST));
+
+					return 1;
+				case IDC_DELETE_BUTTON:
+					hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						if(ListView_GetItemState(hListView,i,LVIS_SELECTED)){
+							ListView_GetItemText(hListView,i,0,temporary,255);
+
+							char temp2[255];
+							sprintf(temp2,"%s をリストから削除します。",temporary);
+							if(MessageBox(hwnd,temp2,APPLICATION_NAME,MB_OKCANCEL)==IDCANCEL) return 1;
+
+							ListView_DeleteItem(hListView,i);
+
+							pobj_nv->pobj_ExtLink->del(temporary);
+							break;
+						}
+					}
+					return 1;
+				case IDOK:
+					hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_bReg=ListView_GetCheckState(hListView,i);
+					}
+
+					if(MessageBox(hwnd,"指定された内容で拡張子に関するレジストリキーを登録します。よろしいですか？",APPLICATION_NAME,MB_YESNO)==IDNO)
+						return 1;
+
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+					for(i=0;i<ListView_GetItemCount(hListView);i++){
+						pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_bReg=ListView_GetCheckState(hListView,i);
+					}
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			hListView=GetDlgItem(hwnd,IDC_EXTENSION_LIST);
+
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hListView&&hdr->code==NM_DBLCLK){
+				SendMessage(hwnd,WM_COMMAND,IDC_EDIT_BUTTON,0);
+			}
+			break;
+	}
+	return 0;
+}
+
+HKEY ClassRoot_CreateKey(char *path,char *lpszData){
+	HKEY hKey;
+	RegCreateKeyEx(HKEY_CLASSES_ROOT,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+	RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)lpszData,lstrlen(lpszData));
+	return hKey;
+}
+void ExtensionLink(HWND hwnd){
+	int i;
+	HKEY hKey;
+
+	//初期状態の重複起動で関連付けを作動しないようにする
+	pobj_nv->save();
+
+	if(DialogBox(hResInst,MAKEINTRESOURCE(IDD_EXTENSION_LINK),hwnd,(DLGPROC)DlgLinkFile)==0) return;
+
+	char szApplicationPath[MAX_PATH];
+	GetModuleFileName(hInst,szApplicationPath,MAX_PATH);
+
+	char temporary[MAX_PATH],temp2[255],temp3[255];
+	for(i=0;i<pobj_nv->pobj_ExtLink->iExtItemNum;i++){
+		if(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_bReg==0) continue;
+
+		//「.拡張子」キー
+		sprintf(temp2,".%s",pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension);
+		sprintf(temp3,"%sfile",pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension);
+		hKey=ClassRoot_CreateKey(temp2,temp3);
+
+		sprintf(temp2,"text/plain",pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension);
+		RegSetValueEx(hKey,"Content Type",0,REG_SZ,(const unsigned char *)temp2,lstrlen(temp2));
+
+		RegCloseKey(hKey);
+
+
+		if(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_bWindowsSearch){
+			//検索対象に含める
+			sprintf(temporary,".%s\\PersistentHandler",pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension);
+			hKey=ClassRoot_CreateKey(temporary,"{5e941d80-bf96-11cd-b579-08002b30bfeb}");
+			RegCloseKey(hKey);
+		}
+		else{
+			//検索対象に含めない
+			sprintf(temporary,".%s\\PersistentHandler",pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension);
+			RegDeleteKey(HKEY_CLASSES_ROOT,temporary);
+		}
+
+
+		//説明
+		RegCreateKeyEx(HKEY_CLASSES_ROOT,temp3,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+		RegSetValueEx(hKey,NULL,0,REG_SZ,
+			(const unsigned char *)pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szNote,
+			lstrlen(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szNote));
+		RegCloseKey(hKey);
+
+
+		//アプリケーションパス
+		sprintf(temporary,"\"%s\" \"%%1\"",szApplicationPath);
+		sprintf(temp2,"%s\\shell\\open\\command",temp3);
+		RegCreateKeyEx(HKEY_CLASSES_ROOT,temp2,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+		RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)temporary,lstrlen(temporary));
+		RegCloseKey(hKey);
+
+
+#ifndef THETEXT
+		/////////////////////
+		// アイコン設定
+		// ※ProjectEditorのみ
+		/////////////////////
+
+		sprintf(temp2,"%s\\DefaultIcon",temp3);
+		if(lstrcmpi(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension,"bas")==0){
+			sprintf(temporary,"\"%s\",8",szApplicationPath);
+			RegCreateKeyEx(HKEY_CLASSES_ROOT,temp2,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+			RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)temporary,lstrlen(temporary));
+			RegCloseKey(hKey);
+		}
+		if(lstrcmpi(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension,"ab")==0||
+			lstrcmpi(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension,"abp")==0){
+			sprintf(temporary,"\"%s\",8",szApplicationPath);
+			RegCreateKeyEx(HKEY_CLASSES_ROOT,temp2,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+			RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)temporary,lstrlen(temporary));
+			RegCloseKey(hKey);
+		}
+		if(lstrcmpi(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension,"sbp")==0){
+			sprintf(temporary,"\"%s\",9",szApplicationPath);
+			RegCreateKeyEx(HKEY_CLASSES_ROOT,temp2,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+			RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)temporary,lstrlen(temporary));
+			RegCloseKey(hKey);
+		}
+		if(lstrcmpi(pobj_nv->pobj_ExtLink->ppobj_ExtItems[i]->m_szExtension,"pj")==0){
+			sprintf(temporary,"\"%s\",7",szApplicationPath);
+			RegCreateKeyEx(HKEY_CLASSES_ROOT,temp2,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,NULL);
+			RegSetValueEx(hKey,NULL,0,REG_SZ,(const unsigned char *)temporary,lstrlen(temporary));
+			RegCloseKey(hKey);
+		}
+#endif
+	}
+
+	//アイコンの関連付けを瞬時に反映させる
+	SHChangeNotify( SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL );
+}
Index: branches/egtra/ab5.0/abdev/abdev/ExtensionLink.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ExtensionLink.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ExtensionLink.h	(revision 774)
@@ -0,0 +1,37 @@
+
+class COneExt{
+public:
+	BOOL m_bReg;
+	char m_szExtension[64];
+	char m_szNote[255];
+	BOOL m_bWindowsSearch;
+
+	COLORREF TabColor;
+
+	COneExt(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color);
+	~COneExt();
+};
+
+class CExtLink{
+public:
+	COneExt **ppobj_ExtItems;
+	int iExtItemNum;
+
+	CExtLink();
+	~CExtLink();
+
+	void load( const std::string &path );
+	void save( const std::string &path );
+
+	BOOL add(BOOL bReg,char *lpszExtension,char *lpszNote,BOOL bWindowsSearch,COLORREF tab_color);
+	void del(char *lpszExtension);
+
+	void SetInitData();
+
+	void ResetListView(HWND hListView);
+
+	COLORREF GetTabColorFromFilePath( const std::string &filepath );
+};
+
+
+void ExtensionLink(HWND hwnd);
Index: branches/egtra/ab5.0/abdev/abdev/FileOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/FileOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/FileOperation.cpp	(revision 774)
@@ -0,0 +1,626 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+char *ReadBuffer( const std::string &path ){
+	extern HANDLE hHeap;
+	int i;
+	DWORD dw;
+	char *buffer,temporary[MAX_PATH];
+
+	ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+	if(hFile==INVALID_HANDLE_VALUE){
+		hFile.Detach();
+		//"\"%s\" ファイルの読み込みに失敗しました。"
+		sprintf(temporary,STRING_ERROR_CANT_FILEOPEN,path.c_str());
+		MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+
+		return 0;
+	}
+	i=GetFileSize(hFile,0);
+	buffer=(char *)HeapAlloc(hHeap,0,i+1);
+	ReadFile(hFile,buffer,i,&dw,0);
+	buffer[dw]=0;
+	return buffer;
+}
+char *ReadBuffer_NonErrMsg( const std::string &path ){
+	extern HANDLE hHeap;
+	DWORD dw;
+
+	ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+	if(hFile==INVALID_HANDLE_VALUE){
+		hFile.Detach();
+		return 0;
+	}
+	int i=GetFileSize(hFile,0);
+	char *buffer=(char *)HeapAlloc(hHeap,0,i+1);
+	ReadFile(hFile,buffer,i,&dw,0);
+	buffer[dw]=0;
+	return buffer;
+}
+_int8 WriteBuffer(const std::string &path,const char *buffer,int length, bool isEnableError)
+{
+	DWORD dw;
+	ATL::CHandle hFile(CreateFile(path.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
+	if(hFile==INVALID_HANDLE_VALUE){
+		hFile.Detach();
+
+		char temporary[MAX_PATH];
+		if( isEnableError ){
+			//"\"%s\" ファイルへの書き込みに失敗しました。"
+			sprintf(temporary,STRING_ERROR_CANT_FILESAVE,path);
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+		}
+		return 0;
+	}
+	if(length) WriteFile(hFile,buffer,length,&dw,NULL);
+	return 1;
+}
+_int8 WriteBuffer_NonErrMsg(const std::string &path,char *buffer,int length){
+	return WriteBuffer( path, buffer, length, false );
+}
+void GetRelationalPath(char *path,char *dir){
+	//相対パスを取得
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH],temp4[MAX_PATH];
+
+	//ドライブ名をチェック
+	_splitpath(path,temporary,0,0,0);
+	_splitpath(dir,temp2,0,0,0);
+	if(lstrcmpi(temporary,temp2)!=0) return;
+
+	_splitpath(path,0,temporary,0,0);
+	_splitpath(dir,0,temp2,0,0);
+	i=1;i2=1;
+	while(1){
+		i4=i;
+		if(temporary[i-1]=='\\'&&temporary[i]){	//path側
+			for(i3=0;;i++,i3++){
+				if(temporary[i]=='\\'){
+					temp3[i3]=0;
+					i++;
+					break;
+				}
+				temp3[i3]=temporary[i];
+			}
+		}
+		else temp3[0]=0;
+
+		i5=i2;
+		if(temp2[i2-1]=='\\'&&temp2[i2]){		//dir側
+			for(i3=0;;i2++,i3++){
+				if(temp2[i2]=='\\'){
+					temp4[i3]=0;
+					i2++;
+					break;
+				}
+				temp4[i3]=temp2[i2];
+			}
+		}
+		else temp4[0]=0;
+
+		if(temp3[0]=='\0'&&temp4[0]=='\0') break;
+
+		if(lstrcmpi(temp3,temp4)!=0){
+			for(i3=0;;i5++){
+				if(temp2[i5]=='\0') break;
+				if(temp2[i5]=='\\') i3++;
+			}
+			temp3[0]=0;
+			for(i2=0;i2<i3;i2++) lstrcat(temp3,"..\\");
+			lstrcat(temp3,temporary+i4);
+			break;
+		}
+	}
+	_splitpath(path,0,0,temporary,temp2);
+	lstrcat(temp3,temporary);
+	lstrcat(temp3,temp2);
+	lstrcpy(path,temp3);
+}
+void GetFullPath(char *path,const char *dir){
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH];
+
+	if(strstr(path,":")||strstr(path,"\\\\")) return;
+
+	i=0;i2=0;
+	while(1){
+		if(path[i]=='.'&&path[i+1]=='\\') i+=2;
+		if(path[i]=='.'&&path[i+1]=='.'&&path[i+2]=='\\'){
+			i2++;
+			i+=3;
+		}
+		else break;
+	}
+
+	i3=lstrlen(dir);i4=0;
+	while(i4<i2){
+		for(i3--;;i3--){
+			if(dir[i3-1]=='\\'){
+				i4++;
+				break;
+			}
+		}
+	}
+	memcpy(temporary,dir,i3);
+	temporary[i3]=0;
+	lstrcat(temporary,path+i);
+	lstrcpy(path,temporary);
+}
+
+void RemoveDirectoryStrong(const char *dirPath){
+	char tempDirPath[MAX_PATH];
+	lstrcpy( tempDirPath, dirPath );
+
+	if( tempDirPath[lstrlen(tempDirPath)-1] == '\\' ){
+		 tempDirPath[lstrlen(tempDirPath)-1] = 0;
+	}
+
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	char temporary[MAX_PATH];
+	sprintf(temporary,"%s\\*",tempDirPath);
+
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind!=INVALID_HANDLE_VALUE){
+		do{
+			if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
+				if(!(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0)){
+					//ディレクトリのとき
+					sprintf(temporary,"%s\\%s\\",tempDirPath,wfd.cFileName);
+					RemoveDirectoryStrong(temporary);
+				}
+			}
+			else{
+				//ファイルのとき
+				sprintf(temporary,"%s\\%s",tempDirPath,wfd.cFileName);
+
+				DeleteFile(temporary);
+			}
+		}while(FindNextFile(hFind,&wfd));
+
+		FindClose( hFind );
+	}
+
+	if( !RemoveDirectory(tempDirPath) ){
+		OutputDebugString( GetLastErrorString().c_str() );
+		OutputDebugString( "\r\n" );
+		OutputDebugString( "一時ディレクトリの削除に失敗\r\n" );
+	}
+}
+
+BOOL GetFilePathDialog(HWND hwnd,char *filename,LPSTR Filter,LPSTR Title,_int8 IsOpen){
+	OPENFILENAME ofstr;
+	filename[0]=0;
+	ofstr.lStructSize=sizeof(OPENFILENAME);
+	ofstr.hwndOwner=hwnd;
+	ofstr.hInstance=0;
+	ofstr.lpstrFilter=Filter;
+	ofstr.lpstrCustomFilter=NULL;
+	ofstr.nMaxCustFilter=0;
+	ofstr.nFilterIndex=1;
+	ofstr.lpstrFile=filename;
+	ofstr.nMaxFile=MAX_PATH;
+	ofstr.lpstrFileTitle=NULL;
+	ofstr.nMaxFileTitle=0;
+	ofstr.lpstrInitialDir=pobj_nv->DefSaveDir;
+	ofstr.lpstrTitle=Title;
+	ofstr.Flags=OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST;
+	ofstr.nFileOffset=0;
+	ofstr.nFileExtension=0;
+	ofstr.lpstrDefExt="*";
+	ofstr.lCustData=NULL;
+	ofstr.lpfnHook=NULL;
+	ofstr.lpTemplateName=NULL;
+	if(IsOpen){
+		if(!GetOpenFileName(&ofstr)) return FALSE;
+	}
+	else{
+		if(!GetSaveFileName(&ofstr)) return FALSE;
+	}
+
+	//次回の初期ディレクトリをセット
+	char temporary[MAX_PATH];
+	_splitpath(filename,pobj_nv->DefSaveDir,temporary,NULL,NULL);
+	lstrcat(pobj_nv->DefSaveDir,temporary);
+
+	return TRUE;
+}
+BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle){
+	BROWSEINFO BrowseInfo;
+	LPITEMIDLIST pidlBrowse;
+	LPMALLOC g_pMalloc;
+	char temporary[MAX_PATH];
+
+	BrowseInfo.hwndOwner=hWnd;
+	BrowseInfo.pszDisplayName=temporary;
+	BrowseInfo.pidlRoot=NULL;
+	BrowseInfo.lpszTitle=OpenFolderTitle;
+	BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
+	BrowseInfo.lpfn=NULL;
+	BrowseInfo.lParam=(LPARAM)0;
+	BrowseInfo.iImage=0;
+	pidlBrowse=SHBrowseForFolder(&BrowseInfo);
+	if(pidlBrowse){
+		if(SHGetMalloc(&g_pMalloc)!=0) return 0;
+		SHGetPathFromIDList(pidlBrowse,folder);
+		g_pMalloc->Free(pidlBrowse);
+		g_pMalloc->Release();
+		return 1;
+	}
+	return 0;
+}
+
+int GetFileExtension( const char *path )
+{
+	char temporary[MAX_PATH];
+	_splitpath(path,0,0,0,temporary);
+
+	if(lstrcmpi(temporary,".bas")==0||
+		lstrcmpi(temporary,".ab")==0||
+		lstrcmpi(temporary,".abp")==0) return FT_BASICPROGRAM;
+	if(lstrcmpi(temporary,".sbp")==0) return FT_SUBPROGRAM;
+	if(lstrcmpi(temporary,".txt")==0) return FT_TEXT;
+	if(lstrcmpi(temporary,".pj")==0) return FT_PROJECT;
+	if(lstrcmpi(temporary,".ico")==0) return FT_ICON;
+
+	if(lstrcmpi(temporary,".html")==0||
+		lstrcmpi(temporary,".htm")==0||
+		lstrcmpi(temporary,".tpl")==0||
+		lstrcmpi(temporary,".php")==0)
+		return FT_HTML;
+
+	return FT_OTHER;
+}
+HWND OpenFileWithExtension( const std::string &filePath )
+{
+	int i;
+	_int8 DocumentType;
+
+	// TODO:
+	char const *OpenFileName = filePath.c_str();
+
+	i=GetFileExtension(OpenFileName);
+
+#ifndef THETEXT
+	if(i==FT_PROJECT){
+		//「最近使ったプロジェクト」に追加
+		pobj_nv->pobj_ProjectHistory->insert(OpenFileName);
+
+		projectInfo.Load(OpenFileName);
+		return 0;
+	}
+#endif
+
+	//「最近使ったファイル」に追加
+	pobj_nv->pobj_History->insert(OpenFileName);
+
+	if(i==FT_ICON){
+		NewIconEditWindow(OpenFileName);
+		return 0;
+	}
+	else if(i==FT_BASICPROGRAM||i==FT_SUBPROGRAM){
+		DocumentType=WNDTYPE_BASIC;
+
+#ifdef THETEXT
+		DocumentType=WNDTYPE_TEXT;
+#endif
+	}
+	else if(i==FT_HTML) DocumentType=WNDTYPE_HTML;
+	else DocumentType=WNDTYPE_TEXT;
+
+	COLORREF TabColor;
+	TabColor=pobj_nv->pobj_ExtLink->GetTabColorFromFilePath( filePath );
+
+	return NewTextEditWindow(OpenFileName,DocumentType,TabColor);
+}
+
+BOOL GetFileInformationByHandleWrap(HANDLE hFile, BY_HANDLE_FILE_INFORMATION& fi){
+	typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
+	GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
+		GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
+	if(pgfibh){
+		return pgfibh(hFile, &fi);
+	}
+	else{
+		SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+		return FALSE;
+	}
+}
+
+//重複チェック用のデータを設定
+void SetFileIdentity(FILEIDENTITY &fi, BY_HANDLE_FILE_INFORMATION const &bhfi){
+	fi.VolumeSerialNumber = bhfi.dwVolumeSerialNumber;
+	fi.FileIndexHigh = bhfi.nFileIndexHigh;
+	fi.FileIndexLow = bhfi.nFileIndexLow;
+}
+
+void SetFileIdentityFromFile(MDIINFO &mi, HANDLE hFile){
+	BY_HANDLE_FILE_INFORMATION fi;
+	if(GetFileInformationByHandleWrap(hFile, fi)){
+		SetFileIdentity(mi.FileIdentity, fi);
+	}
+}
+
+BOOL SaveDocument(HWND hChild,char *SaveFileName){	//ウィンドウからバッファを読み取り、ファイルに保存
+	//SaveFileNameがNULLのときは上書き保存を試みる。
+	extern LPSTR IconFileFilter;
+	extern HWND hClient,hDocCombo;
+	int WndNum,i2;
+	char temporary[MAX_PATH],str[MAX_PATH],str2[32];
+	DWORD dummy;
+
+	WndNum=GetWndNum(hChild);
+
+	std::string oldTitle = MdiInfo[WndNum]->title;
+
+	if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD||MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+		////////////////////////////////////
+		// RADツール及びメニューエディタ
+		////////////////////////////////////
+
+		if(projectInfo.ModifyOfMaterial){
+			std::string const& workDir = projectInfo.GetWorkDir().GetPath();
+			std::string const& projName = projectInfo.GetName();
+			std::string t;
+			t.reserve( workDir.size() + projName.size() + 4 );
+			t += workDir;
+			t += projName;
+			t += ".wnd";
+			SaveWindowFile( t.c_str(), projectInfo.windowInfos );
+
+			//.wbpファイルを生成
+			SaveWindowProgram();
+		}
+	}
+	else if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		//////////////////////////
+		// テキストドキュメント
+		//////////////////////////
+
+		if(SaveFileName){
+			lstrcpy(temporary,SaveFileName);
+			{
+				ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL));
+				if(fh==INVALID_HANDLE_VALUE){
+					fh.Detach();
+					sprintf(str,STRING_FILE_OVERWRIDE,temporary);
+					if(MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNO|MB_ICONINFORMATION)==IDNO){
+						return 0;
+					}
+				}
+			}
+
+			//ドキュメント セレクト コンボボックスから消去
+			i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
+
+			//新しいパスをセット
+			MdiInfo[WndNum]->path = temporary;
+
+			//ドキュメント セレクト コンボボックスに挿入
+			_splitpath(temporary,NULL,NULL,str,str2);
+			lstrcat(str,str2);
+			MdiInfo[WndNum]->title = str;
+			SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+
+			//MDIウィンドウのタイトルを再設定
+			SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
+		}
+		else{
+			if(MdiInfo[WndNum]->path.empty()){
+				//"保存先のファイルを指定してください"
+get_file_path:
+
+				LPSTR ff;
+
+				extern LPSTR DefFileFilter;
+				extern LPSTR HtmlFileFilter;
+				extern LPSTR TextFileFilter;
+				if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
+					ff=DefFileFilter;
+				else if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML)
+					ff=HtmlFileFilter;
+				else if(MdiInfo[WndNum]->DocType==WNDTYPE_TEXT)
+					ff=TextFileFilter;
+
+				if(!GetFilePathDialog(hOwner,temporary,ff,STRING_FILESAVETITLE_DEFAULT,FALSE)) return 0;
+				SaveDocument(hChild,temporary);
+				return 1;
+			}
+			lstrcpy(temporary,MdiInfo[WndNum]->path.c_str());
+		}
+
+		if(!IsExistFile(temporary)){
+			//保存先ファイルが存在しないとき
+			char temp2[MAX_PATH];
+
+			//初期ディレクトリをセット
+			_splitpath(temporary,pobj_nv->DefSaveDir,temp2,NULL,NULL);
+			lstrcat(pobj_nv->DefSaveDir,temp2);
+
+			goto get_file_path;
+		}
+
+		//文字コードを復元
+		char *pBuf;
+		pBuf=nkf.RestoreBuffer(MdiInfo[WndNum]->pMdiTextEdit->buffer,MdiInfo[WndNum]->pMdiTextEdit->iCharCode);
+
+		//改行コードを復元
+		if(MdiInfo[WndNum]->pMdiTextEdit->iLfCode==LFCODE_LF) nkf.ToLF(pBuf);
+		else if(MdiInfo[WndNum]->pMdiTextEdit->iLfCode==LFCODE_CR) nkf.ToCR(pBuf);
+
+
+		////////////////////////
+		// 保存
+		////////////////////////
+
+		{
+			ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
+			if(fh==INVALID_HANDLE_VALUE){
+				fh.Detach();
+				sprintf(str,STRING_ERROR_CANT_FILESAVE,temporary);
+				MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONSTOP);
+				return 0;
+			}
+			WriteFile(fh,pBuf,strlen(pBuf),&dummy,NULL);
+			SetFileIdentityFromFile(*MdiInfo[WndNum], fh);
+		}
+
+
+		HeapDefaultFree(pBuf);
+
+		//変更フラグをオフにする
+		MdiInfo[WndNum]->pMdiTextEdit->UnModify();
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		///////////////////
+		// ICON
+		///////////////////
+
+		if(SaveFileName){
+			lstrcpy(temporary,SaveFileName);
+			{
+				ATL::CHandle fh(CreateFile(temporary,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL));
+				if(fh==INVALID_HANDLE_VALUE){
+					fh.Detach();
+					sprintf(str,STRING_FILE_OVERWRIDE,temporary);
+					if(MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNO|MB_ICONINFORMATION)==IDNO){
+						return 0;
+					}
+				}
+			}
+			MdiInfo[WndNum]->path = temporary;
+			i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
+			_splitpath(temporary,NULL,NULL,str,str2);
+			lstrcat(str,str2);
+			MdiInfo[WndNum]->title = str;
+			SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+			SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
+		}
+		else{
+			if(MdiInfo[WndNum]->path.empty()){
+				//"保存先のファイルを指定してください"
+				if(!GetFilePathDialog(hOwner,temporary,IconFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return 0;
+				SaveDocument(hChild,temporary);
+				return 1;
+			}
+			lstrcpy(temporary,MdiInfo[WndNum]->path.c_str());
+		}
+		SaveIconFile(temporary,hChild);
+
+		MdiInfo[WndNum]->MdiIconEditInfo->bModify=0;
+	}
+
+
+	//タブコントロールを再設定
+	if(pobj_nv->bSaveTabToHead){
+		COLORREF color;
+		color=pobj_MainTab->GetItemColor(oldTitle.c_str());
+		pobj_MainTab->DeleteItem( oldTitle.c_str(), false );
+		pobj_MainTab->InsertItem( hChild, MdiInfo[WndNum]->title.c_str(), false, color );
+	}
+	else{
+		pobj_MainTab->RenameItem( oldTitle.c_str(), MdiInfo[WndNum]->title.c_str() );
+	}
+
+	//「最近使ったファイル」を更新
+	pobj_nv->pobj_History->insert(MdiInfo[WndNum]->path.c_str());
+
+	return 1;
+}
+BOOL ShortPathToLongPath(char ShortPath[MAX_PATH],char *LongPath){
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	int i;
+	char dummy[MAX_PATH];
+	for(i=0;i<MAX_PATH;i++){
+		LongPath[i]=ShortPath[i];
+		if((ShortPath[i-1]==':'&&ShortPath[i]=='\\')||(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\')){
+			LongPath[i+1]=0;
+			break;
+		}
+	}
+	if(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\'){
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+		for(i++;i<MAX_PATH;i++){
+			if(IsDBCSLeadByte(ShortPath[i])){
+				i++;
+				continue;
+			}
+			LongPath[i]=ShortPath[i];
+			if(ShortPath[i]=='\\'){
+				LongPath[i+1]=0;
+				break;
+			}
+		}
+	}
+	for(i++;i<MAX_PATH;i++){
+		if(IsDBCSLeadByte(ShortPath[i])){
+			i++;
+			continue;
+		}
+		if(ShortPath[i]=='\\'||ShortPath[i]=='\0'){
+			strncpy(dummy,ShortPath,i);
+			dummy[i]=0;
+			if((hFind=FindFirstFile(dummy,&wfd))!=INVALID_HANDLE_VALUE) FindClose(hFind);
+			lstrcat(LongPath,wfd.cFileName);
+
+			if(ShortPath[i]=='\0') break;
+			lstrcat(LongPath,"\\");
+
+			if(ShortPath[i]=='\\'&&ShortPath[i+1]=='\0'){
+				break;
+			}
+		}
+	}
+	return 1;
+}
+
+bool IsExistFile( const char *FilePath ){
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind;
+
+	hFind = FindFirstFile(FilePath,&wfd);
+	if( hFind == INVALID_HANDLE_VALUE ){
+		return false;
+	}
+	FindClose( hFind );
+
+	return true;
+}
+
+bool IsExistDirectory( const char *DirPath ){
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind;
+
+	hFind = FindFirstFile(DirPath,&wfd);
+	if( hFind == INVALID_HANDLE_VALUE ){
+		//存在しない
+		return false;
+	}
+	FindClose( hFind );
+
+	if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){
+		//ディレクトリの場合
+		return true;
+	}
+
+	//存在しない
+	return false;
+}
Index: branches/egtra/ab5.0/abdev/abdev/FileTree.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/FileTree.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/FileTree.cpp	(revision 774)
@@ -0,0 +1,241 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+FileListTreeViewCtrl *pobj_FileTree;
+
+WNDPROC OldFileTreeViewProc;
+
+BOOL CALLBACK DlgProject_FileProperty(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	HTREEITEM hTreeItem;
+	int i;
+	char temporary[MAX_PATH];
+	FILETIME LastWriteTime,LocalTime;
+	SYSTEMTIME SystemTime;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+
+				hTreeItem = pobj_FileTree->GetSelectedItem();
+
+				std::string tempPath = projectInfo.fileSystem.root.FindFile( hTreeItem ).GetRelationalPath();
+
+				//絶対パス、相対パスを表示
+				lstrcpy( temporary, tempPath.c_str() );
+				lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+				SetDlgItemText(hwnd,IDC_USING_FILE,temporary);
+				SetDlgItemText(hwnd,IDC_DEFINED_FILE,tempPath.c_str());
+
+				//最終更新日時を表示
+				ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+				if(hFile==INVALID_HANDLE_VALUE){
+					hFile.Detach();
+					//"エラー"
+					lstrcpy(temporary,STRING_ERROR);
+				}
+				else{
+					GetFileTime(hFile,NULL,NULL,&LastWriteTime);
+					FileTimeToLocalFileTime(&LastWriteTime,&LocalTime);
+					FileTimeToSystemTime(&LocalTime,&SystemTime);
+					if(SystemTime.wHour>=12){
+						//"午後 "
+						lstrcpy(temporary,STRING_AFTERNOON);
+						lstrcat(temporary," ");
+						SystemTime.wHour-=12;
+					}
+					else{
+						//"午前 "
+						lstrcpy(temporary,STRING_MORNING);
+						lstrcat(temporary," ");
+					}
+					sprintf(temporary+5,"%02d:%02d:%02d %04d/%02d/%02d",
+						SystemTime.wHour,SystemTime.wMinute,SystemTime.wSecond,
+						SystemTime.wYear,SystemTime.wMonth,SystemTime.wDay);
+				}
+				SetDlgItemText(hwnd,IDC_UPDATE_TIME,temporary);
+
+
+				//////////////
+				// 形式を表示
+				//////////////
+				i=GetFileExtension(tempPath.c_str());
+
+				//"Basic プログラム"
+				if(i==FT_BASICPROGRAM) lstrcpy(temporary,STRING_FILETYPE_BASICPROGRAM);
+				//"サブ プログラム"
+				else if(i==FT_SUBPROGRAM) lstrcpy(temporary,STRING_FILETYPE_SUBPROGRAM);
+				//"テキスト ドキュメント"
+				else if(i==FT_TEXT) lstrcpy(temporary,STRING_FILETYPE_TEXT);
+				//"判別できません"
+				else lstrcpy(temporary,STRING_FILETYPE_UNKNOWN);
+
+				SetDlgItemText(hwnd,IDC_FILETYPE,temporary);
+
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					EndDialog(hwnd,0);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+
+LRESULT CALLBACK FileTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	HTREEITEM hTreeItem;
+	char temporary[MAX_PATH];
+	switch(message){
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDM_FILETREE_INSERT:
+					//"プロジェクトへ挿入するファイルを指定して下さい"
+					extern LPSTR DefFileFilter;
+					if(!GetFilePathDialog(hOwner,temporary,DefFileFilter,STRING_FILEOPENTITLE_INSERTEDPROJECT,1)) break;
+					Project_File_Insert(temporary);
+					break;
+				case IDM_FILETREE_OPEN:
+					{
+						hTreeItem=TreeView_GetSelection(hwnd);
+
+						if( !projectInfo.fileSystem.root.IsExistFile( hTreeItem ) )
+						{
+							// ツリーアイテムに対するファイルが存在しない（フォルダなどの場合）
+							break;
+						}
+
+						std::string tempPath = projectInfo.fileSystem.root.FindFile( hTreeItem ).GetRelationalPath();
+
+						lstrcpy( temporary, tempPath.c_str() );
+						lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+						OpenFileWithExtension(temporary);
+						break;
+					}
+				case IDM_FILETREE_DELETE:
+					hTreeItem=TreeView_GetSelection(hwnd);
+					Project_File_Delete(hTreeItem);
+					break;
+				case IDM_FILETREE_PROPERTY:
+					DialogBox(hResInst,MAKEINTRESOURCE(IDD_PROJECT_FILEPROPERTY),hOwner,(DLGPROC)DlgProject_FileProperty);
+					break;
+			}
+			return 0;
+		case WM_CHAR:
+			if(wParam==VK_RETURN){
+				SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_OPEN,0);
+				//デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
+				return 0;
+			}
+			break;
+		case WM_KEYDOWN:
+			if(wParam==VK_DELETE){
+				SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_DELETE,0);
+			}
+			break;
+		case WM_LBUTTONDBLCLK:
+			SendMessage(hwnd,WM_COMMAND,IDM_FILETREE_OPEN,0);
+			break;
+	}
+	return CallWindowProc(OldFileTreeViewProc,hwnd,message,wParam,lParam);
+}
+
+FileListTreeViewCtrl::FileListTreeViewCtrl( HWND hParent )
+	: CTreeViewCtrl()
+{
+	this->Create( hParent, NULL, NULL, 
+		WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
+		WS_EX_CLIENTEDGE
+	);
+
+	OldFileTreeViewProc=(WNDPROC)this->GetWindowLongPtr(GWLP_WNDPROC);
+	this->SetWindowLongPtr(GWLP_WNDPROC,(long)FileTreeViewProc);
+
+	//イメージリスト読み込み、設定
+	hImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
+	ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
+	ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
+	ImageList_AddIcon(hImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT)));
+	this->SetImageList(hImageList,TVSIL_NORMAL);
+}
+FileListTreeViewCtrl::~FileListTreeViewCtrl()
+{
+	this->DestroyWindow();
+	ImageList_Destroy(hImageList);
+}
+
+void FileListTreeViewCtrl::ContextMenu(POINT *pPos)
+{
+	//右クリックによるメニューを表示
+	TV_HITTESTINFO tvHitTestInfo;
+	tvHitTestInfo.pt=*pPos;
+	this->ScreenToClient(&tvHitTestInfo.pt);
+
+	HTREEITEM hTreeItem = this->HitTest(&tvHitTestInfo);
+	if(hTreeItem){
+		this->SelectItem(hTreeItem);
+
+		extern HMENU hFileTreeMenuBase;
+		if(this->GetRootItem()==hTreeItem)
+		{
+			TrackPopupMenu(GetSubMenu(hFileTreeMenuBase,0),TPM_LEFTALIGN,pPos->x,pPos->y,0,this->m_hWnd,0);
+		}
+		else
+		{
+			TrackPopupMenu(GetSubMenu(hFileTreeMenuBase,1),TPM_LEFTALIGN,pPos->x,pPos->y,0,this->m_hWnd,0);
+		}
+	}
+}
+
+HTREEITEM FileListTreeViewCtrl::Insert( const std::string &str )
+{
+	return this->InsertItem( str.c_str(), 2, 2, this->GetRootItem(), TVI_SORT );
+}
+
+void FileListTreeViewCtrl::Reset( HTREEITEM hParent, ActiveBasic::PM::FM::Folder &folder )
+{
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+
+	lstrcpy( temporary, folder.GetName().c_str() );
+
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.hParent = hParent;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText = temporary;
+	HTREEITEM hFolder = this->InsertItem( &tv );
+
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		this->Reset( hFolder, childFolder );
+	}
+
+	BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		_splitpath(file.GetRelationalPath().c_str(),0,0,temporary,temp2);
+		lstrcat(temporary,temp2);
+
+		TV_INSERTSTRUCT tv;
+		tv.hInsertAfter=TVI_SORT;
+		tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+		tv.hParent = hFolder;
+		tv.item.iImage=2;
+		tv.item.iSelectedImage=2;
+		tv.item.pszText=temporary;
+		file.SetTreeViewHandle( this->InsertItem( &tv ) );
+	}
+}
+void FileListTreeViewCtrl::Reset( ActiveBasic::PM::FM::FileSystem &fileSystem )
+{
+	this->DeleteAllItems();
+
+	this->Reset( TVI_ROOT, fileSystem.root );
+}
Index: branches/egtra/ab5.0/abdev/abdev/FileTree.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/FileTree.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/FileTree.h	(revision 774)
@@ -0,0 +1,19 @@
+
+class FileListTreeViewCtrl
+	: public CTreeViewCtrl
+{
+	HIMAGELIST hImageList;
+public:
+	FileListTreeViewCtrl(HWND hParent);
+	~FileListTreeViewCtrl();
+
+	void ContextMenu(POINT *pPos);
+
+	HTREEITEM Insert( const std::string &str );
+private:
+	void Reset( HTREEITEM hParent, ActiveBasic::PM::FM::Folder &folder );
+public:
+	void Reset( ActiveBasic::PM::FM::FileSystem &fileSystem );
+};
+
+extern FileListTreeViewCtrl *pobj_FileTree;
Index: branches/egtra/ab5.0/abdev/abdev/History.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/History.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/History.cpp	(revision 774)
@@ -0,0 +1,124 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+CHistory::CHistory(int BaseID){
+	iNum=0;
+	iMaxHistoryNum=15;
+
+	m_BaseID=BaseID;
+}
+CHistory::~CHistory(){
+	int i;
+	for(i=0;i<iNum;i++){
+		HeapDefaultFree(lpszPath[i]);
+	}
+}
+
+void CHistory::load( const std::string &path )
+{
+	char temporary[MAX_PATH];
+
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg(path);
+	if(buffer){
+		int i;
+		i=0;
+		while(buffer[i]){
+			//表示名
+			i=GetOneParameter(buffer,i,temporary);
+			if(temporary[0]=='\0') break;
+
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+				i+=2;
+			}
+
+			add(temporary);
+		}
+		HeapDefaultFree(buffer);
+	}
+}
+void CHistory::save( const std::string &path )
+{
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,iNum*MAX_PATH+1);
+	buffer[0]=0;
+
+	int i;
+	for(i=0;i<iNum;i++){
+		sprintf(buffer+lstrlen(buffer),"%s\r\n",lpszPath[i]);
+	}
+
+	WriteBuffer(path,buffer,lstrlen(buffer));
+
+	HeapDefaultFree(buffer);
+}
+void CHistory::add(char *path){
+	lpszPath[iNum]=(char *)HeapAlloc(hHeap,0,lstrlen(path)+1);
+	lstrcpy(lpszPath[iNum],path);
+	iNum++;
+}
+void CHistory::insert(const char *path){
+	//重複チェック
+	int i;
+	for(i=0;i<iNum;i++){
+		if(lstrcmpi(path,lpszPath[i])==0) break;
+	}
+	if(i==iNum){
+		//ローテーション
+		for(i=iNum;i>0;i--){
+			lpszPath[i]=lpszPath[i-1];
+		}
+
+		if(iNum+1 == iMaxHistoryNum){
+			//一番古い情報を削除
+			HeapDefaultFree(lpszPath[iNum]);
+		}
+		else iNum++;
+	}
+	else{
+		//ローテーション
+		HeapDefaultFree(lpszPath[i]);
+
+		for(;i>0;i--){
+			lpszPath[i]=lpszPath[i-1];
+		}
+	}
+
+	lpszPath[0]=(char *)HeapAlloc(hHeap,0,lstrlen(path)+1);
+	lstrcpy(lpszPath[0],path);
+}
+
+void CHistory::ResetFileMenu(CSubMenuEx *pobj_SubMenu,BOOL bOwnerDraw){
+	//古いメニューアイテムを消去
+	while(0<pobj_SubMenu->iMenuItemNum){
+		pobj_SubMenu->RemoveItem(0);
+	}
+
+	if(iNum==0){
+		//なし
+		pobj_SubMenu->InsertItem(0,100,"なし");
+		pobj_SubMenu->EnableItem(100,MF_BYCOMMAND|MF_GRAYED);
+		return;
+	}
+
+
+	int i;
+	for(i=0;i<iNum;i++){
+		//挿入
+		pobj_SubMenu->InsertItem(i,m_BaseID+i,lpszPath[i]);
+
+		//アイコンをセット（ネットワークドライブ内のファイルは取得に時間がかかるため、除外する）
+		if( !Jenga::Common::Path( lpszPath[i] ).IsNetworkPath() )
+		{
+			if(IsExistFile(lpszPath[i])){
+				SHFILEINFO shfi;
+				SHGetFileInfo( lpszPath[i], FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
+
+				if(shfi.hIcon){
+					pobj_SubMenu->SetIcon(m_BaseID+i,shfi.hIcon);
+				}
+			}
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.cpp	(revision 774)
@@ -0,0 +1,693 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+
+#define ADD_TAG_PARAM(str) AddComplimentInfo(str,ACCESS_HTML_PARAM);
+
+int IsHtmlTagWord(char *str){
+	if(str[0]=='a'||str[0]=='A'){
+		if(lstrcmpi(str,"a")==0) return 1;
+		if(lstrcmpi(str,"abbr")==0) return 1;
+		if(lstrcmpi(str,"acronym")==0) return 1;
+		if(lstrcmpi(str,"address")==0) return 1;
+		if(lstrcmpi(str,"applet")==0) return 1;
+		if(lstrcmpi(str,"area")==0) return 1;
+	}
+	else if(str[0]=='b'||str[0]=='B'){
+		if(lstrcmpi(str,"b")==0) return 1;
+		if(lstrcmpi(str,"base")==0) return 1;
+		if(lstrcmpi(str,"basefont")==0) return 1;
+		if(lstrcmpi(str,"bdo")==0) return 1;
+		if(lstrcmpi(str,"bgsound")==0) return 1;
+		if(lstrcmpi(str,"big")==0) return 1;
+		if(lstrcmpi(str,"blink")==0) return 1;
+		if(lstrcmpi(str,"blockquote")==0) return 1;
+		if(lstrcmpi(str,"body")==0) return 1;
+		if(lstrcmpi(str,"br")==0) return 1;
+		if(lstrcmpi(str,"button")==0) return 1;
+	}
+	else if(str[0]=='c'||str[0]=='C'){
+		if(lstrcmpi(str,"caption")==0) return 1;
+		if(lstrcmpi(str,"center")==0) return 1;
+		if(lstrcmpi(str,"cite")==0) return 1;
+		if(lstrcmpi(str,"code")==0) return 1;
+		if(lstrcmpi(str,"col")==0) return 1;
+		if(lstrcmpi(str,"colgroup")==0) return 1;
+		if(lstrcmpi(str,"comment")==0) return 1;
+	}
+	else if(str[0]=='d'||str[0]=='D'){
+		if(lstrcmpi(str,"dd")==0) return 1;
+		if(lstrcmpi(str,"del")==0) return 1;
+		if(lstrcmpi(str,"dfn")==0) return 1;
+		if(lstrcmpi(str,"dir")==0) return 1;
+		if(lstrcmpi(str,"div")==0) return 1;
+		if(lstrcmpi(str,"dl")==0) return 1;
+		if(lstrcmpi(str,"dt")==0) return 1;
+	}
+	else if(str[0]=='e'||str[0]=='E'){
+		if(lstrcmpi(str,"em")==0) return 1;
+		if(lstrcmpi(str,"embed")==0) return 1;
+	}
+	else if(str[0]=='f'||str[0]=='F'){
+		if(lstrcmpi(str,"fieldset")==0) return 1;
+		if(lstrcmpi(str,"font")==0) return 1;
+		if(lstrcmpi(str,"form")==0) return 1;
+		if(lstrcmpi(str,"frame")==0) return 1;
+		if(lstrcmpi(str,"frameset")==0) return 1;
+	}
+	else if(str[0]=='h'||str[0]=='H'){
+		if(lstrcmpi(str,"h1")==0) return 1;
+		if(lstrcmpi(str,"h2")==0) return 1;
+		if(lstrcmpi(str,"h3")==0) return 1;
+		if(lstrcmpi(str,"h4")==0) return 1;
+		if(lstrcmpi(str,"h5")==0) return 1;
+		if(lstrcmpi(str,"h6")==0) return 1;
+		if(lstrcmpi(str,"head")==0) return 1;
+		if(lstrcmpi(str,"hr")==0) return 1;
+		if(lstrcmpi(str,"html")==0) return 1;
+	}
+	else if(str[0]=='i'||str[0]=='I'){
+		if(lstrcmpi(str,"i")==0) return 1;
+		if(lstrcmpi(str,"iframe")==0) return 1;
+		if(lstrcmpi(str,"ilayer")==0) return 1;
+		if(lstrcmpi(str,"img")==0) return 1;
+		if(lstrcmpi(str,"input")==0) return 1;
+		if(lstrcmpi(str,"ins")==0) return 1;
+		if(lstrcmpi(str,"isindex")==0) return 1;
+	}
+	else if(str[0]=='k'||str[0]=='K'){
+		if(lstrcmpi(str,"kbd")==0) return 1;
+		if(lstrcmpi(str,"keygen")==0) return 1;
+	}
+	else if(str[0]=='l'||str[0]=='L'){
+		if(lstrcmpi(str,"label")==0) return 1;
+		if(lstrcmpi(str,"layer")==0) return 1;
+		if(lstrcmpi(str,"legend")==0) return 1;
+		if(lstrcmpi(str,"li")==0) return 1;
+		if(lstrcmpi(str,"link")==0) return 1;
+		if(lstrcmpi(str,"listing")==0) return 1;
+	}
+	else if(str[0]=='m'||str[0]=='M'){
+		if(lstrcmpi(str,"map")==0) return 1;
+		if(lstrcmpi(str,"marquee")==0) return 1;
+		if(lstrcmpi(str,"menu")==0) return 1;
+		if(lstrcmpi(str,"meta")==0) return 1;
+		if(lstrcmpi(str,"multicol")==0) return 1;
+	}
+	else if(str[0]=='n'||str[0]=='N'){
+		if(lstrcmpi(str,"nobr")==0) return 1;
+		if(lstrcmpi(str,"noembed")==0) return 1;
+		if(lstrcmpi(str,"noframes")==0) return 1;
+		if(lstrcmpi(str,"nolayer")==0) return 1;
+		if(lstrcmpi(str,"noscript")==0) return 1;
+	}
+	else if(str[0]=='o'||str[0]=='O'){
+		if(lstrcmpi(str,"object")==0) return 1;
+		if(lstrcmpi(str,"ol")==0) return 1;
+		if(lstrcmpi(str,"optgroup")==0) return 1;
+		if(lstrcmpi(str,"option")==0) return 1;
+	}
+	else if(str[0]=='p'||str[0]=='P'){
+		if(lstrcmpi(str,"p")==0) return 1;
+		if(lstrcmpi(str,"param")==0) return 1;
+		if(lstrcmpi(str,"plaintext")==0) return 1;
+		if(lstrcmpi(str,"pre")==0) return 1;
+	}
+	else if(str[0]=='q'||str[0]=='Q'){
+		if(lstrcmpi(str,"q")==0) return 1;
+	}
+	else if(str[0]=='r'||str[0]=='R'){
+		if(lstrcmpi(str,"rb")==0) return 1;
+		if(lstrcmpi(str,"rp")==0) return 1;
+		if(lstrcmpi(str,"rt")==0) return 1;
+		if(lstrcmpi(str,"ruby")==0) return 1;
+	}
+	else if(str[0]=='s'||str[0]=='S'){
+		if(lstrcmpi(str,"s")==0) return 1;
+		if(lstrcmpi(str,"samp")==0) return 1;
+		if(lstrcmpi(str,"script")==0) return 1;
+		if(lstrcmpi(str,"select")==0) return 1;
+		if(lstrcmpi(str,"server")==0) return 1;
+		if(lstrcmpi(str,"small")==0) return 1;
+		if(lstrcmpi(str,"span")==0) return 1;
+		if(lstrcmpi(str,"strike")==0) return 1;
+		if(lstrcmpi(str,"strong")==0) return 1;
+		if(lstrcmpi(str,"style")==0) return 1;
+		if(lstrcmpi(str,"sub")==0) return 1;
+		if(lstrcmpi(str,"sup")==0) return 1;
+	}
+	else if(str[0]=='t'||str[0]=='T'){
+		if(lstrcmpi(str,"table")==0) return 1;
+		if(lstrcmpi(str,"tbody")==0) return 1;
+		if(lstrcmpi(str,"td")==0) return 1;
+		if(lstrcmpi(str,"textarea")==0) return 1;
+		if(lstrcmpi(str,"tfoot")==0) return 1;
+		if(lstrcmpi(str,"th")==0) return 1;
+		if(lstrcmpi(str,"thead")==0) return 1;
+		if(lstrcmpi(str,"title")==0) return 1;
+		if(lstrcmpi(str,"tr")==0) return 1;
+		if(lstrcmpi(str,"tt")==0) return 1;
+	}
+	else if(str[0]=='u'||str[0]=='U'){
+		if(lstrcmpi(str,"u")==0) return 1;
+		if(lstrcmpi(str,"ul")==0) return 1;
+	}
+	else if(str[0]=='v'||str[0]=='V'){
+		if(lstrcmpi(str,"var")==0) return 1;
+	}
+	else if(str[0]=='w'||str[0]=='W'){
+		if(lstrcmpi(str,"wbr")==0) return 1;
+	}
+	else if(str[0]=='x'||str[0]=='X'){
+		if(lstrcmpi(str,"xmp")==0) return 1;
+	}
+
+
+	return 0;
+}
+int IsHtmlReservedWord(char *str){
+	return IsHtmlTagWord(str);
+}
+
+void AddComplimentInfo(char *str,DWORD dwAccess){
+	ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapReAlloc(hHeap,0,
+		ComplementWndInfo.pMemberInfo,
+		(ComplementWndInfo.MemberNum+1)*sizeof(MEMBERINFO));
+
+	ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].pName=
+		(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
+	lstrcpy(
+		ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].pName,
+		str);
+
+	ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].dwProc=0;
+
+	ComplementWndInfo.pMemberInfo[ComplementWndInfo.MemberNum].dwAccess=dwAccess;
+
+	ComplementWndInfo.MemberNum++;
+}
+
+BOOL GetNowTagInfo(char *buffer,int p){
+	int i,i2,i3;
+	for(i=p;i>0;i--){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n') break;
+	}
+
+	int IsStr=0;
+	char szTag[1024];
+	szTag[0]=0;
+	for(;i<p;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='<'){
+			IsStr=0;
+
+			i2=i+1;
+			while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+			if(IsAlphabet(buffer[i2])){
+				for(i3=0;;i2++,i3++){
+					if(!IsAlphabet(buffer[i2])){
+						szTag[i3]=0;
+						break;
+					}
+					szTag[i3]=buffer[i2];
+				}
+			}
+			else szTag[0]=0;
+		}
+		if(buffer[i]=='>'&&IsStr==0){
+			szTag[0]=0;
+		}
+
+		if(buffer[i]=='\"'&&szTag[0]){
+			//タグ内のダブルクォート
+			IsStr^=1;
+		}
+	}
+
+	if(IsStr){
+		//文字列内では補完しない
+		return 0;
+	}
+
+	if(!IsHtmlTagWord(szTag)){
+		//未登録のタグはサポートしない
+		return 0;
+	}
+
+	ComplementWndInfo.pMemberInfo=(MEMBERINFO *)HeapAlloc(hHeap,0,1);
+	ComplementWndInfo.MemberNum=0;
+
+	BOOL bUseGeneralParam=1;
+	if(lstrcmpi(szTag,"a")==0){
+		ADD_TAG_PARAM("href");
+		ADD_TAG_PARAM("name");
+		ADD_TAG_PARAM("target");
+	}
+	else if(lstrcmpi(szTag,"applet")==0){
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("archive");
+		ADD_TAG_PARAM("code");
+		ADD_TAG_PARAM("codebase");
+		ADD_TAG_PARAM("mayscript");
+		ADD_TAG_PARAM("object");
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"area")==0){
+		ADD_TAG_PARAM("shape");
+		ADD_TAG_PARAM("coords");
+		ADD_TAG_PARAM("href");
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("nohref");
+		ADD_TAG_PARAM("hreflang");
+		ADD_TAG_PARAM("methods");
+		ADD_TAG_PARAM("rel");
+		ADD_TAG_PARAM("rev");
+		ADD_TAG_PARAM("tabindex");
+		ADD_TAG_PARAM("target");
+	}
+	else if(lstrcmpi(szTag,"base")==0){
+		ADD_TAG_PARAM("href");
+		ADD_TAG_PARAM("target");
+
+		bUseGeneralParam=0;
+	}
+	else if(lstrcmpi(szTag,"basefont")==0){
+		ADD_TAG_PARAM("size");
+		ADD_TAG_PARAM("color");
+		ADD_TAG_PARAM("face");
+	}
+	else if(lstrcmpi(szTag,"bgsound")==0){
+		ADD_TAG_PARAM("balance");
+		ADD_TAG_PARAM("loop");
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("volume");
+	}
+	else if(lstrcmpi(szTag,"blockquote")==0){
+		ADD_TAG_PARAM("cite");
+	}
+	else if(lstrcmpi(szTag,"body")==0){
+		ADD_TAG_PARAM("text");
+		ADD_TAG_PARAM("link");
+		ADD_TAG_PARAM("vlink");
+		ADD_TAG_PARAM("alink");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("background");
+		ADD_TAG_PARAM("bgproperties");
+		ADD_TAG_PARAM("marginheight");
+		ADD_TAG_PARAM("marginwidth");
+		ADD_TAG_PARAM("topmargin");
+		ADD_TAG_PARAM("leftmargin");
+		ADD_TAG_PARAM("bottommargin");
+		ADD_TAG_PARAM("rightmargin");
+		ADD_TAG_PARAM("scroll");
+	}
+	else if(lstrcmpi(szTag,"br")==0){
+		ADD_TAG_PARAM("/");
+		ADD_TAG_PARAM("clear");
+	}
+	else if(lstrcmpi(szTag,"button")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("disabled");
+		ADD_TAG_PARAM("tabindex");
+		ADD_TAG_PARAM("type");
+		ADD_TAG_PARAM("value");
+	}
+	else if(lstrcmpi(szTag,"caption")==0){
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("valign");
+	}
+	else if(lstrcmpi(szTag,"col")==0){
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("char");
+		ADD_TAG_PARAM("charoff");
+		ADD_TAG_PARAM("span");
+		ADD_TAG_PARAM("valign");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"colgroup")==0){
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("char");
+		ADD_TAG_PARAM("charoff");
+		ADD_TAG_PARAM("span");
+		ADD_TAG_PARAM("valign");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"del")==0){
+		ADD_TAG_PARAM("cite");
+		ADD_TAG_PARAM("datetime");
+	}
+	else if(lstrcmpi(szTag,"div")==0){
+		ADD_TAG_PARAM("align");
+	}
+	else if(lstrcmpi(szTag,"dl")==0){
+		ADD_TAG_PARAM("compact");
+	}
+	else if(lstrcmpi(szTag,"embed")==0){
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("compact");
+		ADD_TAG_PARAM("units");
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("frameborder");
+		ADD_TAG_PARAM("hidden");
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("code");
+		ADD_TAG_PARAM("codebase");
+		ADD_TAG_PARAM("type");
+		ADD_TAG_PARAM("palette");
+		ADD_TAG_PARAM("pluginspage");
+		ADD_TAG_PARAM("pluginurl");
+		ADD_TAG_PARAM("autostart");
+		ADD_TAG_PARAM("autoplay");
+		ADD_TAG_PARAM("control");
+		ADD_TAG_PARAM("loop");
+		ADD_TAG_PARAM("repeat");
+		ADD_TAG_PARAM("textfocus");
+	}
+	else if(lstrcmpi(szTag,"fieldset")==0){
+		ADD_TAG_PARAM("align");
+	}
+	else if(lstrcmpi(szTag,"font")==0){
+		ADD_TAG_PARAM("size");
+		ADD_TAG_PARAM("color");
+		ADD_TAG_PARAM("face");
+	}
+	else if(lstrcmpi(szTag,"form")==0){
+		ADD_TAG_PARAM("action");
+		ADD_TAG_PARAM("method");
+		ADD_TAG_PARAM("target");
+		ADD_TAG_PARAM("accept");
+		ADD_TAG_PARAM("accept-charset");
+		ADD_TAG_PARAM("autocomplete");
+		ADD_TAG_PARAM("enctype");
+		ADD_TAG_PARAM("urn");
+	}
+	else if(lstrcmpi(szTag,"frame")==0){
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("frameborder");
+		ADD_TAG_PARAM("marginheight");
+		ADD_TAG_PARAM("marginwidth");
+		ADD_TAG_PARAM("noresize");
+		ADD_TAG_PARAM("longdesc");
+		ADD_TAG_PARAM("scrolling");
+		ADD_TAG_PARAM("allowtransparency");
+	}
+	else if(lstrcmpi(szTag,"frameset")==0){
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("cols");
+		ADD_TAG_PARAM("frameborder");
+		ADD_TAG_PARAM("framespacing");
+		ADD_TAG_PARAM("rows");
+	}
+	else if(lstrcmpi(szTag,"h1")==0||
+		lstrcmpi(szTag,"h2")==0||
+		lstrcmpi(szTag,"h3")==0||
+		lstrcmpi(szTag,"h4")==0||
+		lstrcmpi(szTag,"h5")==0||
+		lstrcmpi(szTag,"h6")==0){
+		ADD_TAG_PARAM("align");
+	}
+	else if(lstrcmpi(szTag,"hr")==0){
+		ADD_TAG_PARAM("/");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("color");
+		ADD_TAG_PARAM("noshade");
+		ADD_TAG_PARAM("size");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"iframe")==0){
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("marginheight");
+		ADD_TAG_PARAM("marginwidth");
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("frameborder");
+		ADD_TAG_PARAM("framespacing");
+		ADD_TAG_PARAM("longdesc");
+		ADD_TAG_PARAM("scrolling");
+	}
+	else if(lstrcmpi(szTag,"img")==0){
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("galleryimg");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("longdesc");
+		ADD_TAG_PARAM("lowsrc");
+		ADD_TAG_PARAM("suppress");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("ismap");
+		ADD_TAG_PARAM("usemap");
+		ADD_TAG_PARAM("controls");
+		ADD_TAG_PARAM("dynsrc");
+		ADD_TAG_PARAM("loop");
+		ADD_TAG_PARAM("start");
+	}
+	else if(lstrcmpi(szTag,"input")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("disabled");
+		ADD_TAG_PARAM("tabindex");
+		ADD_TAG_PARAM("type");
+		ADD_TAG_PARAM("autocomplete");
+		ADD_TAG_PARAM("istyle");
+		ADD_TAG_PARAM("maxlength");
+		ADD_TAG_PARAM("readonly");
+		ADD_TAG_PARAM("value");
+		ADD_TAG_PARAM("accept");
+		ADD_TAG_PARAM("checked");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("dynsrc");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("ismap");
+		ADD_TAG_PARAM("lowsrc");
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"ins")==0){
+		ADD_TAG_PARAM("cite");
+		ADD_TAG_PARAM("datetime");
+	}
+	else if(lstrcmpi(szTag,"label")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("for");
+	}
+	else if(lstrcmpi(szTag,"legend")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("align");
+	}
+	else if(lstrcmpi(szTag,"li")==0){
+		ADD_TAG_PARAM("type");
+		ADD_TAG_PARAM("value");
+	}
+	else if(lstrcmpi(szTag,"link")==0){
+		ADD_TAG_PARAM("rel");
+		ADD_TAG_PARAM("href");
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("charset");
+		ADD_TAG_PARAM("media");
+		ADD_TAG_PARAM("type");
+	}
+	else if(lstrcmpi(szTag,"marquee")==0){
+		ADD_TAG_PARAM("behavior");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("direction");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("loop");
+		ADD_TAG_PARAM("scrollamount");
+		ADD_TAG_PARAM("scrolldelay");
+		ADD_TAG_PARAM("truespeed");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("width");
+	}
+	else if(lstrcmpi(szTag,"meta")==0){
+		ADD_TAG_PARAM("name");
+		ADD_TAG_PARAM("http-equiv");
+		ADD_TAG_PARAM("content");
+	}
+	else if(lstrcmpi(szTag,"object")==0){
+		ADD_TAG_PARAM("alt");
+		ADD_TAG_PARAM("archive");
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("classid");
+		ADD_TAG_PARAM("code");
+		ADD_TAG_PARAM("codebase");
+		ADD_TAG_PARAM("codetype");
+		ADD_TAG_PARAM("data");
+		ADD_TAG_PARAM("declare");
+		ADD_TAG_PARAM("name");
+		ADD_TAG_PARAM("standby");
+		ADD_TAG_PARAM("tabindex");
+		ADD_TAG_PARAM("type");
+		ADD_TAG_PARAM("usemap");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("vspace");
+	}
+	else if(lstrcmpi(szTag,"ol")==0){
+		ADD_TAG_PARAM("compact");
+		ADD_TAG_PARAM("start");
+		ADD_TAG_PARAM("type");
+	}
+	else if(lstrcmpi(szTag,"option")==0){
+		ADD_TAG_PARAM("disabled");
+		ADD_TAG_PARAM("label");
+		ADD_TAG_PARAM("selected");
+		ADD_TAG_PARAM("value");
+	}
+	else if(lstrcmpi(szTag,"p")==0){
+		ADD_TAG_PARAM("align");
+	}
+	else if(lstrcmpi(szTag,"param")==0){
+		ADD_TAG_PARAM("name");
+		ADD_TAG_PARAM("value");
+		ADD_TAG_PARAM("valuetype");
+		ADD_TAG_PARAM("type");
+	}
+	else if(lstrcmpi(szTag,"pre")==0){
+		ADD_TAG_PARAM("cols");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("wrap");
+	}
+	else if(lstrcmpi(szTag,"script")==0){
+		ADD_TAG_PARAM("charset");
+		ADD_TAG_PARAM("defer");
+		ADD_TAG_PARAM("event");
+		ADD_TAG_PARAM("for");
+		ADD_TAG_PARAM("src");
+		ADD_TAG_PARAM("type");
+	}
+	else if(lstrcmpi(szTag,"select")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("disabled");
+		ADD_TAG_PARAM("multiple");
+		ADD_TAG_PARAM("size");
+		ADD_TAG_PARAM("tabindex");
+	}
+	else if(lstrcmpi(szTag,"style")==0){
+		ADD_TAG_PARAM("disabled");
+		ADD_TAG_PARAM("media");
+		ADD_TAG_PARAM("type");
+	}
+	else if(lstrcmpi(szTag,"table")==0){
+		ADD_TAG_PARAM("border");
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("bordercolordark");
+		ADD_TAG_PARAM("bordercolorlight");
+		ADD_TAG_PARAM("frame");
+		ADD_TAG_PARAM("rules");
+		ADD_TAG_PARAM("background");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("cellpadding");
+		ADD_TAG_PARAM("cellspacing");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("hspace");
+		ADD_TAG_PARAM("vspace");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("cols");
+		ADD_TAG_PARAM("summary");
+	}
+	else if(lstrcmpi(szTag,"tbody")==0||
+		lstrcmpi(szTag,"tfoot")==0||
+		lstrcmpi(szTag,"thead")==0){
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("char");
+		ADD_TAG_PARAM("charoff");
+		ADD_TAG_PARAM("valign");
+	}
+	else if(lstrcmpi(szTag,"td")==0||
+		lstrcmpi(szTag,"th")==0){
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("bordercolordark");
+		ADD_TAG_PARAM("bordercolorlight");
+		ADD_TAG_PARAM("background");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("valign");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("width");
+		ADD_TAG_PARAM("nowrap");
+		ADD_TAG_PARAM("char");
+		ADD_TAG_PARAM("charoff");
+		ADD_TAG_PARAM("colspan");
+		ADD_TAG_PARAM("rowspan");
+		ADD_TAG_PARAM("abbr");
+		ADD_TAG_PARAM("axis");
+		ADD_TAG_PARAM("headers");
+		ADD_TAG_PARAM("scope");
+	}
+	else if(lstrcmpi(szTag,"textarea")==0){
+		ADD_TAG_PARAM("accesskey");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("cols");
+		ADD_TAG_PARAM("istyle");
+		ADD_TAG_PARAM("readonly");
+		ADD_TAG_PARAM("rows");
+		ADD_TAG_PARAM("wrap");
+		ADD_TAG_PARAM("tabindex");
+	}
+	else if(lstrcmpi(szTag,"title")==0){
+		bUseGeneralParam=0;
+	}
+	else if(lstrcmpi(szTag,"tr")==0){
+		ADD_TAG_PARAM("bordercolor");
+		ADD_TAG_PARAM("bordercolordark");
+		ADD_TAG_PARAM("bordercolorlight");
+		ADD_TAG_PARAM("bgcolor");
+		ADD_TAG_PARAM("align");
+		ADD_TAG_PARAM("char");
+		ADD_TAG_PARAM("charoff");
+		ADD_TAG_PARAM("height");
+		ADD_TAG_PARAM("valign");
+	}
+	else if(lstrcmpi(szTag,"ul")==0){
+		ADD_TAG_PARAM("compact");
+		ADD_TAG_PARAM("type");
+	}
+
+
+
+
+	if(bUseGeneralParam){
+		//一般属性
+		AddComplimentInfo("class",ACCESS_HTML_GENERAL_PARAM);
+		AddComplimentInfo("id",ACCESS_HTML_GENERAL_PARAM);
+		AddComplimentInfo("style",ACCESS_HTML_GENERAL_PARAM);
+	}
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/HtmlAnalysis.h	(revision 774)
@@ -0,0 +1,2 @@
+int IsHtmlReservedWord(char *str);
+BOOL GetNowTagInfo(char *buffer,int p);
Index: branches/egtra/ab5.0/abdev/abdev/IconEditor.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/IconEditor.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/IconEditor.cpp	(revision 774)
@@ -0,0 +1,568 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+RGBQUAD DefaultColorTable16[16]={
+	0,0,0,0,
+	0,0,128,0,
+	0,128,0,0,
+	0,128,128,0,
+	128,0,0,0,
+	128,0,128,0,
+	128,128,0,0,
+	128,128,128,0,
+	192,192,192,0,
+	0,0,255,0,
+	0,255,0,0,
+	0,255,255,0,
+	255,0,0,0,
+	255,0,255,0,
+	255,255,0,0,
+	255,255,255,0,
+};
+RGBQUAD DefaultColorTable256[256];	//ファイルから読み込む（SetupProjectEditor関数を参照）
+
+void ResizeIconWindow(HWND hMain,HWND hToolDlg,HWND hColorDlg,int width,int height){
+	MoveWindow(hMain,0,0,width-170,height-50,1);
+	MoveWindow(hToolDlg,width-170,0,170,height,1);
+	MoveWindow(hColorDlg,0,height-50,width-170,50,1);
+}
+void ResetIconType(int WndNum){
+	int i;
+	HWND hCombo;
+	char temporary[MAX_PATH];
+	BITMAPINFOHEADER *pBmpInfoHdr;
+
+	hCombo=GetDlgItem(MdiInfo[WndNum]->MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
+
+	for(i=0;i<MdiInfo[WndNum]->MdiIconEditInfo->num;i++){
+		pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i];
+
+		//例: "32*32 (xxxx色)"
+		sprintf(temporary,"%d*%d (%d%s)",
+			pBmpInfoHdr->biWidth,
+			pBmpInfoHdr->biHeight/2,
+			(int)pow((double)2,(double)pBmpInfoHdr->biBitCount),
+			STRING_UNIT_COLORS);
+		SendMessage(hCombo,CB_ADDSTRING,0,(long)temporary);
+	}
+	SendMessage(hCombo,CB_SETCURSEL,0,0);
+}
+BYTE *CreateIconType(int IconType,DWORD *dwBytes){
+	extern HANDLE hHeap;
+	int i,width,BitCount,dwBytesInRes;
+	BITMAPINFOHEADER *pBmpHdr;
+	BYTE *pImageBuffer;
+
+	switch(IconType){
+		case ICONTYPE_16_16:
+			width=16;
+			BitCount=4;
+			break;
+		case ICONTYPE_16_256:
+			width=16;
+			BitCount=8;
+			break;
+		case ICONTYPE_32_16:
+			width=32;
+			BitCount=4;
+			break;
+		case ICONTYPE_32_256:
+			width=32;
+			BitCount=8;
+			break;
+	}
+
+	//イメージサイズを計算
+	dwBytesInRes=sizeof(BITMAPINFOHEADER)+
+		sizeof(RGBQUAD)*(int)pow((double)2,(double)BitCount)+
+		BitCount*width*width/8;
+	if(width==16) dwBytesInRes+=width*width*2/8;
+	else dwBytesInRes+=width*width/8;
+	*dwBytes=dwBytesInRes;
+
+	//メモリ領域を確保
+	pImageBuffer=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,dwBytesInRes);
+
+	//ヘッダ情報をセット
+	pBmpHdr=(BITMAPINFOHEADER *)pImageBuffer;
+	pBmpHdr->biSize=sizeof(BITMAPINFOHEADER);
+	pBmpHdr->biWidth=width;
+	pBmpHdr->biHeight=width*2;
+	pBmpHdr->biPlanes=1;
+	pBmpHdr->biBitCount=BitCount;
+
+	//カラーテーブルをセット
+	RGBQUAD *pRgbq;
+	pRgbq=(RGBQUAD *)(pImageBuffer+sizeof(BITMAPINFOHEADER));
+	if(BitCount==4){
+		//16色
+		memcpy(pRgbq,DefaultColorTable16,sizeof(RGBQUAD)*16);
+	}
+	else if(BitCount==8){
+		//256色
+		memcpy(pRgbq,DefaultColorTable256,sizeof(RGBQUAD)*256);
+	}
+
+	//マスクビットをセット
+	BYTE *pMaskBuf;
+	pMaskBuf=pImageBuffer+
+		sizeof(BITMAPINFOHEADER)+
+		sizeof(RGBQUAD)*(int)pow((double)2,(double)BitCount)+
+		BitCount*width*width/8;
+	if(width==16){
+		//一行の4バイト境界を考慮
+		for(i=0;i<16;i++){
+			pMaskBuf[i*4]=0xFF;
+			pMaskBuf[i*4+1]=0xFF;
+			pMaskBuf[i*4+2]=0;
+			pMaskBuf[i*4+3]=0;
+		}
+	}
+	else memset(pMaskBuf,0xFF,width*width/8);
+
+	return pImageBuffer;
+}
+void AddIconType(int WndNum,int IconType){
+	extern HANDLE hHeap;
+	int i,width,BitCount;
+
+	switch(IconType){
+		case ICONTYPE_16_16:
+			width=16;
+			BitCount=4;
+			break;
+		case ICONTYPE_16_256:
+			width=16;
+			BitCount=8;
+			break;
+		case ICONTYPE_32_16:
+			width=32;
+			BitCount=4;
+			break;
+		case ICONTYPE_32_256:
+			width=32;
+			BitCount=8;
+			break;
+	}
+
+	MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->num]=
+		CreateIconType(IconType,
+		&MdiInfo[WndNum]->MdiIconEditInfo->dwBytesInRes[MdiInfo[WndNum]->MdiIconEditInfo->num]);
+
+	//イメージ選択用のメモリを解放
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+
+	//アイコンタイプを追加
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum=MdiInfo[WndNum]->MdiIconEditInfo->num;
+	MdiInfo[WndNum]->MdiIconEditInfo->num++;
+
+	//変更情報を初期化
+	i=MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum;
+	MdiInfo[WndNum]->MdiIconEditInfo->undo[i].NowPos=0;
+	memset(MdiInfo[WndNum]->MdiIconEditInfo->undo[i].lpData,0,sizeof(BYTE *)*MAX_ICONEDIT_UNDONUM);
+
+	//アイコンタイプコンボボックスに追加
+	char temporary[32];
+	HWND hCombo;
+	hCombo=GetDlgItem(MdiInfo[WndNum]->MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
+
+	//例: "32*32 (xxxx色)"
+	sprintf(temporary,"%d*%d (%d%s)",
+		width,
+		width,
+		(int)pow((double)2,(double)BitCount),
+		STRING_UNIT_COLORS);
+	i=SendMessage(hCombo,CB_ADDSTRING,0,(long)temporary);
+
+	SendMessage(hCombo,CB_SETCURSEL,i,0);
+
+	//再描画
+	HBRUSH hOldBrush;
+	hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
+	PatBlt(MdiInfo[WndNum]->MdiIconEditInfo->memdc,0,0,400,400,PATCOPY);
+	SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldBrush);
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,1);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hColorDlg,NULL,0);
+}
+void DeleteIconType(int WndNum){
+	int i;
+
+	//変更情報を解放
+	for(i=0;i<MAX_ICONEDIT_UNDONUM;i++){
+		if(MdiInfo[WndNum]->MdiIconEditInfo->undo[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum].lpData[i])
+			HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->undo[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum].lpData[i]);
+	}
+
+	//メモリを解放
+	HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]);
+
+	//イメージ選択用のメモリを解放
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+
+	////////////////////////
+	// アイコンタイプを削除
+	for(i=MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum;i<MdiInfo[WndNum]->MdiIconEditInfo->num-1;i++){
+		MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i]=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i+1];
+		MdiInfo[WndNum]->MdiIconEditInfo->dwBytesInRes[i]=MdiInfo[WndNum]->MdiIconEditInfo->dwBytesInRes[i+1];
+		MdiInfo[WndNum]->MdiIconEditInfo->undo[i]=MdiInfo[WndNum]->MdiIconEditInfo->undo[i+1];
+	}
+	MdiInfo[WndNum]->MdiIconEditInfo->num--;
+	if(MdiInfo[WndNum]->MdiIconEditInfo->num==MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum)
+		MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum=MdiInfo[WndNum]->MdiIconEditInfo->num-1;
+
+	//コンボボックスからアイコンタイプを削除
+	HWND hCombo;
+	hCombo=GetDlgItem(MdiInfo[WndNum]->MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
+	i=SendMessage(hCombo,CB_DELETESTRING,
+		SendMessage(hCombo,CB_GETCURSEL,0,0),
+		0);
+	SendMessage(hCombo,CB_SETCURSEL,MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum,0);
+
+	//再描画
+	HBRUSH hOldBrush;
+	hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
+	PatBlt(MdiInfo[WndNum]->MdiIconEditInfo->memdc,0,0,400,400,PATCOPY);
+	SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldBrush);
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,1);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hColorDlg,NULL,0);
+}
+void NewIconEditWindow(const char *filepath){
+	extern HINSTANCE hInst,hResInst;
+	extern HANDLE hHeap;
+	extern HWND hDocCombo;
+	int i,i2,IconNum;
+	char str[MAX_PATH],str2[32],*buffer;
+	BYTE *pImageBuffer[8];
+	DWORD dwBytesInRes[8];
+	HWND hChild;
+	HDC hdc;
+	MDICREATESTRUCT mdic;
+
+	if(filepath){
+
+		//すでに指定されたファイルが開かれている場合
+		hChild=GetWindow(hClient,GW_CHILD);
+		while(hChild){
+			i=GetWndNum(hChild);
+			if(MdiInfo[i]->DocType==WNDTYPE_ICONEDIT){
+				if(lstrcmpi(MdiInfo[i]->path.c_str(),filepath)==0) break;
+			}
+			hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+		}
+		if(hChild){
+			BringWindowToTop(hChild);
+			return;
+		}
+
+		//ファイル読み込み（正常に読み込めるかの確認も含む）
+		{
+			DWORD dw;
+			ATL::CHandle hFile(CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+			if(hFile==INVALID_HANDLE_VALUE){
+				hFile.Detach();
+				//"\"%s\" ファイルの読み込みに失敗しました。"
+				sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
+				MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+				return;
+			}
+			i=GetFileSize(hFile,NULL);
+			buffer=(char *)HeapAlloc(hHeap,0,i+1);
+			ReadFile(hFile,buffer,i,&dw,NULL);
+		}
+
+		ICONDIR *pIconDir;
+		ICONDIRENTRY *pIconDirEntry;
+		pIconDir=(ICONDIR *)buffer;
+		IconNum=pIconDir->idCount;
+		bool FileOk = true;
+		for(i=0;i<IconNum;i++){
+			pIconDirEntry=(ICONDIRENTRY *)(buffer+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i);
+
+			pImageBuffer[i]=(BYTE *)HeapAlloc(hHeap,0,pIconDirEntry->dwBytesInRes);
+			memcpy(pImageBuffer[i],buffer+pIconDirEntry->dwImageOffset,pIconDirEntry->dwBytesInRes);
+
+			dwBytesInRes[i]=pIconDirEntry->dwBytesInRes;
+
+			//対応チェック
+			BITMAPINFOHEADER *pBmpInfoHdr=(BITMAPINFOHEADER *)pImageBuffer[i];
+			if( !(pBmpInfoHdr->biBitCount == 4 || pBmpInfoHdr->biBitCount == 8 ) ){
+				//16色、256色以外の場合
+				//未対応
+				FileOk = false;
+			}
+		}
+
+		_splitpath(filepath,NULL,NULL,str,str2);
+		lstrcat(str,str2);
+		mdic.szTitle=str;
+
+		HeapDefaultFree(buffer);
+
+		if( !FileOk ){
+			for(i=0;i<IconNum;i++){
+				HeapDefaultFree( pImageBuffer[i] );
+			}
+
+			char msg[1024];
+			sprintf( msg, "\"%s\"\n\n16色または256色以外の形式のファイルには対応していません。", filepath );
+			MessageBox( hOwner, msg, "ActiveBasic", MB_OK | MB_ICONEXCLAMATION );
+			return;
+		}
+	}
+	else{
+		extern int DocumentCounter;
+		buffer=0;
+		DocumentCounter++;
+		sprintf(str,"Icon[%d]",DocumentCounter);
+		mdic.szTitle=str;
+
+		IconNum=1;
+		pImageBuffer[0]=CreateIconType(ICONTYPE_32_16,&dwBytesInRes[0]);
+	}
+	mdic.szClass="MDIClientWindow_IconEdit";
+	mdic.hOwner=hInst;
+	mdic.x=CW_USEDEFAULT;
+	mdic.y=CW_USEDEFAULT;
+	mdic.cx=CW_USEDEFAULT;
+	mdic.cy=CW_USEDEFAULT;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(IsWindow(hChild)){
+		if(IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+	else{
+		if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+
+	mdic.lParam=0;
+	mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
+	hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic);	//ウィンドウ作成
+
+	////////////////////
+	//子ウィンドウ作成
+
+	//エディタ中央部分を作成
+	HWND hMain;
+	hMain=CreateWindowEx(WS_EX_CLIENTEDGE,"IconEditWindowProc",NULL,
+		WS_CHILD|WS_VISIBLE,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+	//ツールダイアログ部分を作成
+	HWND hToolDlg;
+	hToolDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_TOOL),hChild,(DLGPROC)DlgIconToolProc);
+
+	//ツールダイアログのボタン部分を作成
+	HWND hButtonsDlg;
+	hButtonsDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_BUTTONS),hToolDlg,(DLGPROC)DlgIconButtons);
+
+	//カラーテーブルダイアログ部分を作成
+	HWND hColorDlg;
+	hColorDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_COLOR),hChild,(DLGPROC)DlgIconColorProc);
+
+	//ウィンドウのID登録
+	MdiInfo.push_back( new MDIINFO() );
+	i = MdiInfo.size()-1;
+	MdiInfo[i]->hwnd=hChild;
+	MdiInfo[i]->DocType=WNDTYPE_ICONEDIT;
+	MdiInfo[i]->title = str;
+	if(filepath)
+	{
+		MdiInfo[i]->path = filepath;
+	}
+	else
+	{
+		MdiInfo[i]->path = "";
+	}
+
+	MdiInfo[i]->MdiIconEditInfo=(MDIICONEDITINFO *)HeapAlloc(hHeap,0,sizeof(MDIICONEDITINFO));
+	MdiInfo[i]->MdiIconEditInfo->hMain=hMain;
+	MdiInfo[i]->MdiIconEditInfo->hToolDlg=hToolDlg;
+	MdiInfo[i]->MdiIconEditInfo->hButtonsDlg=hButtonsDlg;
+	MdiInfo[i]->MdiIconEditInfo->hColorDlg=hColorDlg;
+	hdc=GetDC(hMain);
+	MdiInfo[i]->MdiIconEditInfo->memdc=CreateCompatibleDC(hdc);
+	MdiInfo[i]->MdiIconEditInfo->hMemBmp=CreateCompatibleBitmap(hdc,600,400);
+	SelectObject(MdiInfo[i]->MdiIconEditInfo->memdc,MdiInfo[i]->MdiIconEditInfo->hMemBmp);
+	ReleaseDC(hMain,hdc);
+
+	MdiInfo[i]->MdiIconEditInfo->SelectLevel=0;
+
+	MdiInfo[i]->MdiIconEditInfo->num=IconNum;
+	MdiInfo[i]->MdiIconEditInfo->SelectIconNum=0;
+	memcpy(MdiInfo[i]->MdiIconEditInfo->pIconImage,pImageBuffer,sizeof(DWORD)*IconNum);
+
+	memcpy(MdiInfo[i]->MdiIconEditInfo->dwBytesInRes,dwBytesInRes,sizeof(DWORD)*IconNum);
+
+	MdiInfo[i]->MdiIconEditInfo->NowTool=IDC_TOOL_PEN;
+	MdiInfo[i]->MdiIconEditInfo->MainColor=RGB(0,0,0);
+	extern COLORREF TransparentClrRef;
+	MdiInfo[i]->MdiIconEditInfo->SubColor=TransparentClrRef;
+
+	for(i2=0;i2<MdiInfo[i]->MdiIconEditInfo->num;i2++){
+		MdiInfo[i]->MdiIconEditInfo->undo[i2].NowPos=0;
+		memset(MdiInfo[i]->MdiIconEditInfo->undo[i2].lpData,0,sizeof(BYTE *)*MAX_ICONEDIT_UNDONUM);
+	}
+	MdiInfo[i]->MdiIconEditInfo->bModify=0;
+
+
+
+	//メモリへ初期描画を行う
+	HBRUSH hOldBrush;
+	hOldBrush=(HBRUSH)SelectObject(MdiInfo[i]->MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
+	PatBlt(MdiInfo[i]->MdiIconEditInfo->memdc,0,0,600,400,PATCOPY);
+	SelectObject(MdiInfo[i]->MdiIconEditInfo->memdc,hOldBrush);
+	DrawIconToMemBmp(i,0);
+
+	//ウィンドウ位置を初期化
+	RECT rc;
+	GetClientRect(hChild,&rc);
+	ResizeIconWindow(hMain,hToolDlg,hColorDlg,rc.right,rc.bottom);
+
+	//アイコンタイプコンボボックスをセット
+	ResetIconType(i);
+
+	if(MdiInfo[i]->MdiIconEditInfo->num<=1)
+		EnableWindow(GetDlgItem(hToolDlg,IDC_DELETE_ICONTYPE),0);
+
+	//Docコンボボックスに追加
+	i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)str);
+	SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+
+	//タブに追加
+	pobj_MainTab->InsertItem( hChild, str, true );
+
+	SetStatusText(NULL);
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+}
+void SetFileIdentityFromFile(MDIINFO &mi, HANDLE hFile);
+
+void SaveIconFile(char *filepath,HWND hwnd){
+	int i,i2,WndNum;
+	char buffer[8192],temporary[MAX_PATH];
+	int ImgBufSize[8];
+
+	WndNum=GetWndNum(hwnd);
+
+	i2=0;
+
+	///////////
+	// ICONDIR
+	*((WORD *)(buffer+i2))=0;	//idReserved
+	i2+=sizeof(WORD);
+	*((WORD *)(buffer+i2))=1;	//idType
+	i2+=sizeof(WORD);
+	*((WORD *)(buffer+i2))=MdiInfo[WndNum]->MdiIconEditInfo->num;	//idCount
+	i2+=sizeof(WORD);
+
+	////////////////
+	// ICONDIRENTRY
+	ICONDIRENTRY IconDirEntry;
+	memset(&IconDirEntry,0,sizeof(ICONDIRENTRY));
+
+	//イメージバッファの初期位置
+	IconDirEntry.dwImageOffset=sizeof(ICONDIR)+
+		sizeof(ICONDIRENTRY)*MdiInfo[WndNum]->MdiIconEditInfo->num;
+
+	for(i=0;i<MdiInfo[WndNum]->MdiIconEditInfo->num;i++){
+		BITMAPINFOHEADER *pBmpInfoHdr;
+		pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i];
+
+		IconDirEntry.bWidth=(BYTE)pBmpInfoHdr->biWidth;
+		IconDirEntry.bHeight=(BYTE)pBmpInfoHdr->biHeight/2;
+		if(pBmpInfoHdr->biBitCount<=8)
+			IconDirEntry.bColorCount=(BYTE)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+		else IconDirEntry.bColorCount=0;
+
+		IconDirEntry.dwBytesInRes=sizeof(BITMAPINFOHEADER);
+		if(pBmpInfoHdr->biBitCount<=8)	//256色以下の場合はカラーパレットのサイズを考慮
+			IconDirEntry.dwBytesInRes+=(DWORD)pow((double)2,(double)pBmpInfoHdr->biBitCount)*sizeof(long);
+		IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+		if(pBmpInfoHdr->biWidth==16){
+			//16*16のアイコン
+			IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8*2;
+		}
+		else{
+			//32*32のアイコン
+			IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+		}
+
+		ImgBufSize[i]=IconDirEntry.dwBytesInRes;
+
+		memcpy(buffer+i2,&IconDirEntry,sizeof(ICONDIRENTRY));
+		i2+=sizeof(ICONDIRENTRY);
+
+		IconDirEntry.dwImageOffset+=IconDirEntry.dwBytesInRes;
+	}
+
+	////////////////////
+	// イメージバッファ
+	for(i=0;i<MdiInfo[WndNum]->MdiIconEditInfo->num;i++){
+		memcpy(buffer+i2,
+			MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i],
+			ImgBufSize[i]);
+
+		i2+=ImgBufSize[i];
+	}
+
+
+	//ファイルへ書き込み
+	DWORD dummy;
+	ATL::CHandle hFile(CreateFile(filepath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL));
+	if(hFile==INVALID_HANDLE_VALUE){
+		hFile.Detach();
+		//"\"%s\" ファイルへの書き込みに失敗しました。"
+		sprintf(temporary,STRING_ERROR_CANT_FILESAVE,filepath);
+		MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONSTOP);
+		return;
+	}
+	WriteFile(hFile,buffer,i2,&dummy,NULL);
+	SetFileIdentityFromFile(*MdiInfo[WndNum], hFile);
+}
+
+LRESULT CALLBACK MDIClientWindow_IconEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HWND hDocCombo;
+	int i,WndNum;
+
+	switch(message){
+		case WM_MDIACTIVATE:
+			if(!lParam) return 0;
+			i=GetWndNum((HWND)lParam);
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+
+			i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+			SetStatusText(NULL);
+			ResetState_EditMenu();
+			return 0;
+		case WM_SIZE:
+			WndNum=GetWndNum(hwnd);
+			if(WndNum==-1) break;
+			ResizeIconWindow(MdiInfo[WndNum]->MdiIconEditInfo->hMain,
+				MdiInfo[WndNum]->MdiIconEditInfo->hToolDlg,
+				MdiInfo[WndNum]->MdiIconEditInfo->hColorDlg,
+				LOWORD(lParam),HIWORD(lParam));
+			break;
+		case WM_CLOSE:
+			CloseDocWindow(GetWndNum(hwnd));
+			pobj_nv->bMDIZoomed=IsZoomed(hwnd);
+			i=DefMDIChildProc(hwnd,message,wParam,lParam);
+
+			//メニュー状態を設定
+			ResetState_DocMenu();
+
+			return i;
+	}
+	return DefMDIChildProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/IconEditor_Color.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/IconEditor_Color.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/IconEditor_Color.cpp	(revision 774)
@@ -0,0 +1,183 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+extern RGBQUAD DefaultColorTable16[16];
+
+BOOL CALLBACK DlgIconColorProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern COLORREF TransparentClrRef;
+	int i,i2,WndNum;
+	RGBQUAD *pRgbq;
+	RECT rect;
+	POINT pos,pos2;
+	COLORREF ColorRef;
+	HDC hdc;
+
+	switch(message){
+		case WM_LBUTTONDOWN:
+		case WM_RBUTTONDOWN:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+
+			WndNum=GetWndNum(GetParent(hwnd));
+
+			pos2=pos;
+			ClientToScreen(hwnd,&pos2);
+			ScreenToClient(GetDlgItem(hwnd,IDC_STATIC_COLOR),&pos2);
+
+			if((8+1)*15<pos2.x&&pos2.x<(8+1)*15+13&&
+				0<pos2.y&&pos2.y<13){
+				//透明色をクリックした場合
+				if(message==WM_LBUTTONDOWN)
+					MdiInfo[WndNum]->MdiIconEditInfo->MainColor=TransparentClrRef;
+				else
+					MdiInfo[WndNum]->MdiIconEditInfo->SubColor=TransparentClrRef;
+				InvalidateRect(hwnd,NULL,0);
+				return 1;
+			}
+
+			if(pos2.x%15==0||pos2.x%15>=12||
+				pos2.y%15==0||pos2.y%15>=12||
+				0>pos2.x||pos2.x/15>=8||
+				0>pos2.y||pos2.y/15>=2){
+				//パディング部分をクリックした場合は抜け出す
+				return 1;
+			}
+
+			//選択カラーを取得
+			hdc=GetDC(hwnd);
+			ColorRef=GetPixel(hdc,pos.x,pos.y);
+			ReleaseDC(hwnd,hdc);
+
+			if(message==WM_LBUTTONDOWN)
+				MdiInfo[WndNum]->MdiIconEditInfo->MainColor=ColorRef;
+			else
+				MdiInfo[WndNum]->MdiIconEditInfo->SubColor=ColorRef;
+
+			InvalidateRect(hwnd,NULL,0);
+			return 1;
+		case WM_PAINT:
+			WndNum=GetWndNum(GetParent(hwnd));
+			if(WndNum==-1) break;
+
+			////////////////////////
+			// カラーテーブルを表示
+			PAINTSTRUCT ps;
+			HPEN hPen,hOldPen;
+			HBRUSH hBrush,hOldBrush;
+
+			GetWindowRect(GetDlgItem(hwnd,IDC_STATIC_COLOR),&rect);
+			pos.x=rect.left;
+			pos.y=rect.top;
+			ScreenToClient(hwnd,&pos);
+			GetWindowRect(GetDlgItem(hwnd,IDC_NOWCOLOR),&rect);
+			pos2.x=rect.left;
+			pos2.y=rect.top;
+			ScreenToClient(hwnd,&pos2);
+
+			//カラーテーブルを取得
+			pRgbq=(RGBQUAD *)(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+sizeof(BITMAPINFOHEADER));
+
+			hdc=BeginPaint(hwnd,&ps);
+			hPen=CreatePen(PS_SOLID,0,RGB(0,0,0));
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+			if(MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biBitCount==4){
+				////////
+				// 16色
+
+				//カラーテーブルを描画
+				i2=16;
+				for(i=0;i<i2;i++){
+					hBrush=CreateSolidBrush(RGB(pRgbq[i].rgbRed,pRgbq[i].rgbGreen,pRgbq[i].rgbBlue));
+					hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+					if(i<i2/2){
+						Rectangle(hdc,
+							pos.x+i*15,
+							pos.y,
+							pos.x+i*15+13,
+							pos.y+13);
+					}
+					else{
+						Rectangle(hdc,
+							pos.x+(i-i2/2)*15,
+							pos.y+15,
+							pos.x+(i-i2/2)*15+13,
+							pos.y+15+13);
+					}
+					SelectObject(hdc,hOldBrush);
+					DeleteObject(hBrush);
+				}
+			}
+			else{
+				/////////
+				// 256色
+
+				//カラーテーブルを描画
+				i2=16;
+				for(i=0;i<i2;i++){
+					hBrush=CreateSolidBrush(RGB(DefaultColorTable16[i].rgbRed,DefaultColorTable16[i].rgbGreen,DefaultColorTable16[i].rgbBlue));
+					hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+					if(i<i2/2){
+						Rectangle(hdc,
+							pos.x+i*15,
+							pos.y,
+							pos.x+i*15+13,
+							pos.y+13);
+					}
+					else{
+						Rectangle(hdc,
+							pos.x+(i-i2/2)*15,
+							pos.y+15,
+							pos.x+(i-i2/2)*15+13,
+							pos.y+15+13);
+					}
+					SelectObject(hdc,hOldBrush);
+					DeleteObject(hBrush);
+				}
+			}
+
+			//透明色カラーを表示
+			hBrush=CreateSolidBrush(TransparentClrRef);
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			Rectangle(hdc,
+				pos.x+(i2/2+1)*15,
+				pos.y,
+				pos.x+(i2/2+1)*15+13,
+				pos.y+13);
+			SelectObject(hdc,hOldBrush);
+			DeleteObject(hBrush);
+
+			MoveToEx(hdc,pos.x+(i2/2+1)*15,pos.y,NULL);
+			LineTo(hdc,pos.x+(i2/2+1)*15+13,pos.y+13);
+
+
+			//現在選択中のサブカラーを表示
+			hBrush=CreateSolidBrush(MdiInfo[WndNum]->MdiIconEditInfo->SubColor);
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			Rectangle(hdc,
+				pos2.x+10,
+				pos2.y+10,
+				pos2.x+23,
+				pos2.y+23);
+			SelectObject(hdc,hOldBrush);
+			DeleteObject(hBrush);
+
+			//現在選択中のメインカラーを表示
+			hBrush=CreateSolidBrush(MdiInfo[WndNum]->MdiIconEditInfo->MainColor);
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			Rectangle(hdc,
+				pos2.x+3,
+				pos2.y+3,
+				pos2.x+16,
+				pos2.y+16);
+			SelectObject(hdc,hOldBrush);
+			DeleteObject(hBrush);
+
+			SelectObject(hdc,hOldPen);
+			DeleteObject(hPen);
+			EndPaint(hwnd,&ps);
+			return 1;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/IconEditor_Main.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/IconEditor_Main.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/IconEditor_Main.cpp	(revision 774)
@@ -0,0 +1,1563 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+#define ZOOMED_XPOS 100
+#define PIXEL_WIDTH	10
+
+RGBQUAD TransparentRgbq={230,230,255};	//blue,green,red（透明色）
+COLORREF TransparentClrRef=RGB(255,230,230);	//red,green,blue（透明色）
+
+void IconEdit_SelectImage(int WndNum);
+
+void LimitRectFormat(int WndNum,RECT *pRect){
+	//はみ出した場合は範囲内におさめる
+	if(pRect->left<0) pRect->left=0;
+	if(pRect->top<0) pRect->top=0;
+	if(pRect->left>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth)
+		pRect->left=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth-1;
+	if(pRect->top>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		pRect->top=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2-1;
+
+	if(pRect->right<0) pRect->right=0;
+	if(pRect->bottom<0) pRect->bottom=0;
+	if(pRect->right>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth)
+		pRect->right=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth-1;
+	if(pRect->bottom>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		pRect->bottom=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2-1;
+}
+void GetZoomedPos(POINT *pPos){
+	pPos->x=pPos->x*PIXEL_WIDTH+ZOOMED_XPOS;
+	pPos->y*=PIXEL_WIDTH;
+}
+void SetZoomedPixel(HDC hdc,int WndNum,int x,int y){
+	POINT pos;
+
+	if(x<0||y<0||
+		x>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth||
+		y>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		return;
+
+	pos.x=x;
+	pos.y=y;
+	GetZoomedPos(&pos);
+	Rectangle(hdc,pos.x,pos.y,pos.x+11,pos.y+11);
+}
+DWORD GetColorCode(int WndNum,COLORREF ColorRef){
+	int i,i2;
+	RGBQUAD *pRgbq;
+
+	//透明色の場合
+	if(ColorRef==TransparentClrRef) return -1;
+
+	//カラーテーブルを取得
+	pRgbq=(RGBQUAD *)(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+sizeof(BITMAPINFOHEADER));
+
+	i2=(int)pow((double)2,(double)MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biBitCount);
+	for(i=0;i<i2;i++){
+		if(ColorRef==RGB(pRgbq[i].rgbRed,pRgbq[i].rgbGreen,pRgbq[i].rgbBlue)) break;
+	}
+	if(i==i2) i=0;
+
+	return i;
+}
+HGLOBAL IconEdit_GetChildInfoClipboardData(int WndNum){
+	//////////////////////////////////////////////
+	// 選択中のイメージをクリップボードへ保存する
+	//////////////////////////////////////////////
+
+	HDC hDC;
+	HBITMAP hBmp;
+	SIZE size;
+	int sw;
+
+	//何も選択されていない場合は0を返す
+	sw=0;
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==0) return 0;
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==1){
+		IconEdit_SelectImage(WndNum);
+		sw=1;
+	}
+
+	size.cx=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left+1;
+	size.cy=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top+1;
+
+	hDC=CreateCompatibleDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+	hBmp=CreateCompatibleBitmap(
+		MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+		size.cx,
+		size.cy);
+	SelectObject(hDC,hBmp);
+
+	BitBlt(hDC,0,0,size.cx,size.cy,
+		MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top,
+		SRCCOPY);
+
+	DeleteDC(hDC);
+
+	if(sw){
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+		MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=1;
+	}
+
+	return hBmp;
+}
+void IconEdit_PasteChildInfoClipboardData(int WndNum,HBITMAP hBmp){
+	////////////////////////////////////
+	// クリップボードの内容を貼り付ける
+	////////////////////////////////////
+
+	HDC hDC,hDC2;
+	BITMAP Bitmap;
+
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+		IconEdit_PasteImage(WndNum);
+
+	GetObject(hBmp,sizeof(Bitmap),&Bitmap);
+
+	hDC=CreateCompatibleDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+	MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp=
+		CreateCompatibleBitmap(MdiInfo[WndNum]->MdiIconEditInfo->memdc,Bitmap.bmWidth,Bitmap.bmHeight);
+	SelectObject(hDC,MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	hDC2=CreateCompatibleDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+	SelectObject(hDC2,hBmp);
+
+	BitBlt(hDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,
+		hDC2,0,0,SRCCOPY);
+
+	DeleteDC(hDC);
+	DeleteDC(hDC2);
+
+	MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left=0;
+	MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top=0;
+	MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right=Bitmap.bmWidth-1;
+	MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom=Bitmap.bmHeight-1;
+
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=2;
+}
+
+void IconEdit_SelectImage(int WndNum){
+	SIZE size;
+	HDC hDC;
+
+	size.cx=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left+1;
+	size.cy=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top+1;
+
+	hDC=CreateCompatibleDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+	MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp=
+		CreateCompatibleBitmap(MdiInfo[WndNum]->MdiIconEditInfo->memdc,size.cx,size.cy);
+	SelectObject(hDC,MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	BitBlt(hDC,0,0,size.cx,size.cy,
+		MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top,
+		SRCCOPY);
+	DeleteDC(hDC);
+
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=2;
+}
+void IconEdit_PasteImage(int WndNum){
+	extern HANDLE hHeap;
+	int i,i2,i3,x,y,y2,selecting_x,selecting_y;
+	DWORD dwRgbq;
+
+	//コピー先
+	RGBQUAD *pRgbq;
+	BYTE *pBuffer,*pMaskBuf;
+	BITMAPINFOHEADER *pBmpInfoHdr;
+
+	//コピー元
+	BITMAP Bitmap;
+	BITMAPINFO SelectingBitmapInfo;
+	COLORREF *pSelectingBuffer;
+
+	//変更情報
+	IconEdit_NoticeChanging(WndNum);
+
+	GetObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp,sizeof(BITMAP),&Bitmap);
+	pSelectingBuffer=(COLORREF *)HeapAlloc(hHeap,0,Bitmap.bmWidth*Bitmap.bmHeight*sizeof(COLORREF));
+	SelectingBitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	SelectingBitmapInfo.bmiHeader.biWidth=Bitmap.bmWidth;
+	SelectingBitmapInfo.bmiHeader.biHeight=Bitmap.bmHeight;
+	SelectingBitmapInfo.bmiHeader.biPlanes=1;
+	SelectingBitmapInfo.bmiHeader.biBitCount=32;
+	SelectingBitmapInfo.bmiHeader.biCompression=BI_RGB;
+	GetDIBits(MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+		MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp,
+		0,Bitmap.bmHeight,
+		pSelectingBuffer,&SelectingBitmapInfo,DIB_RGB_COLORS);
+
+	pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	//カラーテーブルを取得
+	pRgbq=(RGBQUAD *)(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+sizeof(BITMAPINFOHEADER));
+
+	//ビットバッファを取得
+	pBuffer=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+
+		sizeof(BITMAPINFOHEADER);
+	if(pBmpInfoHdr->biBitCount<=8)
+		pBuffer+=sizeof(DWORD)*(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+
+	//マスクバッファを取得
+	pMaskBuf=pBuffer+pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+
+	for(y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom;y>=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;y--){
+		for(x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;x<=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right;x++){
+			if(x<0||y<0||
+				x>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth||
+				y>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2){
+				//範囲外の場合
+				continue;
+			}
+
+			selecting_x=x-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;
+			selecting_y=y-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;
+			dwRgbq=pSelectingBuffer[(Bitmap.bmHeight-1-selecting_y)*Bitmap.bmWidth+selecting_x];
+
+			if(pBmpInfoHdr->biBitCount==4||pBmpInfoHdr->biBitCount==8){
+				i=(pBmpInfoHdr->biHeight/2-1-y)*pBmpInfoHdr->biWidth+x;
+				if(dwRgbq==*(DWORD *)&TransparentRgbq){
+					//////////////////
+					// 透明色にセット
+					if(pBmpInfoHdr->biWidth==16){
+						//一行の4バイト境界を考慮
+						y2=(pBmpInfoHdr->biHeight/2-1)-y;
+						pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]|=0x01<<(8-(i%8+1));
+					}
+					else pMaskBuf[i/8]|=0x01<<(8-(i%8+1));
+
+					/////////////////
+					// 色を0にセット
+					i3=(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+					for(i2=0;i2<i3;i2++){
+						if(dwRgbq==((DWORD *)pRgbq)[i2]) break;
+					}
+					switch(pBmpInfoHdr->biBitCount){
+						case 4:		//16色
+							if(i%2==0) *(pBuffer+i/2)&=0x0F;
+							else *(pBuffer+i/2)&=0xF0;
+							break;
+						case 8:		//256色
+							pBuffer[i]=0;
+							break;
+					}
+				}
+				else{
+					////////////////////
+					// 無透明色にセット
+					if(pBmpInfoHdr->biWidth==16){
+						//一行の4バイト境界を考慮
+						y2=(pBmpInfoHdr->biHeight/2-1)-y;
+						pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]&=~(0x01<<(8-(i%8+1)));
+					}
+					else pMaskBuf[i/8]&=~(0x01<<(8-(i%8+1)));
+
+					//////////////
+					// 色をセット
+					i3=(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+					for(i2=0;i2<i3;i2++){
+						if(dwRgbq==((DWORD *)pRgbq)[i2]) break;
+					}
+					switch(pBmpInfoHdr->biBitCount){
+						case 4:		//16色
+							if(i%2==0){
+								*(pBuffer+i/2)&=0x0F;
+								*(pBuffer+i/2)|=i2<<4;
+							}
+							else{
+								*(pBuffer+i/2)&=0xF0;
+								*(pBuffer+i/2)|=i2;
+							}
+							break;
+						case 8:		//256色
+							pBuffer[i]=i2;
+							break;
+					}
+				}
+			}
+		}
+	}
+	HeapDefaultFree(pSelectingBuffer);
+
+	DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+}
+
+void DrawIconToMemBmp(int WndNum,RECT *pRect){
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+	int i,i2,i3,x,y,y2;
+	POINT pos;
+	RGBQUAD *pRgbq;
+	COLORREF ColorRef;
+	BYTE *pBuffer,*pMaskBuf;
+	BITMAPINFOHEADER *pBmpInfoHdr;
+
+	pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	if( !(pBmpInfoHdr->biBitCount == 4 || pBmpInfoHdr->biBitCount == 8 ) ){
+		//16色、256色以外の場合
+		//未対応
+		return;
+	}
+
+	hPen=CreatePen(PS_SOLID,0,RGB(200,200,200));
+	hOldPen=(HPEN)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hPen);
+
+	//カラーテーブルを取得
+	pRgbq=(RGBQUAD *)(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+sizeof(BITMAPINFOHEADER));
+
+	//ビットバッファを取得
+	pBuffer=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+
+		sizeof(BITMAPINFOHEADER);
+	if(pBmpInfoHdr->biBitCount<=8)
+		pBuffer+=sizeof(DWORD)*(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+
+	//マスクバッファを取得
+	pMaskBuf=pBuffer+pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+
+	i=0;	//標準ピクセルのバイトカウンタ
+	i3=0;	//透明ピクセルのバイトカウンタ
+	for(y=pBmpInfoHdr->biHeight/2-1;y>=0;y--){
+		for(x=0;x<pBmpInfoHdr->biWidth;x++,i++,i3++){
+			if(pRect){
+				//メモリへの再描画が必要ない場合を検証（実行速度向上のため）
+				if(!(pRect->left<=x&&x<=pRect->right&&
+					pRect->top<=y&&y<=pRect->bottom)) continue;
+			}
+
+			//////////////////////
+			// マスクビットの確認
+			if(pBmpInfoHdr->biWidth==16){
+				//一行の4バイト境界を考慮
+				y2=(pBmpInfoHdr->biHeight/2-1)-y;
+				i2=(pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]>>(8-(i%8+1)))&0x01;
+			}
+			else i2=(pMaskBuf[i/8]>>(8-(i%8+1)))&0x01;
+			if(i2){
+				hBrush=CreateSolidBrush(TransparentClrRef);
+				hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hBrush);
+				pos.x=x;
+				pos.y=y;
+				GetZoomedPos(&pos);
+				Rectangle(MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+					pos.x,
+					pos.y,
+					pos.x+11,
+					pos.y+11);
+				SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldBrush);
+				DeleteObject(hBrush);
+
+				SetPixel(MdiInfo[WndNum]->MdiIconEditInfo->memdc,x,y,TransparentClrRef);
+				continue;
+			}
+
+			////////////////
+			// 通常ピクセル
+			if( pBmpInfoHdr->biBitCount == 4 ){
+				//16色
+				i2=*(pBuffer+i/2);
+				if(i%2==0) i2>>=4;
+				i2&=0x0F;
+				ColorRef=RGB(pRgbq[i2].rgbRed,pRgbq[i2].rgbGreen,pRgbq[i2].rgbBlue);
+			}
+			else if( pBmpInfoHdr->biBitCount == 8 ){
+				//256色
+				i2=pBuffer[i];
+				ColorRef=RGB(pRgbq[i2].rgbRed,pRgbq[i2].rgbGreen,pRgbq[i2].rgbBlue);
+				break;
+			}
+
+			hBrush=CreateSolidBrush(ColorRef);
+			hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hBrush);
+			pos.x=x;
+			pos.y=y;
+			GetZoomedPos(&pos);
+			Rectangle(MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+				pos.x,
+				pos.y,
+				pos.x+11,
+				pos.y+11);
+			SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldBrush);
+			DeleteObject(hBrush);
+
+			SetPixel(MdiInfo[WndNum]->MdiIconEditInfo->memdc,x,y,ColorRef);
+		}
+	}
+
+	SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldPen);
+	DeleteObject(hPen);
+}
+
+void PixelChange(int WndNum,int x,int y,DWORD ColorCode){
+	int i;
+	int y2;
+	BYTE *pBuffer,*pMaskBuf;
+	BITMAPINFOHEADER *pBmpInfoHdr;
+
+	if(x<0||y<0) return;
+	if(x>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth||
+		y>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		return;
+
+	pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	pBuffer=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+
+		sizeof(BITMAPINFOHEADER);
+	pBuffer+=sizeof(DWORD)*(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+
+	pMaskBuf=pBuffer+pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+
+	if(x>=pBmpInfoHdr->biWidth||y>=pBmpInfoHdr->biHeight/2) return;
+	y2=(pBmpInfoHdr->biHeight/2-1)-y;
+	i=pBmpInfoHdr->biWidth*y2+x;
+
+	//////////////////
+	// マスクピクセル
+	if(ColorCode==-1){
+		//透明色に指定
+		if(pBmpInfoHdr->biWidth==16){
+			//一行の4バイト境界を考慮
+			pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]|=0x01<<(8-(i%8+1));
+		}
+		else pMaskBuf[i/8]|=0x01<<(8-(i%8+1));
+
+		ColorCode=0;
+	}
+	else{
+		//無透明色に指定
+		if(pBmpInfoHdr->biWidth==16){
+			//一行の4バイト境界を考慮
+			pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]&=~(0x01<<(8-(i%8+1)));
+		}
+		else pMaskBuf[i/8]&=~(0x01<<(8-(i%8+1)));
+	}
+
+	////////////////
+	// 通常ピクセル
+	switch(pBmpInfoHdr->biBitCount){
+		case 4:
+			////////
+			// 16色
+			if(i%2) *(pBuffer+i/2)=(*(pBuffer+i/2)&0xF0)|(BYTE)ColorCode;
+			else *(pBuffer+i/2)=(*(pBuffer+i/2)&0x0F)|(BYTE)ColorCode<<4;
+			break;
+		case 8:
+			/////////
+			// 256色
+			pBuffer[i]=(BYTE)ColorCode;
+			break;
+	}
+}
+COLORREF IconEdit_GetPixel(int WndNum,int x,int y){
+	int i,i2;
+	int y2;
+	BYTE *pBuffer,*pMaskBuf;
+	BITMAPINFOHEADER *pBmpInfoHdr;
+	RGBQUAD *pRgbq;
+	COLORREF ColorRef;
+
+	if(x<0||y<0) return 0;
+	if(x>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth||
+		y>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		return 0;
+
+	pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	//カラーテーブルを取得
+	pRgbq=(RGBQUAD *)(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+sizeof(BITMAPINFOHEADER));
+
+	//通常バッファを取得
+	pBuffer=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]+
+		sizeof(BITMAPINFOHEADER)+
+		sizeof(DWORD)*(int)pow((double)2,(double)pBmpInfoHdr->biBitCount);
+
+	//マスクバッファを取得
+	pMaskBuf=pBuffer+pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
+
+	if(x>=pBmpInfoHdr->biWidth||y>=pBmpInfoHdr->biHeight/2) return 0;
+	y2=(pBmpInfoHdr->biHeight/2-1)-y;
+	i=pBmpInfoHdr->biWidth*y2+x;
+
+	//////////////////
+	// マスクピクセル
+	if(pBmpInfoHdr->biWidth==16){
+		//一行の4バイト境界を考慮
+		if((pMaskBuf[(i+pBmpInfoHdr->biWidth*y2)/8]>>(8-(i%8+1)))&0x01)
+			return TransparentClrRef;
+	}
+	else{
+		if((pMaskBuf[i/8]>>(8-(i%8+1)))&0x01)
+			return TransparentClrRef;
+	}
+
+	////////////////
+	// 通常ピクセル
+	switch(pBmpInfoHdr->biBitCount){
+		case 4:		//16色
+			if(i%2) i2=*(pBuffer+i/2)&0x0F;
+			else i2=(*(pBuffer+i/2)>>4)&0x0F;
+			ColorRef=RGB(pRgbq[i2].rgbRed,pRgbq[i2].rgbGreen,pRgbq[i2].rgbBlue);
+			break;
+		case 8:		//256色
+			i2=pBuffer[i];
+			ColorRef=RGB(pRgbq[i2].rgbRed,pRgbq[i2].rgbGreen,pRgbq[i2].rgbBlue);
+			break;
+	}
+	return ColorRef;
+}
+void IconEdit_DrawLine(int WndNum,int x1,int y1,int x2,int y2,DWORD ColorCode){
+	int dx,dy,s,step;
+
+	dx=abs(x2-x1);
+	dy=abs(y2-y1);
+	if(dx>dy){
+		if(x1>x2){
+			step=(y1>y2)?1:-1;
+			s=x1;
+			x1=x2;
+			x2=s;
+			y1=y2;
+		}
+		else step=(y1<y2)?1:-1;
+
+		PixelChange(WndNum,x1,y1,ColorCode);
+
+		s=dx>>1;
+		while(++x1<=x2){
+			if((s-=dy)<0){
+				s+=dx;
+				y1+=step;
+			}
+
+			PixelChange(WndNum,x1,y1,ColorCode);
+		}
+	}
+	else{
+		if(y1>y2){
+			step=(x1>x2)?1:-1;
+			s=y1;
+			y1=y2;
+			y2=s;
+			x1=x2;
+		}
+		else step=(x1<x2)?1:-1;
+
+		PixelChange(WndNum,x1,y1,ColorCode);
+
+		s=dy>>1;
+		while(++y1<=y2){
+			if((s-=dx)<0){
+				s+=dy;
+				x1+=step;
+			}
+
+			PixelChange(WndNum,x1,y1,ColorCode);
+		}
+	}
+}
+void IconEdit_FloodFill(int WndNum,int x,int y,COLORREF FilledColor,DWORD ColorCode){
+
+	if(x<0||y<0) return;
+	if(x>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biWidth||
+		y>=MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]->biHeight/2)
+		return;
+
+	PixelChange(WndNum,x,y,ColorCode);
+
+	if(IconEdit_GetPixel(WndNum,x,y+1)==FilledColor)
+		IconEdit_FloodFill(WndNum,x,y+1,FilledColor,ColorCode);
+	if(IconEdit_GetPixel(WndNum,x+1,y)==FilledColor)
+		IconEdit_FloodFill(WndNum,x+1,y,FilledColor,ColorCode);
+	if(IconEdit_GetPixel(WndNum,x,y-1)==FilledColor)
+		IconEdit_FloodFill(WndNum,x,y-1,FilledColor,ColorCode);
+	if(IconEdit_GetPixel(WndNum,x-1,y)==FilledColor)
+		IconEdit_FloodFill(WndNum,x-1,y,FilledColor,ColorCode);
+}
+void IconEdit_DrawRectangle(int WndNum,int x1,int y1,int x2,int y2,DWORD ColorCode,DWORD FillClrCode,BOOL bFill){
+	RectNaturalFormat(&x1,&y1,&x2,&y2);
+
+	IconEdit_DrawLine(WndNum,x1,y1,x1,y2,ColorCode);
+	IconEdit_DrawLine(WndNum,x2,y1,x2,y2,ColorCode);
+	IconEdit_DrawLine(WndNum,x1+1,y1,x2-1,y1,ColorCode);
+	IconEdit_DrawLine(WndNum,x1+1,y2,x2-1,y2,ColorCode);
+
+	if(bFill){
+		int x,y;
+		for(x=x1+1;x<x2;x++){
+			for(y=y1+1;y<y2;y++) PixelChange(WndNum,x,y,FillClrCode);
+		}
+	}
+}
+void IconEdit_DrawEllipse(int WndNum,int x1,int y1,int x2,int y2,DWORD ColorCode){
+	RECT rect,rc2;
+
+	rect.left=x1;
+	rect.top=y1;
+	rect.right=x2;
+	rect.bottom=y2;
+	RectNaturalFormat(&rect,&rc2);
+
+	int xc,yc,rx,ry;
+	int x,y,r;
+
+	rx=(rc2.right-rc2.left)/2;
+	ry=(rc2.bottom-rc2.top)/2;
+	xc=rc2.left+rx;
+	yc=rc2.top+ry;
+	if(rx==0&&ry==0){
+		if(rc2.bottom-rc2.top==1&&rc2.bottom-rc2.top==1)
+			IconEdit_DrawRectangle(WndNum,x1,y1,x2,y2,ColorCode,0,0);
+		else IconEdit_DrawLine(WndNum,x1,y1,x2,y2,ColorCode);
+		return;
+	}
+
+	int bX,bY;
+	if((rc2.right-rc2.left)%2) bX=1;
+	else bX=0;
+	if((rc2.bottom-rc2.top)%2) bY=1;
+	else bY=0;
+
+	if(rx>ry){
+		x=r=rx;
+		y=0;
+		while(x>=y){
+			x1=x*ry/rx;
+			y1=y*ry/rx;
+
+			PixelChange(WndNum,xc+x+bX,yc+y1+bY,ColorCode);
+			PixelChange(WndNum,xc+x+bX,yc-y1,ColorCode);
+			PixelChange(WndNum,xc-x,yc+y1+bY,ColorCode);
+			PixelChange(WndNum,xc-x,yc-y1,ColorCode);
+			PixelChange(WndNum,xc+y+bX,yc+x1+bY,ColorCode);
+			PixelChange(WndNum,xc+y+bX,yc-x1,ColorCode);
+			PixelChange(WndNum,xc-y,yc+x1+bY,ColorCode);
+			PixelChange(WndNum,xc-y,yc-x1,ColorCode);
+
+			if((r-=(y++<<1)+1)<=0) r+=(x-- -1)<<1;
+		}
+	}
+	else{
+		x=r=ry;
+		y=0;
+		while(x>=y){
+			x1=x*rx/ry;
+			y1=y*rx/ry;
+
+			PixelChange(WndNum,xc+x1+bX,yc+y+bY,ColorCode);
+			PixelChange(WndNum,xc+x1+bX,yc-y,ColorCode);
+			PixelChange(WndNum,xc-x1,yc+y+bY,ColorCode);
+			PixelChange(WndNum,xc-x1,yc-y,ColorCode);
+			PixelChange(WndNum,xc+y1+bX,yc+x+bY,ColorCode);
+			PixelChange(WndNum,xc+y1+bX,yc-x,ColorCode);
+			PixelChange(WndNum,xc-y1,yc+x+bY,ColorCode);
+			PixelChange(WndNum,xc-y1,yc-x,ColorCode);
+
+			if((r-=(y++<<1)+1)<=0) r+=(x-- -1)<<1;
+		}
+	}
+}
+
+void IconEdit_EraseRect(int WndNum,RECT *pRect){
+
+	//変更情報
+	IconEdit_NoticeChanging(WndNum);
+
+	IconEdit_DrawRectangle(WndNum,
+		pRect->left,
+		pRect->top,
+		pRect->right,
+		pRect->bottom,
+		GetColorCode(WndNum,MdiInfo[WndNum]->MdiIconEditInfo->SubColor),
+		GetColorCode(WndNum,MdiInfo[WndNum]->MdiIconEditInfo->SubColor),1);
+
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+}
+
+void IconEdit_DrawFrame(HWND hwnd,int WndNum,RECT *pRect){
+	HDC hdc;
+	HPEN hPen,hOldPen;
+	HBRUSH hOldBrush;
+	RECT rect;
+	POINT pos;
+
+	//////////////////////
+	// 選択フレームの描画
+
+	hdc=GetDC(hwnd);
+
+	//以前の選択フレームを消去
+	BITMAPINFOHEADER *pBmpInfoHdr;
+	pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+	pos.x=pBmpInfoHdr->biWidth;
+	pos.y=pBmpInfoHdr->biHeight/2;
+	GetZoomedPos(&pos);
+	BitBlt(hdc,0,0,pos.x,pos.y,MdiInfo[WndNum]->MdiIconEditInfo->memdc,0,0,SRCCOPY);
+
+
+	hPen=CreatePen(PS_DOT,0,RGB(0,0,0));
+	SetBkMode(hdc,TRANSPARENT);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+
+	pos.x=pRect->left;
+	pos.y=pRect->top;
+	GetZoomedPos(&pos);
+	rect.left=pos.x;
+	rect.top=pos.y;
+
+	pos.x=pRect->right+1;
+	pos.y=pRect->bottom+1;
+	GetZoomedPos(&pos);
+	rect.right=pos.x+1;
+	rect.bottom=pos.y+1;
+
+	Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
+	SelectObject(hdc,hOldBrush);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+
+	ReleaseDC(hwnd,hdc);
+}
+void IconEdit_DrawSelectingRect(HDC hdc,int WndNum){
+	int i2,i3;
+	HPEN hPen,hOldPen;
+	HBRUSH hOldBrush;
+	COLORREF rgb;
+	RECT rect;
+
+	rect.left=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left*PIXEL_WIDTH+ZOOMED_XPOS;
+	rect.top=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top*PIXEL_WIDTH;
+	rect.right=(MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right+1)*PIXEL_WIDTH+ZOOMED_XPOS+1;
+	rect.bottom=(MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom+1)*PIXEL_WIDTH+1;
+
+	SetBkMode(hdc,TRANSPARENT);
+
+	//主線
+	hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+	hPen=CreatePen(PS_SOLID,0,RGB(0,0,0));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	Rectangle(hdc,
+		rect.left+2, rect.top+2,
+		rect.right-2, rect.bottom-2);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+	hPen=CreatePen(PS_SOLID,0,RGB(255,255,255));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	Rectangle(hdc,
+		rect.left+1, rect.top+1,
+		rect.right-1, rect.bottom-1);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+	SelectObject(hdc,hOldBrush);
+
+	rgb=RGB(255,60,30);
+	hPen=CreatePen(PS_SOLID,0,rgb);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+	hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(WHITE_BRUSH));
+
+	Rectangle(hdc,
+		rect.left,rect.top,
+		rect.left+5,rect.top+5);
+	Rectangle(hdc,
+		rect.left,rect.bottom-5,
+		rect.left+5,rect.bottom);
+	Rectangle(hdc,
+		rect.right-5,rect.top,
+		rect.right,rect.top+5);
+	Rectangle(hdc,
+		rect.right-5,rect.bottom-5,
+		rect.right,rect.bottom);
+
+	i2=(rect.right-rect.left)/2;
+	i3=(rect.bottom-rect.top)/2;
+	Rectangle(hdc,
+		rect.left+i2-2,rect.top,
+		rect.left+i2+3,rect.top+5);
+	Rectangle(hdc,
+		rect.left+i2-2,rect.bottom-5,
+		rect.left+i2+3,rect.bottom);
+	Rectangle(hdc,
+		rect.left,rect.top+i3-2,
+		rect.left+5,rect.top+i3+3);
+	Rectangle(hdc,
+		rect.right-5,rect.top+i3-2,
+		rect.right,rect.top+i3+3);
+
+	SelectObject(hdc,hOldBrush);
+
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+}
+void DrawZoomedBitmap(HDC hdc,int WndNum,POINT *pPos){
+	extern HANDLE hHeap;
+	int x,y;
+	RGBQUAD rgbq;
+	HPEN hPen,hOldPen;
+	POINT pos;
+
+	BITMAP Bitmap;
+	BITMAPINFO SelectingBitmapInfo;
+	COLORREF *pSelectingBuffer;
+
+	GetObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp,sizeof(BITMAP),&Bitmap);
+	pSelectingBuffer=(COLORREF *)HeapAlloc(hHeap,0,Bitmap.bmWidth*Bitmap.bmHeight*sizeof(COLORREF));
+	SelectingBitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	SelectingBitmapInfo.bmiHeader.biWidth=Bitmap.bmWidth;
+	SelectingBitmapInfo.bmiHeader.biHeight=Bitmap.bmHeight;
+	SelectingBitmapInfo.bmiHeader.biPlanes=1;
+	SelectingBitmapInfo.bmiHeader.biBitCount=32;
+	SelectingBitmapInfo.bmiHeader.biCompression=BI_RGB;
+	GetDIBits(MdiInfo[WndNum]->MdiIconEditInfo->memdc,
+		MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp,
+		0,Bitmap.bmHeight,
+		pSelectingBuffer,&SelectingBitmapInfo,DIB_RGB_COLORS);
+
+	hPen=CreatePen(PS_SOLID,0,RGB(200,200,200));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+	for(y=Bitmap.bmHeight-1;y>=0;y--){
+		for(x=0;x<Bitmap.bmWidth;x++){
+			memcpy(&rgbq,
+				&pSelectingBuffer[(Bitmap.bmHeight-y-1)*Bitmap.bmWidth+x],
+				sizeof(RGBQUAD));
+
+			HBRUSH hBrush,hOldBrush;
+			hBrush=CreateSolidBrush(RGB(rgbq.rgbRed,rgbq.rgbGreen,rgbq.rgbBlue));
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+			pos.x=pPos->x+x;
+			pos.y=pPos->y+y;
+			GetZoomedPos(&pos);
+			Rectangle(hdc,pos.x,pos.y,pos.x+11,pos.y+11);
+
+			SelectObject(hdc,hOldBrush);
+			DeleteObject(hBrush);
+		}
+	}
+
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+
+	HeapDefaultFree(pSelectingBuffer);
+}
+int IconEdit_GetStateOfDraggingFrame(int WndNum,int x,int y){
+	POINT pos;
+	RECT rect;
+
+	pos.x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;
+	pos.y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;
+	GetZoomedPos(&pos);
+	rect.left=pos.x;
+	rect.top=pos.y;
+	pos.x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right+1;
+	pos.y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom+1;
+	GetZoomedPos(&pos);
+	rect.right=pos.x;
+	rect.bottom=pos.y;
+
+	if(rect.left<x&&x<rect.right&&
+		rect.top<y&&y<rect.bottom) return FRAME_INSIDE;
+	return 0;
+}
+void DrawSelectingImage(HDC hdc,int WndNum){
+	/////////////////////////////////
+	// 選択されているイメージを表示
+
+	HDC hDC2;
+	SIZE size;
+	POINT pos;
+
+	size.cx=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;
+	size.cy=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom-MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;
+	hDC2=CreateCompatibleDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+	SelectObject(hDC2,MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+	BitBlt(hdc,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left,
+		MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top,
+		size.cx,size.cy,
+		hDC2,0,0,SRCCOPY);
+	DeleteDC(hDC2);
+
+	//拡大選択イメージを表示
+	pos.x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;
+	pos.y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;
+	DrawZoomedBitmap(hdc,WndNum,&pos);
+}
+void TempLine(HDC hdc,int WndNum,int x1,int y1,int x2,int y2,COLORREF ColorRef){
+	int dx,dy,s,step;
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+
+	hPen=CreatePen(PS_SOLID,0,RGB(200,200,200));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	hBrush=CreateSolidBrush(ColorRef);
+	hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+	dx=abs(x2-x1);
+	dy=abs(y2-y1);
+	if(dx>dy){
+		if(x1>x2){
+			step=(y1>y2)?1:-1;
+			s=x1;
+			x1=x2;
+			x2=s;
+			y1=y2;
+		}
+		else step=(y1<y2)?1:-1;
+
+		SetZoomedPixel(hdc,WndNum,x1,y1);
+
+		s=dx>>1;
+		while(++x1<=x2){
+			if((s-=dy)<0){
+				s+=dx;
+				y1+=step;
+			}
+
+			SetZoomedPixel(hdc,WndNum,x1,y1);
+		}
+	}
+	else{
+		if(y1>y2){
+			step=(x1>x2)?1:-1;
+			s=y1;
+			y1=y2;
+			y2=s;
+			x1=x2;
+		}
+		else step=(x1<x2)?1:-1;
+
+		SetZoomedPixel(hdc,WndNum,x1,y1);
+
+		s=dy>>1;
+		while(++y1<=y2){
+			if((s-=dx)<0){
+				s+=dy;
+				x1+=step;
+			}
+
+			SetZoomedPixel(hdc,WndNum,x1,y1);
+		}
+	}
+
+	SelectObject(hdc,hOldBrush);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+	DeleteObject(hBrush);
+}
+void TempRectangle(HDC hdc,int WndNum,int x1,int y1,int x2,int y2,COLORREF ColorRef,COLORREF FillClrRef,BOOL bFill){
+	int x,y;
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+	RECT rect,rc2;
+
+	hPen=CreatePen(PS_SOLID,0,ColorRef);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	if(!bFill) hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
+	else hBrush=CreateSolidBrush(FillClrRef);
+	hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+	Rectangle(hdc,x1,y1,x2,y2);
+	SelectObject(hdc,hOldBrush);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+	if(bFill) DeleteObject(hBrush);
+
+	rect.left=x1;
+	rect.top=y1;
+	rect.right=x2;
+	rect.bottom=y2;
+	RectNaturalFormat(&rect,&rc2);
+
+	hPen=CreatePen(PS_SOLID,0,RGB(200,200,200));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	hBrush=CreateSolidBrush(ColorRef);
+	hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+	x=rc2.left;
+	for(y=rc2.top;y<=rc2.bottom;y++)
+		SetZoomedPixel(hdc,WndNum,x,y);
+
+	x=rc2.right;
+	for(y=rc2.top;y<=rc2.bottom;y++)
+		SetZoomedPixel(hdc,WndNum,x,y);
+
+	y=rc2.top;
+	for(x=rc2.left+1;x<rc2.right;x++)
+		SetZoomedPixel(hdc,WndNum,x,y);
+
+	y=rc2.bottom;
+	for(x=rc2.left+1;x<rc2.right;x++)
+		SetZoomedPixel(hdc,WndNum,x,y);
+
+	SelectObject(hdc,hOldBrush);
+	DeleteObject(hBrush);
+
+	if(bFill){
+		hBrush=CreateSolidBrush(FillClrRef);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+		for(x=rc2.left+1;x<rc2.right;x++){
+			for(y=rc2.top+1;y<rc2.bottom;y++) SetZoomedPixel(hdc,WndNum,x,y);
+		}
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hBrush);
+	}
+
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+}
+void TempEllipse(HDC hdc,int WndNum,int x1,int y1,int x2,int y2,COLORREF ColorRef){
+	HPEN hPen,hOldPen;
+	HBRUSH hBrush,hOldBrush;
+	RECT rect,rc2;
+
+	rect.left=x1;
+	rect.top=y1;
+	rect.right=x2;
+	rect.bottom=y2;
+	RectNaturalFormat(&rect,&rc2);
+
+	int xc,yc,rx,ry;
+	int x,y,r;
+
+	rx=(rc2.right-rc2.left)/2;
+	ry=(rc2.bottom-rc2.top)/2;
+	xc=rc2.left+rx;
+	yc=rc2.top+ry;
+	if(rx==0&&ry==0){
+		if(rc2.bottom-rc2.top==1&&rc2.bottom-rc2.top==1)
+			TempRectangle(hdc,WndNum,x1,y1,x2,y2,ColorRef,0,0);
+		else TempLine(hdc,WndNum,x1,y1,x2,y2,ColorRef);
+		return;
+	}
+
+	int bX,bY;
+	if((rc2.right-rc2.left)%2) bX=1;
+	else bX=0;
+	if((rc2.bottom-rc2.top)%2) bY=1;
+	else bY=0;
+
+	hPen=CreatePen(PS_SOLID,0,RGB(200,200,200));
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	hBrush=CreateSolidBrush(ColorRef);
+	hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+	if(rx>ry){
+		x=r=rx;
+		y=0;
+		while(x>=y){
+			x1=x*ry/rx;
+			y1=y*ry/rx;
+
+			SetZoomedPixel(hdc,WndNum,xc+x+bX,yc+y1+bY);
+			SetZoomedPixel(hdc,WndNum,xc+x+bX,yc-y1);
+			SetZoomedPixel(hdc,WndNum,xc-x,yc+y1+bY);
+			SetZoomedPixel(hdc,WndNum,xc-x,yc-y1);
+			SetZoomedPixel(hdc,WndNum,xc+y+bX,yc+x1+bY);
+			SetZoomedPixel(hdc,WndNum,xc+y+bX,yc-x1);
+			SetZoomedPixel(hdc,WndNum,xc-y,yc+x1+bY);
+			SetZoomedPixel(hdc,WndNum,xc-y,yc-x1);
+
+			SetPixel(hdc,xc+x+bX,yc+y1+bY,ColorRef);
+			SetPixel(hdc,xc+x+bX,yc-y1,ColorRef);
+			SetPixel(hdc,xc-x,yc+y1+bY,ColorRef);
+			SetPixel(hdc,xc-x,yc-y1,ColorRef);
+			SetPixel(hdc,xc+y+bX,yc+x1+bY,ColorRef);
+			SetPixel(hdc,xc+y+bX,yc-x1,ColorRef);
+			SetPixel(hdc,xc-y,yc+x1+bY,ColorRef);
+			SetPixel(hdc,xc-y,yc-x1,ColorRef);
+
+			if((r-=(y++<<1)+1)<=0) r+=(x-- -1)<<1;
+		}
+	}
+	else{
+		x=r=ry;
+		y=0;
+		while(x>=y){
+			x1=x*rx/ry;
+			y1=y*rx/ry;
+
+			SetZoomedPixel(hdc,WndNum,xc+x1+bX,yc+y+bY);
+			SetZoomedPixel(hdc,WndNum,xc+x1+bX,yc-y);
+			SetZoomedPixel(hdc,WndNum,xc-x1,yc+y+bY);
+			SetZoomedPixel(hdc,WndNum,xc-x1,yc-y);
+			SetZoomedPixel(hdc,WndNum,xc+y1+bX,yc+x+bY);
+			SetZoomedPixel(hdc,WndNum,xc+y1+bX,yc-x);
+			SetZoomedPixel(hdc,WndNum,xc-y1,yc+x+bY);
+			SetZoomedPixel(hdc,WndNum,xc-y1,yc-x);
+
+			SetPixel(hdc,xc+x1+bX,yc+y+bY,ColorRef);
+			SetPixel(hdc,xc+x1+bX,yc-y,ColorRef);
+			SetPixel(hdc,xc-x1,yc+y+bY,ColorRef);
+			SetPixel(hdc,xc-x1,yc-y,ColorRef);
+			SetPixel(hdc,xc+y1+bX,yc+x+bY,ColorRef);
+			SetPixel(hdc,xc+y1+bX,yc-x,ColorRef);
+			SetPixel(hdc,xc-y1,yc+x+bY,ColorRef);
+			SetPixel(hdc,xc-y1,yc-x,ColorRef);
+
+			if((r-=(y++<<1)+1)<=0) r+=(x-- -1)<<1;
+		}
+	}
+
+	SelectObject(hdc,hOldBrush);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+	DeleteObject(hBrush);
+}
+LRESULT CALLBACK IconEditWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int WndNum,dx,dy;
+	BOOL bRedrawMemBmp;
+	HDC hdc;
+	POINT pos,p2;
+	RECT rect,rc2;
+	COLORREF ColorRef,MainClrRef,SubClrRef;
+	static DWORD dwDrag;		//左クリック時は1、右クリック時は2、それ以外は0
+	static int NowDragging;
+	static POINT LastPos;
+	static RECT OldRect;
+
+	switch(message){
+		case WM_LBUTTONDOWN:
+		case WM_RBUTTONDOWN:
+			if(dwDrag) return 0;
+
+			pos.x=(short)(LOWORD(lParam)-ZOOMED_XPOS)/PIXEL_WIDTH;
+			pos.y=(short)HIWORD(lParam)/PIXEL_WIDTH;
+
+			SetFocus(hwnd);
+			WndNum=GetWndNum(GetParent(hwnd));
+
+			SetCapture(hwnd);
+			if(message==WM_LBUTTONDOWN){
+				dwDrag=1;
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+			}
+			else{
+				dwDrag=2;
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+			}
+
+			if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_SELECT){
+				if(dwDrag==2){
+					dwDrag=0;
+					ReleaseCapture();
+					break;
+				}
+
+				if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel){
+					NowDragging=IconEdit_GetStateOfDraggingFrame(WndNum,LOWORD(lParam),HIWORD(lParam));
+					if(NowDragging==0){
+						if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==1){
+							MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+							InvalidateRect(hwnd,NULL,0);
+						}
+						else if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+							IconEdit_PasteImage(WndNum);
+
+						NowDragging=SELECTING_FRAME;
+					}
+					else if(NowDragging==FRAME_INSIDE){
+						if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==1){
+							IconEdit_SelectImage(WndNum);
+							IconEdit_EraseRect(WndNum,&MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect);
+						}
+
+						OldRect=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect;
+					}
+				}
+				else{
+					NowDragging=SELECTING_FRAME;
+					SetCursor(LoadCursor(NULL,IDC_CROSS));
+				}
+
+				LastPos=pos;
+				InvalidateRect(hwnd,NULL,0);
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_PEN){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				PixelChange(WndNum,pos.x,pos.y,GetColorCode(WndNum,MainClrRef));
+				LastPos=pos;
+
+				rect.left=pos.x;
+				rect.top=pos.y;
+				rect.right=pos.x;
+				rect.bottom=pos.y;
+				DrawIconToMemBmp(WndNum,&rect);
+				InvalidateRect(hwnd,NULL,0);
+
+				SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_PEN)));
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILL){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				hdc=GetDC(hwnd);
+				ColorRef=GetPixel(hdc,pos.x,pos.y);
+				ReleaseDC(hwnd,hdc);
+				if(ColorRef!=MainClrRef){
+					IconEdit_FloodFill(WndNum,pos.x,pos.y,ColorRef,GetColorCode(WndNum,MainClrRef));
+
+					DrawIconToMemBmp(WndNum,0);
+					InvalidateRect(hwnd,NULL,0);
+				}
+				SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_FILL)));
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_LINE||
+				MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_RECTANGLE||
+				MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT||
+				MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT2||
+				MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_ELLIPSE){
+				hdc=GetDC(hwnd);
+				TempLine(hdc,WndNum,pos.x,pos.y,pos.x,pos.y,MainClrRef);
+				ReleaseDC(hwnd,hdc);
+
+				LastPos=pos;
+
+				SetCursor(LoadCursor(NULL,IDC_CROSS));
+			}
+			return 0;
+		case WM_LBUTTONUP:
+		case WM_RBUTTONUP:
+			if(dwDrag==0) return 0;
+			if(dwDrag==1&&message==WM_RBUTTONUP||
+				dwDrag==2&&message==WM_LBUTTONUP) return 0;
+
+			WndNum=GetWndNum(GetParent(hwnd));
+
+			pos.x=(short)(LOWORD(lParam)-ZOOMED_XPOS)/PIXEL_WIDTH;
+			pos.y=(short)HIWORD(lParam)/PIXEL_WIDTH;
+
+			if(dwDrag==1){
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+			}
+			else{
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+			}
+
+			ReleaseCapture();
+			dwDrag=0;
+
+			bRedrawMemBmp=0;
+			if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_SELECT){
+				if(NowDragging==SELECTING_FRAME){
+					if(LastPos.x==pos.x&&LastPos.y==pos.y){
+						ResetState_EditMenu();
+						return 0;
+					}
+					rect.left=LastPos.x;
+					rect.top=LastPos.y;
+					rect.right=pos.x;
+					rect.bottom=pos.y;
+
+					RectNaturalFormat(&rect,&MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect);
+					LimitRectFormat(WndNum,&MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect);
+					MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=1;
+					InvalidateRect(hwnd,NULL,0);
+				}
+				else if(NowDragging==FRAME_INSIDE)
+					InvalidateRect(hwnd,NULL,0);
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_LINE){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				IconEdit_DrawLine(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,GetColorCode(WndNum,MainClrRef));
+
+				bRedrawMemBmp=1;
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_RECTANGLE){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				IconEdit_DrawRectangle(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,GetColorCode(WndNum,MainClrRef),0,0);
+
+				bRedrawMemBmp=1;
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				IconEdit_DrawRectangle(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,
+					GetColorCode(WndNum,MainClrRef),
+					GetColorCode(WndNum,SubClrRef),1);
+
+				bRedrawMemBmp=1;
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT2){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				IconEdit_DrawRectangle(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,
+					GetColorCode(WndNum,MainClrRef),
+					GetColorCode(WndNum,MainClrRef),1);
+
+				bRedrawMemBmp=1;
+			}
+			else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_ELLIPSE){
+				//変更情報
+				IconEdit_NoticeChanging(WndNum);
+
+				IconEdit_DrawEllipse(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,GetColorCode(WndNum,MainClrRef));
+
+				bRedrawMemBmp=1;
+			}
+
+			if(bRedrawMemBmp){
+				rect.left=LastPos.x;
+				rect.top=LastPos.y;
+				rect.right=pos.x;
+				rect.bottom=pos.y;
+				RectNaturalFormat(&rect,&rc2);
+				DrawIconToMemBmp(WndNum,&rc2);
+				InvalidateRect(hwnd,NULL,0);
+			}
+
+			ResetState_EditMenu();
+			return 0;
+		case WM_MOUSEMOVE:
+			WndNum=GetWndNum(GetParent(hwnd));
+
+			pos.x=(short)(LOWORD(lParam)-ZOOMED_XPOS)/PIXEL_WIDTH;
+			pos.y=(short)HIWORD(lParam)/PIXEL_WIDTH;
+
+			if(dwDrag==1){
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+			}
+			else{
+				MainClrRef=MdiInfo[WndNum]->MdiIconEditInfo->SubColor;
+				SubClrRef=MdiInfo[WndNum]->MdiIconEditInfo->MainColor;
+			}
+
+			if(dwDrag){
+				if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_SELECT){
+					if(NowDragging==SELECTING_FRAME){
+						//範囲選択中
+						rect.left=LastPos.x;
+						rect.top=LastPos.y;
+						rect.right=pos.x;
+						rect.bottom=pos.y;
+						RectNaturalFormat(&rect,&rc2);
+						LimitRectFormat(WndNum,&rc2);
+						IconEdit_DrawFrame(hwnd,WndNum,&rc2);
+					}
+					else if(NowDragging==FRAME_INSIDE){
+						//移動中
+						dx=pos.x-LastPos.x;
+						dy=pos.y-LastPos.y;
+						MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left+=dx;
+						MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right+=dx;
+						MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top+=dy;
+						MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom+=dy;
+						LastPos=pos;
+
+
+						////////////////////////
+						// 古い選択範囲を再描画
+						HRGN hRgn,hRgn2;
+
+						OldRect.right++;
+						OldRect.bottom++;
+
+						hRgn=CreateRectRgnIndirect(&OldRect);
+						hRgn2=CreateRectRgnIndirect(&MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect);
+						CombineRgn(hRgn,hRgn,hRgn2,RGN_XOR);
+						DeleteObject(hRgn2);
+
+						p2.x=OldRect.left;
+						p2.y=OldRect.top;
+						GetZoomedPos(&p2);
+						rect.left=p2.x;
+						rect.top=p2.y;
+						p2.x=OldRect.right;
+						p2.y=OldRect.bottom;
+						GetZoomedPos(&p2);
+						rect.right=p2.x+1;
+						rect.bottom=p2.y+1;
+						hRgn2=CreateRectRgnIndirect(&rect);
+						CombineRgn(hRgn,hRgn,hRgn2,RGN_OR);
+						DeleteObject(hRgn2);
+
+						p2.x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.left;
+						p2.y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.top;
+						GetZoomedPos(&p2);
+						rect.left=p2.x;
+						rect.top=p2.y;
+						p2.x=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.right;
+						p2.y=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect.bottom;
+						GetZoomedPos(&p2);
+						rect.right=p2.x+1;
+						rect.bottom=p2.y+1;
+						hRgn2=CreateRectRgnIndirect(&rect);
+						CombineRgn(hRgn,hRgn,hRgn2,RGN_XOR);
+						DeleteObject(hRgn2);
+
+						InvalidateRgn(hwnd,hRgn,0);
+						DeleteObject(hRgn);
+						UpdateWindow(hwnd);
+						hdc=GetDC(hwnd);
+						DrawSelectingImage(hdc,WndNum);
+						ReleaseDC(hwnd,hdc);
+
+						OldRect=MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect;
+					}
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_PEN){
+					if(abs(pos.x-LastPos.x)>1||abs(pos.y-LastPos.y)>1){
+						IconEdit_DrawLine(WndNum,LastPos.x,LastPos.y,pos.x,pos.y,GetColorCode(WndNum,MainClrRef));
+
+						rect.left=LastPos.x;
+						rect.top=LastPos.y;
+						rect.right=pos.x;
+						rect.bottom=pos.y;
+						RectNaturalFormat(&rect,&rc2);
+						DrawIconToMemBmp(WndNum,&rc2);
+						InvalidateRect(hwnd,NULL,0);
+					}
+					else{
+						PixelChange(WndNum,pos.x,pos.y,GetColorCode(WndNum,MainClrRef));
+
+						rect.left=pos.x;
+						rect.top=pos.y;
+						rect.right=pos.x;
+						rect.bottom=pos.y;
+						DrawIconToMemBmp(WndNum,&rect);
+						InvalidateRect(hwnd,NULL,0);
+					}
+					LastPos=pos;
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_LINE){
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+
+					hdc=GetDC(hwnd);
+					TempLine(hdc,WndNum,LastPos.x,LastPos.y,pos.x,pos.y,MainClrRef);
+					ReleaseDC(hwnd,hdc);
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_RECTANGLE){
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+
+					hdc=GetDC(hwnd);
+					TempRectangle(hdc,WndNum,LastPos.x,LastPos.y,pos.x,pos.y,MainClrRef,0,0);
+					ReleaseDC(hwnd,hdc);
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT){
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+
+					hdc=GetDC(hwnd);
+					TempRectangle(hdc,WndNum,LastPos.x,LastPos.y,pos.x,pos.y,
+						MainClrRef,
+						SubClrRef,1);
+					ReleaseDC(hwnd,hdc);
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT2){
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+
+					hdc=GetDC(hwnd);
+					TempRectangle(hdc,WndNum,LastPos.x,LastPos.y,pos.x,pos.y,
+						MainClrRef,
+						MainClrRef,1);
+					ReleaseDC(hwnd,hdc);
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_ELLIPSE){
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+
+					hdc=GetDC(hwnd);
+					TempEllipse(hdc,WndNum,LastPos.x,LastPos.y,pos.x,pos.y,MainClrRef);
+					ReleaseDC(hwnd,hdc);
+				}
+			}
+			else{
+				//ドラッグ中でないとき
+				if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_SELECT){
+					if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel)
+						SetCursorByState(IconEdit_GetStateOfDraggingFrame(WndNum,LOWORD(lParam),HIWORD(lParam)));
+					else
+						SetCursor(LoadCursor(NULL,IDC_CROSS));
+				}
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_PEN)
+					SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_PEN)));
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILL)
+					SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_FILL)));
+				else if(MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_LINE||
+					MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_RECTANGLE||
+					MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT||
+					MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_FILLRECT2||
+					MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_ELLIPSE){
+					SetCursor(LoadCursor(NULL,IDC_CROSS));
+				}
+			}
+			return 0;
+		case WM_KEYDOWN:
+			switch(wParam){
+				case VK_ESCAPE:
+					WndNum=GetWndNum(GetParent(hwnd));
+					if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2){
+						DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+						MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+					}
+					InvalidateRect(hwnd,NULL,0);
+					return 0;
+			}
+			break;
+		case WM_PAINT:
+			PAINTSTRUCT ps;
+			SIZE size;
+
+			WndNum=GetWndNum(GetParent(hwnd));
+			BITMAPINFOHEADER *pBmpInfoHdr;
+			pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+			hdc=BeginPaint(hwnd,&ps);
+
+			size.cx=ZOOMED_XPOS+pBmpInfoHdr->biWidth*PIXEL_WIDTH+1;
+			size.cy=pBmpInfoHdr->biWidth*PIXEL_WIDTH+1;
+
+			BitBlt(hdc,
+				0,0,
+				size.cx,
+				size.cy,
+				MdiInfo[WndNum]->MdiIconEditInfo->memdc,0,0,SRCCOPY);
+
+			HBRUSH hOldBrush;
+			hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(WHITE_BRUSH));
+			PatBlt(hdc,
+				0,size.cy,
+				ScreenX,ScreenY-size.cy,
+				PATCOPY);
+			PatBlt(hdc,
+				size.cx,0,
+				ScreenX-size.cx,size.cy,
+				PATCOPY);
+
+			if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==1)
+				IconEdit_DrawSelectingRect(hdc,WndNum);
+			if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2){
+				DrawSelectingImage(hdc,WndNum);
+				if(dwDrag==0) IconEdit_DrawSelectingRect(hdc,WndNum);
+			}
+
+			EndPaint(hwnd,&ps);
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/IconEditor_Tool.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/IconEditor_Tool.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/IconEditor_Tool.cpp	(revision 774)
@@ -0,0 +1,231 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+HRESULT ApplyDialogTexture( HWND );
+
+char *GetIconEditToolName(DWORD id){
+	char *pTemp=0;
+
+#if defined(JPN)
+	//日本語
+	if(id==IDC_TOOL_SELECT) pTemp="選択";
+	else if(id==IDC_TOOL_PEN) pTemp="ペン";
+	else if(id==IDC_TOOL_LINE) pTemp="線";
+	else if(id==IDC_TOOL_FILL) pTemp="塗りつぶし";
+	else if(id==IDC_TOOL_RECTANGLE) pTemp="四角形";
+	else if(id==IDC_TOOL_FILLRECT) pTemp="縁付き四角形";
+	else if(id==IDC_TOOL_FILLRECT2) pTemp="塗りつぶし四角形";
+	else if(id==IDC_TOOL_ELLIPSE) pTemp="楕円";
+#else
+	//英語
+	if(id==IDC_TOOL_SELECT) pTemp="Tool";
+	else if(id==IDC_TOOL_PEN) pTemp="Pen";
+	else if(id==IDC_TOOL_LINE) pTemp="Line";
+	else if(id==IDC_TOOL_FILL) pTemp="Fill";
+	else if(id==IDC_TOOL_RECTANGLE) pTemp="Rectangle";
+	else if(id==IDC_TOOL_FILLRECT) pTemp="Rectangle with edge";
+	else if(id==IDC_TOOL_FILLRECT2) pTemp="Fill Rectangle";
+	else if(id==IDC_TOOL_ELLIPSE) pTemp="Ellipse";
+#endif
+
+	return pTemp;
+}
+
+INT_PTR CALLBACK DlgIconButtons(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int WndNum;
+	RECT rect;
+#define BMPNUM_ICONTOOLBAR 8
+	TBBUTTON IconToolBar[]={
+		{0,IDC_TOOL_SELECT,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{1,IDC_TOOL_PEN,TBSTATE_ENABLED|TBSTATE_CHECKED,TBSTYLE_CHECKGROUP,0,0},
+		{2,IDC_TOOL_LINE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{3,IDC_TOOL_FILL,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{4,IDC_TOOL_RECTANGLE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{5,IDC_TOOL_FILLRECT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{6,IDC_TOOL_FILLRECT2,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{7,IDC_TOOL_ELLIPSE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+	};
+	TOOLTIPTEXT *pTipText;
+	static HWND hToolBar;
+
+	switch(message){
+		case WM_INITDIALOG:
+			MoveWindow(hwnd,20,120,80,200,1);
+
+			hToolBar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS,
+				NULL,
+				BMPNUM_ICONTOOLBAR,	/*ビットマップの個数*/
+				hResInst,(unsigned int)MAKEINTRESOURCE(IDR_ICONTOOLBAR),IconToolBar,
+				BMPNUM_ICONTOOLBAR,	/*アイテムの個数*/
+				0,0,16,15,sizeof(TBBUTTON));
+
+
+			//Windows9x系OSでの不具合を防ぐため
+			PostMessage(hwnd,WM_USER+120,0,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_USER+120:
+			GetClientRect(hwnd,&rect);
+			MoveWindow(hToolBar,0,0,rect.right,rect.bottom,1);
+			return 1;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_TOOL_SELECT:
+				case IDC_TOOL_PEN:
+				case IDC_TOOL_LINE:
+				case IDC_TOOL_FILL:
+				case IDC_TOOL_RECTANGLE:
+				case IDC_TOOL_FILLRECT:
+				case IDC_TOOL_FILLRECT2:
+				case IDC_TOOL_ELLIPSE:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(LOWORD(wParam)!=IDC_TOOL_SELECT&&
+						MdiInfo[WndNum]->MdiIconEditInfo->NowTool==IDC_TOOL_SELECT){
+						MdiInfo[WndNum]->MdiIconEditInfo->NowTool=LOWORD(wParam);
+						if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel){
+							if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+								DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+							MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+						}
+						InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+					}
+					else MdiInfo[WndNum]->MdiIconEditInfo->NowTool=LOWORD(wParam);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			pTipText=(TOOLTIPTEXT *)lParam;
+			if(pTipText->hdr.code==TTN_NEEDTEXT){
+				//ツールチップを表示
+				pTipText->lpszText=GetIconEditToolName(pTipText->hdr.idFrom);
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgIconType(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,WndNum;
+	HWND hList;
+	BOOL bExist[4];
+	char temporary[32];
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+			memset(bExist,0,sizeof(BOOL)*4);
+			for(i=0;i<MdiInfo[WndNum]->MdiIconEditInfo->num;i++){
+				if(MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biWidth==16&&
+					MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biBitCount==4){
+					bExist[0]=1;
+				}
+				if(MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biWidth==16&&
+					MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biBitCount==8){
+					bExist[1]=1;
+				}
+				if(MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biWidth==32&&
+					MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biBitCount==4){
+					bExist[2]=1;
+				}
+				if(MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biWidth==32&&
+					MdiInfo[WndNum]->MdiIconEditInfo->pBmpHdr[i]->biBitCount==8){
+					bExist[3]=1;
+				}
+			}
+
+			hList=GetDlgItem(hwnd,IDC_TYPELIST);
+			if(bExist[0]==0){
+				//"16*16 (16色)"
+				sprintf(temporary,"16*16 (16%s)",STRING_UNIT_COLORS);
+				SendMessage(hList,LB_ADDSTRING,0,(LPARAM)temporary);
+			}
+			if(bExist[1]==0){
+				//"16*16 (256色)"
+				sprintf(temporary,"16*16 (256%s)",STRING_UNIT_COLORS);
+				SendMessage(hList,LB_ADDSTRING,0,(LPARAM)temporary);
+			}
+			if(bExist[2]==0){
+				//"32*32 (16色)"
+				sprintf(temporary,"32*32 (16%s)",STRING_UNIT_COLORS);
+				SendMessage(hList,LB_ADDSTRING,0,(LPARAM)temporary);
+			}
+			if(bExist[3]==0){
+				//"32*32 (256色)"
+				sprintf(temporary,"32*32 (256%s)",STRING_UNIT_COLORS);
+				SendMessage(hList,LB_ADDSTRING,0,(LPARAM)temporary);
+			}
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					hList=GetDlgItem(hwnd,IDC_TYPELIST);
+					SendMessage(hList,LB_GETTEXT,SendMessage(hList,LB_GETCURSEL,0,0),(LPARAM)temporary);
+
+					if(temporary[0]=='1'&&temporary[7]=='1') i=ICONTYPE_16_16;
+					if(temporary[0]=='1'&&temporary[7]=='2') i=ICONTYPE_16_256;
+					if(temporary[0]=='3'&&temporary[7]=='1') i=ICONTYPE_32_16;
+					if(temporary[0]=='3'&&temporary[7]=='2') i=ICONTYPE_32_256;
+					EndDialog(hwnd,i);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,-1);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgIconToolProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,WndNum;
+
+	switch(message){
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_ADD_ICONTYPE:
+					i=DialogBox(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_ICONTYPE),GetParent(hwnd),DlgIconType);
+					if(i==-1) return 1;
+
+					WndNum=GetWndNum(GetParent(hwnd));
+					AddIconType(WndNum,i);
+
+					EnableWindow(GetDlgItem(hwnd,IDC_DELETE_ICONTYPE),1);
+					return 1;
+				case IDC_DELETE_ICONTYPE:
+					WndNum=GetWndNum(GetParent(hwnd));
+					DeleteIconType(WndNum);
+
+					if(MdiInfo[WndNum]->MdiIconEditInfo->num<=1)
+						EnableWindow(GetDlgItem(hwnd,IDC_DELETE_ICONTYPE),0);
+					return 1;
+				case IDC_ICONTYPECOMBO:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						WndNum=GetWndNum(GetParent(hwnd));
+
+						//イメージ選択用のメモリを解放
+						if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2)
+							DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+						MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+
+						MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum=
+							SendDlgItemMessage(hwnd,IDC_ICONTYPECOMBO,CB_GETCURSEL,0,0);
+
+						HBRUSH hOldBrush;
+						hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
+						PatBlt(MdiInfo[WndNum]->MdiIconEditInfo->memdc,0,0,400,400,PATCOPY);
+						SelectObject(MdiInfo[WndNum]->MdiIconEditInfo->memdc,hOldBrush);
+						DrawIconToMemBmp(WndNum,0);
+
+						InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,1);
+						InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hColorDlg,NULL,0);
+					}
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/IconEditor_UndoRedo.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/IconEditor_UndoRedo.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/IconEditor_UndoRedo.cpp	(revision 774)
@@ -0,0 +1,99 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void IconEdit_UndoCommand(int WndNum){
+	int i;
+	BYTE *pByte;
+	ICONEDIT_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiIconEditInfo->undo[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	i=pUndoState->NowPos-1;
+	if(i==-1) i=MAX_ICONEDIT_UNDONUM-1;
+	if(!pUndoState->lpData[i]){
+		MessageBeep(0);
+		return;
+	}
+	pUndoState->NowPos=i;
+
+	pByte=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+	MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]=
+		pUndoState->lpData[i];
+	pUndoState->lpData[i]=pByte;
+
+	//選択フレームを消去
+	if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==2){
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+		MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+	}
+
+	//再描画
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+
+	MdiInfo[WndNum]->MdiIconEditInfo->bModify=1;
+
+	//メニューを有効化
+	ResetState_UndoMenu();
+}
+void IconEdit_RedoCommand(int WndNum){
+	BYTE *pByte;
+	ICONEDIT_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiIconEditInfo->undo[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	if(!pUndoState->lpData[pUndoState->NowPos]){
+		MessageBeep(0);
+		return;
+	}
+
+	pByte=MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+	MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]=
+		pUndoState->lpData[pUndoState->NowPos];
+	pUndoState->lpData[pUndoState->NowPos]=pByte;
+
+	DrawIconToMemBmp(WndNum,0);
+	InvalidateRect(MdiInfo[WndNum]->MdiIconEditInfo->hMain,NULL,0);
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_ICONEDIT_UNDONUM) pUndoState->NowPos=0;
+
+	MdiInfo[WndNum]->MdiIconEditInfo->bModify=1;
+
+	ResetState_UndoMenu();
+}
+void IconEdit_NoticeChanging(int WndNum){
+	extern HANDLE hHeap;
+	int i;
+	ICONEDIT_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiIconEditInfo->undo[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum];
+
+	//Redoされた場合の不要なデータを削除する
+	for(i=pUndoState->NowPos;;i++){
+		if(i==MAX_ICONEDIT_UNDONUM) i=0;
+		if(pUndoState->lpData[i]==0) break;
+		HeapDefaultFree(pUndoState->lpData[i]);
+		pUndoState->lpData[i]=0;
+	}
+
+	pUndoState->lpData[pUndoState->NowPos]=(BYTE *)
+		HeapAlloc(hHeap,0,MdiInfo[WndNum]->MdiIconEditInfo->dwBytesInRes[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]);
+
+	memcpy(pUndoState->lpData[pUndoState->NowPos],
+		MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum],
+		MdiInfo[WndNum]->MdiIconEditInfo->dwBytesInRes[MdiInfo[WndNum]->MdiIconEditInfo->SelectIconNum]);
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_ICONEDIT_UNDONUM) pUndoState->NowPos=0;
+	if(pUndoState->lpData[pUndoState->NowPos]){
+		//一番古い情報を切り捨てる
+		HeapDefaultFree(pUndoState->lpData[pUndoState->NowPos]);
+		pUndoState->lpData[pUndoState->NowPos]=0;
+	}
+
+	MdiInfo[WndNum]->MdiIconEditInfo->bModify=1;
+
+	ResetState_UndoMenu();
+}
Index: branches/egtra/ab5.0/abdev/abdev/LuxCtrl.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/LuxCtrl.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/LuxCtrl.cpp	(revision 774)
@@ -0,0 +1,7 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+HINSTANCE hLib_LuxCtrl;
+
+PROC_LuxToolbar_CreateInstance LuxToolbar_CreateInstance;
Index: branches/egtra/ab5.0/abdev/abdev/LuxCtrl.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/LuxCtrl.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/LuxCtrl.h	(revision 774)
@@ -0,0 +1,26 @@
+
+
+extern "C++"
+{
+class ILuxToolbar:public IUnknown{
+public:
+	virtual void _stdcall Create(HWND hParent);
+	virtual HWND _stdcall GetHandle(void);
+	virtual void _stdcall Insert(int index,int id,HICON hIcon,LPSTR lpszToolTip);
+	virtual void _stdcall Add(int id,HICON hIcon,LPSTR lpszToolTip);
+	virtual void _stdcall Clear(void);
+	virtual void _stdcall EnableItem(int id,BOOL bEnabled);
+	virtual void _stdcall GetSize(SIZE &ref_size);
+};
+}// extern "C++"
+
+extern HINSTANCE hLib_LuxCtrl;
+
+typedef ILuxToolbar *(_stdcall *PROC_LuxToolbar_CreateInstance)(void);
+extern PROC_LuxToolbar_CreateInstance LuxToolbar_CreateInstance;
+
+
+
+extern ILuxToolbar *pobj_StandardToolbar;
+extern ILuxToolbar *pobj_ReleaseToolbar;
+extern ILuxToolbar *pobj_DebuggerToolbar;
Index: branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.cpp	(revision 774)
@@ -0,0 +1,58 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+CMdiTextEdit::CMdiTextEdit( MDIINFO *pMdiInfo ){
+	this->pMdiInfo = pMdiInfo;
+
+	isModified = false;
+
+	BaseNumOfUndoRedo = 0;
+
+	pTextEditUndoState = (TEXTEDIT_UNDOSTATE *)HeapAlloc( hHeap, HEAP_ZERO_MEMORY, sizeof( TEXTEDIT_UNDOSTATE ) );
+	pTextEditUndoState->NowPos = 0;
+}
+CMdiTextEdit::~CMdiTextEdit(){
+	for( int i=0; i<MAX_UNDONUM; i++ ){
+		if( pTextEditUndoState->Command[i] ){
+			TextEdit_DeleteUndoData( pTextEditUndoState, i );
+		}
+	}
+	HeapDefaultFree( pTextEditUndoState );
+}
+
+void CMdiTextEdit::Modify(){
+	//変更時
+	isModified = true;
+
+	//タブ文字列に変更を示すアスタリスクを付ける
+	pobj_MainTab->NofityModifyDocument( pMdiInfo->title.c_str() );
+}
+void CMdiTextEdit::UnModify(){
+	//変更状態解除
+	isModified = false;
+
+	//アスタリスク表示を解除する
+	pobj_MainTab->NofityUnModifyDocument( pMdiInfo->title.c_str() );
+
+	//アンドゥーリドゥーのベース番号を取得
+	BaseNumOfUndoRedo = pTextEditUndoState->NowPos;
+}
+bool CMdiTextEdit::IsModified(){
+	return isModified;
+}
+
+void CMdiTextEdit::NofityUndoRedoToModify(){
+	if( BaseNumOfUndoRedo == pTextEditUndoState->NowPos ){
+		//変更なし
+		if( IsModified() ){
+			UnModify();
+		}
+	}
+	else{
+		//変更あり
+		if( ! IsModified() ){
+			Modify();
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/MdiTextEdit.h	(revision 774)
@@ -0,0 +1,60 @@
+
+struct MDIINFO;
+struct TEXTEDIT_UNDOSTATE;
+
+class CMdiTextEdit{
+	//変更ありの状態かどうか
+	bool isModified;
+
+	//アンドゥーリドゥーのベース
+	int BaseNumOfUndoRedo;
+
+	MDIINFO *pMdiInfo;
+
+public:
+	CMdiTextEdit( MDIINFO *pMdiInfo );
+	~CMdiTextEdit();
+
+	//変更あり
+	void Modify();
+
+	//変更なし
+	void UnModify();
+
+	//変更状態を取得 ( true/変更あり, false/変更なし )
+	bool IsModified();
+
+	//アンドゥーリドゥーからの変更通知
+	void NofityUndoRedoToModify();
+
+	HWND hEdit;
+
+	//Web検索ウィンドウ
+	CWebResult *pobj_WebResult;
+
+	//ルーラーウィンドウ
+	CRuler *pobj_Ruler;
+
+	//アイコン
+	HICON hIcon;
+
+	char *buffer;
+	COLORREF *pColorRef;
+	int iUnderStart;
+	int iUnderEnd;
+
+	POINT StartCaretPos;
+	POINT EndCaretPos;
+	int Temp_UpDown_CaretXPos;
+	BOOL bAutoScroll;
+
+	//コントロールタブスペースの幅と行番号の文字数
+	int iWidth_ControlTabSpace;
+	int iLineNumberTextCount;
+
+	int iCharCode;
+	int iLfCode;
+
+	//元に戻す、やり直し機能
+	TEXTEDIT_UNDOSTATE *pTextEditUndoState;
+};
Index: branches/egtra/ab5.0/abdev/abdev/MenuProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/MenuProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/MenuProc.cpp	(revision 774)
@@ -0,0 +1,881 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "rad_msg_jpn.h"
+#else
+//英語
+#include "rad_msg_eng.h"
+#endif
+
+int GetMenuInfoNum(const std::string &name){
+	int i;
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		if(lstrcmpi(name.c_str(),projectInfo.pMenuInfo[i].IdName)==0) return i;
+	}
+	return -1;
+}
+void HeapMenuDataFree(MENU_INFO *pMenuInfo,int ItemNum,int *NumberOfFreedItem){
+	extern HANDLE hHeap;
+	int i;
+	for(i=0;i<ItemNum;i++){
+		if(NumberOfFreedItem) (*NumberOfFreedItem)++;
+		if(pMenuInfo[i].caption) HeapDefaultFree(pMenuInfo[i].caption);
+		if(pMenuInfo[i].IdName) HeapDefaultFree(pMenuInfo[i].IdName);
+		if(pMenuInfo[i].pMenuInfo){
+			HeapMenuDataFree(pMenuInfo[i].pMenuInfo,pMenuInfo[i].NumberOfMenu,NumberOfFreedItem);
+			HeapDefaultFree(pMenuInfo[i].pMenuInfo);
+		}
+	}
+}
+
+BOOL CALLBACK DlgProject_MenuID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern char NewIdName[MAX_PATH];
+	switch(message){
+		case WM_INITDIALOG:
+			if(lParam==0){
+				//"新規メニュー"
+				SetWindowText(hwnd,STRING_MENUEDIT_MAKE_NEWMENU);
+			}
+			else{
+				//"メニューIDの変更"
+				SetWindowText(hwnd,STRING_MENUEDIT_RENAME_MENUID);
+				SetDlgItemText(hwnd,IDC_IDNAME,(char *)lParam);
+			}
+			SetPosCenter(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDC_IDNAME,NewIdName,MAX_PATH);
+					if(!NewIdName[0]){
+						//"ID名を入力して下さい。"
+						MessageBox(hwnd,STRING_ERROR_MUST_IDNAME,STRING_ERROR,MB_OK);
+						return 1;
+					}
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+void Project_Menu_Insert(void){
+	extern HANDLE hHeap;
+	extern char NewIdName[MAX_PATH];
+	int i;
+	char temporary[MAX_PATH];
+	MENU_INFO *MenuInfo;
+
+	if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,0)) return;
+
+	//重複チェック
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		if(lstrcmpi(NewIdName,projectInfo.pMenuInfo[i].IdName)==0){
+			//"\"%s\" メニューは既にプロジェクト内に存在します。"
+			sprintf(temporary,STRING_MENUEDIT_DUPLICATIONERROR,projectInfo.pMenuInfo[i].IdName);
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	projectInfo.pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,0,projectInfo.pMenuInfo,(projectInfo.NumberOfMenu+1)*sizeof(MENU_INFO));
+	MenuInfo=&projectInfo.pMenuInfo[projectInfo.NumberOfMenu];
+
+	MenuInfo->IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
+	lstrcpy(MenuInfo->IdName,NewIdName);
+
+	MenuInfo->caption=0;
+
+	MenuInfo->NumberOfMenu=0;
+	MenuInfo->pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+
+
+	//////////////////////
+	//ツリービューに追加
+
+	extern HWND hMaterialTreeView;
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.item.iImage=3;
+	tv.item.iSelectedImage=3;
+	tv.hParent=projectInfo.hMenuTreeItem;
+	tv.item.pszText=MenuInfo->IdName;
+
+	MenuInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
+
+	TreeView_SelectItem(hMaterialTreeView,MenuInfo->hTreeItem);
+
+
+	projectInfo.NumberOfMenu++;
+	projectInfo.ModifyOfMaterial=1;
+
+
+	////////////////////////////////
+	// ウィンドウ プロパティを更新
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd&&MdiInfo[i]->DocType==WNDTYPE_RAD){
+			if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+				ChangePropertyWindow(i,GetWndInfoNum(MdiInfo[i]->path));
+		}
+	}
+
+	NewMenuWindow(&projectInfo.pMenuInfo[projectInfo.NumberOfMenu-1]);
+}
+void Project_Menu_Delete(int MenuInfoNum){
+	extern HANDLE hHeap;
+	int i;
+
+	//ウィンドウが開かれている場合は閉じる
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd&&lstrcmpi(projectInfo.pMenuInfo[MenuInfoNum].IdName,MdiInfo[i]->path.c_str())==0){
+			SendMessage(MdiInfo[i]->hwnd,WM_CLOSE,0,0);
+			break;
+		}
+	}
+
+	//メニュー情報のメモリを解放
+	HeapMenuDataFree(projectInfo.pMenuInfo[MenuInfoNum].pMenuInfo,projectInfo.pMenuInfo[MenuInfoNum].NumberOfMenu,0);
+	HeapDefaultFree(projectInfo.pMenuInfo[MenuInfoNum].pMenuInfo);
+	HeapDefaultFree(projectInfo.pMenuInfo[MenuInfoNum].IdName);
+
+	//ツリービューから削除
+	extern HWND hMaterialTreeView;
+	TreeView_DeleteItem(hMaterialTreeView,projectInfo.pMenuInfo[MenuInfoNum].hTreeItem);
+
+	//projectInfo.pMenuInfo構造体から削除
+	projectInfo.NumberOfMenu--;
+	for(i=MenuInfoNum;i<projectInfo.NumberOfMenu;i++) projectInfo.pMenuInfo[i]=projectInfo.pMenuInfo[i+1];
+	if(projectInfo.NumberOfMenu==0){
+		HeapDefaultFree(projectInfo.pMenuInfo);
+		projectInfo.pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+	}
+	else projectInfo.pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,0,projectInfo.pMenuInfo,projectInfo.NumberOfMenu*sizeof(MENU_INFO));
+
+	projectInfo.ModifyOfMaterial=1;
+
+
+	////////////////////////////////
+	// ウィンドウ プロパティを更新
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd&&MdiInfo[i]->DocType==WNDTYPE_RAD){
+			if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+				ChangePropertyWindow(i,GetWndInfoNum(MdiInfo[i]->path.c_str()));
+		}
+	}
+}
+
+void SetMenuDataList(HWND hList,MENU_INFO *pMenuInfo,int GradeNum){
+	int i;
+	char temporary[MAX_PATH];
+	for(i=0;i<pMenuInfo->NumberOfMenu;i++){
+		memset(temporary,' ',GradeNum*4);
+		temporary[GradeNum*4]=0;
+		if(pMenuInfo->pMenuInfo[i].type==MFT_SEPARATOR)
+			lstrcpy(temporary+GradeNum*4,"-");
+		else
+			lstrcpy(temporary+GradeNum*4,pMenuInfo->pMenuInfo[i].caption);
+		SendMessage(hList,LB_ADDSTRING,0,(long)temporary);
+		if(pMenuInfo->pMenuInfo[i].pMenuInfo)
+			SetMenuDataList(hList,&pMenuInfo->pMenuInfo[i],GradeNum+1);
+	}
+}
+void NewMenuWindow(MENU_INFO *pMenuInfo){
+	extern HINSTANCE hInst;
+	extern HWND hDocCombo;
+	int i;
+	HWND hChild,hListWnd,hMenuEdit;
+	RECT rect;
+	MDICREATESTRUCT mdic;
+
+	//すでに指定されたファイルが開かれている場合
+	hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		i=GetWndNum(hChild);
+		if(MdiInfo[i]->DocType==WNDTYPE_MENU){
+			if(lstrcmpi(MdiInfo[i]->path.c_str(),pMenuInfo->IdName)==0) break;
+		}
+		hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+	if(hChild){
+		BringWindowToTop(hChild);
+		return;
+	}
+
+	mdic.szTitle=pMenuInfo->IdName;
+	mdic.szClass="MDIClientWindow_Menu";
+	mdic.hOwner=hInst;
+	mdic.x=CW_USEDEFAULT;
+	mdic.y=CW_USEDEFAULT;
+	mdic.cx=CW_USEDEFAULT;
+	mdic.cy=CW_USEDEFAULT;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(IsWindow(hChild)){
+		if(IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+	else{
+		if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+
+	mdic.lParam=0;
+	mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
+	hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic);	//ウィンドウ作成
+
+
+	////////////////////
+	//子ウィンドウ作成
+
+	//ダイアログの下地を作成
+	hMenuEdit=CreateWindowEx(WS_EX_CLIENTEDGE,"MenuEditWindow",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+	//メニュー リスト ウィンドウを作成
+	hListWnd=CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX",NULL,
+		WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+
+	//ウィンドウのID登録
+	MdiInfo.push_back( new MDIINFO() );
+	i = MdiInfo.size()-1;
+	MdiInfo[i]->hwnd=hChild;
+	MdiInfo[i]->DocType=WNDTYPE_MENU;
+	MdiInfo[i]->title = pMenuInfo->IdName;
+	MdiInfo[i]->path = pMenuInfo->IdName;
+
+
+	/////////////////////
+	//MENU ウィンドウ情報
+
+	MdiInfo[i]->MdiMenuInfo=(MDIMENUINFO *)GlobalAlloc(GPTR,sizeof(MDIMENUINFO));
+
+	MdiInfo[i]->MdiMenuInfo->hList=hListWnd;
+
+	MdiInfo[i]->MdiMenuInfo->hMenuEdit=hMenuEdit;
+	MdiInfo[i]->MdiMenuInfo->hEdit_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_PROJECT_MENUEDIT),hMenuEdit,(DLGPROC)MenuEditDlg);
+
+	SCROLLINFO ScrollInfo;
+	ScrollInfo.cbSize=sizeof(SCROLLINFO);
+	ScrollInfo.fMask=SIF_POS;
+	ScrollInfo.nPos=0;
+	SetScrollInfo(MdiInfo[i]->MdiMenuInfo->hMenuEdit,SB_VERT,&ScrollInfo,1);
+
+	SendMessage(hListWnd,LB_RESETCONTENT,0,0);
+	SetMenuDataList(hListWnd,pMenuInfo,0);
+	if(pMenuInfo->NumberOfMenu){
+		SendMessage(hListWnd,LB_SETCURSEL,0,0);
+		SendMessage(hChild,WM_COMMAND,MAKELONG(0,LBN_SELCHANGE),(long)hListWnd);
+	}
+
+
+	//ウィンドウ位置を初期化
+	GetClientRect(hChild,&rect);
+	MoveWindow(MdiInfo[i]->MdiMenuInfo->hMenuEdit,0,0,172,rect.bottom,1);
+	MoveWindow(MdiInfo[i]->MdiMenuInfo->hList,172,0,rect.right-172,rect.bottom,1);
+
+	//Docコンボボックスに追加
+	i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)pMenuInfo->IdName);
+	SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+
+	//タブに追加
+	pobj_MainTab->InsertItem( hChild, pMenuInfo->IdName, true );
+
+	SetFocus(hListWnd);
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+}
+
+int GetNumberOfMenu(MENU_INFO *pMenuInfo){
+	int i,i2;
+	for(i=0,i2=0;i<pMenuInfo->NumberOfMenu;i++,i2++){
+		if(pMenuInfo->pMenuInfo[i].pMenuInfo) i2+=GetNumberOfMenu(&pMenuInfo->pMenuInfo[i]);
+	}
+	return i2;
+}
+MENU_INFO *GetMenuInfoFromList(MENU_INFO *pMenuInfo,int *pPos,int index,int *GradeNum){
+	int i;
+	MENU_INFO *pRetMenuInfo;
+	for(i=0;i<pMenuInfo->NumberOfMenu;i++){
+		if((*pPos)==index){
+			*pPos=i;
+			return pMenuInfo;
+		}
+		(*pPos)++;
+		if(pMenuInfo->pMenuInfo[i].pMenuInfo){
+			(*GradeNum)++;
+			pRetMenuInfo=GetMenuInfoFromList(&pMenuInfo->pMenuInfo[i],pPos,index,GradeNum);
+			if(pRetMenuInfo) return pRetMenuInfo;
+			(*GradeNum)--;
+		}
+	}
+	return 0;
+}
+BOOL CALLBACK DlgMenuProperty_Rename(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HWND hClient,hOwner;
+	int i;
+	char temporary[MAX_PATH];
+	static MENU_INFO *pMenuInfo;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+			i=GetWndNum(GetWindow(hClient,GW_CHILD));
+			GetDlgItemText(MdiInfo[i]->MdiMenuInfo->hEdit_Dlg,IDC_IDNAME,temporary,MAX_PATH);
+			SetDlgItemText(hwnd,IDC_IDNAME,temporary);
+			GetDlgItemText(MdiInfo[i]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTION,temporary,MAX_PATH);
+			SetDlgItemText(hwnd,IDC_CAPTION,temporary);
+
+			pMenuInfo=(MENU_INFO *)lParam;
+			if(pMenuInfo->pMenuInfo){
+				EnableWindow(GetDlgItem(hwnd,IDC_IDSTATIC),0);
+				EnableWindow(GetDlgItem(hwnd,IDC_IDNAME),0);
+			}
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					i=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+					if(!pMenuInfo->pMenuInfo){
+						//ID
+						GetDlgItemText(hwnd,IDC_IDNAME,temporary,MAX_PATH);
+						if(!temporary[0]){
+							//"ID名を入力して下さい。"
+							MessageBox(hOwner,STRING_ERROR_MUST_IDNAME,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+							break;
+						}
+						HeapDefaultFree(pMenuInfo->IdName);
+						pMenuInfo->IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->IdName,temporary);
+					}
+
+					//キャプション
+					GetDlgItemText(hwnd,IDC_CAPTION,temporary,MAX_PATH);
+					if(!temporary[0]){
+						//"キャプションを入力して下さい。"
+						MessageBox(hOwner,STRING_ERROR_MUST_CAPTION,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+						break;
+					}
+					HeapDefaultFree(pMenuInfo->caption);
+					pMenuInfo->caption=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+					lstrcpy(pMenuInfo->caption,temporary);
+
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+BOOL CALLBACK MenuEditDlg(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,WndNum,MenuInfoNum;
+	char temporary[MAX_PATH];
+	MENU_INFO *pMenuInfo,tempMenuInfo;
+
+	switch(message){
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_RENAME:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR) return 1;
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+					if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_PROJECT_MENURENAME),hOwner,(DLGPROC)DlgMenuProperty_Rename,(long)pMenuInfo)) return 1;
+					GetDlgItemText(hwnd,IDC_IDNAME,temporary,MAX_PATH);
+
+					if(!pMenuInfo->pMenuInfo){
+						//ID
+						SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDNAME,pMenuInfo->IdName);
+					}
+
+					//キャプション
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTION,pMenuInfo->caption);
+
+					//リストへキャプションを反映
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_DELETESTRING,i4,0);
+					memset(temporary,' ',i3*4);
+					lstrcpy(temporary+i3*4,pMenuInfo->caption);
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_INSERTSTRING,i4,(long)temporary);
+
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4,0);
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_POPUP:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR) return 1;
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+					if(pMenuInfo->pMenuInfo){
+						if(pMenuInfo->NumberOfMenu){
+							//"この操作を行うとポップアップされるメニュー アイテムも削除されます。"
+							if(MessageBox(hOwner,STRING_MENUEDIT_DELETECHECK,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)==IDCANCEL) return 1;
+						}
+						i=0;
+						HeapMenuDataFree(pMenuInfo->pMenuInfo,pMenuInfo->NumberOfMenu,&i);
+
+						for(i2=0;i2<i;i2++)
+							SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_DELETESTRING,i4+1,0);
+
+						HeapDefaultFree(pMenuInfo->pMenuInfo);
+						pMenuInfo->pMenuInfo=0;
+						lstrcpy(temporary,"IDM_name");
+						pMenuInfo->IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->IdName,temporary);
+					}
+					else{
+						if(pMenuInfo->type==MFT_STRING){
+							HeapDefaultFree(pMenuInfo->IdName);
+							pMenuInfo->IdName=0;
+						}
+						else if(pMenuInfo->type==MFT_SEPARATOR){
+							lstrcpy(temporary,"caption text");
+							pMenuInfo->caption=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+							lstrcpy(pMenuInfo->caption,temporary);
+						}
+						pMenuInfo->NumberOfMenu=0;
+						pMenuInfo->pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+						pMenuInfo->type=MFT_STRING;
+					}
+					SendMessage(MdiInfo[WndNum]->hwnd,WM_COMMAND,MAKELONG(0,LBN_SELCHANGE),(long)MdiInfo[WndNum]->MdiMenuInfo->hList);
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_SEPARATOR:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR) return 1;
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+					if(SendDlgItemMessage(hwnd,IDC_SEPARATOR,BM_GETCHECK,0,0)){
+						HeapDefaultFree(pMenuInfo->caption);
+						pMenuInfo->caption=0;
+						HeapDefaultFree(pMenuInfo->IdName);
+						pMenuInfo->IdName=0;
+						pMenuInfo->type=MFT_SEPARATOR;
+
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_DELETESTRING,i4,0);
+						memset(temporary,' ',i3*4);
+						lstrcpy(temporary+i3*4,"-");
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_INSERTSTRING,i4,(long)temporary);
+					}
+					else{
+						lstrcpy(temporary,"caption text");
+						pMenuInfo->caption=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->caption,temporary);
+						lstrcpy(temporary,"IDM_name");
+						pMenuInfo->IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->IdName,temporary);
+						pMenuInfo->type=MFT_STRING;
+
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_DELETESTRING,i4,0);
+						memset(temporary,' ',i3*4);
+						lstrcpy(temporary+i3*4,pMenuInfo->caption);
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_INSERTSTRING,i4,(long)temporary);
+					}
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4,0);
+					SendMessage(MdiInfo[WndNum]->hwnd,WM_COMMAND,MAKELONG(0,LBN_SELCHANGE),(long)MdiInfo[WndNum]->MdiMenuInfo->hList);
+					return 1;
+				case IDC_CHECKED:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR) return 1;
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+					if(SendDlgItemMessage(hwnd,IDC_CHECKED,BM_GETCHECK,0,0))
+						pMenuInfo->state|=MFS_CHECKED;
+					else
+						pMenuInfo->state&=~MFS_CHECKED;
+
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_DISABLED:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR) return 1;
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+					if(SendDlgItemMessage(hwnd,IDC_DISABLED,BM_GETCHECK,0,0))
+						pMenuInfo->state|=MFS_DISABLED;
+					else
+						pMenuInfo->state&=~MFS_DISABLED;
+
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_INSERTMENUITEM:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					if(projectInfo.pMenuInfo[MenuInfoNum].NumberOfMenu==0){
+						projectInfo.pMenuInfo[MenuInfoNum].pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,projectInfo.pMenuInfo[MenuInfoNum].pMenuInfo,(projectInfo.pMenuInfo[MenuInfoNum].NumberOfMenu+1)*sizeof(MENU_INFO));
+						pMenuInfo=&projectInfo.pMenuInfo[MenuInfoNum].pMenuInfo[projectInfo.pMenuInfo[MenuInfoNum].NumberOfMenu];
+
+						sprintf(temporary,"caption text");
+						pMenuInfo->caption=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->caption,temporary);
+
+						sprintf(temporary,"IDM_name");
+						pMenuInfo->IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->IdName,temporary);
+
+						pMenuInfo->state=0;
+						pMenuInfo->type=MFT_STRING;
+						pMenuInfo->pMenuInfo=0;
+
+						projectInfo.pMenuInfo[MenuInfoNum].NumberOfMenu++;
+
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_INSERTSTRING,0,(long)pMenuInfo->caption);
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,0,0);
+						SendMessage(GetParent(MdiInfo[WndNum]->MdiMenuInfo->hMenuEdit),WM_COMMAND,MAKELONG(0,LBN_SELCHANGE),(long)MdiInfo[WndNum]->MdiMenuInfo->hList);
+					}
+					else{
+						i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+						if(i4==LB_ERR){
+							//"新しいメニュー アイテムの挿入位置を選択して下さい"
+							MessageBox(hOwner,STRING_MENUEDIT_MUSTSELECT_NEW_ITEM,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+							return 1;
+						}
+						i2=0;
+						i3=0;
+						pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+						if(pMenuInfo->pMenuInfo[i2].pMenuInfo){
+							//"ポップアップ アイテムを作成する場合は \"はい\" を、ポップアップと同じ階層にメニュー アイテムを作成する場合は \"いいえ\" を押して下さい。"
+							i=MessageBox(hOwner,STRING_MENUEDIT_INSERTTYPE_YESNO,APPLICATION_NAME,MB_YESNOCANCEL);
+							if(i==IDYES){
+								pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+								i2=0;
+								i3++;
+							}
+							else if(i==IDNO){
+								i4+=GetNumberOfMenu(&pMenuInfo->pMenuInfo[i2]);
+								i2++;
+							}
+							else return 1;
+						}
+						else i2++;
+						i4++;
+						pMenuInfo->pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,0,pMenuInfo->pMenuInfo,(pMenuInfo->NumberOfMenu+1)*sizeof(MENU_INFO));
+						for(i=pMenuInfo->NumberOfMenu;i>i2;i--){
+							pMenuInfo->pMenuInfo[i]=pMenuInfo->pMenuInfo[i-1];
+						}
+						memset(&pMenuInfo->pMenuInfo[i2],0,sizeof(MENU_INFO));
+
+						sprintf(temporary,"caption text");
+						pMenuInfo->pMenuInfo[i2].caption=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->pMenuInfo[i2].caption,temporary);
+
+						sprintf(temporary,"IDM_name");
+						pMenuInfo->pMenuInfo[i2].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+						lstrcpy(pMenuInfo->pMenuInfo[i2].IdName,temporary);
+
+						memset(temporary,' ',i3*4);
+						lstrcpy(temporary+i3*4,pMenuInfo->pMenuInfo[i2].caption);
+
+						pMenuInfo->NumberOfMenu++;
+
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_INSERTSTRING,i4,(long)temporary);
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4,0);
+						SendMessage(GetParent(MdiInfo[WndNum]->MdiMenuInfo->hMenuEdit),WM_COMMAND,MAKELONG(0,LBN_SELCHANGE),(long)MdiInfo[WndNum]->MdiMenuInfo->hList);
+					}
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_DELETEMENUITEM:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR){
+						//"削除するメニュー アイテムを選択して下さい"
+						MessageBox(hOwner,STRING_MENUEDIT_MUSTSELECT_DELETE_MENUITEM,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+						return 1;
+					}
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+
+					i3=1;
+					if(pMenuInfo->pMenuInfo[i2].pMenuInfo){
+						if(pMenuInfo->pMenuInfo[i2].NumberOfMenu){
+							//"この操作を行うとポップアップされるメニュー アイテムも削除されます。"
+							if(MessageBox(hOwner,STRING_MENUEDIT_DELETECHECK,APPLICATION_NAME,MB_OKCANCEL)==IDCANCEL) return 1;
+						}
+						HeapMenuDataFree(pMenuInfo->pMenuInfo[i2].pMenuInfo,pMenuInfo->pMenuInfo[i2].NumberOfMenu,&i3);
+						HeapDefaultFree(pMenuInfo->pMenuInfo[i2].pMenuInfo);
+					}
+					else HeapDefaultFree(pMenuInfo->pMenuInfo[i2].IdName);
+
+					if(pMenuInfo->pMenuInfo[i2].type!=MFT_SEPARATOR)
+						HeapDefaultFree(pMenuInfo->pMenuInfo[i2].caption);
+
+					for(i=i2;i<pMenuInfo->NumberOfMenu-1;i++)
+						pMenuInfo->pMenuInfo[i]=pMenuInfo->pMenuInfo[i+1];
+
+					pMenuInfo->NumberOfMenu--;
+					pMenuInfo->pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,0,pMenuInfo->pMenuInfo,pMenuInfo->NumberOfMenu*sizeof(MENU_INFO));
+
+					for(i=0;i<i3;i++)
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_DELETESTRING,i4,0);
+
+					i=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCOUNT,0,0)-1;
+					if(i){
+						if(i<i4) i4=i;
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4,0);
+					}
+
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_UP:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR){
+						//"移動するメニュー アイテムを選択して下さい"
+						MessageBox(hOwner,STRING_MENUEDIT_MUSTSELECT_MOVE_MENUITEM,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+						return 1;
+					}
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					if(i2==0) return 1;
+					i2--;
+
+					memcpy(&tempMenuInfo,&pMenuInfo->pMenuInfo[i2],sizeof(MENU_INFO));
+					memcpy(&pMenuInfo->pMenuInfo[i2],&pMenuInfo->pMenuInfo[i2+1],sizeof(MENU_INFO));
+					memcpy(&pMenuInfo->pMenuInfo[i2+1],&tempMenuInfo,sizeof(MENU_INFO));
+
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_RESETCONTENT,0,0);
+					SetMenuDataList(MdiInfo[WndNum]->MdiMenuInfo->hList,&projectInfo.pMenuInfo[MenuInfoNum],0);
+					if(!pMenuInfo->pMenuInfo[i2].pMenuInfo)
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4-1,0);
+
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+				case IDC_DOWN:
+					WndNum=GetWndNum(GetParent(GetParent(hwnd)));
+					if(WndNum==-1) return 1;
+					MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+
+					i4=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+					if(i4==LB_ERR){
+						//"移動するメニュー アイテムを選択して下さい"
+						MessageBox(hOwner,STRING_MENUEDIT_MUSTSELECT_MOVE_MENUITEM,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+						return 1;
+					}
+					i2=0;
+					i3=0;
+					pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i4,&i3);
+					if(pMenuInfo->NumberOfMenu<=i2+1) return 1;
+
+					memcpy(&tempMenuInfo,&pMenuInfo->pMenuInfo[i2],sizeof(MENU_INFO));
+					memcpy(&pMenuInfo->pMenuInfo[i2],&pMenuInfo->pMenuInfo[i2+1],sizeof(MENU_INFO));
+					memcpy(&pMenuInfo->pMenuInfo[i2+1],&tempMenuInfo,sizeof(MENU_INFO));
+
+					SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_RESETCONTENT,0,0);
+					SetMenuDataList(MdiInfo[WndNum]->MdiMenuInfo->hList,&projectInfo.pMenuInfo[MenuInfoNum],0);
+					if(!pMenuInfo->pMenuInfo[i2].pMenuInfo)
+						SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_SETCURSEL,i4+1,0);
+
+					projectInfo.ModifyOfMaterial=1;
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+
+LRESULT CALLBACK MenuEditWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst;
+	int i;
+	RECT rect;
+	SCROLLINFO ScrollInfo;
+
+	switch(message){
+		case WM_MOUSEACTIVATE:
+			BringWindowToTop(GetParent(hwnd));
+			return 0;
+		case WM_VSCROLL:
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(LOWORD(wParam)==SB_LINEUP) i=-20;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=20;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-ScrollInfo.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-ScrollInfo.nPos,min(i,ScrollInfo.nMax-rect.bottom-ScrollInfo.nPos));
+			if(i!=0){
+				ScrollInfo.nPos+=i;
+				SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+				ScrollWindow(hwnd,0,-i,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_SIZE:
+			i=GetWndNum(GetParent(hwnd));
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			GetClientRect(MdiInfo[i]->MdiMenuInfo->hEdit_Dlg,&rect);
+			ScrollInfo.nMin=0;
+			ScrollInfo.nMax=rect.bottom;
+			ScrollInfo.nPage=HIWORD(lParam);
+			SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+
+			i=ScrollInfo.nPos;
+			ScrollInfo.fMask=SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(i>ScrollInfo.nPos){
+				ScrollWindow(hwnd,0,i-ScrollInfo.nPos,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+LRESULT CALLBACK MDIClientWindow_Menu(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HWND hDocCombo;
+	int i,i2,i3,WndNum,MenuInfoNum;
+	MENU_INFO *pMenuInfo;
+
+	switch(message){
+		case WM_COMMAND:
+			WndNum=GetWndNum(hwnd);
+			if(WndNum==-1) return 0;
+			MenuInfoNum=GetMenuInfoNum(MdiInfo[WndNum]->path);
+			if((HWND)lParam==MdiInfo[WndNum]->MdiMenuInfo->hList&&HIWORD(wParam)==LBN_SELCHANGE){
+				i=SendMessage(MdiInfo[WndNum]->MdiMenuInfo->hList,LB_GETCURSEL,0,0);
+				i2=0;
+				i3=0;
+				pMenuInfo=GetMenuInfoFromList(&projectInfo.pMenuInfo[MenuInfoNum],&i2,i,&i3);
+				pMenuInfo=&pMenuInfo->pMenuInfo[i2];
+
+				if(pMenuInfo->pMenuInfo){
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTION,pMenuInfo->caption);
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDNAME,"");
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDSTATIC),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_RENAME),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CHECKED),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_DISABLED),1);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP,BM_SETCHECK,BST_CHECKED,0);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR,BM_SETCHECK,BST_UNCHECKED,0);
+				}
+				else if(pMenuInfo->type==MFT_STRING){
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTION,pMenuInfo->caption);
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDNAME,pMenuInfo->IdName);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDSTATIC),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTIONSTATIC),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_RENAME),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CHECKED),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_DISABLED),1);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP,BM_SETCHECK,BST_UNCHECKED,0);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR,BM_SETCHECK,BST_UNCHECKED,0);
+				}
+				else if(pMenuInfo->type==MFT_SEPARATOR){
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTION,"");
+					SetDlgItemText(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDNAME,"");
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_IDSTATIC),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CAPTIONSTATIC),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_RENAME),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR),1);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CHECKED),0);
+					EnableWindow(GetDlgItem(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_DISABLED),0);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_POPUP,BM_SETCHECK,BST_UNCHECKED,0);
+					SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_SEPARATOR,BM_SETCHECK,BST_CHECKED,0);
+				}
+
+				if(pMenuInfo->state&MFS_CHECKED) i2=BST_CHECKED;
+				else i2=BST_UNCHECKED;
+				SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_CHECKED,BM_SETCHECK,i2,0);
+				if(pMenuInfo->state&MFS_DISABLED) i2=BST_CHECKED;
+				else i2=BST_UNCHECKED;
+				SendDlgItemMessage(MdiInfo[WndNum]->MdiMenuInfo->hEdit_Dlg,IDC_DISABLED,BM_SETCHECK,i2,0);
+			}
+			return 0;
+		case WM_MDIACTIVATE:
+			if(!lParam) return 0;
+			i=GetWndNum((HWND)lParam);
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+
+			i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+			SetStatusText(NULL);
+			ResetState_EditMenu();
+			return 0;
+		case WM_SIZE:
+			WndNum=GetWndNum(hwnd);
+			if(WndNum==-1) break;
+			MoveWindow(MdiInfo[WndNum]->MdiMenuInfo->hMenuEdit,0,0,172,HIWORD(lParam),1);
+			MoveWindow(MdiInfo[WndNum]->MdiMenuInfo->hList,172,0,LOWORD(lParam)-172,HIWORD(lParam),1);
+			break;
+		case WM_CLOSE:
+			CloseDocWindow(GetWndNum(hwnd));
+			pobj_nv->bMDIZoomed=IsZoomed(hwnd);
+			i=DefMDIChildProc(hwnd,message,wParam,lParam);
+
+			//メニュー状態を設定
+			ResetState_DocMenu();
+
+			return i;
+	}
+	return DefMDIChildProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/MessageCallOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/MessageCallOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/MessageCallOperation.cpp	(revision 774)
@@ -0,0 +1,715 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+HRESULT ApplyDialogTexture( HWND );
+
+////////////////////////////////////////////////////////////////////////////
+//このソースファイルではイベントプロシージャの管理を行う（MainWnd.abなど）
+////////////////////////////////////////////////////////////////////////////
+
+int NowMenuNum;
+
+int GetItemMessageInfo(int WndInfoNum,char *buffer,char *EventName){
+	int i;
+
+	for(i=lstrlen(buffer);i>=0;i--){
+		if(buffer[i]=='_') break;
+	}
+	if(i==-1) return 0;
+	lstrcpy(EventName,buffer+i+1);
+	buffer[i]=0;
+	if(lstrcmp(EventName,"MenuClick")==0) return CT_MENU;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+	BOOST_FOREACH( ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+	{
+		if( pChildInfo->GetName() == buffer )
+		{
+			return pChildInfo->Control;
+		}
+	}
+
+	return 0;
+}
+char **GetProcedureNamesOfMessageCall(int WndInfoNum,ITEMEVENTINFO **ppItemEventInfo,int *num,BOOL *pbAlways){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,i6,NameLen,CallBackNameLen;
+	char *buffer,**ppNames,temporary[MAX_PATH],temp2[MAX_PATH];
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	NameLen=pWindowInfo->GetName().size();
+	CallBackNameLen=pWindowInfo->GetCallbackName().size();
+
+	buffer = ReadBuffer( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileNameForOldVer( projectInfo.GetWorkDir().GetPath() ) );
+
+	*num=0;
+	ppNames=(char **)HeapAlloc(hHeap,0,1);
+
+	*pbAlways=0;
+
+	//メッセージ
+	*ppItemEventInfo=(ITEMEVENTINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(ITEMEVENTINFO));
+
+	if( buffer )
+	{
+		for(i=0,i4=0;;i++){
+			if(buffer[i]=='\0') break;
+
+			//注釈（複数行）
+			if(buffer[i]=='/'&&buffer[i+1]=='*'){
+				i+=2;
+				while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+					if(buffer[i]=='\0'){
+						i--;
+						break;
+					}
+					i++;
+				}
+				continue;
+			}
+
+			if((buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]!='\0')||i==0){
+				if(buffer[i]=='\r'&&buffer[i+1]=='\n') i2=i+2;
+				else i2=i;
+				while(buffer[i2]>='0'&&buffer[i2]<='9') i2++;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+				if(memicmp(buffer+i2,"Sub",3)==0&&(buffer[i2+3]==' '||buffer[i2+3]=='\t')){
+					i2+=4;
+					while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+					strncpy(temporary,buffer+i2,NameLen);
+					temporary[NameLen]=0;
+					if( pWindowInfo->GetName() == temporary && buffer[i2+NameLen] == '_' ){
+						for(i2+=NameLen+1,i3=0;;i2++,i3++){
+							if(!IsVariableChar(buffer[i2])){
+								temporary[i3]=0;
+								break;
+							}
+							temporary[i3]=buffer[i2];
+						}
+						i6=GetItemMessageInfo(WndInfoNum,temporary,temp2);
+						if(i6){
+							//アイテムメッセージ（WM_COMMAND、WM_NOTIFY）
+							for(i5=0;;i5++){
+								if((*ppItemEventInfo)[i5].IdName==0){
+									*ppItemEventInfo=(ITEMEVENTINFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,*ppItemEventInfo,(i4+2)*sizeof(ITEMEVENTINFO));
+									(*ppItemEventInfo)[i4].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+									lstrcpy((*ppItemEventInfo)[i4].IdName,temporary);
+									(*ppItemEventInfo)[i4].pEventNames=(char **)HeapAlloc(hHeap,0,1);
+									(*ppItemEventInfo)[i4].ClassID=i6;
+									i4++;
+									break;
+								}
+								if(lstrcmp((*ppItemEventInfo)[i5].IdName,temporary)==0) break;
+							}
+							(*ppItemEventInfo)[i5].pEventNames=(char **)HeapReAlloc(hHeap,0,(*ppItemEventInfo)[i5].pEventNames,((*ppItemEventInfo)[i5].EventNum+1)*sizeof(char *));
+							(*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+							lstrcpy((*ppItemEventInfo)[i5].pEventNames[(*ppItemEventInfo)[i5].EventNum],temp2);
+							(*ppItemEventInfo)[i5].EventNum++;
+						}
+						else if(temporary[0]){
+							//一般メッセージ
+							ppNames=(char **)HeapReAlloc(hHeap,0,ppNames,(*num+1)*sizeof(char *));
+							ppNames[*num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+							lstrcpy(ppNames[*num],temporary);
+							(*num)++;
+						}
+					}
+				}
+				if(memicmp(buffer+i2,"Function",8)==0&&(buffer[i2+8]==' '||buffer[i2+8]=='\t')){
+					//[WndName]_WindowProcのみFunction定義
+					i2+=9;
+					while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+					if(memicmp(buffer+i2,pWindowInfo->GetCallbackName().c_str(),CallBackNameLen)==0&&
+						(buffer[i2+CallBackNameLen]==' '||buffer[i2+CallBackNameLen]=='\t'||buffer[i2+CallBackNameLen]=='(')){
+						*pbAlways=1;
+					}
+				}
+			}
+		}
+		HeapDefaultFree(buffer);
+	}
+
+	return ppNames;
+}
+void SelectProcedureOfMessageCall(int WndInfoNum,char *ProcedureName,char *Parameter){
+	int i,i2,i3,WndNum;
+	char temporary[MAX_PATH],*pBuf;
+	HWND hChild;
+	POINT pos;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	hChild=OpenFileWithExtension( projectInfo.GetWorkDir().GetPath() + pWindowInfo->GetSourceFileNameForOldVer( projectInfo.GetWorkDir().GetPath() ) );
+	if(!hChild) return;
+	WndNum=GetWndNum(hChild);
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	for(i=0;;i++){
+		if(pBuf[i]=='\0') break;
+		if((pBuf[i]=='\r'&&pBuf[i+1]=='\n'&&pBuf[i+2]!='\0')||i==0){
+			if(i) i2=i+2;
+			else i2=i;
+			while(pBuf[i2]>='0'&&pBuf[i2]<='9') i2++;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+			strncpy(temporary,pBuf+i2,3);
+			temporary[3]=0;
+			if(lstrcmpi(temporary,"Sub")==0&&(pBuf[i2+3]==' '||pBuf[i2+3]=='\t')){
+				pos.x=i2;
+				i2+=4;
+				while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+				for(i3=0;;i2++,i3++){
+					if(!IsVariableChar(pBuf[i2])){
+						temporary[i3]=0;
+						break;
+					}
+					temporary[i3]=pBuf[i2];
+				}
+				if(lstrcmpi(temporary,ProcedureName)==0){
+					for(;;i2++){
+						if(pBuf[i2]=='\r'||pBuf[i2]=='\0'){
+							if(pBuf[i2]=='\r'){
+								if(pBuf[i2+1]!='\n') continue;
+							}
+							pos.y=i2;
+							break;
+						}
+					}
+					break;
+				}
+			}
+		}
+	}
+	if(pBuf[i]){
+		//プロシージャが見つかったとき
+		TextEdit_SetSel(WndNum,pos.x,pos.y);
+	}
+	else{
+		//プロシージャがないときは生成する
+
+		//挿入位置にキャレットを移動
+		TextEdit_SetSel(WndNum,i,i);
+
+		//挿入
+		sprintf(temporary,"\r\nSub %s(%s)",ProcedureName,Parameter);
+		i2=lstrlen(temporary);
+		lstrcat(temporary,"\r\n\r\nEnd Sub\r\n");
+		TextEdit_ReplaceUpdateUndoData(WndNum,temporary,1,1);
+
+		TextEdit_SetSel(WndNum,i+2,i+i2);
+	}
+	SetFocus(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+}
+void InsertEventToList(HWND hList,int ItemNum,char *EventName,char *MessageName,char *OutLine){
+	LV_ITEM item;
+
+	item.mask=LVIF_TEXT;
+	item.pszText=EventName;
+	item.iItem=ItemNum;
+	item.iSubItem=0;
+	ListView_InsertItem(hList,&item);
+	item.pszText=MessageName;
+	item.iItem=ItemNum;
+	item.iSubItem=1;
+	ListView_SetItem(hList,&item);
+	item.pszText=OutLine;
+	item.iItem=ItemNum;
+	item.iSubItem=2;
+	ListView_SetItem(hList,&item);
+}
+BOOL GetEventProcedureNameFromListView(HWND hList,int WndNum,int WndInfoNum,char *EventName,char *Parameter,DWORD dwEventType){
+	int i,MaxCount;
+	char temporary[MAX_PATH];
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	MaxCount=ListView_GetItemCount(hList);
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+		if(dwEventType==EVENTTYPE_DEFAULT){
+			for(i=0;i<MaxCount;i++){
+				if(ListView_GetItemState(hList,i,LVIS_SELECTED)){
+					ListView_GetItemText(hList,i,0,temporary,MAX_PATH);
+					sprintf(EventName,"%s_%s",
+						pWindowInfo->GetName().c_str(),
+						temporary);
+					break;
+				}
+			}
+			if(i==MaxCount) return 0;
+
+			if(i==0) lstrcpy(Parameter,"state As Integer, minimized As Integer");
+			else if(i==1) lstrcpy(Parameter,"ByRef CreateStruct As CREATESTRUCT");
+			else if(i==2) Parameter[0]=0;
+			else if(i==3) lstrcpy(Parameter,"hDrop As HDROP");
+			else if(i==4) lstrcpy(Parameter,"nScrollCode As Long, nPos As Integer, hwndScrollBar As HWND");
+			else if(i==5) lstrcpy(Parameter,"KeyCode As Long, flags As Long");
+			else if(i==6) lstrcpy(Parameter,"KeyCode As Long, flags As Long");
+			else if(i==7) lstrcpy(Parameter,"KeyCode As Long, flags As Long");
+			else if(i==8) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==9) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==10) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==11) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==12) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==13) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==14) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==15) lstrcpy(Parameter,"x As Integer, y As Integer");
+			else if(i==16) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==17) lstrcpy(Parameter,"hDC As HDC");
+			else if(i==18) lstrcpy(Parameter,"ByRef cancel As Integer");
+			else if(i==19) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==20) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==21) lstrcpy(Parameter,"flags As Long, x As Integer, y As Integer");
+			else if(i==22) lstrcpy(Parameter,"SizeType As Long, cx As Integer, cy As Integer");
+			else if(i==23) Parameter[0]=0;
+			else if(i==24) lstrcpy(Parameter,"TimerID As DWord");
+			else if(i==25) lstrcpy(Parameter,"nScrollCode As Long, nPos As Integer, hwndScrollBar As HWND");
+		}
+		else if(dwEventType==EVENTTYPE_MENU){
+			for(i=0;i<MaxCount;i++){
+				if(ListView_GetItemState(hList,i,LVIS_SELECTED)){
+					ListView_GetItemText(hList,i,0,temporary,MAX_PATH);
+					sprintf(EventName,"%s_%s_MenuClick",
+						pWindowInfo->GetName().c_str(),
+						temporary);
+					break;
+				}
+			}
+			if(i==MaxCount) return 0;
+
+			Parameter[0]=0;
+		}
+		else if(dwEventType==EVENTTYPE_MMSYS){
+			for(i=0;i<MaxCount;i++){
+				if(ListView_GetItemState(hList,i,LVIS_SELECTED)){
+					ListView_GetItemText(hList,i,0,temporary,MAX_PATH);
+					sprintf(EventName,"%s_%s",
+						pWindowInfo->GetName().c_str(),
+						temporary);
+					break;
+				}
+			}
+			if(i==MaxCount) return 0;
+
+			if(i==0) lstrcpy(Parameter,"flags As Long, DevID As DWord");
+		}
+	}
+	else{
+		for(i=0;i<MaxCount;i++){
+			if(ListView_GetItemState(hList,i,LVIS_SELECTED)){
+				ListView_GetItemText(hList,i,0,temporary,MAX_PATH);
+				sprintf(EventName,"%s_%s_%s",
+					pWindowInfo->GetName().c_str(),
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetName().c_str(),
+					temporary);
+				break;
+			}
+		}
+		if(i==MaxCount) return 0;
+
+		if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){
+			//ListView
+			if(i==0) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==1) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==2) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==3) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==4) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==5) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==6) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==7) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==8) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==9) lstrcpy(Parameter,"ByRef nmLVDispInfo As NMLVDISPINFO");
+			else if(i==10) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==11) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==12) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==13) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==14) lstrcpy(Parameter,"ByRef nmLVDispInfo As NMLVDISPINFO");
+			else if(i==15) lstrcpy(Parameter,"ByRef nmLVDispInfo As NMLVDISPINFO");
+			else if(i==16) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==17) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==18) lstrcpy(Parameter,"ByRef nmListView As NMLISTVIEW");
+			else if(i==19) lstrcpy(Parameter,"ByRef nmLVKeyDown As NMLVKEYDOWN");
+			else if(i==20) lstrcpy(Parameter,"ByRef nmLVDispInfo As NMLVDISPINFO");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){
+			//ProgressBar
+			lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){
+			//TrackBar
+			lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){
+			//TreeView
+			if(0<=i&&i<=7) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else lstrcpy(Parameter,"ByRef nmTreeView As NMTREEVIEW");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){
+			//UpDown
+			if(i==0) lstrcpy(Parameter,"ByRef nmHdr As NMHDR");
+			else if(i==1) lstrcpy(Parameter,"ByRef nmUpDown As NMUPDOWN");
+		}
+		else Parameter[0]=0;
+	}
+
+	return 1;
+}
+int SetDefaultNotifyMessagesInList(HWND hList,int ClassID){
+	int i;
+	i=0;
+	InsertEventToList(hList,i++,"Click","NM_CLICK","ｺﾝﾄﾛｰﾙ内でﾏｳｽの左ﾎﾞﾀﾝがｸﾘｯｸされた時");
+	InsertEventToList(hList,i++,"DblClick","NM_DBLCLK","ｺﾝﾄﾛｰﾙ内でﾏｳｽの左ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+	InsertEventToList(hList,i++,"KillFocus","NM_KILLFOCUS","入力ﾌｫｰｶｽを失った時");
+	InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","ﾒﾓﾘ不足でｺﾝﾄﾛｰﾙの動作が完了できない時");
+	InsertEventToList(hList,i++,"RClick","NM_RCLICK","ｺﾝﾄﾛｰﾙ内でﾏｳｽの右ﾎﾞﾀﾝがｸﾘｯｸされた時");
+	InsertEventToList(hList,i++,"RDblClick","NM_RDBLCLK","ｺﾝﾄﾛｰﾙ内でﾏｳｽの右ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+	InsertEventToList(hList,i++,"Return","NM_RETURN","ｺﾝﾄﾛｰﾙに入力ﾌｫｰｶｽがあるときにEnterｷｰが押された時");
+	InsertEventToList(hList,i++,"SetFocus","NM_SETFOCUS","入力ﾌｫｰｶｽを取得した時");
+	if(ClassID==CT_LISTVIEW){
+		InsertEventToList(hList,i++,"BeginDrag","LVN_BEGINDRAG","ﾏｳｽの左ﾎﾞﾀﾝでﾄﾞﾗｯｸﾞ&ﾄﾞﾛｯﾌﾟを始める時");
+		InsertEventToList(hList,i++,"BeginLabelEdit","LVN_BEGINLABELEDIT","ｱｲﾃﾑのﾗﾍﾞﾙの編集が開始された時");
+		InsertEventToList(hList,i++,"BeginRDrag","LVN_BEGINRDRAG","ﾏｳｽの右ﾎﾞﾀﾝでﾄﾞﾗｯｸﾞ&ﾄﾞﾛｯﾌﾟを始める時");
+		InsertEventToList(hList,i++,"ColumnClick","LVN_COLUMNCLICK","ｶﾗﾑの1つがｸﾘｯｸされた時");
+		InsertEventToList(hList,i++,"DeleteAllItems","LVN_DELETEALLITEMS","ﾋﾞｭｰ内のすべてのｱｲﾃﾑが削除された時");
+		InsertEventToList(hList,i++,"DeleteItem","LVN_DELETEITEM","ﾋﾞｭｰ内のｱｲﾃﾑが削除された時");
+		InsertEventToList(hList,i++,"EndLabelEdit","LVN_ENDLABELEDIT","ｱｲﾃﾑのﾗﾍﾞﾙの編集が終了した時");
+		InsertEventToList(hList,i++,"GetDispInfo","LVN_GETDISPINFO","親ｳｨﾝﾄﾞｳがﾃﾞｨｽﾌﾟﾚｲに関する情報を供給した時");
+		InsertEventToList(hList,i++,"InsertItem","LVN_INSERTITEM","ﾋﾞｭｰ内にｱｲﾃﾑが挿入された時");
+		InsertEventToList(hList,i++,"ItemChanged","LVN_ITEMCHANGED","ﾋﾞｭｰ内のｱｲﾃﾑが変更された時");
+		InsertEventToList(hList,i++,"ItemChanging","LVN_ITEMCHANGING","ﾋﾞｭｰ内のｱｲﾃﾑを変更する時");
+		InsertEventToList(hList,i++,"KeyDown","LVN_KEYDOWN","ｷｰが押された時");
+		InsertEventToList(hList,i++,"SetDispInfo","LVN_SETDISPINFO","親ｳｨﾝﾄﾞｳがｱｲﾃﾑに対して情報を更新する必要がある時");
+	}
+	else if(ClassID==CT_TREEVIEW){
+		//未完成
+	}
+	return i;
+}
+void SetMenuEventToList(HWND hList,MENU_INFO *pMenuInfo,int *pListNum,int *pPos){
+	int i;
+	for(i=0;i<pMenuInfo->NumberOfMenu;i++){
+		if((!pMenuInfo->pMenuInfo[i].pMenuInfo)&&pMenuInfo->pMenuInfo[i].type==MFT_STRING)
+			InsertEventToList(hList,(*pListNum)++,pMenuInfo->pMenuInfo[i].IdName,"WM_COMMAND",pMenuInfo->pMenuInfo[i].caption);
+		(*pPos)++;
+		if(pMenuInfo->pMenuInfo[i].pMenuInfo)
+			SetMenuEventToList(hList,&pMenuInfo->pMenuInfo[i],pListNum,pPos);
+	}
+}
+void SetEventToList(HWND hDlg,DWORD dwEventType){
+	int i,i2,WndNum;
+	HWND hList;
+
+	hList=GetDlgItem(hDlg,IDC_EVENTLIST);
+	ListView_DeleteAllItems(hList);
+	SetDlgItemText(hDlg,IDC_PROCEDURENAME,"");
+
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+	ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+	i=0;
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+		EnableWindow(GetDlgItem(hDlg,IDC_DEFAULT),1);
+		EnableWindow(GetDlgItem(hDlg,IDC_MENU),1);
+		EnableWindow(GetDlgItem(hDlg,IDC_MMSYS),1);
+		if(dwEventType==EVENTTYPE_DEFAULT){
+			SendDlgItemMessage(hDlg,IDC_DEFAULT,BM_SETCHECK,BST_CHECKED,0);
+			InsertEventToList(hList,i++,"Activate","WM_ACTIVATE","ｳｨﾝﾄﾞｳがｱｸﾃｨﾌﾞ、または非ｱｸﾃｨﾌﾞになった時");
+			InsertEventToList(hList,i++,"Create","WM_CREATE","ｳｨﾝﾄﾞｳ作成時");
+			InsertEventToList(hList,i++,"Destroy","WM_DESTROY","ｳｨﾝﾄﾞｳ破棄時");
+			InsertEventToList(hList,i++,"DropFiles","WM_DROPFILES","ｳｨﾝﾄﾞｳにﾌｧｲﾙがﾄﾞﾛｯﾌﾟされた時");
+			InsertEventToList(hList,i++,"HScroll","WM_HSCROLL","水平ｽｸﾛｰﾙ ﾊﾞｰ・ﾄﾗｯｸ ﾊﾞｰが移動した時");
+			InsertEventToList(hList,i++,"KeyDown","WM_KEYDOWN","ｷｰが押された時");
+			InsertEventToList(hList,i++,"KeyPress","WM_CHAR","ANSI文字ｷｰを押して離した時");
+			InsertEventToList(hList,i++,"KeyUp","WM_KEYUP","ｷｰが離された時");
+			InsertEventToList(hList,i++,"LButtonDblClick","WM_LBUTTONDBLCLK","ﾏｳｽの左ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"LButtonDown","WM_LBUTTONDOWN","ﾏｳｽの左ﾎﾞﾀﾝが押された時");
+			InsertEventToList(hList,i++,"LButtonUp","WM_LBUTTONUP","ﾏｳｽの左ﾎﾞﾀﾝが離された時");
+			InsertEventToList(hList,i++,"MButtonDblClick","WM_MBUTTONDBLCLK","ﾏｳｽの中央ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"MButtonDown","WM_MBUTTONDOWN","ﾏｳｽの中央ﾎﾞﾀﾝが押された時");
+			InsertEventToList(hList,i++,"MButtonUp","WM_MBUTTONUP","ﾏｳｽの中央ﾎﾞﾀﾝが離された時");
+			InsertEventToList(hList,i++,"MouseMove","WM_MOUSEMOVE","ﾏｳｽが移動した時");
+			InsertEventToList(hList,i++,"Move","WM_MOVE","ｳｨﾝﾄﾞｳが移動した時");
+			InsertEventToList(hList,i++,"Notify","WM_NOTIFY","ｺﾓﾝｺﾝﾄﾛｰﾙからﾒｯｾｰｼﾞが通知された時");
+			InsertEventToList(hList,i++,"Paint","WM_PAINT","再描画要求が出された時");
+			InsertEventToList(hList,i++,"QueryClose","WM_CLOSE","ｳｨﾝﾄﾞｳの終了ﾎﾞﾀﾝが押された時");
+			InsertEventToList(hList,i++,"RButtonDblClick","WM_RBUTTONDBLCLK","ﾏｳｽの右ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"RButtonDown","WM_RBUTTONDOWN","ﾏｳｽの右ﾎﾞﾀﾝが押された時");
+			InsertEventToList(hList,i++,"RButtonUp","WM_RBUTTONUP","ﾏｳｽの右ﾎﾞﾀﾝが離された時");
+			InsertEventToList(hList,i++,"Resize","WM_SIZE","ｳｨﾝﾄﾞｳの大きさが変更された時");
+			InsertEventToList(hList,i++,"SetFocus","WM_SETFOCUS","ｷｰﾎﾞｰﾄﾞ ﾌｫｰｶｽを受け取った時");
+			InsertEventToList(hList,i++,"Timer","WM_TIMER","設定したﾀｲﾏｰのﾀｲﾑ ｱｳﾄ時");
+			InsertEventToList(hList,i++,"VScroll","WM_VSCROLL","垂直ｽｸﾛｰﾙ ﾊﾞｰ・ﾄﾗｯｸ ﾊﾞｰが移動した時");
+		}
+		else if(dwEventType==EVENTTYPE_MENU){
+			//メニュー イベント
+			SendDlgItemMessage(hDlg,IDC_MENU,BM_SETCHECK,BST_CHECKED,0);
+			if( pWindowInfo->HasMenu() )
+			{
+				int MenuInfoNum;
+				MenuInfoNum=GetMenuInfoNum(pWindowInfo->GetMenuIdName().c_str());
+				i=0;
+				i2=0;
+
+				SetMenuEventToList(hList,&projectInfo.pMenuInfo[MenuInfoNum],&i,&i2);
+			}
+		}
+		else if(dwEventType==EVENTTYPE_MMSYS){
+			SendDlgItemMessage(hDlg,IDC_MMSYS,BM_SETCHECK,BST_CHECKED,0);
+			InsertEventToList(hList,i++,"MciNotify","MM_MCINOTIFY","MCIｺﾏﾝﾄﾞが完了したり異常終了した場合");
+		}
+	}
+	else{
+		EnableWindow(GetDlgItem(hDlg,IDC_DEFAULT),1);
+		EnableWindow(GetDlgItem(hDlg,IDC_MENU),0);
+		EnableWindow(GetDlgItem(hDlg,IDC_MMSYS),0);
+		SendDlgItemMessage(hDlg,IDC_DEFAULT,BM_SETCHECK,BST_CHECKED,0);
+		if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_BUTTON){
+			//Button
+			InsertEventToList(hList,i++,"Click","BN_CLICKED","ﾎﾞﾀﾝがｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX){
+			//CheckBox
+			InsertEventToList(hList,i++,"Click","BN_CLICKED","ﾁｪｯｸ ﾎﾞｯｸｽがｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","ﾁｪｯｸ ﾎﾞｯｸｽがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_COMBOBOX){
+			//ComboBox
+			InsertEventToList(hList,i++,"CloseUp","CBN_CLOSEUP","ﾘｽﾄ ﾎﾞｯｸｽが非表示になる時");
+			InsertEventToList(hList,i++,"DblClick","CBN_DBLCLK","ﾘｽﾄ内のｱｲﾃﾑがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DropDown","CBN_DROPDOWN","ﾘｽﾄ ﾎﾞｯｸｽがﾄﾞﾛｯﾌﾟ ﾀﾞｳﾝされる時");
+			InsertEventToList(hList,i++,"EditChange","CBN_EDITCHANGE","ｴﾃﾞｨｯﾄ ﾎﾞｯｸｽの内容が変化した時（後処理）");
+			InsertEventToList(hList,i++,"EditUpdate","CBN_EDITUPDATE","ﾘｽﾄ ﾎﾞｯｸｽが非表示になった時");
+			InsertEventToList(hList,i++,"ErrSpace","CBN_ERRSPACE","ﾒﾓﾘ割り当てに失敗した時");
+			InsertEventToList(hList,i++,"KillFocus","CBN_KILLFOCUS","入力ﾌｫｰｶｽを失った時");
+			InsertEventToList(hList,i++,"SelChange","CBN_SELCHANGE","ﾘｽﾄ内の選択が変更された時");
+			InsertEventToList(hList,i++,"SelEndCancel","CBN_SELENDCANCEL","ｺﾝﾎﾞ ﾎﾞｯｸｽの選択を取り消した時");
+			InsertEventToList(hList,i++,"SelEndOk","CBN_SELENDOK","選択した項目が有効である時");
+			InsertEventToList(hList,i++,"SetFocus","CBN_SETFOCUS","入力ﾌｫｰｶｽを取得した時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_EDIT){
+			//Edit
+			InsertEventToList(hList,i++,"Change","EN_CHANGE","ｴﾃﾞｨｯﾄ ﾎﾞｯｸｽの内容が変更された時（後処理）");
+			InsertEventToList(hList,i++,"ErrSpace","EN_ERRSPACE","ﾒﾓﾘ割り当てに失敗した時");
+			InsertEventToList(hList,i++,"HScroll","EN_HSCROLL","水平ｽｸﾛｰﾙを行った時");
+			InsertEventToList(hList,i++,"KillFocus","EN_KILLFOCUS","入力ﾌｫｰｶｽを失った時");
+			InsertEventToList(hList,i++,"MaxText","EN_MAXTEXT","文字数が上限を超えた時");
+			InsertEventToList(hList,i++,"SetFocus","EN_SETFOCUS","入力ﾌｫｰｶｽを取得した時");
+			InsertEventToList(hList,i++,"Update","EN_UPDATE","ｴﾃﾞｨｯﾄ ﾎﾞｯｸｽの内容が変更される時（前処理）");
+			InsertEventToList(hList,i++,"VScroll","EN_VSCROLL","垂直ｽｸﾛｰﾙを行った時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_IMAGEBOX){
+			//ImageBox
+			InsertEventToList(hList,i++,"Click","STN_CLICKED","ｲﾒｰｼﾞ ﾎﾞｯｸｽがｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DblClick","STN_DBLCLK","ｲﾒｰｼﾞ ﾎﾞｯｸｽがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTBOX){
+			//ListBox
+			InsertEventToList(hList,i++,"SelChange","LBN_SELCHANGE","ﾘｽﾄ内の選択が変更された時");
+			InsertEventToList(hList,i++,"DblClick","LBN_DBLCLK","ﾘｽﾄ内の文字列がﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"ErrSpace","LBN_ERRSPACE","ﾘｽﾄのﾒﾓﾘ割り当てに失敗した時");
+			InsertEventToList(hList,i++,"KillFocus","LBN_KILLFOCUS","入力ﾌｫｰｶｽを失った時");
+			InsertEventToList(hList,i++,"SelCancel","LBN_SELCANCEL","ﾘｽﾄ内の選択が取り消された時");
+			InsertEventToList(hList,i++,"SetFocus","LBN_SETFOCUS","入力ﾌｫｰｶｽを取得した時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW){
+			//ListView
+			i=SetDefaultNotifyMessagesInList(hList,CT_LISTVIEW);
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR){
+			//ProgressBar
+			InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","ﾒﾓﾘ不足でｺﾝﾄﾛｰﾙの動作が完了できない時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON){
+			//RadioButton
+			InsertEventToList(hList,i++,"Click","BN_CLICKED","ﾗｼﾞｵ ﾎﾞﾀﾝがｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DblClick","BN_DBLCLK","ﾗｼﾞｵ ﾎﾞﾀﾝがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC){
+			//Static
+			InsertEventToList(hList,i++,"Click","STN_CLICKED","ｽﾀﾃｨｯｸ ﾃｷｽﾄがｸﾘｯｸされた時");
+			InsertEventToList(hList,i++,"DblClick","STN_DBLCLK","ｽﾀﾃｨｯｸ ﾃｷｽﾄがﾀﾞﾌﾞﾙ ｸﾘｯｸされた時");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR){
+			//TrackBar
+			InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","ﾒﾓﾘ不足でｺﾝﾄﾛｰﾙの動作が完了できない時");
+			InsertEventToList(hList,i++,"ReleasedCapture","NM_RELEASEDCAPTURE ","ﾏｳｽ ｷｬﾌﾟﾁｬ ﾘﾘｰｽの通知");
+			InsertEventToList(hList,i++,"CustomDraw","NM_CUSTOMDRAW ","ｶｽﾀﾑ描画操作の通知");
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW){
+			//TreeView
+			i=SetDefaultNotifyMessagesInList(hList,CT_TREEVIEW);
+		}
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN){
+			//UpDown
+			InsertEventToList(hList,i++,"OutOfMemory","NM_OUTOFMEMORY","ﾒﾓﾘ不足でｺﾝﾄﾛｰﾙの動作が完了できない時");
+			InsertEventToList(hList,i++,"Deltapos","UDN_DELTAPOS","ｺﾝﾄﾛｰﾙの位置が変えられようとしている時");
+		}
+	}
+}
+void Popup_SelectMenu(HWND hDlg){
+	int i;
+	POINT pos;
+	HMENU hMenu;
+
+	if(projectInfo.NumberOfMenu==0) return;
+
+	GetCursorPos(&pos);
+
+	hMenu=CreatePopupMenu();
+
+	MENUITEMINFO mii;
+	mii.cbSize=sizeof(MENUITEMINFO);
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		if(NowMenuNum==i){
+			mii.fMask=MIIM_TYPE|MIIM_ID|MIIM_STATE;
+			mii.fState=MFS_CHECKED;
+		}
+		else mii.fMask=MIIM_TYPE|MIIM_ID;
+		mii.fType=MFT_STRING;
+		mii.wID=100+i;
+		mii.dwTypeData=projectInfo.pMenuInfo[i].IdName;
+		InsertMenuItem(hMenu,i,1,&mii);
+	}
+
+	extern HMENU hRadMenuBase;
+	TrackPopupMenu(hMenu,TPM_LEFTALIGN,pos.x,pos.y,0,hDlg,0);
+
+	DestroyMenu(hMenu);
+}
+
+WNDPROC OldEventListViewProc;
+LRESULT CALLBACK EventListViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	if(message==WM_RBUTTONDOWN){
+		if(SendDlgItemMessage(GetParent(hwnd),IDC_MENU,BM_GETCHECK,0,0))
+			Popup_SelectMenu(GetParent(hwnd));
+		return 0;
+	}
+	return CallWindowProc(OldEventListViewProc,hwnd,message,wParam,lParam);
+}
+INT_PTR CALLBACK DlgEventCode(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int WndNum,WndInfoNum,i,i2;
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+	HWND hList;
+	DWORD dwStyle;
+	RECT rect;
+	LV_COLUMN ListView_Column;
+
+	static DWORD dwEventType;
+
+	if(message==WM_COMMAND&&100<=wParam&&wParam<200){
+		hList=GetDlgItem(hwnd,IDC_EVENTLIST);
+		WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+		WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path);
+
+		ListView_DeleteAllItems(hList);
+		SetDlgItemText(hwnd,IDC_PROCEDURENAME,"");
+		i=0;
+		i2=0;
+
+		NowMenuNum=wParam-100;
+		SetMenuEventToList(hList,&projectInfo.pMenuInfo[wParam-100],&i,&i2);
+	}
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+			SetFocus(GetDlgItem(hwnd,IDC_EVENTLIST));
+
+			hList=GetDlgItem(hwnd,IDC_EVENTLIST);
+			GetClientRect(hList,&rect);
+			dwStyle=ListView_GetExtendedListViewStyle(hList);
+			dwStyle|=LVS_EX_FULLROWSELECT;
+			ListView_SetExtendedListViewStyle(hList,dwStyle);
+
+			ListView_Column.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+			ListView_Column.fmt=LVCFMT_LEFT;
+
+			ListView_Column.cx=100;
+			ListView_Column.pszText="イベント";
+			ListView_Column.iSubItem=0;
+			ListView_InsertColumn(hList,0,&ListView_Column);
+
+			ListView_Column.cx=120;
+			ListView_Column.pszText="対応メッセージ";
+			ListView_Column.iSubItem=1;
+			ListView_InsertColumn(hList,1,&ListView_Column);
+
+			ListView_Column.cx=rect.right-240;
+			ListView_Column.pszText="概要";
+			ListView_Column.iSubItem=2;
+			ListView_InsertColumn(hList,2,&ListView_Column);
+
+			dwEventType=lParam;
+			SetEventToList(hwnd,dwEventType);
+			EnableWindow(GetDlgItem(hwnd,IDOK),0);
+
+			OldEventListViewProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwnd,IDC_EVENTLIST),GWLP_WNDPROC,(LPARAM)EventListViewProc);
+
+			{
+				WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+				NowMenuNum=GetMenuInfoNum(pWindowInfo->GetMenuIdName().c_str());
+			}
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_DEFAULT:
+					dwEventType=EVENTTYPE_DEFAULT;
+					SetEventToList(hwnd,dwEventType);
+					EnableWindow(GetDlgItem(hwnd,IDOK),0);
+					break;
+				case IDC_MENU:
+					dwEventType=EVENTTYPE_MENU;
+					SetEventToList(hwnd,dwEventType);
+					EnableWindow(GetDlgItem(hwnd,IDOK),0);
+
+					//「対象メニュー」選択メニューを表示
+					Popup_SelectMenu(hwnd);
+					break;
+				case IDC_MMSYS:
+					dwEventType=EVENTTYPE_MMSYS;
+					SetEventToList(hwnd,dwEventType);
+					EnableWindow(GetDlgItem(hwnd,IDOK),0);
+					break;
+				case IDOK:
+					hList=GetDlgItem(hwnd,IDC_EVENTLIST);
+					WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+					WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path);
+					if(GetEventProcedureNameFromListView(hList,WndNum,WndInfoNum,temporary,temp2,dwEventType)){
+						SelectProcedureOfMessageCall(WndInfoNum,temporary,temp2);
+						EndDialog(hwnd,0);
+					}
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			NMLISTVIEW *nmListView;
+			nmListView=(NMLISTVIEW *)lParam;
+			if(nmListView->hdr.idFrom==IDC_EVENTLIST){
+				if(nmListView->hdr.code==LVN_ITEMCHANGED){
+					hList=GetDlgItem(hwnd,IDC_EVENTLIST);
+					WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+					WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path);
+					if(GetEventProcedureNameFromListView(hList,WndNum,WndInfoNum,temporary,temp2,dwEventType)){
+						sprintf(temporary+lstrlen(temporary),"(%s)",temp2);
+						EnableWindow(GetDlgItem(hwnd,IDOK),1);
+					}
+					else{
+						temporary[0]=0;
+						EnableWindow(GetDlgItem(hwnd,IDOK),0);
+					}
+					SetDlgItemText(hwnd,IDC_PROCEDURENAME,temporary);
+					return 1;
+				}
+				else if(nmListView->hdr.code==NM_DBLCLK)
+					SendMessage(hwnd,WM_COMMAND,IDOK,0);
+			}				
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/NonVolatile.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/NonVolatile.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/NonVolatile.cpp	(revision 774)
@@ -0,0 +1,881 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+
+void GetDefaultEditFont(LOGFONT *pLogFont){
+#if defined(JPN)
+	//日本語
+	pLogFont->lfHeight=-13;
+	pLogFont->lfWidth=0;
+	pLogFont->lfEscapement=0;
+	pLogFont->lfOrientation=0;
+	pLogFont->lfWeight=400;
+	pLogFont->lfItalic=NULL;
+	pLogFont->lfUnderline=NULL;
+	pLogFont->lfStrikeOut=NULL;
+	pLogFont->lfCharSet=SHIFTJIS_CHARSET;
+	pLogFont->lfOutPrecision=OUT_STRING_PRECIS;
+	pLogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	pLogFont->lfQuality=DRAFT_QUALITY;
+	pLogFont->lfPitchAndFamily=FIXED_PITCH;
+	sprintf(pLogFont->lfFaceName,"ＭＳ ゴシック");
+#else
+	//英語
+	pLogFont->lfHeight=-15;
+	pLogFont->lfWidth=0;
+	pLogFont->lfEscapement=0;
+	pLogFont->lfOrientation=0;
+	pLogFont->lfWeight=400;
+	pLogFont->lfItalic=NULL;
+	pLogFont->lfUnderline=NULL;
+	pLogFont->lfStrikeOut=NULL;
+	pLogFont->lfCharSet=ANSI_CHARSET;
+	pLogFont->lfOutPrecision=OUT_STRING_PRECIS;
+	pLogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	pLogFont->lfQuality=DRAFT_QUALITY;
+	pLogFont->lfPitchAndFamily=FIXED_PITCH;
+	sprintf(pLogFont->lfFaceName,"Courier New");
+#endif
+}
+void GetDefaultHintFont(LOGFONT *pLogFont){
+#if defined(JPN)
+	//日本語
+	pLogFont->lfHeight=-12;
+	pLogFont->lfWidth=0;
+	pLogFont->lfEscapement=0;
+	pLogFont->lfOrientation=0;
+	pLogFont->lfWeight=FW_THIN;
+	pLogFont->lfItalic=NULL;
+	pLogFont->lfUnderline=NULL;
+	pLogFont->lfStrikeOut=NULL;
+	pLogFont->lfCharSet=ANSI_CHARSET;
+	pLogFont->lfOutPrecision=OUT_STRING_PRECIS;
+	pLogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	pLogFont->lfQuality=DRAFT_QUALITY;
+	pLogFont->lfPitchAndFamily=VARIABLE_PITCH;
+	sprintf(pLogFont->lfFaceName,"ＭＳ Ｐゴシック");
+#else
+	//英語
+	pLogFont->lfHeight=-12;
+	pLogFont->lfWidth=0;
+	pLogFont->lfEscapement=0;
+	pLogFont->lfOrientation=0;
+	pLogFont->lfWeight=FW_THIN;
+	pLogFont->lfItalic=NULL;
+	pLogFont->lfUnderline=NULL;
+	pLogFont->lfStrikeOut=NULL;
+	pLogFont->lfCharSet=ANSI_CHARSET;
+	pLogFont->lfOutPrecision=OUT_STRING_PRECIS;
+	pLogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	pLogFont->lfQuality=DRAFT_QUALITY;
+	pLogFont->lfPitchAndFamily=VARIABLE_PITCH;
+	sprintf(pLogFont->lfFaceName,"Arial");
+#endif
+}
+void GetDefaultPrintFont(LOGFONT *pLogFont){
+	pLogFont->lfHeight=0;	//iPrintFontPointSizeとデバイス情報により決まる
+	pLogFont->lfWidth=0;
+	pLogFont->lfEscapement=0;
+	pLogFont->lfOrientation=0;
+	pLogFont->lfWeight=FW_NORMAL;
+	pLogFont->lfItalic=NULL;
+	pLogFont->lfUnderline=NULL;
+	pLogFont->lfStrikeOut=NULL;
+	pLogFont->lfCharSet=SHIFTJIS_CHARSET;
+	pLogFont->lfOutPrecision=OUT_STRING_PRECIS;
+	pLogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	pLogFont->lfQuality=DRAFT_QUALITY;
+	pLogFont->lfPitchAndFamily=FIXED_PITCH;
+	lstrcpy(pLogFont->lfFaceName,"ＭＳ ゴシック");
+}
+
+
+///////////////////////////
+// 不揮発性のデータ管理
+///////////////////////////
+
+CNonVolatile::CNonVolatile(){
+	memset(this,0,sizeof(CNonVolatile));
+
+	//拡張子管理オブジェクトを生成
+	pobj_ExtLink=new CExtLink();
+
+	//Web検索用ドメイン管理オブジェクトを生成
+	pobj_DBDomain=new CDBDomain();
+
+	//「最近使ったファイル」オブジェクトを生成
+	pobj_History=new CHistory(100);
+
+	//「最近使ったプロジェクト」オブジェクトを生成
+	pobj_ProjectHistory=new CHistory(200);
+}
+CNonVolatile::~CNonVolatile(){
+	//拡張子管理オブジェクトを破棄
+	delete pobj_ExtLink;
+	pobj_ExtLink=0;
+
+	//Web検索用ドメイン管理オブジェクトを破棄
+	delete pobj_DBDomain;
+	pobj_DBDomain=0;
+
+	//「最近使ったファイル」オブジェクトを破棄
+	delete pobj_History;
+	pobj_History=0;
+
+	//「最近使ったプロジェクト」オブジェクトを破棄
+	delete pobj_ProjectHistory;
+	pobj_ProjectHistory=0;
+}
+
+BOOL CSettingFile::GetDataLine( const char *name,char *parms){
+	int i,i2,length;
+	length=lstrlen(name);
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(i==0||buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n') i+=2;
+			if(memcmp(buffer+i,name,length)==0&&buffer[i+length]=='='){
+				i+=length+1;
+				for(i2=0;;i++,i2++){
+					if(buffer[i]=='\r'&&buffer[i+1]=='\n'||buffer[i]=='\0'){
+						parms[i2]=0;
+						break;
+					}
+					parms[i2]=buffer[i];
+				}
+				return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+BOOL CSettingFile::GetWholeValue( const char *name, int *pi32data ){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	*pi32data=atoi(temporary);
+	return 1;
+}
+bool CSettingFile::GetBoolean( const char *name,bool &b ){
+	int i=0;
+	if( !GetWholeValue( name, &i ) ){
+		return 0;
+	}
+
+	b = ( i != 0 ) ? true:false;
+
+	return 1;
+}
+BOOL CSettingFile::Get3WholeValue(char *name,int *pd1,int *pd2,int *pd3){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d",pd1,pd2,pd3);
+	return 1;
+}
+BOOL CSettingFile::GetRGBValue(char *name,COLORREF *prgb){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%x",prgb);
+	return 1;
+}
+BOOL CSettingFile::GetStringValue(char *name,char *str){
+	if(!GetDataLine(name,str)) return 0;
+	return 1;
+}
+BOOL CSettingFile::GetRectValue(char *name,RECT *prc){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d,%d",&prc->left,&prc->top,&prc->right,&prc->bottom);
+	return 1;
+}
+BOOL CSettingFile::GetLogFont(char *name,LOGFONT *plf){
+	char temporary[8192];
+	if(!GetDataLine(name,temporary)) return 0;
+	sscanf(temporary,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+		&plf->lfHeight,
+		&plf->lfWidth,
+		&plf->lfEscapement,
+		&plf->lfOrientation,
+		&plf->lfWeight,
+		&plf->lfItalic,
+		&plf->lfUnderline,
+		&plf->lfStrikeOut,
+		&plf->lfCharSet,
+		&plf->lfOutPrecision,
+		&plf->lfClipPrecision,
+		&plf->lfQuality,
+		&plf->lfPitchAndFamily);
+
+	int i;
+	for(i=lstrlen(temporary)-1;i>=0;i--){
+		if(temporary[i]==','){
+			i++;
+			break;
+		}
+	}
+	lstrcpy(plf->lfFaceName,temporary+i);
+	return 1;
+}
+BOOL CSettingFile::GetRebarBand(SAVEREBAR *psr,int num){
+	char name[32];
+	char temporary[8192];
+
+	sprintf(name,"RebarBand%d",num);
+	if(!GetDataLine(name,temporary)) return 0;
+
+	sscanf(temporary,"%d,%d,%d",&psr->RebarID,&psr->RebarLength,&psr->IsBandBreak);
+	return 1;
+}
+
+void CNonVolatile::load(){
+	extern METHODCHECKINFO MethodCheckInfo;
+
+	int i;
+	char temporary[MAX_PATH];
+
+	std::string userAppDir = ActiveBasic::IDE::Program::GetIdeUserAppDir();
+
+
+	///////////////////////////////////
+	// 関連付け用の拡張子オブジェクト
+	///////////////////////////////////
+	pobj_ExtLink->load( userAppDir + "\\extlink.ini" );
+
+
+	///////////////////////////////////////
+	// 「最近使ったファイル」オブジェクト
+	///////////////////////////////////////
+	pobj_History->load( userAppDir + "\\history.ini" );
+
+
+	////////////////////////////////////////////
+	// 「最近使ったプロジェクト」オブジェクト
+	////////////////////////////////////////////
+	pobj_ProjectHistory->load( userAppDir + "\\pj_history.ini" );
+
+
+
+	//開く
+	buffer=ReadBuffer_NonErrMsg( userAppDir + "\\editor.ini" );
+	if(!buffer){
+
+		//デフォルトの初期設定
+		InitToDefaultData();
+		return;
+	}
+
+	//関連付けを行うかどうか（この関数の最後に呼び出す）
+	if(!GetStringValue("LinkFile",temporary)){
+		ExtensionLink(NULL);
+	}
+
+	//ウィンドウサイズを保存するかしないか
+	if(!GetRectValue("WindowRect",&StartupWindowRect)){
+		StartupWindowRect.left=(int)((double)ScreenX*0.1);
+		StartupWindowRect.top=(int)((double)ScreenX*0.1);
+		StartupWindowRect.right=(int)((double)ScreenX*0.8);
+		StartupWindowRect.bottom=(int)((double)ScreenY*0.8);
+	}
+
+	//ウィンドウを最大化するか
+	if(!GetWholeValue("IsWindowMax",&bWindowMax)) bWindowMax=0;
+
+	//実行時のプロジェクトの保存確認の有無
+	if(!GetWholeValue("Project_SaveCheck",&bSaveCheckProject)) bSaveCheckProject=0;
+
+	//ラインアジャスタ
+	if(!GetWholeValue("Rad_LineAdjust",&bLineAdjust)) bLineAdjust=1;
+
+	//ProjectView位置情報
+	if(!GetRectValue("ProjectViewRect",&rectProjectView)){
+		rectProjectView.left=StartupWindowRect.right-270;
+		rectProjectView.right=StartupWindowRect.right-5;
+		rectProjectView.top=StartupWindowRect.top+60;
+		rectProjectView.bottom=StartupWindowRect.top+380;
+	}
+	if(rectProjectView.right<=0||
+		rectProjectView.left>=ScreenX||
+		rectProjectView.bottom<=0||
+		rectProjectView.top>=ScreenY||
+		rectProjectView.right-rectProjectView.left<10||
+		rectProjectView.bottom-rectProjectView.top<10){
+		//不正なデータは復元
+		rectProjectView.left=StartupWindowRect.right-270;
+		rectProjectView.right=StartupWindowRect.right-5;
+		rectProjectView.top=StartupWindowRect.top+60;
+		rectProjectView.bottom=StartupWindowRect.top+380;
+	}
+
+	//ProjectViewクリップ情報
+	if(!GetWholeValue("IsClipProjectView",&bClipProjectView)) bClipProjectView=1;
+	if(!GetWholeValue("width_ClipProjectView",&width_ClipProjectView)) width_ClipProjectView=200;
+
+	//デバッガビュー クリップ情報
+	if(!GetWholeValue("height_ClipDebuggerView",&height_ClipDebuggerView)) height_ClipDebuggerView=180;
+
+	//コンパイラビュー クリップ情報
+	if(!GetWholeValue("height_ClipCompileView",&height_ClipCompileView)) height_ClipCompileView=130;
+
+	//Web検索クリップ情報
+	if(!GetWholeValue("width_WebSearchView",&width_WebSearchView)) width_WebSearchView=230;
+
+
+	//Rebarバンド情報
+	for(i=0;i<MAX_REBARBANDS;i++){
+		if(!GetRebarBand(&SaveRebar[i],i)){
+			ResetRebarData();
+			break;
+		}
+	}
+
+	//Rebarバンドを固定するか
+	if(!GetWholeValue("IsNoGripper",&bNoGripper)) bNoGripper=0;
+
+
+	//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+	if(!GetWholeValue("IsSaveTabToHead",&bSaveTabToHead)){
+		bSaveTabToHead=0;
+	}
+
+	//フォント
+	if(!GetLogFont("EditorFont",&lf)){
+		//読み込めなかったときは、デフォルトのエディタフォントをセット
+		GetDefaultEditFont(&lf);
+	}
+
+	//タブサイズ
+	if(!GetWholeValue("TabSize",&TabSize)) TabSize=4;
+
+	//エディタの行番号を表示するかどうか
+	if(!GetWholeValue("IsShowLineNumber",&bEditor_LineNumber)) bEditor_LineNumber=1;
+
+	//エディタのルーラーを表示するかどうか
+	if(!GetWholeValue("IsShowRuler",&bEditor_Ruler)) bEditor_Ruler=1;
+
+	//カーソル行を強調表示するかどうか
+	if(!GetWholeValue("IsCaretLine_BackGround",&bEditor_CaretLine_BackGround)) bEditor_CaretLine_BackGround=1;
+
+	//自動折り返し時の一行あたりの文字数
+	if(!GetWholeValue("MaxOneLineTextLength",&iMaxOneLineTextLength)) iMaxOneLineTextLength=75;
+
+	//コード補完機能を有効にするかどうか
+	if(!GetWholeValue("IsShowComplementWnd",&bShowComplementWnd)) bShowComplementWnd=1;
+
+	//ペアステートメント補完を有効にするかどうか
+	if(!GetWholeValue("BackNum_PairStatementComplement",&BackNum_PairStatementComplement)) BackNum_PairStatementComplement=100;
+
+	//パラメータヒント
+	if(!GetWholeValue("ParameterHint",(int *)&dwParameterHint)) dwParameterHint=1;
+
+	//パラメータ ヒント フォント
+	extern METHODCHECKINFO MethodCheckInfo;
+	if(!GetLogFont("HintFont",&MethodCheckInfo.LogFont)){
+		//読み込めなかったときは、デフォルトのヒントフォントをセット
+		GetDefaultHintFont(&MethodCheckInfo.LogFont);
+	}
+
+	//自動インデント
+	if(!GetWholeValue("IsAutoIndent",&bAutoIndent)) bAutoIndent=1;
+
+	//貼り付け時のインデント調整
+	if(!GetWholeValue("IsPasteIndent",&bPasteIndent)) bPasteIndent=0;
+
+	//検索・置換文字列を保存するかどうか
+	if(!GetWholeValue("IsSaveFindStr",&bSaveFindStr)) bSaveFindStr=1;
+
+	//自動折り返しをするかどうか
+	if(!GetWholeValue("IsRightTurn",&bRightTurn)) bRightTurn=0;
+
+	//Ctrlキーによるハイパーリンク
+	if(!GetWholeValue("IsCtrlKeyHyperLink",&bCtrlKeyHyperLink)) bCtrlKeyHyperLink=1;
+
+	//Web検索文字列を保存するかどうか
+	if(!GetWholeValue("IsSaveWebFindStr",&bSaveWebFindStr)) bSaveWebFindStr=1;
+
+	//初回のMDIウィンドウを最大化表示するか
+	if(!GetWholeValue("IsMDIZoomed",&bMDIZoomed)) bMDIZoomed=0;
+
+	//標準保存先ディレクトリ
+	if(!GetStringValue("DefSaveDir",DefSaveDir)) lstrcpy(DefSaveDir,pj_editor_Dir);
+
+	//プロジェクト保存ディレクトリ
+	if(!GetStringValue("ProjectSaveDir",ProjectSaveDir)) sprintf(ProjectSaveDir,"%sMyProjects",pj_editor_Dir);
+
+	//検索時に、大文字小文字を区別するか
+	if(!GetWholeValue("IsFindStrBigSmall",&bFindStrBigSmall)) bFindStrBigSmall=0;
+
+	// 単語単位で検索するか
+	if( !GetBoolean("isWordUnit",isWordUnit) ){
+		isWordUnit = false;
+	}
+
+	//検索時に、正規表現を利用するかどうか
+	if(!GetWholeValue("IsRegExp",&bRegExp)) bRegExp=0;
+
+	//アクティブ デザイン テーマ
+	if(!GetStringValue("ActiveTheme",szActiveTheme)) lstrcpy(szActiveTheme,THEMENAME_CLASSIC);
+
+	//印刷用フォント
+	if(!GetLogFont("PrintFont",&lfPrint)){
+		//読み込めなかったときは、デフォルトのエディタフォントをセット
+		GetDefaultPrintFont(&lfPrint);
+	}
+
+	//印刷用フォントのポイントサイズ
+	if(!GetWholeValue("PrintFontPointSize",&iPrintFontPointSize)){
+		//読み込めなかったときは、デフォルトのポイントサイズをセット
+		iPrintFontPointSize=72;
+	}
+
+	//ページ番号を表示するかどうか
+	if(!GetWholeValue("IsShowPageNum",&bShowPageNum)) bShowPageNum=1;
+
+	//ページ番号文字列
+	if(!GetStringValue("PageStr",szPageStr)) lstrcpy(szPageStr,"ページ &n");
+
+	//インクルードディレクトリ
+	if(!GetStringValue("IncludeDir",szIncludeDir)) lstrcpy(szIncludeDir,".\\ablib\\src");
+
+	HeapDefaultFree(buffer);
+
+
+	/////////////////
+	// 検索文字列
+	/////////////////
+	int i2,i3;
+
+	buffer=ReadBuffer_NonErrMsg( userAppDir + "\\findstr.ini" );
+	if(buffer){
+		i2=0;
+		for(i=0;i<MAX_FINDLIST;i++){
+			for(i3=0;i3<MAX_PATH;i2++,i3++){
+				if(buffer[i2]=='\r'&&buffer[i2+1]=='\n'||buffer[i2]=='\0'){
+					FindStr[i][i3]=0;
+					break;
+				}
+				FindStr[i][i3]=buffer[i2];
+			}
+			if(buffer[i2]=='\r'&&buffer[i2+1]=='\n') i2+=2;
+		}
+
+		HeapDefaultFree(buffer);
+	}
+
+
+	/////////////////
+	// 置換文字列
+	/////////////////
+	buffer=ReadBuffer_NonErrMsg( userAppDir + "\\permustr.ini" );
+	if(buffer){
+		i2=0;
+		for(i=0;i<MAX_FINDLIST;i++){
+			for(i3=0;i3<MAX_PATH;i2++,i3++){
+				if(buffer[i2]=='\r'&&buffer[i2+1]=='\n'||buffer[i2]=='\0'){
+					PermutationStr[i][i3]=0;
+					break;
+				}
+				PermutationStr[i][i3]=buffer[i2];
+			}
+			if(buffer[i2]=='\r'&&buffer[i2+1]=='\n') i2+=2;
+		}
+
+		HeapDefaultFree(buffer);
+	}
+
+
+	/////////////////
+	// Web検索文字列
+	/////////////////
+	buffer=ReadBuffer_NonErrMsg( userAppDir + "webstr.ini" );
+	if(buffer){
+		i2=0;
+		for(i=0;i<MAX_FINDLIST;i++){
+			for(i3=0;i3<MAX_PATH;i2++,i3++){
+				if(buffer[i2]=='\r'&&buffer[i2+1]=='\n'||buffer[i2]=='\0'){
+					WebStr[i][i3]=0;
+					break;
+				}
+				WebStr[i][i3]=buffer[i2];
+			}
+			if(buffer[i2]=='\r'&&buffer[i2+1]=='\n') i2+=2;
+		}
+
+		HeapDefaultFree(buffer);
+	}
+}
+
+void CNonVolatile::InitToDefaultData(){
+	///////////////////////////////////
+	// デフォルトの初期設定
+	///////////////////////////////////
+
+	//検索・置換文字列を保存するかどうか
+	bSaveFindStr=1;
+
+	//自動折り返しをするかどうか
+	bRightTurn=0;
+
+	//Ctrlキーによるハイパーリンク
+	bCtrlKeyHyperLink=0;
+
+	//Web検索文字列を保存するかどうか
+	bSaveWebFindStr=0;
+
+	//アクティブ デザイン テーマ
+	lstrcpy(szActiveTheme,THEMENAME_CLASSIC);
+
+	//印刷用フォント
+	GetDefaultPrintFont(&lfPrint);
+
+	//印刷用フォントのポイントサイズ
+	iPrintFontPointSize=72;
+
+	//ページ番号を表示するかどうか
+	bShowPageNum=1;
+
+	//ページ番号文字列
+	lstrcpy(szPageStr,"ページ &n");
+
+	//インクルードディレクトリ
+	lstrcpy(szIncludeDir,".\\ablib\\src");
+
+	//ウィンドウ位置、サイズ
+	StartupWindowRect.left=(int)((double)ScreenX*0.1);
+	StartupWindowRect.top=(int)((double)ScreenX*0.1);
+	StartupWindowRect.right=(int)((double)ScreenX*0.8);
+	StartupWindowRect.bottom=(int)((double)ScreenY*0.8);
+
+	//ウィンドウを最大化するか
+	bWindowMax=1;
+
+	//実行時の、プロジェクトの保存確認の有無
+	bSaveCheckProject=0;
+
+	//RADツールのライン アジャスタ
+	bLineAdjust=1;
+
+	//ProjectView位置情報
+	rectProjectView.left=StartupWindowRect.right-270;
+	rectProjectView.right=StartupWindowRect.right-5;
+	rectProjectView.top=StartupWindowRect.top+60;
+	rectProjectView.bottom=StartupWindowRect.top+380;
+
+	//Rebar情報を初期化
+	ResetRebarData();
+
+	//エディタ フォント
+	GetDefaultEditFont(&lf);
+
+	//パラメータ ヒント フォント
+	extern METHODCHECKINFO MethodCheckInfo;
+	GetDefaultHintFont(&MethodCheckInfo.LogFont);
+
+	//タブサイズ
+	TabSize=4;
+
+	//行番号を表示するかどうか
+	bEditor_LineNumber=1;
+
+	//ルーラーを表示するかどうか
+	bEditor_Ruler=1;
+
+	//カーソル行を強調表示するかどうか
+	bEditor_CaretLine_BackGround=1;
+
+	//自動折り返しの文字数
+	iMaxOneLineTextLength=75;
+
+	//パラメータヒント
+	dwParameterHint=1;
+
+	//自動インデント
+	bAutoIndent=1;
+
+	//貼り付け時のインデント調整
+	bPasteIndent=0;
+
+	//初回のMDIウィンドウを最大化表示するか
+	bMDIZoomed=1;
+
+	//標準保存先ディレクトリ
+	lstrcpy(DefSaveDir,pj_editor_Dir);
+
+	//プロジェクト保存ディレクトリ
+	sprintf(ProjectSaveDir,"%sMyProjects",pj_editor_Dir);
+
+	bClipProjectView=1;
+	width_ClipProjectView=200;
+	height_ClipDebuggerView=180;
+	height_ClipCompileView=130;
+	width_WebSearchView=230;
+	bSaveTabToHead=0;
+
+	BackNum_PairStatementComplement=100;
+
+	//ファイルの関連付け
+	ExtensionLink(NULL);
+}
+
+void CSettingFile::SetWholeValue(const char *name,long i32data){
+	sprintf(buffer+lstrlen(buffer),"%s=%d\r\n",name,i32data);
+}
+void CSettingFile::SetBoolean(const char *name,bool b){
+	sprintf(buffer+lstrlen(buffer),"%s=%d\r\n",name,b?1:0);
+}
+void CSettingFile::Set3WholeValue(char *name,long d1,long d2,long d3){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d\r\n",name,d1,d2,d3);
+}
+void CSettingFile::SetRGBValue(char *name,COLORREF rgb){
+	rgb=RGB(
+		LOBYTE(LOWORD(rgb)),
+		HIBYTE(LOWORD(rgb)),
+		LOBYTE(HIWORD(rgb))
+		);
+	sprintf(buffer+lstrlen(buffer),"%s=%x\r\n",name,rgb);
+}
+void CSettingFile::SetStringValue(char *name,char *str){
+	sprintf(buffer+lstrlen(buffer),"%s=%s\r\n",name,str);
+}
+void CSettingFile::SetRectValue(char *name,RECT *prc){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d,%d\r\n",name,prc->left,prc->top,prc->right,prc->bottom);
+}
+void CSettingFile::SetLogFont(char *name,LOGFONT *plf){
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s\r\n",name,
+		plf->lfHeight,
+		plf->lfWidth,
+		plf->lfEscapement,
+		plf->lfOrientation,
+		plf->lfWeight,
+		plf->lfItalic,
+		plf->lfUnderline,
+		plf->lfStrikeOut,
+		plf->lfCharSet,
+		plf->lfOutPrecision,
+		plf->lfClipPrecision,
+		plf->lfQuality,
+		plf->lfPitchAndFamily,
+		plf->lfFaceName);
+}
+void CSettingFile::SetRebarBand(SAVEREBAR *psr,int num){
+	char name[32];
+
+	sprintf(name,"RebarBand%d",num);
+	sprintf(buffer+lstrlen(buffer),"%s=%d,%d,%d\r\n",name,psr->RebarID,psr->RebarLength,psr->IsBandBreak);
+}
+
+void CNonVolatile::save(){
+	int i;
+	
+	// ユーザ情報保存用のディレクトリを作成
+	Jenga::Common::Directory dir( ActiveBasic::IDE::Program::GetIdeUserAppDir(), true );
+
+
+	buffer=(char *)HeapAlloc(hHeap,0,65536);
+	buffer[0]=0;
+
+
+	//ウィンドウサイズを保存するかしないか
+	SetRectValue("WindowRect",&StartupWindowRect);
+
+	//ウィンドウを最大化するか
+	SetWholeValue("IsWindowMax",bWindowMax);
+
+	//実行時のプロジェクトの保存確認の有無
+	SetWholeValue("Project_SaveCheck",bSaveCheckProject);
+
+	//ラインアジャスタ
+	SetWholeValue("Rad_LineAdjust",bLineAdjust);
+
+	//ProjectView位置情報
+	SetRectValue("ProjectViewRect",&rectProjectView);
+
+	//ProjectViewクリップ情報
+	SetWholeValue("IsClipProjectView",bClipProjectView);
+	SetWholeValue("width_ClipProjectView",width_ClipProjectView);
+
+	//デバッガビュー クリップ情報
+	SetWholeValue("height_ClipDebuggerView",height_ClipDebuggerView);
+
+	//コンパイラビュー クリップ情報
+	SetWholeValue("height_ClipCompileView",height_ClipCompileView);
+
+	//Web検索クリップ情報
+	SetWholeValue("width_WebSearchView",width_WebSearchView);
+
+
+	//Rebar情報
+	for(i=0;i<MAX_REBARBANDS;i++){
+		SetRebarBand(&SaveRebar[i],i);
+	}
+
+	//Rebarバンドを固定するか
+	SetWholeValue("IsNoGripper",bNoGripper);
+
+
+	//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+	SetWholeValue("IsSaveTabToHead",bSaveTabToHead);
+
+	//フォント
+	SetLogFont("EditorFont",&lf);
+
+	//タブサイズ
+	SetWholeValue("TabSize",TabSize);
+
+	//エディタの行番号を表示するかどうか
+	SetWholeValue("IsShowLineNumber",bEditor_LineNumber);
+
+	//ルーラーを表示するかどうか
+	SetWholeValue("IsShowRuler",bEditor_Ruler);
+
+	//カーソル行を強調表示するかどうか
+	SetWholeValue("IsCaretLine_BackGround",bEditor_CaretLine_BackGround);
+
+	//自動折り返し時の一行あたりの文字数
+	SetWholeValue("MaxOneLineTextLength",iMaxOneLineTextLength);
+
+	//コード補完機能を有効にするかどうか
+	SetWholeValue("IsShowComplementWnd",bShowComplementWnd);
+
+	//ペアステートメント補完を有効にするかどうか
+	SetWholeValue("BackNum_PairStatementComplement",BackNum_PairStatementComplement);
+
+	//パラメータヒント
+	SetWholeValue("ParameterHint",dwParameterHint);
+
+	//パラメータ ヒント フォント
+	extern METHODCHECKINFO MethodCheckInfo;
+	SetLogFont("HintFont",&MethodCheckInfo.LogFont);
+
+	//検索・置換文字列を保存するかどうか
+	SetWholeValue("IsSaveFindStr",bSaveFindStr);
+
+	//自動インデント
+	SetWholeValue("IsAutoIndent",bAutoIndent);
+
+	//貼り付け時のインデント調整
+	SetWholeValue("IsPasteIndent",bPasteIndent);
+
+	//自動折り返しをするかどうか
+	SetWholeValue("IsRightTurn",bRightTurn);
+
+	//Ctrlキーによるハイパーリンク
+	SetWholeValue("IsCtrlKeyHyperLink",bCtrlKeyHyperLink);
+
+	//Web検索文字列を保存するかどうか
+	SetWholeValue("IsSaveWebFindStr",bSaveWebFindStr);
+
+	//初回のMDIウィンドウを最大化表示するか
+	SetWholeValue("IsMDIZoomed",bMDIZoomed);
+
+	//標準保存先ディレクトリ
+	SetStringValue("DefSaveDir",DefSaveDir);
+
+	//プロジェクト保存ディレクトリ
+	SetStringValue("ProjectSaveDir",ProjectSaveDir);
+
+	//検索時に、大文字小文字を区別するか
+	SetWholeValue("IsFindStrBigSmall",bFindStrBigSmall);
+
+	// 単語単位で検索するか
+	SetBoolean("isWordUnit",isWordUnit);
+
+	//検索時に、正規表現を利用するか
+	SetWholeValue("IsRegExp",bRegExp);
+
+	//次回起動時に関連付けダイアログを表示しないようにする
+	SetStringValue("LinkFile","ok");
+
+	//アクティブ デザイン テーマ
+	SetStringValue("ActiveTheme",szActiveTheme);
+
+	//印刷用フォント
+	SetLogFont("PrintFont",&lfPrint);
+
+	//印刷用フォントのポイントサイズ
+	SetWholeValue("PrintFontPointSize",iPrintFontPointSize);
+
+	//ページ番号を表示するかどうか
+	SetWholeValue("IsShowPageNum",bShowPageNum);
+
+	//ページ番号文字列
+	SetStringValue("PageStr",szPageStr);
+
+	//インクルードディレクトリ
+	SetStringValue("IncludeDir",szIncludeDir);
+
+
+	std::string userAppDir = ActiveBasic::IDE::Program::GetIdeUserAppDir();
+
+	//保存
+	WriteBuffer( userAppDir + "\\editor.ini", buffer,lstrlen(buffer));
+
+
+
+	/////////////////
+	// 検索文字列
+	/////////////////
+	buffer[0]=0;
+	if(pobj_nv->bSaveFindStr){
+		for(i=0;i<MAX_FINDLIST;i++){
+			lstrcat(buffer,FindStr[i]);
+			lstrcat(buffer,"\r\n");
+		}
+	}
+
+	//保存
+	WriteBuffer( userAppDir + "\\findstr.ini", buffer,lstrlen(buffer));
+
+
+
+	/////////////////
+	// 置換文字列
+	/////////////////
+	buffer[0]=0;
+	if(pobj_nv->bSaveFindStr){
+		for(i=0;i<MAX_FINDLIST;i++){
+			lstrcat(buffer,PermutationStr[i]);
+			lstrcat(buffer,"\r\n");
+		}
+	}
+
+	//保存
+	WriteBuffer( userAppDir + "\\permustr.ini", buffer,lstrlen(buffer));
+
+
+
+	/////////////////
+	// Web検索文字列
+	/////////////////
+	buffer[0]=0;
+	if(pobj_nv->bSaveWebFindStr){
+		for(i=0;i<MAX_FINDLIST;i++){
+			lstrcat(buffer,WebStr[i]);
+			lstrcat(buffer,"\r\n");
+		}
+	}
+
+	//保存
+	WriteBuffer( userAppDir + "\\webstr.ini", buffer,lstrlen(buffer));
+
+	HeapDefaultFree(buffer);
+
+
+
+	///////////////////////////////////
+	// 関連付け用の拡張子オブジェクト
+	///////////////////////////////////
+	pobj_ExtLink->save( userAppDir + "\\extlink.ini" );
+
+
+	///////////////////////////////////////
+	// 「最近使ったファイル」オブジェクト
+	///////////////////////////////////////
+	pobj_History->save( userAppDir + "\\history.ini" );
+
+	
+	///////////////////////////////////////
+	// 「最近使ったファイル」オブジェクト
+	///////////////////////////////////////
+	pobj_ProjectHistory->save( userAppDir + "\\pj_history.ini" );
+}
Index: branches/egtra/ab5.0/abdev/abdev/NonVolatile.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/NonVolatile.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/NonVolatile.h	(revision 774)
@@ -0,0 +1,144 @@
+
+
+class CNonVolatile:public CSettingFile{
+	void InitToDefaultData();
+
+public:
+	BOOL bSaveCheckProject;
+	BOOL bLineAdjust;
+	BOOL bWindowMax;
+	DWORD dwParameterHint;
+	BOOL bMDIZoomed;
+	char DefSaveDir[MAX_PATH];
+	char ProjectSaveDir[MAX_PATH];
+	RECT StartupWindowRect;
+	RECT rectProjectView;
+
+	//大文字・小文字検索を見分けるかどうか
+	BOOL bFindStrBigSmall;
+
+	// 単語単位で検索するか
+	bool isWordUnit;
+
+	//正規表現検索を行うかどうか
+	BOOL bRegExp;
+
+	//ProjectViewクリップ情報
+	BOOL bClipProjectView;
+	int width_ClipProjectView;
+
+	//デバッガビュー クリップ情報
+	int height_ClipDebuggerView;
+
+	//コンパイラビュー クリップ情報
+	int height_ClipCompileView;
+
+	//Web検索クリップ情報
+	int width_WebSearchView;
+
+	//レバー情報
+	SAVEREBAR SaveRebar[MAX_REBARBANDS];
+	BOOL bNoGripper;
+
+	//ドキュメントを保存したときにタブを先頭に再配置するかどうか
+	BOOL bSaveTabToHead;
+
+	//エディタフォント
+	LOGFONT lf;
+
+	//タブサイズ
+	int TabSize;
+
+	//行番号を表示するかどうか
+	BOOL bEditor_LineNumber;
+
+	//ルーラーを表示するかどうか
+	BOOL bEditor_Ruler;
+
+	//カーソル行を強調表示するかどうか
+	BOOL bEditor_CaretLine_BackGround;
+
+	//自動折り返し時の一行あたりの文字数
+	int iMaxOneLineTextLength;
+
+	//自動インデント
+	BOOL bAutoIndent;
+
+	//貼り付け時のインデント調整
+	BOOL bPasteIndent;
+
+	//コード補完機能を有効にするかどうか
+	BOOL bShowComplementWnd;
+
+	//ペアステートメント補完を有効にするかどうか
+	int BackNum_PairStatementComplement;
+
+	//検索・置換文字列を保存するかどうか
+	BOOL bSaveFindStr;
+
+	//自動折り返しをするかどうか
+	BOOL bRightTurn;
+
+	//Ctrlキーによるハイパーリンク
+	BOOL bCtrlKeyHyperLink;
+
+	//Web検索文字列を保存するかどうか
+	BOOL bSaveWebFindStr;
+
+	//文字色、背景色
+	char szActiveTheme[255];
+
+	//印刷用フォント
+	LOGFONT lfPrint;
+
+	//印刷用フォントのポイントサイズ
+	int iPrintFontPointSize;
+
+	//ページ番号を表示するかどうか
+	BOOL bShowPageNum;
+
+	//ページ番号文字列
+	char szPageStr[255];
+
+	//インクルードディレクトリ
+	char szIncludeDir[MAX_PATH];
+	std::string GetIncludeDirFullPath()
+	{
+		return Jenga::Common::Path::MakeFullPath( szIncludeDir, ActiveBasic::Common::Environment::GetAbdevRootPath() );
+	}
+
+	//////////////////////////////////////////////////////////////
+
+
+
+	//検索、置換文字列（findstr.ini）
+	char FindStr[MAX_FINDLIST][MAX_PATH];
+	char PermutationStr[MAX_FINDLIST][MAX_PATH];
+
+
+	//Web検索文字列（premustr.ini）
+	char WebStr[MAX_FINDLIST][MAX_PATH];
+
+
+	//関連付けの拡張子オブジェクト（extlink.ini）
+	CExtLink *pobj_ExtLink;
+
+
+	//Web検索用ドメイン（webstr.ini）
+	CDBDomain *pobj_DBDomain;
+
+
+	//履歴（history.ini）
+	CHistory *pobj_History;
+
+
+	//プロジェクト履歴（pj_history.ini）
+	CHistory *pobj_ProjectHistory;
+
+
+	CNonVolatile();
+	~CNonVolatile();
+	void load();
+	void save();
+};
+extern CNonVolatile *pobj_nv;
Index: branches/egtra/ab5.0/abdev/abdev/ParameterHint.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ParameterHint.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ParameterHint.cpp	(revision 774)
@@ -0,0 +1,1228 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void ShowCommandMessage(void);
+
+BOOL CheckGrammar(char *buffer){
+	int i,IsStr,PareNum;
+
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		if(buffer[i]=='\"') IsStr^=1;
+		else if(buffer[i]=='(') PareNum++;
+		else if(buffer[i]==')') PareNum--;
+		else if(buffer[i]=='\0'||(buffer[i]=='\r'&&buffer[i+1]=='\n')){
+			if(IsStr||PareNum) return 0;
+			if(buffer[i]=='\0') break;
+			i++;
+			continue;
+		}
+		else if(buffer[i]=='\''&&IsStr==0){
+			while(!(buffer[i]=='\0'||(buffer[i]=='\r'&&buffer[i+1]=='\n'))) i++;
+			i--;
+			continue;
+		}
+	}
+	return 1;
+}
+
+char *GetUserSourceCode(void){
+	//単体ファイルのときはそのファイルを、プロジェクトのときはpjname.abの内容を取得
+	extern HANDLE hHeap;
+	int i;
+	char temporary[MAX_PATH],*pBuf;
+
+	if( projectInfo.IsOpened() ){
+		//プロジェクトが開かれているとき
+		lstrcpy(temporary,projectInfo.fileSystem.root.files[0].GetFullPath().c_str());
+
+		for(i=0;i<MdiInfo.size();i++){
+			if(MdiInfo[i]->hwnd){
+				if(lstrcmpi(MdiInfo[i]->path.c_str(),temporary)==0) break;
+			}
+		}
+		if(i==MdiInfo.size()){
+			//ファイルから開く
+			pBuf=ReadBuffer(temporary);
+		}
+		else{
+			//エディタから読み込む
+			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[i]->pMdiTextEdit->buffer)+1);
+			lstrcpy(pBuf,MdiInfo[i]->pMdiTextEdit->buffer);
+		}
+	}
+	else{
+		//単体ソースコードのとき
+		int WndNum;
+
+		WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+		pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer)+1);
+		lstrcpy(pBuf,MdiInfo[WndNum]->pMdiTextEdit->buffer);
+	}
+
+	//ファイルをインクルード
+	pBuf=IncludeFiles(pBuf);
+
+	return pBuf;
+}
+
+BOOL SetCommandMessageToMethodCheck(char *Command){
+	extern METHODCHECKINFO MethodCheckInfo;
+
+	if( ActiveBasic::IDE::Program::ablang->IsExistReservedKeywordWithQuickHelp( Command ) )
+	{
+		lstrcpy( MethodCheckInfo.msg, ActiveBasic::IDE::Program::ablang->GetReservedKeywordWithQuickHelp( Command ).c_str() );
+		return 1;
+	}
+
+	return 0;
+}
+
+void ChangeReturnCode(char *buffer){
+	//改行コードのCRLFをLFに変換
+	int i,i2;
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
+		buffer[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+}
+void DeleteComment(char *buffer){	//注釈「'」の取り除き
+	int i,i2,i3,IsStr;
+	char *temporary;
+	temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
+	for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
+		if(buffer[i]=='\"') IsStr^=1;
+		if(buffer[i]=='\n'||buffer[i]=='\0'){
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+
+			if(i3){
+				//複数行に渡る注釈文の中に改行が存在するとき
+				memset(temporary+i2,'\n',i3);
+				i2+=i3;
+				i3=0;
+			}
+		}
+		if(buffer[i]=='\''&&IsStr==0){
+			//注釈文
+			i2--;
+			while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
+			i2++;
+			while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
+		}
+		if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
+			//注釈文（複数行）
+			i+=2;
+			i3=0;
+			while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
+				if(buffer[i]=='\n') i3++;
+				if(buffer[i]=='\0') break;
+				i++;
+			}
+			if(buffer[i]){
+				i+=2;
+			}
+			i--;
+			i2--;
+			continue;
+		}
+		temporary[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+	lstrcpy(buffer,temporary);
+	GlobalFree(temporary);
+}
+
+BOOL GetDefualtFunctionParameter(char *pBuf,char *FuncName,char *Parameter){
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	/////////////////////////////////////////
+	// ソースコードから関数定義位置を取得
+	/////////////////////////////////////////
+
+	for(i=0;;i++){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')||
+			memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')||
+			memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){
+			/* Class ～ End Class
+				Interface ～ End Interface
+				Type ～ End Type
+				は飛び越す */
+
+			while(1){
+				if(pBuf[i]=='\0'){
+					i2=0;
+					break;
+				}
+
+				if(memicmp(pBuf+i,"End",3)==0){
+					/*	End Class
+						End Interface
+						End Type
+						の検出 */
+					i+=3;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+					if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
+						memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
+						memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
+						i2=0;
+						break;
+					}
+				}
+
+				//次の行をサーチ
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+			}
+		}
+
+		if(memicmp(pBuf+i,"Declare",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')){
+			i+=8;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+			else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			else goto NextCommand;
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=pBuf[i];
+			}
+			if(lstrcmp(temporary,FuncName)==0){
+				//関数名が一致したとき
+				break;
+			}
+		}
+		if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+			if(pBuf[i]=='f'||pBuf[i]=='F') i+=9;
+			else i+=4;
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=pBuf[i];
+			}
+			if(lstrcmpi(temporary,"Export")==0){
+				//"Export"を飛び越す
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				for(i2=0;;i++,i2++){
+					if(!IsVariableChar(pBuf[i])){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=pBuf[i];
+				}
+			}
+			if(lstrcmp(temporary,FuncName)==0){
+				//関数名が一致したとき
+				break;
+			}
+
+		}
+
+NextCommand:
+		for(;;i++){
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				if(i2==2) i++;
+				break;
+			}
+		}
+
+		if(pBuf[i]=='\0') return 0;
+	}
+
+	for(;;i++){
+		if(pBuf[i]=='(') break;
+		if(IsCommandDelimitation(pBuf,i)) return 0;
+	}
+
+	//関数名をコピー
+	lstrcpy(Parameter,FuncName);
+	i2=lstrlen(Parameter);
+
+
+	//////////////////////////////////////////////////////
+	//パラメータをコピー
+	//（コメントの挿入、途中改行などの状況を考慮する）
+	//////////////////////////////////////////////////////
+
+	for(;;i++,i2++){
+		if(IsVariableChar(pBuf[i-1])==0&&pBuf[i-1]!=')'&&IS_BLANK(pBuf[i])||
+			pBuf[i]=='\''||
+			pBuf[i]=='/'&&pBuf[i+1]=='*')
+			JumpBlank(pBuf,&i);
+
+		if(IsCommandDelimitation(pBuf,i)){
+			if(IS_RETURN(pBuf,i)&&
+				pBuf[i-1]=='_'||pBuf[i-1]=='('||pBuf[i-1]==','){
+				//改行を許可
+				i2--;
+				if(Parameter[i2]=='_') i2--;
+
+				i+=2;
+				continue;
+			}
+
+			Parameter[i2]=0;
+			break;
+		}
+		Parameter[i2]=pBuf[i];
+	}
+
+
+	//文法チェック
+	if(!CheckGrammar(Parameter)) return 0;
+
+	
+	return 1;
+}
+BOOL GetClassMemberFunctionParameter(char *pBuf,char *ClassName,char *nest,char *Parameter){
+	extern HANDLE hHeap;
+	extern char *pHeaderBuf;
+	extern char *pUserSource;
+	int i,i2;
+	char temporary[8192];
+	DWORD dwClassType;
+	BOOL bRet;
+
+
+	/////////////////////////////////////////
+	// ソースコードからクラス定義位置を取得
+	/////////////////////////////////////////
+	i=GetClassPos(pBuf,ClassName,&dwClassType);
+	if(pBuf[i]=='\0') return 0;
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	int RefType;				//"."参照のときは0、"->"参照のときは1
+	lstrcpy(VarName,nest);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+	if(RefType){
+		////////////////////
+		// 入れ子構造の場合
+		////////////////////
+
+		//メンバ変数の型であるクラスの名前を取得
+		char ClassName[VN_SIZE];
+		BOOL bArray;
+		if(!GetClassNameFromClassMember(pBuf,i,VarName,ClassName,&bArray)) return 0;
+
+		//TypeDef宣言を考慮してオリジナルなクラス名を取得
+		GetOriginalClassName(ClassName);
+
+		if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
+
+		//ユーザーのソースコードをサーチ
+		bRet=GetClassMemberFunctionParameter(pUserSource,ClassName,NestMember,Parameter);
+		if(!bRet){
+			//失敗したときはbasic.sbpをサーチ
+			bRet=GetClassMemberFunctionParameter(pHeaderBuf,ClassName,NestMember,Parameter);
+		}
+		return bRet;
+	}
+
+
+	////////////////////////
+	// メンバ情報を取得
+	////////////////////////
+	DWORD dwProc;
+
+	if(memicmp(pBuf+i,"Inherits",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+		i+=9;
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		////////////////////////
+		// 継承先クラスをサーチ
+		////////////////////////
+
+		for(i2=0;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		//ユーザーのソースコードをサーチ
+		bRet=GetClassMemberFunctionParameter(pUserSource,temporary,nest,Parameter);
+		if(!bRet){
+			//失敗したときはbasic.sbpをサーチ
+			bRet=GetClassMemberFunctionParameter(pHeaderBuf,temporary,nest,Parameter);
+		}
+		if(bRet) return 1;
+	}
+
+	//メンバ変数、関数を取得
+	while(1){
+		if(pBuf[i]=='\0') break;
+		if(memicmp(pBuf+i,"End",3)==0){
+			/*	End Class
+				End Interface
+				End Type
+				の検出 */
+			i2=i+3;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+			if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
+				memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
+				memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break;
+		}
+
+		if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
+			memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+			//メンバ関数のとき
+			if(pBuf[i]=='a'||pBuf[i]=='A'){
+				i+=9;
+				dwProc=ESC_ABSTRACT;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
+			}
+			else if(pBuf[i]=='v'||pBuf[i]=='V'){
+				i+=8;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+					i+=9;
+					dwProc=ESC_FUNCTION;
+				}
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+					i+=4;
+					dwProc=ESC_SUB;
+				}
+			}
+			else if(pBuf[i]=='o'||pBuf[i]=='O'){
+				i+=9;
+
+				while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+					i+=9;
+					dwProc=ESC_FUNCTION;
+				}
+				else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+					i+=4;
+					dwProc=ESC_SUB;
+				}
+			}
+			else if(pBuf[i]=='f'||pBuf[i]=='F'){
+				i+=9;
+				dwProc=ESC_FUNCTION;
+			}
+			else if(pBuf[i]=='s'||pBuf[i]=='S'){
+				i+=4;
+				dwProc=ESC_SUB;
+			}
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		else{
+			//メンバ変数のとき
+			dwProc=0;
+		}
+
+		if(dwProc){
+			//変数名または関数名を取得
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=pBuf[i];
+			}
+
+			if(lstrcmp(temporary,nest)==0){
+				//ターゲットとなるメンバ関数が見つかったとき
+				for(;;i++){
+					if(pBuf[i]=='(') break;
+					if(IsCommandDelimitation(pBuf,i)) return 0;
+				}
+
+				lstrcpy(Parameter,nest);
+				i2=lstrlen(Parameter);
+				for(;;i++,i2++){
+					if(IsCommandDelimitation(pBuf,i)){
+						Parameter[i2]=0;
+						break;
+					}
+					Parameter[i2]=pBuf[i];
+				}
+
+				if(!CheckGrammar(Parameter)) return 0;
+
+				return 1;
+			}
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				i+=i2;
+				break;
+			}
+		}
+		JumpBlank(pBuf,&i);
+
+		if((dwProc==ESC_SUB||dwProc==ESC_FUNCTION)&&dwClassType!=ESC_INTERFACE){
+			//End Sub、End Functionまでジャンプする
+
+			while(1){
+				if(pBuf[i]=='\0'){
+					i2=0;
+					break;
+				}
+
+				if(memicmp(pBuf+i,"End",3)==0){
+					/*	End Sub
+						End Function
+						の検出 */
+					i+=3;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+					if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
+						memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
+						i2=1;
+						break;
+					}
+
+					if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
+						memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
+						memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
+						i2=0;
+						break;
+					}
+				}
+
+				//次の行をサーチ
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+			}
+
+			if(i2==0){
+				//コード解析が不正に終了
+				return 1;
+			}
+
+			//次の行をサーチ
+			for(;;i++){
+				if(pBuf[i]=='\0') break;
+				i2=IsCommandDelimitation(pBuf,i);
+				if(i2){
+					i+=i2;
+					break;
+				}
+			}
+			JumpBlank(pBuf,&i);
+		}
+	}
+
+	return 0;
+}
+BOOL GetParameterString(char *pEditBuf,int iPos,char *FuncName,char *Parameter){
+	extern char *pHeaderBuf;
+	extern char *pUserSource;
+	BOOL bRet;
+
+	//ユーザーソースコードを取得
+	if(pUserSource==0)
+		pUserSource=GetUserSourceCode();
+
+
+	//クラス、配列の構成要素を解析する
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	int RefType;				//"."参照のときは0、"->"参照のときは1
+	lstrcpy(VarName,FuncName);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
+
+	if(RefType==0){
+		// キャレット位置のコード領域を判定（クラス/ローカル/グローバル）
+		int iProcPos;
+		char NowClass[VN_SIZE];
+		GetCodeAreaType(pEditBuf,iPos,&iProcPos,NowClass);
+
+		if(NowClass[0]&&iProcPos!=-1){
+			//クラスメンバ関数領域
+			bRet=GetClassMemberFunctionParameter(pUserSource,NowClass,FuncName,Parameter);
+			if(!bRet){
+				bRet=GetClassMemberFunctionParameter(pHeaderBuf,NowClass,FuncName,Parameter);
+			}
+
+			if(bRet) return 1;
+		}
+
+		//通常関数
+		bRet=GetDefualtFunctionParameter(pUserSource,FuncName,Parameter);
+		if(!bRet){
+			bRet=GetDefualtFunctionParameter(pHeaderBuf,FuncName,Parameter);
+		}
+	}
+	else{
+		//メンバ関数
+		char ClassName[VN_SIZE];
+		BOOL bArray;
+
+		//オブジェクトのクラス名を取得
+		if(!GetVariableClassName(pEditBuf,iPos,VarName,ClassName,&bArray)) return 0;
+
+		//TypeDef宣言を考慮してオリジナルなクラス名を取得
+		GetOriginalClassName(ClassName);
+
+		if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
+
+		bRet=GetClassMemberFunctionParameter(pUserSource,ClassName,NestMember,Parameter);
+		if(!bRet){
+			bRet=GetClassMemberFunctionParameter(pHeaderBuf,ClassName,NestMember,Parameter);
+		}
+	}
+
+	DeleteComment(Parameter);
+
+	return bRet;
+}
+
+void ShowParameterHint(int WndNum){
+	extern HANDLE hHeap;
+	extern METHODCHECKINFO MethodCheckInfo;
+	int i,i2,i3,IsStr,IsComment,PareNum,iPos;
+	char *pBuf;
+	char temp2[8192];
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//キャレットが示すバッファインデックスを取得
+	iPos=GetBufferIndexFromCaretPos(
+		pBuf,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+	static int Before_StartCaretY;
+	BOOL Before_StartCaretSwitch=0;
+	if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y!=Before_StartCaretY){
+		Before_StartCaretY=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
+		Before_StartCaretSwitch=1;
+	}
+
+	if(!MethodCheckInfo.hWnd){
+		////////////////////////////////////////////////
+		// 新規の場合は選択されている行の先頭位置を取得
+		////////////////////////////////////////////////
+
+		for(i=iPos;i>0;i--){
+			if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
+				i++;
+				break;
+			}
+		}
+		MethodCheckInfo.HeadPos=i;
+
+		//注釈中かどうかを判定
+		for(i2=0,IsStr=0,IsComment=0;i2<MethodCheckInfo.HeadPos;i2++){
+			if(pBuf[i2]=='\"'){
+				i3=i2;
+				IsStr^=1;
+			}
+
+			//注釈（複数行）
+			if(pBuf[i2]=='/'&&pBuf[i2+1]=='*'&&IsStr==0&&IsComment==0){
+				i2+=2;
+				while(!(pBuf[i2]=='*'&&pBuf[i2+1]=='/')){
+					if(pBuf[i2]=='\0'){
+						i2--;
+						break;
+					}
+					i2++;
+					if(i2>=MethodCheckInfo.HeadPos) break;
+				}
+				if(i2>=MethodCheckInfo.HeadPos){
+					IsComment=1;
+					break;
+				}
+				continue;
+			}
+
+			//注釈（単行）
+			if(pBuf[i2]=='\''&&IsStr==0){
+				while(!(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
+					if(pBuf[i2]=='\0'){
+						i2--;
+						break;
+					}
+					i2++;
+					if(i2>=MethodCheckInfo.HeadPos) break;
+				}
+				if(i2>=MethodCheckInfo.HeadPos){
+					IsComment=1;
+					break;
+				}
+				continue;
+			}
+
+			if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'){
+				IsComment=0;
+				IsStr=0;
+			}
+		}
+
+		if(IsComment){
+			//注釈文の位置のときは抜け出す
+			return;
+		}
+	}
+	else{
+		/*既存のパラメータヒントが存在し、
+			以前の先頭位置よりも手前にカーソルが移動されたときは破棄する*/
+		if(iPos<=MethodCheckInfo.HeadPos){
+			DestroyWindow(MethodCheckInfo.hWnd);
+			MethodCheckInfo.hWnd=0;
+		}
+	}
+
+
+	////////////////////////////////////////
+	// ダブルクォートの中かどうかを判別する
+	////////////////////////////////////////
+
+	IsStr=0;
+	IsComment=0;
+	PareNum=0;
+	for(i2=MethodCheckInfo.HeadPos;i2<iPos;i2++){
+		if(pBuf[i2]=='\"'){
+			i3=i2;
+			IsStr^=1;
+		}
+
+		if(pBuf[i2]=='('&&IsStr==0&&IsComment==0) PareNum++;
+		if(pBuf[i2]==')'&&IsStr==0&&IsComment==0) PareNum--;
+
+		//注釈（複数行）
+		if(pBuf[i2]=='/'&&pBuf[i2+1]=='*'&&IsStr==0&&IsComment==0){
+			i2+=2;
+			while(!(pBuf[i2]=='*'&&pBuf[i2+1]=='/')){
+				if(pBuf[i2]=='\0'){
+					i2--;
+					break;
+				}
+				i2++;
+				if(i2>=iPos) break;
+			}
+			if(i2>=iPos){
+				IsComment=1;
+				break;
+			}
+			continue;
+		}
+
+		//注釈（単行）
+		if(pBuf[i2]=='\''&&IsStr==0){
+			while(!(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
+				if(pBuf[i2]=='\0'){
+					i2--;
+					break;
+				}
+				i2++;
+				if(i2>=iPos) break;
+			}
+			if(i2>=iPos){
+				IsComment=1;
+				break;
+			}
+			continue;
+		}
+
+		if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'){
+			if(PareNum==0){
+				//複数行にパラメータ記述がなされないとき
+				DestroyWindow(MethodCheckInfo.hWnd);
+				MethodCheckInfo.hWnd=0;
+				return;
+			}
+			IsComment=0;
+			IsStr=0;
+		}
+
+	}
+	if(IsStr){
+		if(!MethodCheckInfo.hWnd){
+			return;
+		}
+		i=i3-1;
+	}
+	else i=iPos-1;
+
+
+	for(PareNum=0;i>=MethodCheckInfo.HeadPos;i--){
+		if(pBuf[i]=='\"'){
+			i--;
+			while(pBuf[i]!='\"'){
+				i--;
+				if(i<MethodCheckInfo.HeadPos) break;
+			}
+			if(i<MethodCheckInfo.HeadPos) break;
+			continue;
+		}
+
+		//文の第一パラメータ時に表示する（すでに表示されている場合は無関係）
+		if((!MethodCheckInfo.hWnd)&&pBuf[i]==',') break;
+
+		if(pBuf[i]==')') PareNum--;
+		if(pBuf[i]=='('){
+			PareNum++;
+			if(PareNum>0){
+				i3=i+1;
+				i--;
+				while(pBuf[i]==' '||pBuf[i]=='\t') i--;
+				for(i2=0;i>=0;i--,i2++){
+					if(!IsVariableChar(pBuf[i])){
+						if(pBuf[i-1]=='-'&&pBuf[i]=='>'){
+							// "->" を含ませる
+							i--;
+							i2++;
+							continue;
+						}
+						break;
+					}
+				}
+				i++;
+				memcpy(temp2,pBuf+i,i2);
+				temp2[i2]=0;
+				if(i3<=iPos){
+					for(i2=0,IsStr=0,PareNum=0;i3<iPos;i3++){
+						if(pBuf[i3]=='\"') IsStr^=1;
+						if(pBuf[i3]=='('&&IsStr==0) PareNum++;
+						if(pBuf[i3]==')'&&IsStr==0){
+							PareNum--;
+							if(PareNum<0) break;
+						}
+						if(pBuf[i3]==','&&IsStr==0&&PareNum==0) i2++;
+					}
+					if(PareNum<0) i2=0x7FFFFFFF;
+				}
+				else i2=0x7FFFFFFF;
+
+				if(temp2[0]==0){
+					PareNum=0;
+					iPos=i;
+					continue;
+				}
+
+				if(lstrcmp(MethodCheckInfo.BeforeMethodName,temp2)!=0){
+					//新規の場合はパラメータ文字列を取得
+					if(!GetParameterString(pBuf,iPos,temp2,MethodCheckInfo.msg)){
+						PareNum=0;
+						iPos=i;
+						continue;
+					}
+				}
+				else if(MethodCheckInfo.ParmNum==i2&&Before_StartCaretSwitch==0){
+					//表示中のパラメータヒントに変更がないとき
+					//※行移動が行われた場合を除く
+					break;
+				}
+
+				//第何パラメータを太字にするかを示す
+				MethodCheckInfo.ParmNum=i2;
+
+				//パラメータヒントを表示
+				ShowCommandMessage();
+
+				lstrcpy(MethodCheckInfo.BeforeMethodName,temp2);
+				break;
+			}
+		}
+		if(i==MethodCheckInfo.HeadPos){
+
+			//行番号を飛び越す
+			while(pBuf[i]>='0'&&pBuf[i]<='9') i++;
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temp2[i2]=0;
+					break;
+				}
+				temp2[i2]=pBuf[i];
+			}
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+			if(pBuf[i]=='(') i++;
+			if(i<=iPos){
+				for(i2=0,IsStr=0,PareNum=0;i<iPos;i++){
+					if(pBuf[i]=='\"') IsStr^=1;
+					if(pBuf[i]=='('&&IsStr==0) PareNum++;
+					if(pBuf[i]==')'&&IsStr==0){
+						PareNum--;
+						if(PareNum<0) break;
+					}
+					if(pBuf[i]==','&&IsStr==0&&PareNum==0) i2++;
+				}
+				if(PareNum<0) temp2[0]=0;
+			}
+			else i2=0x7FFFFFFF;
+			if(SetCommandMessageToMethodCheck(temp2)){
+				//第何パラメータを太字にするかを示す
+				MethodCheckInfo.ParmNum=i2;
+
+				//パラメータヒントを表示
+				ShowCommandMessage();
+
+				lstrcpy(MethodCheckInfo.BeforeMethodName,temp2);
+			}
+			else{
+				if(MethodCheckInfo.hWnd){
+					UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);	//ちらつき防止
+
+					DestroyWindow(MethodCheckInfo.hWnd);
+					MethodCheckInfo.hWnd=0;
+				}
+			}
+			break;
+		}
+	}
+
+	extern char *pUserSource;
+	if(pUserSource){
+		HeapDefaultFree(pUserSource);
+		pUserSource=0;
+	}
+}
+
+
+//////////////////////////////////////
+// パラメータヒントのインターフェイス
+//////////////////////////////////////
+
+int DrawParam_StartScreenPosX;
+int DrawParam_PosY;
+int DrawParam_TextHeight;
+int DrawParam_MaxX;
+void TextOut_ToParmHint(HDC hdc,HFONT hFont,char *buffer,SIZE *pSize){
+	int i,i2;
+	HFONT hOldFont;
+
+	i=lstrlen(buffer);
+	hOldFont=(HFONT)SelectObject(hdc,hFont);
+
+	i2=pSize->cx;
+	GetTextExtentPoint32(hdc,buffer,i,pSize);
+	if(DrawParam_StartScreenPosX+i2+pSize->cx >= ScreenX){
+		DrawParam_PosY+=DrawParam_TextHeight;
+		i2=10;
+	}
+	TextOut(hdc,i2,DrawParam_PosY,buffer,i);
+	pSize->cx+=i2;
+
+	if(DrawParam_MaxX<pSize->cx) DrawParam_MaxX=pSize->cx;
+
+	SelectObject(hdc,hOldFont);
+}
+void DrawParameterHint(HDC hdc,SIZE *pSize){
+	extern METHODCHECKINFO MethodCheckInfo;
+	int i,i2,i3,counter;
+	char temporary[8192];
+	HFONT hOldFont;
+
+	SetBkMode(hdc,TRANSPARENT);
+
+	DrawParam_PosY=2;
+
+	//命令語、関数の識別名
+	for(i=0;;i++){
+		temporary[i]=MethodCheckInfo.msg[i];
+		if(MethodCheckInfo.msg[i]=='\0') break;
+		if(MethodCheckInfo.msg[i]==' '||MethodCheckInfo.msg[i]=='('){
+			i++;
+			temporary[i]=0;
+			break;
+		}
+	}
+	hOldFont=(HFONT)SelectObject(hdc,MethodCheckInfo.hFont);
+	TextOut(hdc,2,2,temporary,lstrlen(temporary));
+	GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),pSize);
+	SelectObject(hdc,hOldFont);
+	pSize->cx+=2;
+	DrawParam_TextHeight=pSize->cy;
+
+	DrawParam_MaxX=pSize->cx;
+
+	for(i2=0,counter=0;;i++,i2++){
+		if(MethodCheckInfo.msg[i]=='('){
+			i3=GetStringInPare(temporary+i2,MethodCheckInfo.msg+i);
+			i+=i3-1;
+			i2+=i3-1;
+		}
+		if(MethodCheckInfo.msg[i]==','||
+			MethodCheckInfo.msg[i]==')'||
+			MethodCheckInfo.msg[i]=='\0'){
+			temporary[i2]=0;
+			if(MethodCheckInfo.ParmNum==counter){
+				//太字フォントパラメータ
+				TextOut_ToParmHint(hdc,MethodCheckInfo.hBoldFont,temporary,pSize);
+			}
+			else{
+				//通常フォントパラメータ
+				TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
+			}
+			counter++;
+
+			if(MethodCheckInfo.msg[i]==','){
+				temporary[0]=',';
+				temporary[1]=' ';
+				temporary[2]=0;
+
+				TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
+
+				i++;
+				while(MethodCheckInfo.msg[i]==' '||MethodCheckInfo.msg[i]=='\t') i++;
+				i--;
+			}
+			else if(MethodCheckInfo.msg[i]==')'){
+				lstrcpy(temporary,MethodCheckInfo.msg+i);
+
+				TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
+
+				break;
+			}
+			else if(MethodCheckInfo.msg[i]=='\0') break;
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=MethodCheckInfo.msg[i];
+	}
+
+	pSize->cx=DrawParam_MaxX+20;
+	pSize->cy=DrawParam_PosY+DrawParam_TextHeight+2;
+}
+void ShowHelp_FromParamHint(void){
+	extern METHODCHECKINFO MethodCheckInfo;
+	int i;
+	char temporary[MAX_PATH],temp2[255];
+	HH_AKLINK ak;
+
+	for(i=0;;i++){
+		if(MethodCheckInfo.msg[i]=='('||MethodCheckInfo.msg[i]==' '||
+			MethodCheckInfo.msg[i]=='\0'){
+			temp2[i]=0;
+			break;
+		}
+		temp2[i]=MethodCheckInfo.msg[i];
+	}
+
+	memset(&ak, 0, sizeof(HH_AKLINK));
+	ak.cbStruct = sizeof(HH_AKLINK);
+	ak.pszKeywords = temp2;
+	ak.fIndexOnFail=1;
+
+	sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
+	HtmlHelp(NULL,temporary,HH_KEYWORD_LOOKUP,(DWORD)&ak);
+}
+LRESULT CALLBACK MethodCheckWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern METHODCHECKINFO MethodCheckInfo;
+	HDC hdc;
+	HPEN hOldPen;
+	HBRUSH hBrush,hOldBrush;
+	PAINTSTRUCT ps;
+	SIZE size;
+	RECT rect;
+	POINT pos;
+
+	switch(message){
+		case WM_CREATE:
+			GetCaretPos(&pos);
+			ClientToScreen(GetWindow(hClient,GW_CHILD),&pos);
+			DrawParam_StartScreenPosX=pos.x;
+
+			SetTimer(hwnd,1,50,0);
+			return 0;
+		case WM_PAINT:
+			hdc=BeginPaint(hwnd,&ps);
+
+			//枠を描画
+			GetClientRect(hwnd,&rect);
+			hBrush=CreateSolidBrush(RGB(255,255,180));
+			hOldPen=(HPEN)SelectObject(hdc,GetStockObject(BLACK_PEN));
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			Rectangle(hdc,0,0,rect.right,rect.bottom);
+			SelectObject(hdc,hOldPen);
+			SelectObject(hdc,hOldBrush);
+			DeleteObject(hBrush);
+
+			//パラメータヒントを描画
+			DrawParameterHint(hdc,&size);
+
+			//[?]マークを描画
+			HBITMAP hBmp,hOldBmp;
+			HDC memdc;
+			hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
+			memdc=CreateCompatibleDC(hdc);
+			hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
+			GetClientRect(hwnd,&rect);
+			BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
+			SelectObject(memdc,hOldBmp);
+			DeleteDC(memdc);
+			DeleteObject(hBmp);
+
+			EndPaint(hwnd,&ps);
+			return 0;
+		case WM_TIMER:
+			//[?]マークを描画
+			static BOOL bOnMouse;
+			GetClientRect(hwnd,&rect);
+			GetCursorPos(&pos);
+			ScreenToClient(hwnd,&pos);
+			if(rect.right-14<=pos.x&&pos.x<=rect.right-1&&
+				rect.bottom-14<=pos.y&&pos.y<=rect.bottom-1){
+				if(bOnMouse) return 0;
+
+				hdc=GetDC(hwnd);
+
+				hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION2),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
+				memdc=CreateCompatibleDC(hdc);
+				hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
+				GetClientRect(hwnd,&rect);
+				BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
+				SelectObject(memdc,hOldBmp);
+				DeleteDC(memdc);
+				DeleteObject(hBmp);
+
+				ReleaseDC(hwnd,hdc);
+
+				bOnMouse=1;
+			}
+			else{
+				if(!bOnMouse) return 0;
+
+				hdc=GetDC(hwnd);
+
+				hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
+				memdc=CreateCompatibleDC(hdc);
+				hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
+				GetClientRect(hwnd,&rect);
+				BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
+				SelectObject(memdc,hOldBmp);
+				DeleteDC(memdc);
+				DeleteObject(hBmp);
+
+				ReleaseDC(hwnd,hdc);
+				bOnMouse=0;
+			}
+			return 0;
+		case WM_ACTIVATE:
+			if(LOWORD(wParam)==WA_ACTIVE||LOWORD(wParam)==WA_CLICKACTIVE){
+				SetFocus(GetWindow(hClient,GW_CHILD));
+
+				if(LOWORD(wParam)==WA_CLICKACTIVE){
+					GetClientRect(hwnd,&rect);
+					GetCursorPos(&pos);
+					ScreenToClient(hwnd,&pos);
+					if(rect.right-14<=pos.x&&pos.x<=rect.right-1&&
+						rect.bottom-14<=pos.y&&pos.y<=rect.bottom-1){
+						ShowHelp_FromParamHint();
+					}
+				}
+			}
+			return 0;
+		case WM_DESTROY:
+			MethodCheckInfo.BeforeMethodName[0]=0;
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+void ShowCommandMessage(void){
+	extern METHODCHECKINFO MethodCheckInfo;
+	int i;
+	int sw;
+
+	if(pobj_nv->dwParameterHint==1){
+		//ポップアップ表示
+
+		extern HINSTANCE hInst;
+		extern METHODCHECKINFO MethodCheckInfo;
+		HDC hdc,memdc;
+		RECT rect,rc2;
+		SIZE size;
+		POINT pos;
+		if(!MethodCheckInfo.hWnd){
+			MethodCheckInfo.hWnd=CreateWindow("MethodCheckWindow",NULL,WS_POPUP,
+				0,0,0,0,
+				hOwner,NULL,hInst,0);
+			sw=1;
+		}
+		else sw=0;
+		i=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+		hdc=GetDC(MethodCheckInfo.hWnd);
+		memdc=CreateCompatibleDC(hdc);
+		DrawParameterHint(memdc,&size);
+		DeleteDC(memdc);
+		ReleaseDC(MethodCheckInfo.hWnd,hdc);
+
+		GetWindowRect(MdiInfo[i]->hwnd,&rect);
+		GetCaretPos(&pos);
+		ClientToScreen(MdiInfo[i]->pMdiTextEdit->hEdit,&pos);
+		rect.left=pos.x-20;
+		rect.top=pos.y-pobj_nv->lf.lfHeight;
+		if(sw){
+			MoveWindow(MethodCheckInfo.hWnd,rect.left,rect.top,size.cx,size.cy,1);
+			ShowWindow(MethodCheckInfo.hWnd,SW_SHOWNOACTIVATE);
+		}
+		else{
+			GetWindowRect(MethodCheckInfo.hWnd,&rc2);
+
+			MoveWindow(MethodCheckInfo.hWnd,
+				rc2.left,
+				rect.top,
+				size.cx,
+				size.cy,
+				1);
+
+			InvalidateRect(MethodCheckInfo.hWnd,NULL,0);
+		}
+	}
+
+	//ステータスバーに表示
+	else if(pobj_nv->dwParameterHint==2)
+		SetStatusText(MethodCheckInfo.msg);
+}
Index: branches/egtra/ab5.0/abdev/abdev/Print.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Print.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Print.cpp	(revision 774)
@@ -0,0 +1,564 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+HRESULT ApplyDialogTexture( HWND );
+
+int iPreviewNowPage;
+int iZoomNowPage;
+
+#define ZOOM_NUM 8
+#define ZOOM_INIT 4
+int array_Zoom[ZOOM_NUM]={
+	500,
+	200,
+	150,
+	100,
+	75,
+	50,
+	25,
+	10
+};
+
+
+CPage obj_Page;
+
+CPage::CPage(){
+	memset(&psd, 0, sizeof(PAGESETUPDLG));
+	psd.lStructSize = sizeof(PAGESETUPDLG);
+	psd.hwndOwner = hOwner;
+	psd.Flags = PSD_MARGINS |PSD_INHUNDREDTHSOFMILLIMETERS|PSD_DISABLEORIENTATION;
+	psd.rtMargin.left=2500;
+	psd.rtMargin.top=2500;
+	psd.rtMargin.right=2500;
+	psd.rtMargin.bottom=2500;
+	psd.ptPaperSize.x=21000;
+	psd.ptPaperSize.y=29700;
+}
+CPage::~CPage(){
+}
+
+BOOL CPage::SetupDlg(void){
+	//ページ設定ダイアログ
+	return PageSetupDlg(&psd);
+}
+
+void DrawPage(HDC memdc,BOOL bPreview,BOOL *lpbLastPage=0){
+	RECT rc;
+
+	//ページの幅、高さ（単位は0.1ミリメートル）
+	int iPageWidth,iPageHeight;
+	iPageWidth=obj_Page.psd.ptPaperSize.x/10;
+	iPageHeight=obj_Page.psd.ptPaperSize.y/10;
+
+	//マッピングモードをセット
+	SetMapMode(memdc,MM_LOMETRIC);
+
+	POINT px_pos;
+	px_pos.x=iPageWidth;
+	px_pos.y=iPageHeight;
+	LPtoDP(memdc,&px_pos,1);
+	px_pos.y=-px_pos.y;
+
+	int WndNum;
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+	//フォント生成
+	LOGFONT lf;
+	lf=pobj_nv->lfPrint;
+	lf.lfHeight=-MulDiv(pobj_nv->iPrintFontPointSize,GetDeviceCaps(memdc, LOGPIXELSY),960);
+	HFONT hFont;
+	hFont=CreateFontIndirect(&lf);
+
+	//フォントをセット
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(memdc,hFont);
+
+	//マージン（単位は0.1ミリメートル）
+	RECT rcMargin;
+	rcMargin.left=obj_Page.psd.rtMargin.left/10;
+	rcMargin.top=obj_Page.psd.rtMargin.top/10;
+	rcMargin.right=obj_Page.psd.rtMargin.right/10;
+	rcMargin.bottom=obj_Page.psd.rtMargin.bottom/10;
+
+	//タブ文字数
+	DRAWTEXTPARAMS dtp;
+	dtp.cbSize=sizeof(DRAWTEXTPARAMS);
+	dtp.iLeftMargin=0;
+	dtp.iRightMargin=0;
+	dtp.iTabLength=pobj_nv->TabSize;
+	dtp.uiLengthDrawn=0;
+
+	char *temp;
+	temp=(char *)malloc(65535);
+
+	char *buffer;
+	buffer=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+	int i=0,i2=0,iPage=0;
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\0'||buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			temp[i2]=0;
+
+			memset(&rc,0,sizeof(RECT));
+			rc.right=iPageWidth-(rcMargin.left + rcMargin.right);
+			DrawTextEx(memdc,temp,-1,&rc,DT_CALCRECT | DT_WORDBREAK|DT_TABSTOP|DT_EXPANDTABS|DT_NOPREFIX,&dtp);
+
+			if(rc.bottom<=-(iPageHeight-(rcMargin.top+rcMargin.bottom)) || buffer[i]=='\0'){
+
+				if(rc.bottom<-(iPageHeight-(rcMargin.top+rcMargin.bottom))){
+					i--;i2--;
+					while(i>0 && (!(buffer[i]=='\r'&&buffer[i+1]=='\n'))){
+						i--;
+						i2--;
+					}
+					temp[i2]=0;
+				}
+
+				rc.left=rcMargin.left;
+				rc.right=iPageWidth-rcMargin.right;
+				rc.top=-rcMargin.top;
+				rc.bottom=-(iPageHeight-rcMargin.bottom);
+
+				char szTempPage[255],*temp2,temp3[255];
+				lstrcpy(temp3,pobj_nv->szPageStr);
+				temp2=strstr(temp3,"&n");
+				if(temp2){
+					temp2[0]='%';
+					temp2[1]='d';
+
+					sprintf(szTempPage,temp3,iPage+1);
+				}
+
+				if(bPreview&&iPage==iPreviewNowPage || bPreview==0){
+					if(bPreview==0) StartPage(memdc);
+
+					DrawTextEx(memdc,temp,-1,&rc,DT_LEFT | DT_WORDBREAK|DT_TABSTOP|DT_EXPANDTABS|DT_NOPREFIX,&dtp);
+
+					if(pobj_nv->bShowPageNum){
+						//ページ番号
+						rc.top=-(iPageHeight-rcMargin.bottom);
+						rc.bottom=-iPageHeight;
+						DrawText(memdc,szTempPage,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX);
+					}
+
+					if(bPreview==0) EndPage(memdc);
+
+					if(lpbLastPage){
+						if(buffer[i]=='\0'){
+							*lpbLastPage=1;
+						}
+						else *lpbLastPage=0;
+					}
+
+					if(bPreview) break;
+				}
+
+				if(buffer[i]=='\0') break;
+
+				iPage++;
+
+				i++;
+				i2=-1;
+				continue;
+			}
+		}
+		temp[i2]=buffer[i];
+	}
+
+	free(temp);
+
+	SelectObject(memdc,hOldFont);
+}
+
+void CreatePreviewDCAndBmp(HDC *lphDC,HBITMAP *lphBmp,POINT *lpPxPos,BOOL *lpbLastPage){
+
+	//印刷ダイアログ
+	PRINTDLG pd;
+	memset(&pd,0,sizeof(PRINTDLG));
+	pd.lStructSize=sizeof(PRINTDLG);
+	pd.hwndOwner=hOwner;
+	pd.Flags=PD_RETURNDC|PD_RETURNDEFAULT;
+	pd.nFromPage=1;
+	pd.nToPage=1;
+	pd.nMinPage=1;
+	pd.nMaxPage=1;
+	pd.nCopies=1;
+	if(PrintDlg(&pd)==0){
+		return;
+	}
+
+	HDC memdc;
+	memdc=CreateCompatibleDC(pd.hDC);
+
+	//ページの幅、高さ（単位は0.1ミリメートル）
+	int iPageWidth,iPageHeight;
+	iPageWidth=obj_Page.psd.ptPaperSize.x/10;
+	iPageHeight=obj_Page.psd.ptPaperSize.y/10;
+
+	//マッピングモードをセット
+	SetMapMode(memdc,MM_LOMETRIC);
+
+	POINT px_pos;
+	px_pos.x=iPageWidth;
+	px_pos.y=iPageHeight;
+	LPtoDP(memdc,&px_pos,1);
+	px_pos.y=-px_pos.y;
+
+	HBITMAP hMemBmp;
+	hMemBmp=CreateCompatibleBitmap(pd.hDC,px_pos.x,px_pos.y);
+	SelectObject(memdc,hMemBmp);
+
+	//背景を初期化
+	HBRUSH hOldBrush;
+	hOldBrush=(HBRUSH)SelectObject(memdc,GetStockObject(WHITE_BRUSH));
+	PatBlt(memdc,0,0,px_pos.x,-px_pos.y,PATCOPY);
+	SelectObject(memdc,hOldBrush);
+
+	//メモリへ描画
+	DrawPage(memdc,1,lpbLastPage);
+
+	DeleteDC(pd.hDC);
+
+
+	*lphDC=memdc;
+	*lphBmp=hMemBmp;
+	*lpPxPos=px_pos;
+}
+
+void DrawPreview(HWND hPreview,HDC hdc,HDC memdc,POINT *lpPxPos){
+	SetMapMode(memdc,MM_TEXT);
+
+	POINT px_pos;
+	px_pos=*lpPxPos;
+
+	SIZE size;
+	RECT rc;
+	GetClientRect(hPreview,&rc);
+	size.cy=(long)((double)rc.bottom*0.9);
+	size.cx=(long)((double)size.cy*((double)obj_Page.psd.ptPaperSize.x/(double)obj_Page.psd.ptPaperSize.y));
+
+	SIZE size_hori;
+	size_hori.cx=(long)((double)rc.right*0.9);
+	size_hori.cy=(long)((double)size_hori.cx*((double)obj_Page.psd.ptPaperSize.y/(double)obj_Page.psd.ptPaperSize.x));
+
+	if(size.cx>size_hori.cx) size=size_hori;
+	size.cx=px_pos.x;
+	size.cy=px_pos.y;
+
+
+	//////////////////////////////////
+	// スクロールバー情報を取得
+	//////////////////////////////////
+
+	//垂直
+	SCROLLINFO si_vert;
+	si_vert.cbSize=sizeof(SCROLLINFO);
+	si_vert.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
+	GetScrollInfo(hPreview,SB_VERT,&si_vert);
+
+	//水平
+	SCROLLINFO si_horz;
+	si_horz.cbSize=sizeof(SCROLLINFO);
+	si_horz.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
+	GetScrollInfo(hPreview,SB_HORZ,&si_horz);
+
+
+
+	//表示率
+	double dblZoomRatio;
+	dblZoomRatio=((double)array_Zoom[iZoomNowPage]/(double)100)*0.18;
+
+
+	///////////////////////////
+	// メモリへ描画
+	///////////////////////////
+
+	HDC memdc2;
+	memdc2=CreateCompatibleDC(hdc);
+
+	HBITMAP hMemBmp;
+	hMemBmp=CreateCompatibleBitmap(hdc,(int)((double)size.cx*dblZoomRatio)+40, (int)((double)size.cy*dblZoomRatio)+40);
+
+	SelectObject(memdc2,hMemBmp);
+	RECT rc2;
+	rc2.left=0;rc2.top=0;
+	rc2.right=(int)((double)size.cx*dblZoomRatio)+40;
+	rc2.bottom=(int)((double)size.cy*dblZoomRatio)+40;
+	FillRect(memdc2,&rc2,(HBRUSH)GetStockObject(GRAY_BRUSH));
+
+	SetStretchBltMode(memdc2,HALFTONE);
+	StretchBlt(memdc2,
+		20, 20,
+		(int)((double)size.cx*dblZoomRatio), (int)((double)size.cy*dblZoomRatio),
+		memdc,0,0,px_pos.x,px_pos.y,SRCCOPY);
+
+	//画面へ描画
+	BitBlt(hdc,-si_horz.nPos,-si_vert.nPos,rc2.right,rc2.bottom,
+		memdc2,0,0,SRCCOPY);
+
+	DeleteDC(memdc2);
+	DeleteObject(hMemBmp);
+
+
+	//////////////////////////////
+	// スクロールバーを設定
+	//////////////////////////////
+	GetClientRect(hPreview,&rc);
+
+	//垂直
+	si_vert.nMin=0;
+	si_vert.nMax=rc2.bottom;
+	si_vert.nPage=rc.bottom;
+	SetScrollInfo(hPreview,SB_VERT,&si_vert,1);
+
+	//水平
+	si_horz.nMin=0;
+	si_horz.nMax=rc2.right;
+	si_horz.nPage=rc.right;
+	SetScrollInfo(hPreview,SB_HORZ,&si_horz,1);
+}
+#define WM_RESETPREVIEW WM_USER+100
+LRESULT CALLBACK PreviewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static HDC memdc;
+	static HBITMAP hMemBmp;
+	static POINT px_pos;
+	SCROLLINFO si;
+	int i;
+	RECT rc;
+	switch(message){
+		case WM_CREATE:
+			memdc=0;
+			hMemBmp=0;
+			SendMessage(hwnd,WM_RESETPREVIEW,0,0);
+			return 0;
+		case WM_PAINT:
+			HDC hdc;
+			PAINTSTRUCT ps;
+			hdc=BeginPaint(hwnd,&ps);
+			DrawPreview(hwnd,hdc,memdc,&px_pos);
+			EndPaint(hwnd,&ps);
+			return 0;
+		case WM_RESETPREVIEW:
+			if(memdc) DeleteDC(memdc);
+			if(hMemBmp) DeleteObject(hMemBmp);
+			BOOL bLastPage;
+			CreatePreviewDCAndBmp(&memdc,&hMemBmp,&px_pos,&bLastPage);
+			InvalidateRect(hwnd,NULL,1);
+
+			if(iPreviewNowPage==0) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_PREV),0);
+			else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_PREV),1);
+			if(bLastPage) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_NEXT),0);
+			else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_NEXT),1);
+
+			if(iZoomNowPage<=0) EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMIN),0);
+			else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMIN),1);
+			if(iZoomNowPage>=ZOOM_NUM-1)
+				EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMOUT),0);
+			else EnableWindow(GetDlgItem(GetParent(hwnd),IDC_ZOOMOUT),1);
+			return 0;
+		case WM_VSCROLL:
+		case WM_HSCROLL:
+			int fnBar;
+			if(message==WM_VSCROLL) fnBar=SB_VERT;
+			else fnBar=SB_HORZ;
+
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+
+			GetScrollInfo(hwnd,fnBar,&si);
+			if(LOWORD(wParam)==SB_LINEUP) i=-1;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rc);
+			if(message==WM_VSCROLL)
+				i=max(-si.nPos,min(i,si.nMax-rc.bottom-si.nPos));
+			else
+				i=max(-si.nPos,min(i,si.nMax-rc.right-si.nPos));
+			if(i!=0){
+				si.nPos+=i;
+				SetScrollInfo(hwnd,fnBar,&si,1);
+
+				InvalidateRect(hwnd,NULL,0);
+			}
+			return 0;
+		case WM_DESTROY:
+			DeleteDC(memdc);
+			DeleteObject(hMemBmp);
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+INT_PTR CALLBACK DlgPreview(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static HWND hPreview;
+	char temporary[255];
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(GetDesktopWindow(),hwnd);
+
+			hPreview=CreateWindowEx(WS_EX_STATICEDGE,"PreviewWindow",NULL,
+				WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL,
+				0,0,0,0,
+				hwnd,0,hInst,0);
+
+			RECT rc;
+			GetClientRect(hwnd,&rc);
+			SetWindowPos(hwnd,NULL,0,0,rc.right,rc.bottom,SWP_NOMOVE);
+
+			iPreviewNowPage=0;
+
+			SetDlgItemText(hwnd,IDC_FONT,pobj_nv->lfPrint.lfFaceName);
+
+			//ページ番号を表示するかどうか
+			if(pobj_nv->bShowPageNum) SendDlgItemMessage(hwnd,IDC_SHOWPAGENUM,BM_SETCHECK,BST_CHECKED,0);
+			SendMessage(hwnd,WM_COMMAND,IDC_SHOWPAGENUM,0);
+
+			//ページ番号文字列
+			SetDlgItemText(hwnd,IDC_PAGESTR,pobj_nv->szPageStr);
+
+			//拡大・縮小アイコンを表示
+			SendDlgItemMessage(hwnd,IDC_ZOOMOUT,BM_SETIMAGE,IMAGE_ICON ,
+				(LPARAM)LoadImage(hResInst,MAKEINTRESOURCE(IDI_ZOOMOUT),IMAGE_ICON,16,16,LR_SHARED));
+			SendDlgItemMessage(hwnd,IDC_ZOOMIN,BM_SETIMAGE,IMAGE_ICON ,
+				(LPARAM)LoadImage(hResInst,MAKEINTRESOURCE(IDI_ZOOMIN),IMAGE_ICON,16,16,LR_SHARED));
+			iZoomNowPage=ZOOM_INIT;
+
+			sprintf(temporary,"%d%%",array_Zoom[iZoomNowPage]);
+			SetDlgItemText(hwnd,IDC_ZOOMRATIO,temporary);
+
+			SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+
+				case IDC_PREV:
+					iPreviewNowPage--;
+					SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+					return 1;
+				case IDC_NEXT:
+					iPreviewNowPage++;
+					SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+					return 1;
+
+				case IDC_ZOOMOUT:
+				case IDC_ZOOMIN:
+					if(LOWORD(wParam)==IDC_ZOOMOUT)
+						iZoomNowPage++;
+					if(LOWORD(wParam)==IDC_ZOOMIN)
+						iZoomNowPage--;
+					SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+
+					sprintf(temporary,"%d%%",array_Zoom[iZoomNowPage]);
+					SetDlgItemText(hwnd,IDC_ZOOMRATIO,temporary);
+					return 1;
+
+				case IDC_PRINT:
+					Printout();
+					return 1;
+
+				case IDC_PAGESET:
+					if(obj_Page.SetupDlg()){
+						//再描画
+						SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+					}
+					return 1;
+
+				case IDC_FONT:
+					int iPointSize;
+					LOGFONT temp_lf;
+					temp_lf=pobj_nv->lfPrint;
+					if(!SetFontDialog(hwnd,&temp_lf,0,&iPointSize)) return 1;
+					pobj_nv->lfPrint=temp_lf;
+					pobj_nv->iPrintFontPointSize=iPointSize;
+
+					SetDlgItemText(hwnd,IDC_FONT,pobj_nv->lfPrint.lfFaceName);
+
+					//再描画
+					SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+					return 1;
+
+				case IDC_SHOWPAGENUM:
+					//ページ番号を表示するかどうか
+					if(SendDlgItemMessage(hwnd,IDC_SHOWPAGENUM,BM_GETCHECK,0,0)){
+						EnableWindow(GetDlgItem(hwnd,IDC_PAGESTR),1);
+						pobj_nv->bShowPageNum=1;
+					}
+					else{
+						EnableWindow(GetDlgItem(hwnd,IDC_PAGESTR),0);
+						pobj_nv->bShowPageNum=0;
+					}
+					SendMessage(hPreview,WM_RESETPREVIEW,0,0);
+					return 1;
+
+				case IDC_PAGESTR:
+					//ページ番号文字列
+					GetDlgItemText(hwnd,IDC_PAGESTR,pobj_nv->szPageStr,255);
+					return 1;
+			}
+			return 0;
+
+		case WM_SIZE:
+			MoveWindow(hPreview,
+				140,40,
+				LOWORD(lParam)-155,
+				HIWORD(lParam)-55,0);
+			InvalidateRect(hwnd,NULL,0);
+			return 0;
+
+		case WM_DESTROY:
+			DestroyWindow(hPreview);
+			return 0;
+	}
+	return 0;
+}
+
+void Preview(void){
+	DialogBox(hResInst,MAKEINTRESOURCE(IDD_PREVIEW),hOwner,DlgPreview);
+}
+
+
+void Printout(void){
+	int WndNum;
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+	//印刷ダイアログ
+	PRINTDLG pd;
+	memset(&pd,0,sizeof(PRINTDLG));
+	pd.lStructSize=sizeof(PRINTDLG);
+	pd.hwndOwner=hOwner;
+	pd.Flags=PD_ALLPAGES | PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE | PD_NOSELECTION | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE;
+	pd.nFromPage=1;
+	pd.nToPage=1;
+	pd.nMinPage=1;
+	pd.nMaxPage=1;
+	pd.nCopies=1;
+	if(PrintDlg(&pd)==0){
+		return;
+	}
+
+	//印刷ドキュメントをスタート
+	DOCINFO di;
+	memset(&di,0,sizeof(DOCINFO));
+	di.cbSize=sizeof(DOCINFO);
+	di.lpszDocName=MdiInfo[WndNum]->title.c_str();
+	if(StartDoc(pd.hDC,&di)==0){
+		MessageBox(hOwner,"印刷できません。プリンターの状況を確認してください。",APPLICATION_NAME,MB_OK | MB_ICONEXCLAMATION);
+		return;
+	}
+
+	//紙へ描画
+	DrawPage(pd.hDC,0);
+
+	//印刷ドキュメントを終了
+	EndDoc(pd.hDC);
+
+	DeleteDC(pd.hDC);
+}
Index: branches/egtra/ab5.0/abdev/abdev/ProjectControl.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/ProjectControl.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/ProjectControl.cpp	(revision 774)
@@ -0,0 +1,1875 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+using namespace ActiveBasic::IDE;
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+HWND hProjectViewTab;
+HWND hProcedureTreeView,hMaterialTreeView;
+HIMAGELIST hProcedureTreeViewImageList,hMaterialTreeViewImageList;
+WNDPROC OldProcedureTreeViewProc,OldMaterialTreeViewProc;
+WNDPROC OldTabProc;
+
+LRESULT CALLBACK ProcedureTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	if(message==WM_CHAR&&wParam==VK_RETURN){
+		SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
+		//デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
+		return 0;
+	}
+	else if(message==WM_LBUTTONDBLCLK){
+		SendMessage(hProjectViewTab,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
+		return 0;
+	}
+	return CallWindowProc(OldProcedureTreeViewProc,hwnd,message,wParam,lParam);
+}
+LRESULT CALLBACK MaterialTreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	if(message==WM_CHAR&&wParam==VK_RETURN){
+		SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
+		//デフォルトのメッセージ処理をするとビープ音がしてしまうので避ける
+		return 0;
+	}
+	if(message==WM_KEYDOWN&&wParam==VK_DELETE) SendMessage(hProjectViewTab,WM_COMMAND,IDM_MATERIALTREE_DELETE,0);
+	return CallWindowProc(OldMaterialTreeViewProc,hwnd,message,wParam,lParam);
+}
+LRESULT CALLBACK TabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern LPSTR DefFileFilter;
+	int i,i2,WndNum;
+	char str[MAX_PATH],temporary[MAX_PATH];
+	HWND hTree,hChild;
+	HTREEITEM hTreeItem,hTreeItem2;
+	TV_HITTESTINFO tvHitTestInfo;
+	TVITEM tvItem;
+
+	switch(message){
+		case WM_CONTEXTMENU:
+			i=TabCtrl_GetCurSel(hwnd);
+			if(i==0){
+				//ファイルツリー
+				POINT pos;
+				pos.x=LOWORD(lParam);
+				pos.y=HIWORD(lParam);
+				pobj_FileTree->ContextMenu(&pos);
+				return 0;
+			}
+			else if(i==1) hTree=hProcedureTreeView;
+			else if(i==2) hTree=hMaterialTreeView;
+			tvHitTestInfo.pt.x=LOWORD(lParam);
+			tvHitTestInfo.pt.y=HIWORD(lParam);
+			ScreenToClient(hTree,&tvHitTestInfo.pt);
+			hTreeItem=TreeView_HitTest(hTree,&tvHitTestInfo);
+			if(hTreeItem){
+				TreeView_SelectItem(hTree,hTreeItem);
+				if(i==1){
+					extern HMENU hProcedureTreeMenuBase;
+					if(TreeView_GetRoot(hTree)!=hTreeItem)
+						TrackPopupMenu(GetSubMenu(hProcedureTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+				}
+				else if(i==2){
+					extern HMENU hMaterialTreeMenuBase;
+					hTreeItem2=TreeView_GetRoot(hTree);
+					for(i2=0;;i2++){
+						if(hTreeItem2==hTreeItem) break;
+						hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
+						if(!hTreeItem2) break;
+					}
+					if(hTreeItem2){
+						if(i2==0)
+							TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,0),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+						else if(i2==1)
+							TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,2),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+						else if(i2==2)
+							TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,4),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+						else if(i2==3)
+							TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,6),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+						else if(i2==4)
+							TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,8),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+					}
+					else{
+						hTreeItem=TreeView_GetNextItem(hTree,hTreeItem,TVGN_PARENT);
+						hTreeItem2=TreeView_GetRoot(hTree);
+						for(i2=0;;i2++){
+							if(hTreeItem2==hTreeItem) break;
+							hTreeItem2=TreeView_GetNextSibling(hTree,hTreeItem2);
+							if(!hTreeItem2) break;
+						}
+						if(hTreeItem2){
+							if(i2==0)
+								TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,1),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+							else if(i2==1)
+								TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,3),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+							else if(i2==2)
+								TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,5),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+							else if(i2==3)
+								TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,7),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+							else if(i2==4)
+								TrackPopupMenu(GetSubMenu(hMaterialTreeMenuBase,9),TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hwnd,0);
+						}
+					}
+				}
+			}
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+
+				case IDM_PROCEDURETREE_SHOW:
+					extern BOOL bSearchingClasses;
+					if(bSearchingClasses){
+						pobj_ClassTreeView->bShowSwitch=1;
+						break;
+					}
+
+					hTreeItem=TreeView_GetSelection(hProcedureTreeView);
+					for(i=0;i<pobj_ClassTreeView->NumberOfProcedures;i++){
+						if(pobj_ClassTreeView->pProcInfo[i].hTreeItem==hTreeItem){
+
+							if( projectInfo.IsOpened() ){
+								// 対象ファイルを開く
+								lstrcpy(temporary,
+									projectInfo.fileSystem.root.FindFile( pobj_ClassTreeView->pProcInfo[i].hFileTreeItem ).GetRelationalPath().c_str());
+								lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+								hChild=OpenFileWithExtension(temporary);
+							}
+							else{
+								hChild = GetWindow(hClient,GW_CHILD);
+							}
+
+							//プロシージャの行を選択する
+							//ResetScrollbarが再描画時に呼び出されるので、再描画する
+							WndNum=GetWndNum(hChild);
+							InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
+							UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+							TextEdit_SelectOneLine(WndNum,pobj_ClassTreeView->pProcInfo[i].code_pos,TRUE);
+
+							//タイマーをセット
+							// ※フォーカスをエディタにセットするため
+							// ※タイミングを遅らせてSetFocusを実行する必要あり
+							SetTimer(hwnd,100,10,NULL);
+
+							break;
+						}
+					}
+
+					break;
+
+				case IDM_MATERIALTREE_INSERTCURSOR:
+					Project_CursorResInsert();
+					break;
+				case IDM_MATERIALTREE_INSERTBITMAP:
+					Project_BitmapResInsert();
+					break;
+				case IDM_MATERIALTREE_INSERTICON:
+					Project_IconResInsert();
+					break;
+				case IDM_MATERIALTREE_INSERTMENU:
+					Project_Menu_Insert();
+					break;
+				case IDM_MATERIALTREE_INSERTWINDOW:
+					Project_Window_Insert();
+					break;
+				case IDM_MATERIALTREE_OPEN:
+					hTreeItem=TreeView_GetSelection(hMaterialTreeView);
+					for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
+						if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
+							NewRadWindow( *projectInfo.windowInfos[i] );
+							break;
+						}
+					}
+					for(i=0;i<projectInfo.NumberOfMenu;i++){
+						if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
+							NewMenuWindow(&projectInfo.pMenuInfo[i]);
+							break;
+						}
+					}
+					BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+					{
+						if( resourceItem.hTreeItem == hTreeItem )
+						{
+							NewIconEditWindow(
+								projectInfo.GetWorkDir().GetFullPath( resourceItem.filepath ).c_str()
+							);
+							break;
+						}
+					}
+					break;
+				case IDM_MATERIALTREE_DELETE:
+					hTreeItem=TreeView_GetSelection(hMaterialTreeView);
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
+						if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
+
+							//"%s カーソルをプロジェクトから削除します。よろしいですか？"
+							sprintf(str,STRING_PJ_CHECK_DELETECURSOR,projectInfo.resourceManager.cursorResources[i].idName.c_str());
+							if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+							Project_Cursor_Delete(i);
+							break;
+						}
+					}
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
+						if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
+
+							//"%s ビットマップをプロジェクトから削除します。よろしいですか？"
+							sprintf(str,STRING_PJ_CHECK_DELETEBITMAP,projectInfo.resourceManager.bitmapResources[i].idName.c_str());
+							if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+							Project_Bitmap_Delete(i);
+							break;
+						}
+					}
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
+						if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
+
+							//"%s アイコンをプロジェクトから削除します。よろしいですか？"
+							sprintf(str,STRING_PJ_CHECK_DELETEICON,projectInfo.resourceManager.iconResources[i].idName.c_str());
+							if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+							Project_Icon_Delete(i);
+							break;
+						}
+					}
+					for(i=0;i<projectInfo.NumberOfMenu;i++){
+						if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
+
+							//"%s メニューをプロジェクトから削除します。よろしいですか？"
+							sprintf(str,STRING_PJ_CHECK_DELETEMENU,projectInfo.pMenuInfo[i].IdName);
+							if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+							Project_Menu_Delete(i);
+							break;
+						}
+					}
+					for(i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
+						if(projectInfo.windowInfos[i]->hTreeItem==hTreeItem){
+
+							//"%s ウィンドウをプロジェクトから削除します。よろしいですか？"
+							sprintf(str,STRING_PJ_CHECK_DELETEWINDOW,projectInfo.windowInfos[i]->GetName().c_str());
+							if(IDCANCEL==MessageBox(hOwner,str,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) break;
+
+							Project_Window_Delete(i);
+							break;
+						}
+					}
+					break;
+				case IDM_MENUTREE_RENAMEID:
+					extern char NewIdName[MAX_PATH];
+					hTreeItem=TreeView_GetSelection(hMaterialTreeView);
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i++){
+						if(projectInfo.resourceManager.cursorResources[i].hTreeItem==hTreeItem){
+							Project_Cursor_RenameID(i);
+							break;
+						}
+					}
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i++){
+						if(projectInfo.resourceManager.bitmapResources[i].hTreeItem==hTreeItem){
+							Project_Bitmap_RenameID(i);
+							break;
+						}
+					}
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
+						if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
+							Project_Icon_RenameID(i);
+						}
+					}
+					for(i=0;i<projectInfo.NumberOfMenu;i++){
+						if(projectInfo.pMenuInfo[i].hTreeItem==hTreeItem){
+							if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_MenuID_Input,(long)projectInfo.pMenuInfo[i].IdName)) break;
+
+							//重複チェック
+							for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
+								if(i2==i) continue;
+								if(lstrcmp(NewIdName,projectInfo.pMenuInfo[i2].IdName)==0){
+									//"ID \"%s\" は既にプロジェクト内に存在します。"
+									sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
+									MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+									return 0;
+								}
+							}
+
+							HeapDefaultFree(projectInfo.pMenuInfo[i].IdName);
+							projectInfo.pMenuInfo[i].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(NewIdName)+1);
+							lstrcpy(projectInfo.pMenuInfo[i].IdName,NewIdName);
+
+							tvItem.hItem=hTreeItem;
+							tvItem.mask=TVIF_TEXT;
+							tvItem.pszText=projectInfo.pMenuInfo[i].IdName;
+							tvItem.cchTextMax=lstrlen(projectInfo.pMenuInfo[i].IdName)+1;
+							TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+							projectInfo.ModifyOfMaterial=1;
+
+							TreeView_SortChildren(hMaterialTreeView,
+								TreeView_GetParent(hMaterialTreeView,hTreeItem),
+								0);
+							break;
+						}
+					}
+					break;
+				case IDM_MATERIALTREE_ICON_SETMAIN:
+					hTreeItem=TreeView_GetSelection(hMaterialTreeView);
+					for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
+						if(projectInfo.resourceManager.iconResources[i].hTreeItem==hTreeItem){
+							if(i==0) break;
+
+							ActiveBasic::Common::ResourceItem tempItem = projectInfo.resourceManager.iconResources[i];
+							Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.iconResources, i );
+							projectInfo.resourceManager.iconResources.insert( projectInfo.resourceManager.iconResources.begin(), tempItem );
+
+							tvItem.hItem=projectInfo.resourceManager.iconResources[1].hTreeItem;
+							tvItem.mask=TVIF_TEXT;
+							lstrcpy( temporary, projectInfo.resourceManager.iconResources[1].idName.c_str() );
+							tvItem.pszText = temporary;
+							tvItem.cchTextMax=lstrlen(temporary)+1;
+							TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+							tvItem.hItem=projectInfo.resourceManager.iconResources[0].hTreeItem;
+							tvItem.mask=TVIF_TEXT;
+							sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[0].idName.c_str());
+							tvItem.pszText=temporary;
+							tvItem.cchTextMax=lstrlen(temporary)+1;
+							TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+							projectInfo.ModifuOfResource=1;
+							break;
+						}
+					}
+					break;
+			}
+			break;
+		case WM_TIMER:
+			KillTimer(hwnd,wParam);
+
+			//フォーカスをエディタにセット
+			SetFocus(GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD));
+			break;
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->code==NM_DBLCLK){
+				if(hdr->hwndFrom==hProcedureTreeView) SendMessage(hwnd,WM_COMMAND,IDM_PROCEDURETREE_SHOW,0);
+				else if(hdr->hwndFrom==hMaterialTreeView) SendMessage(hwnd,WM_COMMAND,IDM_MATERIALTREE_OPEN,0);
+			}
+			if(hdr->code==TVN_ITEMEXPANDEDW||hdr->code==TVN_ITEMEXPANDED){
+				NMTREEVIEW *nmTreeView;
+				TVITEM tvItem;
+				nmTreeView=(NMTREEVIEW *)lParam;
+				tvItem.mask=TVIF_HANDLE|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+				tvItem.hItem=nmTreeView->itemNew.hItem;
+				TreeView_GetItem(nmTreeView->hdr.hwndFrom,&tvItem);
+				if(tvItem.iImage==0||tvItem.iImage==1){
+					if(nmTreeView->action==TVE_EXPAND){
+						tvItem.iImage=1;
+						tvItem.iSelectedImage=1;
+					}
+					else if(nmTreeView->action==TVE_COLLAPSE){
+						tvItem.iImage=0;
+						tvItem.iSelectedImage=0;
+					}
+					tvItem.hItem=nmTreeView->itemNew.hItem;
+					TreeView_SetItem(nmTreeView->hdr.hwndFrom,&tvItem);
+				}
+			}
+			break;
+	}
+	return CallWindowProc(OldTabProc,hwnd,message,wParam,lParam);
+}
+void ResizeProjectView_ToolWindow(void){
+	extern HWND hProjectView_ToolWindow;
+	RECT rect;
+	GetClientRect(hProjectView_ToolWindow,&rect);
+	SendMessage(hProjectView_ToolWindow,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
+}
+LRESULT CALLBACK ProjectView_ToolWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HWND hProjectView;
+	switch(message){
+		case WM_SIZE:
+			MoveWindow(hProjectView,0,0,
+				LOWORD(lParam),
+				HIWORD(lParam),1);
+			return 0;
+		case WM_CLOSE:
+			SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+void ShowFileView(){
+	TabCtrl_SetCurSel(hProjectViewTab,0);
+	pobj_FileTree->ShowWindow( SW_SHOW );
+	ShowWindow(hProcedureTreeView,SW_HIDE);
+	ShowWindow(hMaterialTreeView,SW_HIDE);
+}
+void ShowClassView(){
+	TabCtrl_SetCurSel(hProjectViewTab,1);
+	pobj_FileTree->ShowWindow( SW_HIDE );
+	ShowWindow(hMaterialTreeView,SW_HIDE);
+	ShowWindow(hProcedureTreeView,SW_SHOW);
+}
+void ShowMaterialView(){
+	TabCtrl_SetCurSel(hProjectViewTab,2);
+	pobj_FileTree->ShowWindow( SW_HIDE );
+	ShowWindow(hProcedureTreeView,SW_HIDE);
+	ShowWindow(hMaterialTreeView,SW_SHOW);
+}
+LRESULT CALLBACK ProjectViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HINSTANCE hInst,hResInst;
+	extern HWND hTabOfProjectView;
+	extern HFONT hStatusFont;
+	extern HWND hProjectView_ToolWindow;
+	RECT rect;
+	HWND hButton;
+
+	switch(message){
+		case WM_CREATE:
+			hProjectViewTab=CreateWindow(WC_TABCONTROL,NULL,
+				WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
+				0,0,0,0,hwnd,0,hInst,0);
+			SendMessage(hProjectViewTab,WM_SETFONT,(long)hStatusFont,0);
+
+			hButton=CreateWindow("BUTTON","↓",WS_CHILD|WS_VISIBLE,
+				0,0,30,13,
+				hwnd,(HMENU)IDC_CLIP,hInst,0);
+			SendMessage(hButton,WM_SETFONT,(long)hStatusFont,0);
+
+			OldTabProc=(WNDPROC)GetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC);
+			SetWindowLongPtr(hProjectViewTab,GWLP_WNDPROC,(long)TabProc);
+
+			//タブを設定
+			TC_ITEM tcItem;
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="File";
+			TabCtrl_InsertItem(hProjectViewTab,0,&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="Class";
+			TabCtrl_InsertItem(hProjectViewTab,1,&tcItem);
+			tcItem.mask=TCIF_TEXT;
+			tcItem.pszText="Material";
+			TabCtrl_InsertItem(hProjectViewTab,2,&tcItem);
+
+			//ファイルツリービューを作成
+			pobj_FileTree = new FileListTreeViewCtrl( hProjectViewTab );
+
+			//クラスツリービューを作成
+			hProcedureTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hProjectViewTab,0,hInst,0);
+			OldProcedureTreeViewProc=(WNDPROC)GetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC);
+			SetWindowLongPtr(hProcedureTreeView,GWLP_WNDPROC,(long)ProcedureTreeViewProc);
+			//イメージリスト読み込み、設定
+			hProcedureTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,8,0);
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROCEDURE)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_PROGRAM_FOLDER)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_VARIABLE)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PUBLIC_FUNCTION)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_VARIABLE)));
+			ImageList_AddIcon(hProcedureTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MEMBER_PRIVATE_FUNCTION)));
+			TreeView_SetImageList(hProcedureTreeView,hProcedureTreeViewImageList,TVSIL_NORMAL);
+
+			//マテリアルツリービューを作成
+			hMaterialTreeView=CreateWindowEx(WS_EX_CLIENTEDGE,WC_TREEVIEW,"",
+				WS_CHILD|TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS,
+				0,0,0,0,
+				hProjectViewTab,0,hInst,0);
+			OldMaterialTreeViewProc=(WNDPROC)GetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC);
+			SetWindowLongPtr(hMaterialTreeView,GWLP_WNDPROC,(long)MaterialTreeViewProc);
+			//イメージリスト読み込み、設定
+			hMaterialTreeViewImageList=ImageList_Create(16,16,ILC_COLOR24|ILC_MASK,3,0);
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_CLOSE)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FOLDER_OPEN)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_WINDOW)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_MENU)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_ICON)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_BMP)));
+			ImageList_AddIcon(hMaterialTreeViewImageList,LoadIcon(hResInst,MAKEINTRESOURCE(IDI_FILE_CURSOR)));
+			TreeView_SetImageList(hMaterialTreeView,hMaterialTreeViewImageList,TVSIL_NORMAL);
+
+			pobj_FileTree->ShowWindow( SW_SHOW );
+			GetClientRect(hwnd,&rect);
+			SendMessage(hwnd,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
+			return 0;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_CLIP:
+					if(pobj_nv->bClipProjectView==0){
+						pobj_nv->bClipProjectView=1;
+
+						SetWindowLongPtr(hwnd,GWL_EXSTYLE,WS_EX_STATICEDGE);
+						SetParent(hwnd,hOwner);
+						ActiveBasic::IDE::Program::mainFrame.Resized();
+
+						ShowWindow(hProjectView_ToolWindow,SW_HIDE);
+					}
+					else{
+						pobj_nv->bClipProjectView=0;
+
+						SetWindowLongPtr(hwnd,GWL_EXSTYLE,0);
+
+						SetParent(hwnd,hProjectView_ToolWindow);
+
+						ActiveBasic::IDE::Program::mainFrame.Resized();
+						ResizeProjectView_ToolWindow();
+
+						ShowWindow(hProjectView_ToolWindow,SW_SHOW);
+					}
+					return 0;
+			}
+			break;
+		case WM_NOTIFY:
+			NMHDR *hdr;
+			hdr=(NMHDR *)lParam;
+			if(hdr->hwndFrom==hProjectViewTab&&hdr->code==TCN_SELCHANGE){
+				switch( TabCtrl_GetCurSel(hProjectViewTab) ){
+					case 0:
+						ShowFileView();
+						break;
+					case 1:
+						ShowClassView();
+						break;
+					case 2:
+						ShowMaterialView();
+						break;
+				}
+			}
+			return 0;
+		case WM_PAINT:
+			PAINTSTRUCT ps;
+			HDC hdc;
+			HFONT hOldFont;
+			SIZE size;
+			HBRUSH hBrush,hOldBrush;
+			HPEN hPen,hOldPen;
+			char temporary[MAX_PATH];
+
+			if(pobj_nv->bClipProjectView==0) break;
+
+			hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+
+			hdc=BeginPaint(hwnd,&ps);
+
+			hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+			if( projectInfo.IsOpened() ){
+				sprintf(temporary,"%s \'%s\'",STRING_PROJECT,projectInfo.GetName().c_str());
+			}
+			else{
+				lstrcpy( temporary, "現在のドキュメント" );
+			}
+
+			GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),&size);
+			GetClientRect(hwnd,&rect);
+			rect.left++;
+			rect.top++;
+			rect.right--;
+			rect.bottom=size.cy+2;
+
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+			Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
+			SelectObject(hdc,hOldBrush);
+			SelectObject(hdc,hPen);
+
+			rect.top++;
+			rect.bottom--;
+			SetBkMode(hdc,OPAQUE);
+			SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
+			SetTextColor(hdc,GetSysColor(COLOR_3DHILIGHT));
+			DrawText(hdc,temporary,lstrlen(temporary),&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+			EndPaint(hwnd,&ps);
+
+			DeleteObject(hBrush);
+			DeleteObject(hPen);
+			return 0;
+		case WM_SIZE:
+			if(pobj_nv->bClipProjectView){
+				MoveWindow(hProjectViewTab,
+					LEVER_THICK,
+					LEVER_THICK+11,
+					LOWORD(lParam)-LEVER_THICK*2,
+					HIWORD(lParam)-LEVER_THICK*2-21,1);
+
+				GetClientRect(hProjectViewTab,&rect);
+				TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
+				rect.left-=2;
+				rect.right++;
+				rect.bottom++;
+
+				pobj_FileTree->MoveWindow(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
+				MoveWindow(hProcedureTreeView,
+					rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+				MoveWindow(hMaterialTreeView,
+					rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+				GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
+				MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
+				InvalidateRect(GetDlgItem(hwnd,IDC_CLIP),NULL,0);
+			}
+			else{
+				MoveWindow(hProjectViewTab,0,0,
+					LOWORD(lParam),
+					HIWORD(lParam)-15,1);
+
+				GetClientRect(hProjectViewTab,&rect);
+				TabCtrl_AdjustRect(hProjectViewTab,FALSE,&rect);
+
+				pobj_FileTree->MoveWindow(rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top);
+				MoveWindow(hProcedureTreeView,
+					rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+				MoveWindow(hMaterialTreeView,
+					rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,1);
+
+				GetClientRect(GetDlgItem(hwnd,IDC_CLIP),&rect);
+				MoveWindow(GetDlgItem(hwnd,IDC_CLIP),LOWORD(lParam)-rect.right,HIWORD(lParam)-rect.bottom,rect.right,rect.bottom,1);
+			}
+			return 0;
+		case WM_CLOSE:
+			SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
+			return 0;
+		case WM_DESTROY:
+			delete pobj_FileTree;
+			ImageList_Destroy(hProcedureTreeViewImageList);
+			ImageList_Destroy(hMaterialTreeViewImageList);
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+void Project_File_Insert(char *path){
+	extern HANDLE hHeap;
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+
+	lstrcpy( path, projectInfo.GetWorkDir().GetRelationalPath( path ).c_str() );
+
+	//重複チェック
+	if( projectInfo.fileSystem.root.IsExistFile( path ) )
+	{
+		//"\"%s\" ファイルは既にプロジェクト内に存在します。"
+		sprintf(temporary,STRING_DUPLICATIONERROR_FILE_IN_PROJECT,path);
+		MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+		return;
+	}
+
+
+	//////////////////////
+	//ツリービューに追加
+	HTREEITEM hTreeItem;
+	_splitpath(path,0,0,temporary,temp2);
+	lstrcat(temporary,temp2);
+	hTreeItem=pobj_FileTree->Insert( temporary );
+
+
+	//projectInfo.ppobj_DBFileInfoオブジェクトに追加
+	projectInfo.fileSystem.root.files.push_back( ActiveBasic::PM::FM::File( path, hTreeItem ) );
+
+
+	projectInfo.modify=1;
+
+	//ファイル操作によるクラスビューの再表示
+	ResetClassTree((HTREEITEM)-1);
+}
+void Project_File_Delete(HTREEITEM hTreeItem){
+	extern HANDLE hHeap;
+
+	/*if(projectInfo.pobj_DBFileInfo->IsMainFile(hTreeItem)){
+		//"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
+		MessageBox(hOwner,STRING_ERROR_CANT_MAINFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+		return;
+	}*/
+
+	//ツリービューから削除
+	pobj_FileTree->DeleteItem( hTreeItem );
+
+	// オブジェクトから削除
+	projectInfo.fileSystem.root.Remove( hTreeItem );
+
+	projectInfo.modify=1;
+
+	//ファイル操作によるクラスビューの再表示
+	ResetClassTree((HTREEITEM)-1);
+}
+
+void MakeNewProject(){
+	extern HANDLE hHeap;
+	extern NEWPROJECTINFO NewProjectInfo;
+	int i;
+	char buffer[GENERAL_SIZE],dir[MAX_PATH],temporary[MAX_PATH],*pTemp;
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+
+	//既にプロジェクトが開かれている場合は閉じる
+	if( projectInfo.IsOpened() ){
+		if(!projectInfo.Close()) return;
+	}
+
+	//ワークディレクトリを作成
+	i=lstrlen(pobj_nv->ProjectSaveDir);
+	if(pobj_nv->ProjectSaveDir[i-1]=='\\'&&pobj_nv->ProjectSaveDir[i-2]!=':') pobj_nv->ProjectSaveDir[i-1]=0;
+	sprintf(dir,"%s\\%s\\",pobj_nv->ProjectSaveDir,NewProjectInfo.name);
+	i=0;
+	while(!(dir[i]==':'||(dir[i-1]=='\\'&&dir[i]=='\\'))) i++;
+	if(dir[i]==':') i++;
+	else{
+		i++;
+		while(dir[i]!='\\') i++;
+	}
+	for(i++;;i++){
+		if(dir[i]=='\\'){
+			lstrcpy(temporary,dir);
+			temporary[i]=0;
+			hFind=FindFirstFile(temporary,&wfd);
+			if(hFind==INVALID_HANDLE_VALUE){
+				if(!CreateDirectory(temporary,NULL)){
+					MessageBox(hOwner,"ディレクトリを作成できませんでした",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+					return;
+				}
+			}
+			else FindClose(hFind);
+		}
+		if(dir[i]=='\0') break;
+	}
+
+
+	//////////////////////////////////////
+	// プロジェクトファイル（*.pj）を作成
+	//////////////////////////////////////
+
+	// 出力先拡張子
+	const std::string outputFileExt
+		= ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ".dll"
+		: ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ".lib"
+		: ".exe";
+
+	//先頭の注釈
+	lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
+	i=lstrlen(buffer);
+
+	//プロジェクトのフォーマットバージョン
+	sprintf(buffer+i,"#VERSION=%d\r\n\r\n",PROJECT_VERSION);
+	i+=lstrlen(buffer+i);
+
+	//モジュールタイプ（EXEならば0、DLLならば1）
+	ActiveBasic::Common::TargetModuleType::EnumType moduleType
+		= ( NewProjectInfo.dwTypeID == IDC_DLL ) ? ActiveBasic::Common::TargetModuleType::Dll
+		: ( NewProjectInfo.dwTypeID == IDC_SLL ) ? ActiveBasic::Common::TargetModuleType::Sll
+		: ActiveBasic::Common::TargetModuleType::Exe;
+	lstrcpy(buffer+i,( (std::string)"#MODULETYPE=" + Jenga::Common::ToString( static_cast<int>(moduleType) ) + "\r\n\r\n" ).c_str());
+	i+=lstrlen(buffer+i);
+
+	//プロジェクト名
+	sprintf(buffer+i,"#NAME=%s\r\n\r\n",NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+
+	lstrcpy(buffer+i,"#PLATFORM=32\r\n\r\n");
+	i+=lstrlen(buffer+i);
+
+	//RADウィンドウの数
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
+		NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
+		lstrcpy(buffer+i,"#USEWINDOW=1\r\n\r\n");
+	else lstrcpy(buffer+i,"#USEWINDOW=0\r\n\r\n");
+	i+=lstrlen(buffer+i);
+
+	//プロジェクトオプション
+	sprintf(buffer+i,"#OPTION=&H%08x\r\n\r\n",NewProjectInfo.dwOption);
+	i+=lstrlen(buffer+i);
+
+	//出力先（Release）
+	sprintf(buffer+i,"#OUTPUT_RELEASE=.\\%s%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
+	i+=lstrlen(buffer+i);
+
+	//出力先（Debug）
+	sprintf(buffer+i,"#OUTPUT_DEBUG=.\\%s_debug%s\r\n\r\n",NewProjectInfo.name, outputFileExt.c_str());
+	i+=lstrlen(buffer+i);
+
+	//マニフェスト
+	sprintf(buffer+i,"#MANIFEST=%s.manifest.xml\r\n\r\n",NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+
+	//デバッグ用（コマンドライン）
+	lstrcpy(buffer+i,"#DEBUG_CMD_LINE=\r\n\r\n");
+	i+=lstrlen(buffer+i);
+
+	//デバッグ用（DLL用の実行ファイル）
+	lstrcpy(buffer+i,"#DEBUG_EXE_PATH=\r\n\r\n");
+	i+=lstrlen(buffer+i);
+
+	//リソースファイル
+	lstrcpy(buffer+i,"#RESOURCE=0\r\n\r\n");
+	i+=lstrlen(buffer+i);
+
+	//ソースファイル
+	sprintf(buffer+i,"#SOURCE\r\n%s.ab\r\n",NewProjectInfo.name);
+	i+=lstrlen(buffer+i);
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
+		NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		lstrcpy(buffer+i,"MainWnd.ab\r\n");
+		i+=lstrlen(buffer+i);
+	}
+	if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		lstrcpy(buffer+i,"dx_graphics.sbp\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_input.sbp\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"dx_music.sbp\r\n");
+		i+=lstrlen(buffer+i);
+	}
+
+	//保存
+	sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind!=INVALID_HANDLE_VALUE){
+		FindClose(hFind);
+
+		//"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか？"
+		if(MessageBox(hOwner,STRING_ERROR_PROJECT_OVERWRITE,APPLICATION_NAME,MB_YESNO|MB_ICONEXCLAMATION)==IDNO) return;
+	}
+	if(!WriteBuffer(temporary,buffer,i)) return;
+
+
+	///////////////////////////////////////////
+	//メインプログラムファイル（*.ab）を作成
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+		sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
+		i=lstrlen(buffer);
+		lstrcpy(buffer+i,"'---------------------------\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'  Window Message Loop\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'---------------------------\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"Dim msgMain As MSG, iResult As Long\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"Do\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tiResult=GetMessage(msgMain,0,0,0)\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tTranslateMessage(msgMain)\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tDispatchMessage(msgMain)\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"Loop\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"' Call destructores and exit process\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"End\r\n");
+		i+=lstrlen(buffer+i);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_PROMPTBASE){
+		sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
+		i=lstrlen(buffer);
+		lstrcpy(buffer+i,"#N88BASIC\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		if(NewProjectInfo.ShowHelloWorld){
+			lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
+			i+=lstrlen(buffer+i);
+		}
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DOSPROMPTBASE){
+		sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
+		i=lstrlen(buffer);
+		lstrcpy(buffer+i,"#console\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
+		i+=lstrlen(buffer+i);
+		if(NewProjectInfo.ShowHelloWorld){
+			lstrcpy(buffer+i,"Print \"Hello World!\"\r\n");
+			i+=lstrlen(buffer+i);
+		}
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_NOBASE){
+		sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
+		i=lstrlen(buffer);
+		lstrcpy(buffer+i,"' ↓ ここからプログラムが実行されます\r\n\r\n");
+		i+=lstrlen(buffer+i);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		const std::string mainExeDirectXAbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\main_exe_directx.abp";
+		pTemp = ReadBuffer( mainExeDirectXAbpPath );
+
+		//#name#をプロジェクト名に置換
+		pTemp=PermutationWndPgmTemplate(pTemp,NewProjectInfo.name,0,0,0);
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_DLL){
+		sprintf(buffer,"#include \"%s.idx\"\r\n\r\n",NewProjectInfo.name);
+		i=lstrlen(buffer);
+		lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"' メモ - このファイルには、DLLの構成要素を記述します。\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'        （例：関数定義、グローバル変数、定数定義など）\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'        エクスポートが必要な関数には、\"Export\" 修飾子を指定します。\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'        （例：Function Export FuncName() As Long）\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"'-------------------------------------------------------------------\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"Function Export DllMain(hinstDLL As HINSTANCE, fdwReason As DWord, lpvReserved As VoidPtr) As Long\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t'DLLエントリポイント\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tSelect Case fdwReason\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_ATTACH\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\t\t'DLLがプロセス空間にロードされた時に実行されます。\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\t\t_System_StartupProgram()\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\t\tDllMain=1\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\tCase DLL_PROCESS_DETACH\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\t\t\t_System_Call_Destructor_of_GlobalObject()\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\tEnd Select\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"End Function\r\n");
+		i+=lstrlen(buffer+i);
+		lstrcpy(buffer+i,"\r\n");
+		i+=lstrlen(buffer+i);
+	}
+	else if( NewProjectInfo.dwTypeID == IDC_SLL )
+	{
+		buffer[0] = 0;
+	}
+
+	//保存
+	if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
+		WriteBuffer(temporary,pTemp,lstrlen(pTemp));
+
+		HeapDefaultFree(pTemp);
+	}
+	else{
+		sprintf(temporary,"%s%s.ab",dir,NewProjectInfo.name);
+		if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
+	}
+
+
+	/////////////////////
+	// MainWnd.abを作成
+	/////////////////////
+
+	std::string mainWndSbpPath = "";
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
+	{
+		mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_windowbase.sbp";
+	}
+	else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
+	{
+		mainWndSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\MainWnd_exe_directx.sbp";
+	}
+
+	if( !mainWndSbpPath.empty() ){
+		pTemp = ReadBuffer( mainWndSbpPath );
+
+		//#name#をプロジェクト名に置換
+		pTemp=PermutationWndPgmTemplate(pTemp,
+			NewProjectInfo.name,
+			"MainWnd",
+			"hMainWnd",
+			"MainWndProc");
+
+		if(NewProjectInfo.ShowHelloWorld){
+			//Hello World!表示
+			i=0;
+			lstrcpy(buffer+i,"\r\nSub MainWnd_Paint(hDC As HDC)\r\n");
+			i+=lstrlen(buffer+i);
+			lstrcpy(buffer+i,"\tDim rect As RECT\r\n");
+			i+=lstrlen(buffer+i);
+			lstrcpy(buffer+i,"\tGetClientRect(hMainWnd,rect)\r\n");
+			i+=lstrlen(buffer+i);
+			lstrcpy(buffer+i,"\tDrawText(hDC,\"Hello World!\",-1,rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE)\r\n");
+			i+=lstrlen(buffer+i);
+			lstrcpy(buffer+i,"End Sub\r\n");
+			i+=lstrlen(buffer+i);
+
+			pTemp=(char *)HeapReAlloc(hHeap,0,pTemp,lstrlen(pTemp)+lstrlen(buffer)+1);
+			lstrcat(pTemp,buffer);
+		}
+
+		sprintf(temporary,"%sMainWnd.ab",dir,NewProjectInfo.name);
+		WriteBuffer(temporary,pTemp,lstrlen(pTemp));
+
+		HeapDefaultFree(pTemp);
+	}
+
+
+	if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		///////////////////////////
+		// DirextX対応アプリのとき
+		///////////////////////////
+
+		//dx_graphics.sbpをコピー
+		const std::string dxGraphicsSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_graphics.sbp";
+		pTemp = ReadBuffer( dxGraphicsSbpPath );
+		sprintf(temporary,"%sdx_graphics.sbp",dir,NewProjectInfo.name);
+		WriteBuffer(temporary,pTemp,lstrlen(pTemp));
+		HeapDefaultFree(pTemp);
+
+		//dx_input.sbpをコピー
+		const std::string dxInputSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_input.sbp";
+		pTemp = ReadBuffer( dxInputSbpPath );
+		sprintf(temporary,"%sdx_input.sbp",dir,NewProjectInfo.name);
+		WriteBuffer(temporary,pTemp,lstrlen(pTemp));
+		HeapDefaultFree(pTemp);
+
+		//dx_music.sbpをコピー
+		const std::string dxMusicSbpPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dx\\dx_music.sbp";
+		pTemp = ReadBuffer( dxMusicSbpPath );
+		sprintf(temporary,"%sdx_music.sbp",dir,NewProjectInfo.name);
+		WriteBuffer(temporary,pTemp,lstrlen(pTemp));
+		HeapDefaultFree(pTemp);
+
+		//dx9abm.dllをコピー
+		sprintf(temporary,"%sRuntime\\dx9abm.dll",pj_editor_Dir);
+		sprintf(buffer,"%sdx9abm.dll",dir,NewProjectInfo.name);
+		CopyFile(temporary,buffer,0);
+	}
+
+
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE||
+		NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX){
+		/////////////////////////////////////////
+		// ウィンドウ定義ファイル（*.wnd）を作成
+		/////////////////////////////////////////
+		ActiveBasic::PM::WindowInfos windowInfos;
+		windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
+		windowInfos.back()->SetName( "MainWnd" );
+		windowInfos.back()->pos.x=CW_USEDEFAULT;
+		windowInfos.back()->pos.y=CW_USEDEFAULT;
+		windowInfos.back()->size.cx=480;
+		windowInfos.back()->size.cy=360;
+		windowInfos.back()->SetCaption( NewProjectInfo.name );
+		if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE)
+		{
+			windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE );
+		}
+		else if(NewProjectInfo.dwTypeID==IDC_EXE_DIRECTX)
+		{
+			windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_THICKFRAME|WS_SYSMENU );
+		}
+		windowInfos.back()->SetExStyle( 0 );
+		windowInfos.back()->SetMenuIdName( "" );
+		windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
+		GetDefaultWindowFont(&windowInfos.back()->LogFont);
+		windowInfos.back()->SetIconResourceName( "" );
+		windowInfos.back()->SetClassName( "NORMAL" );
+		windowInfos.back()->SetType( ActiveBasic::PM::WindowType::Default );
+		sprintf(temporary,"%s%s.wnd",dir,NewProjectInfo.name);
+
+		projectInfo.NumberOfMenu=0;
+		SaveWindowFile( temporary, windowInfos );
+
+		windowInfos.Clear();
+	}
+
+
+	////////////////////////
+	// ワークファイルを作成
+	////////////////////////
+	lstrcpy(buffer,"case4\r\n\r\n");
+	if(NewProjectInfo.dwTypeID==IDC_EXE_WINDOWBASE){
+		lstrcat(buffer,"rad,MainWnd\r\n\r\n");
+	}
+	else{
+		sprintf(buffer+lstrlen(buffer),"text,\"%s.ab\",0,0,0,0\r\n\r\n",NewProjectInfo.name);
+	}
+	lstrcat(buffer,"0\r\n0\r\n0\r\n0,0");
+	//保存
+	sprintf(temporary,"%s%s.wrk",dir,NewProjectInfo.name);
+	if(!WriteBuffer(temporary,buffer,lstrlen(buffer))) return;
+
+
+	//マニフェストを作成
+	char temp2[MAX_PATH];
+	const std::string manifestTempXmlPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\manifest_temp.xml";
+	sprintf(temp2,"%s%s.manifest.xml",dir,NewProjectInfo.name);
+	CopyFile( manifestTempXmlPath.c_str(), temp2, 0 );
+
+
+	sprintf(temporary,"%s%s.pj",dir,NewProjectInfo.name);
+	projectInfo.Load(temporary);
+	projectInfo.Save();
+}
+void SetTreeViewForProjectInfo(){
+	extern HANDLE hHeap;
+	extern HWND hProjectView;
+	int i;
+	char temporary[MAX_PATH];
+	TV_INSERTSTRUCT tv;
+
+	sprintf(temporary,"%s ",projectInfo.GetName().c_str());
+	lstrcat(temporary,STRING_PROJECT);
+	SetWindowText(hProjectView,temporary);
+
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+
+	//ファイル ツリー
+	pobj_FileTree->Reset( projectInfo.fileSystem );
+
+	//関数ツリー
+	ResetClassTree((HTREEITEM)-1);
+
+	/////////////////////
+	// マテリアル ツリー
+
+	//Cursorリソース フォルダ
+	sprintf(temporary,"Cursor %s",STRING_RESOURCE);
+	tv.hParent=TVI_ROOT;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText=temporary;
+	tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
+	hCursorTreeItemForProjectView = tv.hParent;
+	BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
+	{
+		tv.item.iImage=6;
+		tv.item.iSelectedImage=6;
+		lstrcpy( temporary, resourceItem.idName.c_str() );
+		tv.item.pszText=temporary;
+		resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
+	}
+
+	//Bitmapリソース フォルダ
+	sprintf(temporary,"Bitmap %s",STRING_RESOURCE);
+	tv.hParent=TVI_ROOT;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText=temporary;
+	tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
+	hBitmapTreeItemForProjectView = tv.hParent;
+	BOOST_FOREACH( ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+	{
+		tv.item.iImage=5;
+		tv.item.iSelectedImage=5;
+		lstrcpy( temporary, resourceItem.idName.c_str() );
+		tv.item.pszText=temporary;
+		resourceItem.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
+	}
+
+	//Iconリソース フォルダ
+	sprintf(temporary,"Icon %s",STRING_RESOURCE);
+	tv.hParent=TVI_ROOT;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText=temporary;
+	tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
+	hIconTreeItemForProjectView = tv.hParent;
+	for(i=0;i<static_cast<int>(projectInfo.resourceManager.iconResources.size());i++){
+		tv.item.iImage=4;
+		tv.item.iSelectedImage=4;
+		if(i==0){
+			sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[i].idName.c_str());
+		}
+		else
+		{
+			sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[i].idName.c_str());
+		}
+		tv.item.pszText=temporary;
+		projectInfo.resourceManager.iconResources[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
+	}
+
+	//Menuフォルダ
+	tv.hParent=TVI_ROOT;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText="Menu";
+	tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
+	projectInfo.hMenuTreeItem=tv.hParent;
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		tv.item.iImage=3;
+		tv.item.iSelectedImage=3;
+		tv.item.pszText=projectInfo.pMenuInfo[i].IdName;
+		projectInfo.pMenuInfo[i].hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
+	}
+
+	//Windowフォルダ
+	tv.hParent=TVI_ROOT;
+	tv.item.iImage=0;
+	tv.item.iSelectedImage=0;
+	tv.item.pszText="Window";
+	tv.hParent=TreeView_InsertItem(hMaterialTreeView,&tv);
+	projectInfo.hWindowTreeItem=tv.hParent;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		tv.item.iImage=2;
+		tv.item.iSelectedImage=2;
+		char temporary[1024];
+		lstrcpy( temporary, pWindowInfo->GetName().c_str() );
+		tv.item.pszText = temporary;
+		pWindowInfo->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
+	}
+}
+void OpenWorkfile( const std::string &path )
+{
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
+
+	//プロジェクト ビューを設定、表示
+	extern HWND hProjectView;
+	SetTreeViewForProjectInfo();
+	if(!IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
+
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+
+
+	//////////////////////////////////////////
+	//ワークファイル（*.wrk）をオープン
+	HTREEITEM hTreeItem;
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	HWND hChild;
+	int WndNum;
+	hFind=FindFirstFile(path.c_str(),&wfd);
+	if(hFind!=INVALID_HANDLE_VALUE){
+		FindClose(hFind);
+		buffer=ReadBuffer(path);
+		if(!buffer) return;
+
+		//解析、反映
+		memcpy(temporary,buffer,5);
+		temporary[5]=0;
+		if(lstrcmp(temporary,"case4")==0){
+
+			LockWindowUpdate(hOwner);
+			for(i=9,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					if(i2!=0){
+						temporary[i2]=0;
+						for(i3=0;;i3++){
+							if(temporary[i3]==','||temporary[i3]=='\0') break;
+						}
+						if(temporary[i3]=='\0') goto EndToSetWorkFile;
+						lstrcpy(temp2,temporary+i3+1);
+						temporary[i3]=0;
+						if(lstrcmpi(temporary,"text")==0){
+							if(temp2[0]!='\"') goto EndToSetWorkFile;
+
+							//ファイルを開く
+							i2=1;
+							for(i3=0;;i2++,i3++){
+								if(temp2[i2]=='\"'||temp2[i2]=='\0'){
+									temporary[i3]=0;
+									break;
+								}
+								temporary[i3]=temp2[i2];
+							}
+							lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+							hChild=OpenFileWithExtension(temporary);
+							WndNum=GetWndNum(hChild);
+							if(WndNum==-1){
+								goto EndToSetWorkFile;
+							}
+
+							//ResetScrollbarが再描画時に呼び出されるので、再描画する
+							InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
+							UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+
+							if(temp2[i2]=='\0') goto EndToSetWorkFile;
+							if(temp2[i2+1]!=',') goto EndToSetWorkFile;
+
+							//以前のスクロール位置を復元
+							SCROLLINFO si;
+							POINT pos;
+							for(i2+=2,i3=0;;i2++,i3++){
+								if(temp2[i2]==','||temp2[i2]=='\0'){
+									temporary[i3]=0;
+									break;
+								}
+								temporary[i3]=temp2[i2];
+							}
+							sscanf(temporary,"%d",&pos.x);
+							if(temp2[i2]=='\0') goto EndToSetWorkFile;
+							for(i2++,i3=0;;i2++,i3++){
+								if(temp2[i2]==','||temp2[i2]=='\0'){
+									temporary[i3]=0;
+									break;
+								}
+								temporary[i3]=temp2[i2];
+							}
+							sscanf(temporary,"%d",&pos.y);
+							si.cbSize=sizeof(SCROLLINFO);
+							si.fMask=SIF_POS;
+							si.nPos=pos.x;
+							SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si,1);
+							si.nPos=pos.y;
+							SetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si,1);
+
+							if(temp2[i2]=='\0') goto EndToSetWorkFile;
+
+							//キャレット位置をセット
+							for(i2++,i3=0;;i2++,i3++){
+								if(temp2[i2]==','||temp2[i2]=='\0'){
+									temporary[i3]=0;
+									break;
+								}
+								temporary[i3]=temp2[i2];
+							}
+							sscanf(temporary,"%d",&pos.x);
+							if(temp2[i2]=='\0') goto EndToSetWorkFile;
+							for(i2++,i3=0;;i2++,i3++){
+								if(temp2[i2]==','||temp2[i2]=='\0'){
+									temporary[i3]=0;
+									break;
+								}
+								temporary[i3]=temp2[i2];
+							}
+							sscanf(temporary,"%d",&pos.y);
+							TextEdit_SetSel(WndNum,pos.x,pos.y);
+						}
+						else if(lstrcmpi(temporary,"rad")==0){
+							for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
+								if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
+									NewRadWindow( *projectInfo.windowInfos[i3] );
+									break;
+								}
+							}
+						}
+						else if(lstrcmpi(temporary,"menu")==0){
+							for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
+								if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
+									NewMenuWindow(&projectInfo.pMenuInfo[i3]);
+									break;
+								}
+							}
+						}
+						else if(lstrcmpi(temporary,"icon")==0)
+						{
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+							{
+								if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
+									NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
+									break;
+								}
+							}
+						}
+						i++;
+						i2=-1;
+						continue;
+					}
+					else break;
+				}
+				temporary[i2]=buffer[i];
+			}
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			sscanf(temporary,"%d",&i2);
+
+			switch( i2 ){
+				case 0:
+					ShowFileView();
+					break;
+				case 1:
+					ShowClassView();
+					break;
+				case 2:
+					ShowMaterialView();
+					break;
+			}
+
+			if(buffer[i]=='\0') goto EndToSetWorkFile;
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(temporary[0]=='1')
+			{
+				pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
+			}
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			hTreeItem=TreeView_GetRoot(hMaterialTreeView);
+			i2=0;
+			while(hTreeItem){
+				i2=GetOneParameter(temporary,i2,temp2);
+				if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
+				hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
+			}
+		}
+		else if(lstrcmp(temporary,"case3")==0){
+			////////////////////////////////////////
+			// 古いフォーマットのワークファイル
+
+			LockWindowUpdate(hOwner);
+			for(i=9,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					if(i2!=0){
+						temporary[i2]=0;
+						for(i3=0;;i3++){
+							if(temporary[i3]==','||temporary[i3]=='\0') break;
+						}
+						if(temporary[i3]=='\0') goto EndToSetWorkFile;
+						lstrcpy(temp2,temporary+i3+1);
+						temporary[i3]=0;
+						if(lstrcmpi(temporary,"text")==0){
+							for(i3=0;;i3++){
+								if(temp2[i3]==','||temp2[i3]=='\0') break;
+							}
+							if(temp2[i3]=='\0') goto EndToSetWorkFile;
+							lstrcpy(temporary,temp2+i3+1);
+							temp2[i3]=0;
+							lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+							sscanf(temp2,"%d",&i3);
+
+							//ファイルを開く
+							hChild=OpenFileWithExtension(temporary);
+							WndNum=GetWndNum(hChild);
+
+							//キャレット位置をセット
+							TextEdit_SetSel(WndNum,i3,i3);
+						}
+						else if(lstrcmpi(temporary,"rad")==0){
+							for(i3=0;i3<static_cast<int>(projectInfo.windowInfos.size());i3++){
+								if(lstrcmpi(projectInfo.windowInfos[i3]->GetName().c_str(),temp2)==0){
+									NewRadWindow( *projectInfo.windowInfos[i3] );
+									break;
+								}
+							}
+						}
+						else if(lstrcmpi(temporary,"menu")==0){
+							for(i3=0;i3<projectInfo.NumberOfMenu;i3++){
+								if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,temp2)==0){
+									NewMenuWindow(&projectInfo.pMenuInfo[i3]);
+									break;
+								}
+							}
+						}
+						else if(lstrcmpi(temporary,"icon")==0){
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+							{
+								if(lstrcmpi(resourceItem.filepath.c_str(),temp2)==0){
+									NewIconEditWindow( projectInfo.GetWorkDir().GetFullPath( temp2 ).c_str() );
+									break;
+								}
+							}
+						}
+						i++;
+						i2=-1;
+						continue;
+					}
+					else break;
+				}
+				temporary[i2]=buffer[i];
+			}
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			sscanf(temporary,"%d",&i2);
+
+			switch( i2 ){
+				case 0:
+					ShowFileView();
+					break;
+				case 1:
+					ShowClassView();
+					break;
+				case 2:
+					ShowMaterialView();
+					break;
+			}
+
+			if(buffer[i]=='\0') goto EndToSetWorkFile;
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(temporary[0]=='1')
+			{
+				pobj_FileTree->Expand( pobj_FileTree->GetRootItem(), TVE_EXPAND );
+			}
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(temporary[0]=='1') TreeView_Expand(hProcedureTreeView,TreeView_GetRoot(hProcedureTreeView),TVE_EXPAND);
+
+			for(i+=2,i2=0;;i++,i2++){
+				if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			hTreeItem=TreeView_GetRoot(hMaterialTreeView);
+			i2=0;
+			while(hTreeItem){
+				i2=GetOneParameter(temporary,i2,temp2);
+				if(GetValue(temp2)) TreeView_Expand(hMaterialTreeView,hTreeItem,TVE_EXPAND);
+				hTreeItem=TreeView_GetNextSibling(hMaterialTreeView,hTreeItem);
+			}
+		}
+EndToSetWorkFile:
+		LockWindowUpdate(NULL);
+		HeapDefaultFree(buffer);
+	}
+
+
+	//ウィンドウ タイトルを変更
+	sprintf(temporary,"%s - %s",projectInfo.GetName().c_str(),APPLICATION_NAME);
+	SetWindowText(hOwner,temporary);
+}
+BOOL ProjectModifyCheck(BOOL bRun){
+	int i,WndNum,sw;
+	HWND hChild;
+	char temporary[MAX_PATH];
+	if(projectInfo.modify||projectInfo.ModifyOfMaterial||projectInfo.ModifuOfResource){
+		if(bRun==0||pobj_nv->bSaveCheckProject){
+			//"\"%s\" プロジェクトは変更されています。保存しますか？"
+			sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
+			i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
+
+			if(i==IDCANCEL) return 0;
+			if(i==IDYES)
+			{
+				projectInfo.Save();
+			}
+		}
+		else
+		{
+			projectInfo.Save();
+		}
+		return 1;
+	}
+	hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		WndNum=GetWndNum(hChild);
+		sw=0;
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
+				sw = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path );
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+			if(MdiInfo[WndNum]->MdiIconEditInfo->bModify){
+				BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+				{
+					lstrcpy(temporary,resourceItem.filepath.c_str());
+					lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+					if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0) sw=1;
+				}
+			}
+		}
+
+		if(sw){
+			if(bRun==0||pobj_nv->bSaveCheckProject){
+				//"\"%s\" プロジェクトは変更されています。保存しますか？"
+				sprintf(temporary,STRING_MODIFYCHECK_PROJECT,projectInfo.GetName().c_str());
+				i=MessageBox(hOwner,temporary,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONEXCLAMATION);
+
+				if(i==IDCANCEL) return 0;
+				if(i==IDYES)
+				{
+					projectInfo.Save();
+				}
+			}
+			else
+			{
+				projectInfo.Save();
+			}
+			return 1;
+		}
+		hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+	return 2;
+}
+
+void MakeTextMdiWindowBuffer( ActiveBasic::PM::FM::Folder &folder, int WndNum, char *buffer )
+{
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		MakeTextMdiWindowBuffer( childFolder, WndNum, buffer );
+	}
+
+	BOOST_FOREACH( ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),file.GetFullPath().c_str())==0){
+			CHARRANGE CharRange;
+			TextEdit_GetSel(WndNum,&CharRange);
+
+			SCROLLINFO si;
+			POINT pos;
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS;
+			GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_HORZ,&si);
+			pos.x=si.nPos;
+			GetScrollInfo(MdiInfo[WndNum]->pMdiTextEdit->hEdit,SB_VERT,&si);
+			pos.y=si.nPos;
+
+			char temporary[1024];
+			sprintf(temporary,"text,\"%s\",%d,%d,%d,%d\r\n",
+				file.GetRelationalPath().c_str(),
+				pos.x,
+				pos.y,
+				CharRange.cpMin,
+				CharRange.cpMax);
+
+			lstrcat( buffer, temporary );
+			break;
+		}
+	}
+}
+
+void MakeWorkFile(void){
+	int i,i2,WndNum;
+	char temporary[MAX_PATH],buffer[32767];
+	HWND hChild;
+
+	//ワークファイル（*.wrk）を作成
+	lstrcpy(buffer,"case4\r\n\r\n");
+	i2=lstrlen(buffer);
+
+
+	///////////////////////
+	//MDIウィンドウの並び
+	hChild=GetWindow(GetWindow(hClient,GW_CHILD),GW_HWNDLAST);
+	while(hChild){
+		WndNum=GetWndNum(hChild);
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			MakeTextMdiWindowBuffer( projectInfo.fileSystem.root, WndNum, buffer );
+			i2 = lstrlen( buffer );
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+			BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+			{
+				if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),pWindowInfo->GetName().c_str())==0){
+					sprintf(buffer+i2,"rad,%s\r\n",MdiInfo[WndNum]->path.c_str());
+					i2+=lstrlen(buffer+i2);
+					break;
+				}
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+			for(i=0;i<projectInfo.NumberOfMenu;i++){
+				if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.pMenuInfo[i].IdName)==0){
+					sprintf(buffer+i2,"menu,%s\r\n",MdiInfo[WndNum]->path.c_str());
+					i2+=lstrlen(buffer+i2);
+					break;
+				}
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+			BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+			{
+				lstrcpy(temporary,resourceItem.filepath.c_str());
+				lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+				if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
+					sprintf(buffer+i2,"icon,%s\r\n",resourceItem.filepath.c_str());
+					i2+=lstrlen(buffer+i2);
+					break;
+				}
+			}
+		}
+		hChild=GetNextWindow(hChild,GW_HWNDPREV);
+	}
+	lstrcpy(buffer+i2,"\r\n");
+	i2+=2;
+
+
+	//////////////////////////
+	//ツリービューの展開状況
+	sprintf(buffer+i2,"%d\r\n",TabCtrl_GetCurSel(hProjectViewTab));
+	i2+=lstrlen(buffer+i2);
+	TVITEM tvItem;
+	memset(&tvItem,0,sizeof(TVITEM));
+	tvItem.mask=TVIF_HANDLE|TVIF_STATE;
+	tvItem.hItem = pobj_FileTree->GetRootItem();
+	pobj_FileTree->GetItem( &tvItem );
+	if(tvItem.state&TVIS_EXPANDED) i=1;
+	else i=0;
+	sprintf(buffer+i2,"%d\r\n",i);
+	i2+=lstrlen(buffer+i2);
+
+	tvItem.hItem=TreeView_GetRoot(hProcedureTreeView);
+	TreeView_GetItem(hProcedureTreeView,&tvItem);
+	if(tvItem.state&TVIS_EXPANDED) i=1;
+	else i=0;
+	sprintf(buffer+i2,"%d\r\n",i);
+	i2+=lstrlen(buffer+i2);
+
+	tvItem.hItem=TreeView_GetRoot(hMaterialTreeView);
+	while(tvItem.hItem){
+		TreeView_GetItem(hMaterialTreeView,&tvItem);
+		if(tvItem.state&TVIS_EXPANDED) i=1;
+		else i=0;
+		sprintf(buffer+i2,"%d",i);
+		i2+=lstrlen(buffer+i2);
+
+		tvItem.hItem=TreeView_GetNextSibling(hMaterialTreeView,tvItem.hItem);
+		if(tvItem.hItem){
+			lstrcpy(buffer+i2,",");
+			i2+=lstrlen(buffer+i2);
+		}
+	}
+
+
+	//保存
+	sprintf(temporary,"%s%s.wrk",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
+	WriteBuffer(temporary,buffer,i2);
+}
+
+BOOL SetProjectToRun(void){
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+
+	if( projectInfo.fileSystem.root.IsEmpty() )
+	{
+		//"プログラム ファイルがプロジェクトに存在しません。"
+		MessageBox(hOwner,STRING_ERROR_NOFILE,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+		return 0;
+	}
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	hFind=FindFirstFile( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(), &wfd );
+	if(hFind==INVALID_HANDLE_VALUE){
+		//"BasicCompiler.exe が見つかりません"
+		MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+		return 0;
+	}
+	FindClose(hFind);
+
+	//プロジェクト構造のバージョンが違う時は、再保存する
+	if(projectInfo.dwVersion<PROJECT_VERSION)
+		projectInfo.ModifyOfMaterial=1;
+
+	//保存確認
+	if(!ProjectModifyCheck(1)) return 0;
+
+	return 1;
+}
+bool IsNeedCompileForProject( const ActiveBasic::PM::FM::Folder &folder, const FILETIME &exeTime )
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		if( IsNeedCompileForProject( childFolder, exeTime ) )
+		{
+			return true;
+		}
+	}
+
+	BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		FILETIME sourceTime;
+		{
+			ATL::CHandle hFile(CreateFile(file.GetFullPath().c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+			GetFileTime(hFile,NULL,NULL,&sourceTime);
+		}
+
+		if(sourceTime.dwHighDateTime>exeTime.dwHighDateTime||
+			sourceTime.dwHighDateTime==exeTime.dwHighDateTime&&
+			sourceTime.dwLowDateTime>exeTime.dwLowDateTime) return true;
+	}
+
+	return false;
+}
+
+BOOL IsNeedCompileForProject(BOOL bDebug){
+	char temporary[MAX_PATH];
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	FILETIME SourceTime,ExeTime;
+
+	if(bDebug) lstrcpy(temporary,projectInfo.lpszOutput_Debug);
+	else lstrcpy(temporary,projectInfo.lpszOutput_Release);
+	lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind==INVALID_HANDLE_VALUE) return 1;
+	FindClose(hFind);
+
+	{
+		ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		GetFileTime(hFile,NULL,NULL,&ExeTime);
+	}
+
+	if( IsNeedCompileForProject( projectInfo.fileSystem.root, ExeTime ) )
+	{
+		return 1;
+	}
+	if( !projectInfo.windowInfos.empty() )
+	{
+		//CallBack.wbp
+		lstrcpy(temporary,"CallBack.wbp");
+		lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+		{
+			ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+			GetFileTime(hFile,NULL,NULL,&SourceTime);
+		}
+		if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
+			SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
+			SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
+
+		//MakeWindow.wbp
+		lstrcpy(temporary,"MakeWindow.wbp");
+		lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+		{
+			ATL::CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+			GetFileTime(hFile,NULL,NULL,&SourceTime);
+		}
+		if(SourceTime.dwHighDateTime>ExeTime.dwHighDateTime||
+			SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
+			SourceTime.dwLowDateTime>ExeTime.dwLowDateTime) return 1;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/RadProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/RadProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/RadProc.cpp	(revision 774)
@@ -0,0 +1,2023 @@
+#include "stdafx.h"
+
+
+#include "common.h"
+
+void NewRadWindow( const ActiveBasic::PM::WindowInfo &windowInfo )
+{
+	extern HINSTANCE hInst,hResInst;
+	extern HWND hDocCombo;
+	int i,i2;
+	HWND hChild;
+	RECT rect;
+	MDICREATESTRUCT mdic;
+
+	//すでに指定されたファイルが開かれている場合
+	hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		i=GetWndNum(hChild);
+		if(MdiInfo[i]->DocType==WNDTYPE_RAD){
+			if(lstrcmpi(MdiInfo[i]->path.c_str(),windowInfo.GetName().c_str())==0) break;
+		}
+		hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+	if(hChild){
+		BringWindowToTop(hChild);
+		return;
+	}
+
+	mdic.szTitle=windowInfo.GetName().c_str();
+	mdic.szClass="MDIClientWindow_Rad";
+	mdic.hOwner=hInst;
+	mdic.x=CW_USEDEFAULT;
+	mdic.y=CW_USEDEFAULT;
+	mdic.cx=CW_USEDEFAULT;
+	mdic.cy=CW_USEDEFAULT;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(IsWindow(hChild)){
+		if(IsZoomed(hChild)) mdic.style=WS_MAXIMIZE|WS_CLIPCHILDREN;
+		else mdic.style=0;
+	}
+	else{
+		if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE|WS_CLIPCHILDREN;
+		else mdic.style=0;
+	}
+
+	mdic.lParam=0;
+	mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
+	hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mdic);	//ウィンドウ作成
+
+
+	//////////////////////
+	// 子ウィンドウを作成
+	//////////////////////
+
+	//ツールウィンドウを作成
+	HWND hTools;
+	hTools=CreateWindow("RadToolsWindow",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE|WS_CLIPCHILDREN,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+	//プロパティウィンドウを作成
+	HWND hProperty;
+	hProperty=CreateWindowEx(WS_EX_CLIENTEDGE,"RadPropertyWindow",NULL,
+		WS_CHILD|WS_VSCROLL|WS_VISIBLE|WS_CLIPCHILDREN,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+	//内部RADウィンドウを作成
+	HWND hRad;
+	hRad=CreateWindowEx(WS_EX_CLIENTEDGE,"RadWindow",NULL,
+		WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE|WS_CLIPCHILDREN,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+	//サポートウィンドウを作成
+	HWND hSupport;
+	hSupport=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_SUPPORT),hChild,(DLGPROC)DlgRadSupport);
+
+	//ウィンドウのID登録
+	HDC hdc;
+	MdiInfo.push_back( new MDIINFO() );
+	i = MdiInfo.size()-1;
+
+	MdiInfo[i]->hwnd=hChild;
+	MdiInfo[i]->DocType=WNDTYPE_RAD;
+	MdiInfo[i]->title = windowInfo.GetName();
+	MdiInfo[i]->path = windowInfo.GetName();
+
+
+	////////////////////////////
+	// MDIRADINFO構造体をセット
+	////////////////////////////
+
+	MdiInfo[i]->MdiRadInfo=(MDIRADINFO *)GlobalAlloc(GPTR,sizeof(MDIRADINFO));
+
+	MdiInfo[i]->MdiRadInfo->hTools=hTools;
+	MdiInfo[i]->MdiRadInfo->hProperty=hProperty;
+	MdiInfo[i]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_WINDOW),hProperty,(DLGPROC)RadProperty_WindowProc);
+
+	SCROLLINFO ScrollInfo;
+	ScrollInfo.cbSize=sizeof(SCROLLINFO);
+	ScrollInfo.fMask=SIF_POS;
+	ScrollInfo.nPos=0;
+	SetScrollInfo(MdiInfo[i]->MdiRadInfo->hProperty,SB_VERT,&ScrollInfo,1);
+
+	MdiInfo[i]->MdiRadInfo->hRad=hRad;
+
+	MdiInfo[i]->MdiRadInfo->hSupport=hSupport;
+
+	hdc=GetDC(hRad);
+	MdiInfo[i]->MdiRadInfo->hBitmap=CreateCompatibleBitmap(hdc,ScreenX*2,ScreenY*2);
+	MdiInfo[i]->MdiRadInfo->hMemDC=CreateCompatibleDC(hdc);
+	MdiInfo[i]->MdiRadInfo->hOldBitmap=
+		(HBITMAP)SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,MdiInfo[i]->MdiRadInfo->hBitmap);
+	ReleaseDC(hRad,hdc);
+
+	for(i2=0;i2<MAX_RAD_SELITEM;i2++) MdiInfo[i]->MdiRadInfo->SelectingItem[i2]=-1;
+	MdiInfo[i]->MdiRadInfo->ButtonSelect=IDC_TOOL_MOUSE;
+
+	//変更情報を初期化
+	MdiInfo[i]->MdiRadInfo->undo.NowPos=0;
+	memset(MdiInfo[i]->MdiRadInfo->undo.Command,0,sizeof(int)*MAX_UNDONUM);
+
+	DrawRadWindow(i,&windowInfo);
+
+	//サポートダイアログの内容をセット
+	SetSupportDlgData(i,windowInfo);
+
+
+	ShowWindow(hSupport,SW_SHOW);
+
+	//ウィンドウ位置を初期化
+	GetClientRect(hChild,&rect);
+	ResizeToRadToolWindows(i,rect.right,rect.bottom);
+
+	i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)windowInfo.GetName().c_str());	//Docコンボボックスに追加
+	SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+
+	//タブに追加
+	pobj_MainTab->InsertItem( hChild, windowInfo.GetName().c_str(), true );
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+
+	SetFocus(hRad);
+}
+
+int InsertDlgItem(int WndNum,int WndInfoNum,int ItemNum,POINT *pPos,SIZE *pSize,const char *IdName,const char *caption,DWORD style_or_WndNum,DWORD ExStyle,int Control,ActiveBasic::PM::ImageReferenceType::EnumType ImageType,const char *ImagePath,DWORD dwInsertType){
+	//dwInsertType
+	//0 … 元に戻す、やり直し
+	//1 … 通常の挿入
+	//2 … 貼り付け
+
+	extern HANDLE hHeap;
+	int i,i2,NewItemNum;
+	char temporary[MAX_PATH];
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	ActiveBasic::PM::ChildWindowInfo *pChildInfo = new ActiveBasic::PM::ChildWindowInfo();
+
+	if(ItemNum==-1)
+	{
+		NewItemNum = pWindowInfo->childWindowInfos.size();
+		pWindowInfo->childWindowInfos.push_back( pChildInfo );
+	}
+	else
+	{
+		ActiveBasic::PM::ChildWindowInfos::iterator it = pWindowInfo->childWindowInfos.begin();
+		for( int i=0; i<ItemNum; i++ )
+		{
+			it++;
+		}
+		pWindowInfo->childWindowInfos.insert( it, pChildInfo );
+
+		NewItemNum=ItemNum;
+	}
+
+	//ID
+	if(ItemNum==-1){
+		char temp2[1024];
+		lstrcpy( temp2, IdName );
+		for(i=lstrlen(temp2)-1;i>=0;i--){
+			if(!('0'<=temp2[i]&&temp2[i]<='9')) break;
+		}
+		i++;
+
+		if(temp2[i]!='\0'){
+			i2=atoi(temp2+i)+1;
+			if(dwInsertType==2) i2--;
+			temp2[i]=0;
+		}
+		else{
+			if(dwInsertType==2) i2=0;
+			else i2=1;
+		}
+
+		if(i2==0) lstrcpy(temporary,temp2);
+		else sprintf(temporary,"%s%d",temp2,i2);
+SearchStart:
+		for( i=0; i<static_cast<int>(pWindowInfo->childWindowInfos.size()); i++ )
+		{
+			if( i != NewItemNum )
+			{
+				if( pWindowInfo->childWindowInfos[i]->GetName() == temporary )
+				{
+					i2++;
+					sprintf(temporary,"%s%d",temp2,i2);
+					goto SearchStart;
+				}
+			}
+		}
+	}
+	else lstrcpy(temporary,IdName);
+	pChildInfo->SetName( temporary );
+
+	//位置
+	pChildInfo->pos=*pPos;
+	pChildInfo->size=*pSize;
+	//小さすぎる場合は、最小の大きさに調整
+	if(pChildInfo->size.cx<MIN_ITEM_X) pChildInfo->size.cx=MIN_ITEM_X;
+	if(pChildInfo->size.cy<MIN_ITEM_Y) pChildInfo->size.cy=MIN_ITEM_Y;
+
+	//テキスト
+	if(ItemNum==-1){
+		if(dwInsertType==1){
+			if(caption[0]) sprintf(temporary,"%s%d",caption,i2);
+			else temporary[0]=0;
+		}
+		else lstrcpy(temporary,caption);
+	}
+	else lstrcpy(temporary,caption);
+	pChildInfo->SetCaption( temporary );
+
+	//スタイル
+	pChildInfo->SetStyle( style_or_WndNum );
+
+	//拡張スタイル
+	pChildInfo->SetExStyle( ExStyle );
+
+	//クラス名
+	pChildInfo->Control=Control;
+
+	if(Control==CT_IMAGEBOX){
+		//イメージ ボックスの場合
+		pChildInfo->image.type = ImageType;
+		if(!ImagePath)
+		{
+			pChildInfo->image.path = "";
+		}
+		else{
+			pChildInfo->image.path = ImagePath;
+		}
+	}
+
+	//変更情報
+	if(dwInsertType!=0)
+		Rad_NoticeChanging(WndNum,RAD_UNDO_INSERTITEM,NewItemNum,(DWORD)pChildInfo);
+
+	DrawRadWindow(WndNum,pWindowInfo);
+	return NewItemNum;
+}
+void DeleteDlgItem(int WndNum,int WndInfoNum,int ItemNum,BOOL bNoticeChanging){
+	extern HANDLE hHeap;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	//変更情報
+	if(bNoticeChanging)
+		Rad_NoticeChanging(WndNum,RAD_UNDO_DELETEITEM,ItemNum,(DWORD)pWindowInfo->childWindowInfos[ItemNum]);
+
+	//子ウィンドウのメモリを解放
+	delete pWindowInfo->childWindowInfos[ItemNum];
+
+	ActiveBasic::PM::ChildWindowInfos::iterator it = pWindowInfo->childWindowInfos.begin();
+	for( int i=0; i<ItemNum; i++ )
+	{
+		it++;
+	}
+	pWindowInfo->childWindowInfos.erase( it );
+
+	DrawRadWindow(WndNum,pWindowInfo);
+
+
+	//////////////////////////////
+	//プロパティウィンドウを設定
+	DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg);
+	MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_WINDOW),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_WindowProc);
+
+	SCROLLINFO ScrollInfo;
+	ScrollInfo.cbSize=sizeof(SCROLLINFO);
+	ScrollInfo.fMask=SIF_POS;
+	ScrollInfo.nPos=0;
+	SetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hProperty,SB_VERT,&ScrollInfo,1);
+
+	RECT rect;
+	GetClientRect(MdiInfo[WndNum]->MdiRadInfo->hProperty,&rect);
+	SendMessage(MdiInfo[WndNum]->MdiRadInfo->hProperty,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
+}
+
+void CursorPos_GlobalToLocal(HWND hwnd,long *x,long *y){
+	SCROLLINFO VertScrollInfo,HorzScrollInfo;
+
+	VertScrollInfo.cbSize=sizeof(SCROLLINFO);
+	VertScrollInfo.fMask=SIF_RANGE|SIF_POS;
+	GetScrollInfo(hwnd,SB_VERT,&VertScrollInfo);
+	HorzScrollInfo.cbSize=sizeof(SCROLLINFO);
+	HorzScrollInfo.fMask=SIF_RANGE|SIF_POS;
+	GetScrollInfo(hwnd,SB_HORZ,&HorzScrollInfo);
+
+	*x-=HorzScrollInfo.nPos;
+	*y-=VertScrollInfo.nPos;
+}
+void CursorPos_LocalToGlobal(HWND hwnd,long *x,long *y){
+	SCROLLINFO VertScrollInfo,HorzScrollInfo;
+
+	VertScrollInfo.cbSize=sizeof(SCROLLINFO);
+	VertScrollInfo.fMask=SIF_RANGE|SIF_POS;
+	GetScrollInfo(hwnd,SB_VERT,&VertScrollInfo);
+	HorzScrollInfo.cbSize=sizeof(SCROLLINFO);
+	HorzScrollInfo.fMask=SIF_RANGE|SIF_POS;
+	GetScrollInfo(hwnd,SB_HORZ,&HorzScrollInfo);
+
+	*x+=HorzScrollInfo.nPos;
+	*y+=VertScrollInfo.nPos;
+}
+void DrawFrame(HWND hwnd,int WndNum,int WndInfoNum,RECT *NewRect,RECT *OldRect,BOOL bLA){
+	static int swLineStop;
+	int i,sw;
+	int x,y;
+	HDC hdc;
+	HPEN hPen,hOldPen;
+	HBRUSH hOldBrush;
+	RECT rect;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	hdc=GetDC(hwnd);
+
+	sw=0;
+	if(pobj_nv->bLineAdjust&&bLA){
+		for( i=0; i<static_cast<int>(pWindowInfo->childWindowInfos.size()); i++ )
+		{
+			const ActiveBasic::PM::ChildWindowInfo *pChildInfo = pWindowInfo->childWindowInfos[i];
+			if(i==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]) continue;
+			if(pChildInfo->Control !=
+				pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control) continue;
+
+			if(NewRect->left<OldRect->left){
+				if(pChildInfo->pos.x
+											>
+					NewRect->left - MdiInfo[WndNum]->MdiRadInfo->ClientPos.x
+					&&
+					pChildInfo->pos.x-10
+											<
+					NewRect->left - MdiInfo[WndNum]->MdiRadInfo->ClientPos.x){
+
+					//左側をストップする
+					x=NewRect->right-NewRect->left;
+					NewRect->left=pChildInfo->pos.x + MdiInfo[WndNum]->MdiRadInfo->ClientPos.x;
+					NewRect->right=NewRect->left+x;
+
+					hPen=CreatePen(PS_SOLID,0,RGB(100,100,100));
+					hOldPen=(HPEN)SelectObject(hdc,hPen);
+					MoveToEx(hdc,NewRect->left,0,NULL);
+					LineTo(hdc,NewRect->left,ScreenX);
+					SelectObject(hdc,hOldPen);
+					DeleteObject(hPen);
+
+					swLineStop=1;
+					sw=1;
+				}
+			}
+			if(NewRect->top<OldRect->top){
+				if(pChildInfo->pos.y
+											>
+					NewRect->top - MdiInfo[WndNum]->MdiRadInfo->ClientPos.y
+					&&
+					pChildInfo->pos.y-10
+											<
+					NewRect->top - MdiInfo[WndNum]->MdiRadInfo->ClientPos.y){
+
+					//左側をストップする
+					y=NewRect->bottom-NewRect->top;
+					NewRect->top=pChildInfo->pos.y + MdiInfo[WndNum]->MdiRadInfo->ClientPos.y;
+					NewRect->bottom=NewRect->top+y;
+
+					hPen=CreatePen(PS_SOLID,0,RGB(100,100,100));
+					hOldPen=(HPEN)SelectObject(hdc,hPen);
+					MoveToEx(hdc,0,NewRect->top,NULL);
+					LineTo(hdc,ScreenY,NewRect->top);
+					SelectObject(hdc,hOldPen);
+					DeleteObject(hPen);
+
+					swLineStop=1;
+					sw=1;
+				}
+			}
+		}
+	}
+
+	//以前の選択フレームを消去
+	RectNaturalFormat(OldRect,&rect);
+	x=rect.left;
+	y=rect.top;
+	CursorPos_GlobalToLocal(hwnd,&rect.left,&rect.top);
+	CursorPos_GlobalToLocal(hwnd,&rect.right,&rect.bottom);
+	if(swLineStop&&sw==0){
+		BitBlt(hdc,0,0,ScreenX*2,ScreenY*2,
+			MdiInfo[WndNum]->MdiRadInfo->hMemDC,0,0,SRCCOPY);
+		swLineStop=0;
+	}
+	else{
+		BitBlt(hdc,rect.left-LEVER_THICK, rect.top-LEVER_THICK,
+			rect.right-rect.left+LEVER_THICK*2, rect.bottom-rect.top+LEVER_THICK*2,
+			MdiInfo[WndNum]->MdiRadInfo->hMemDC,x-LEVER_THICK,y-LEVER_THICK,SRCCOPY);
+	}
+
+	//新しい選択フレームを描画
+	RectNaturalFormat(NewRect,&rect);
+	CursorPos_GlobalToLocal(hwnd,&rect.left,&rect.top);
+	CursorPos_GlobalToLocal(hwnd,&rect.right,&rect.bottom);
+
+	hPen=CreatePen(PS_DOT,0,RGB(0,0,0));
+	SetBkMode(hdc,TRANSPARENT);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+	hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+	Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
+	SelectObject(hdc,hOldBrush);
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+
+	ReleaseDC(hwnd,hdc);
+
+	*OldRect=*NewRect;
+}
+void GetSelectingRect(int WndNum,int WndInfoNum,int num,RECT *rect){
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]==SELECT_WINDOW){
+		//ウィンドウ軸を選択
+		rect->left=0;
+		rect->top=0;
+		rect->right=pWindowInfo->size.cx+(LEVER_THICK*2);
+		rect->bottom=pWindowInfo->size.cy+(LEVER_THICK*2);
+	}
+	else{
+		//子ウィンドウを選択
+		rect->left=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->pos.x-LEVER_THICK;
+		rect->top=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->pos.y-LEVER_THICK;
+		rect->right=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->pos.x+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->size.cx+LEVER_THICK;
+		rect->bottom=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->pos.y+pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[num]]->size.cy+LEVER_THICK;
+	}
+}
+void DrawSelectingRect(HWND hwnd,int WndNum,int WndInfoNum,int ButtonSelect){
+	extern RADINFO RadInfo;
+	int i,i2,i3;
+	HDC hdc;
+	HPEN hPen,hOldPen;
+	HBRUSH hOldBrush;
+	COLORREF rgb;
+	RECT rect,tempRect;
+
+	hdc=GetDC(hwnd);
+	if(ButtonSelect==IDC_TOOL_MOUSE) rgb=RGB(255,60,30);
+	else if(ButtonSelect==NON_TOOL) rgb=RGB(100,100,100);
+	hPen=CreatePen(PS_SOLID,0,rgb);
+	SetBkMode(hdc,TRANSPARENT);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+	i=0;
+	while(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i]!=-1||i==0){
+		GetSelectingRect(WndNum,WndInfoNum,i,&tempRect);
+		RectNaturalFormat(&tempRect,&rect);
+		CursorPos_GlobalToLocal(hwnd,&rect.left,&rect.top);
+		CursorPos_GlobalToLocal(hwnd,&rect.right,&rect.bottom);
+
+		//主線
+		hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
+		Rectangle(hdc,
+			rect.left+2, rect.top+2,
+			rect.right-2, rect.bottom-2);
+		SelectObject(hdc,hOldBrush);
+
+
+		hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(WHITE_BRUSH));
+
+		Rectangle(hdc,
+			rect.left,rect.top,
+			rect.left+5,rect.top+5);
+		Rectangle(hdc,
+			rect.left,rect.bottom-5,
+			rect.left+5,rect.bottom);
+		Rectangle(hdc,
+			rect.right-5,rect.top,
+			rect.right,rect.top+5);
+		Rectangle(hdc,
+			rect.right-5,rect.bottom-5,
+			rect.right,rect.bottom);
+
+		i2=(rect.right-rect.left)/2;
+		i3=(rect.bottom-rect.top)/2;
+		Rectangle(hdc,
+			rect.left+i2-2,rect.top,
+			rect.left+i2+3,rect.top+5);
+		Rectangle(hdc,
+			rect.left+i2-2,rect.bottom-5,
+			rect.left+i2+3,rect.bottom);
+		Rectangle(hdc,
+			rect.left,rect.top+i3-2,
+			rect.left+5,rect.top+i3+3);
+		Rectangle(hdc,
+			rect.right-5,rect.top+i3-2,
+			rect.right,rect.top+i3+3);
+
+		SelectObject(hdc,hOldBrush);
+
+		//移動時の選択フレームの消去用範囲
+		RadInfo.OldDraggingRect[i]=rect;
+
+		i++;
+	}
+
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+
+	ReleaseDC(hwnd,hdc);
+}
+void ChangePropertyWindow(int WndNum,int WndInfoNum){
+	RECT rect;
+	SCROLLINFO ScrollInfo;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg);
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+		MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_WINDOW),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_WindowProc);
+
+		ScrollInfo.cbSize=sizeof(SCROLLINFO);
+		ScrollInfo.fMask=SIF_POS;
+		ScrollInfo.nPos=0;
+		SetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hProperty,SB_VERT,&ScrollInfo,1);
+
+		GetClientRect(MdiInfo[WndNum]->MdiRadInfo->hProperty,&rect);
+		SendMessage(MdiInfo[WndNum]->MdiRadInfo->hProperty,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
+	}
+	else{
+		if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_BUTTON)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_BUTTON),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ButtonProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_CHECKBOX),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_CheckBoxProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_COMBOBOX)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_COMBOBOX),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ComboBoxProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_EDIT)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_EDIT),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_EditProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_GROUPBOX)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_GROUPBOX),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_GroupBoxProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_HSCROLLBAR)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_SCROLLBAR),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ScrollBarProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_IMAGEBOX)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_IMAGEBOX),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ImageBoxProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTBOX)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_LISTBOX),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ListBoxProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTVIEW)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_LISTVIEW),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ListViewProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_PROGRESSBAR)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_PROGRESSBAR),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ProgressBarProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_RADIOBUTTON),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_RadioButtonProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_STATIC),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_StaticProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TRACKBAR)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_TRACKBAR),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_TrackBarProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_TREEVIEW)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_TREEVIEW),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_TreeViewProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_UPDOWN)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_UPDOWN),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_UpDownProc);
+		else if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_VSCROLLBAR)
+			MdiInfo[WndNum]->MdiRadInfo->hProp_Dlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_SCROLLBAR),MdiInfo[WndNum]->MdiRadInfo->hProperty,(DLGPROC)RadProperty_ScrollBarProc);
+
+		ScrollInfo.cbSize=sizeof(SCROLLINFO);
+		ScrollInfo.fMask=SIF_POS;
+		ScrollInfo.nPos=0;
+		SetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hProperty,SB_VERT,&ScrollInfo,1);
+
+		GetClientRect(MdiInfo[WndNum]->MdiRadInfo->hProperty,&rect);
+		SendMessage(MdiInfo[WndNum]->MdiRadInfo->hProperty,WM_SIZE,0,MAKELONG(rect.right,rect.bottom));
+	}
+}
+int GetItemNumOnMouse(int WndNum,int WndInfoNum,int x,int y){
+	int i;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	for(i=pWindowInfo->childWindowInfos.size()-1;i>=0;i--){
+		if(pWindowInfo->childWindowInfos[i]->Control==CT_COMBOBOX&&
+			(pWindowInfo->childWindowInfos[i]->GetStyle()&0x000F)!=CBS_SIMPLE){
+			//コンボ ボックスの場合は表示部分をターゲットに選択する（高さ20pixel）
+			if(x>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x&&
+				x<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x+pWindowInfo->childWindowInfos[i]->size.cx&&
+				y>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y&&
+				y<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y+20){
+				break;
+			}
+		}
+		else if(pWindowInfo->childWindowInfos[i]->Control==CT_GROUPBOX){
+			//グループ ボックスの場合は中央をあける
+			if((
+				x>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x&&
+				x<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x+pWindowInfo->childWindowInfos[i]->size.cx&&
+				y>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y&&
+				y<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y+pWindowInfo->childWindowInfos[i]->size.cy
+				)&&
+				(!(
+				x>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x+LEVER_THICK*2&&
+				x<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x+pWindowInfo->childWindowInfos[i]->size.cx-LEVER_THICK*2&&
+				y>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y+LEVER_THICK*3&&
+				y<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y+pWindowInfo->childWindowInfos[i]->size.cy-LEVER_THICK*2
+				))
+				){
+				break;
+			}
+		}
+		else if(x>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x&&
+			x<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[i]->pos.x+pWindowInfo->childWindowInfos[i]->size.cx&&
+			y>=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y&&
+			y<=MdiInfo[WndNum]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[i]->pos.y+pWindowInfo->childWindowInfos[i]->size.cy){
+			break;
+		}
+	}
+	return i;
+}
+void SelectItemNumOnMouse(int WndNum,int WndInfoNum,int x,int y){
+	//マウス座標をもとにコントロールアイテムを選択
+	int i;
+
+	for(i=1;i<MAX_RAD_SELITEM;i++) MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i]=-1;
+	i=GetItemNumOnMouse(WndNum,WndInfoNum,x,y);
+
+	if(i==-1){
+		if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW){
+			MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]=SELECT_WINDOW;
+			ChangePropertyWindow(WndNum,WndInfoNum);
+		}
+	}
+	else{
+		MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]=i;
+		ChangePropertyWindow(WndNum,WndInfoNum);
+	}
+
+	SetStatusText(NULL);
+
+	//サポートダイアログの内容をセット
+	SetSupportDlgData( WndNum, *projectInfo.windowInfos[WndInfoNum] );
+}
+void SetItemNumOnFrame(int WndNum,int WndInfoNum,RECT *pRect){
+	int i,i2,sw;
+	RECT rect;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	for(i=1;i<MAX_RAD_SELITEM;i++) MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i]=-1;
+	RectNaturalFormat(pRect,&rect);
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW) sw=0;
+	else sw=1;
+	for(i=pWindowInfo->childWindowInfos.size()-1,i2=0;i>=0;i--){
+		if(rect.left <= pWindowInfo->childWindowInfos[i]->pos.x+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x&&
+			rect.top <= pWindowInfo->childWindowInfos[i]->pos.y+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y&&
+			rect.right >= pWindowInfo->childWindowInfos[i]->pos.x+pWindowInfo->childWindowInfos[i]->size.cx+MdiInfo[WndNum]->MdiRadInfo->ClientPos.x&&
+			rect.bottom >= pWindowInfo->childWindowInfos[i]->pos.y+pWindowInfo->childWindowInfos[i]->size.cy+MdiInfo[WndNum]->MdiRadInfo->ClientPos.y){
+			MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i2]=i;
+			i2++;
+		}
+	}
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW||
+		(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW&&sw)){
+		ChangePropertyWindow(WndNum,WndInfoNum);
+	}
+}
+int GetStateOfDraggingFrame(int WndNum,int WndInfoNum,int x,int y){
+	int i;
+	RECT rect;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[1]!=-1){
+		i=0;
+		while(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i]!=-1||i==0){
+			GetSelectingRect(WndNum,WndInfoNum,i,&rect);
+
+			if(x>=rect.left+LEVER_THICK&&x<=rect.right-LEVER_THICK&&
+				y>=rect.top+LEVER_THICK&&y<=rect.bottom-LEVER_THICK){
+					if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i]]->Control==CT_GROUPBOX){
+					//グループボックスの場合は中央をあける
+					if(!(x>=rect.left+LEVER_THICK*2&&x<=rect.right-LEVER_THICK*2&&
+						y>=rect.top+LEVER_THICK*3&&y<=rect.bottom-LEVER_THICK*2)){
+						return FRAME_INSIDE;
+					}
+				}
+				else return FRAME_INSIDE;
+			}
+			i++;
+		}
+	}
+	else{
+		GetSelectingRect(WndNum,WndInfoNum,0,&rect);
+
+		if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW){
+			if(x>=rect.left+LEVER_THICK&&x<=rect.right-LEVER_THICK&&
+				y>=rect.top+LEVER_THICK&&y<=rect.bottom-LEVER_THICK){
+				if(pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->Control==CT_GROUPBOX){
+					//グループ ボックスの場合は中央をあける
+					if(!(x>=rect.left+LEVER_THICK*3&&x<=rect.right-LEVER_THICK*3&&
+						y>=rect.top+LEVER_THICK*4&&y<=rect.bottom-LEVER_THICK*3)){
+						return FRAME_INSIDE;
+					}
+				}
+				else return FRAME_INSIDE;
+			}
+			else if(x>=rect.left&&x<=rect.left+LEVER_THICK&&
+				y>=rect.top&&y<=rect.top+LEVER_THICK)				return FRAME_UPPER_LEFT;
+			else if(x>=rect.right-LEVER_THICK&&x<=rect.right&&
+				y>=rect.top&&y<=rect.top+LEVER_THICK)				return FRAME_UPPER_RIGHT;
+			else if(x>=rect.left&&x<=rect.left+LEVER_THICK&&
+				y>=rect.bottom-LEVER_THICK&&y<=rect.bottom)			return FRAME_LOWER_LEFT;
+			else if(x>=rect.left&&x<=rect.left+LEVER_THICK&&
+				y>=rect.top+LEVER_THICK&&y<=rect.bottom-LEVER_THICK)return FRAME_LEFT;
+			else if(x>=rect.left+LEVER_THICK&&x<=rect.right-LEVER_THICK&&
+				y>=rect.top&&y<=rect.top+LEVER_THICK)				return FRAME_UPPER;
+		}
+		if(x>=rect.right-LEVER_THICK&&x<=rect.right&&
+			y>=rect.bottom-LEVER_THICK&&y<=rect.bottom)				return FRAME_LOWER_RIGHT;
+		else if(x>=rect.right-LEVER_THICK&&x<=rect.right&&
+			y>=rect.top+LEVER_THICK&&y<=rect.bottom-LEVER_THICK)	return FRAME_RIGHT;
+		else if(x>=rect.left+LEVER_THICK&&x<=rect.right-LEVER_THICK&&
+			y>=rect.bottom-LEVER_THICK&&y<=rect.bottom)				return FRAME_LOWER;
+	}
+	return 0;
+}
+void ResetScrollbarOfRadEditor(int WndNum,int weight,int height){
+	SCROLLINFO ScrollInfo;
+	SIZE NeedSize;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+
+	//必要な幅、高さを共に100ピクセル余裕を持たせる
+	NeedSize.cx=pWindowInfo->size.cx+(LEVER_THICK*2)+100;
+	NeedSize.cy=pWindowInfo->size.cy+(LEVER_THICK*2)+100;
+
+	ScrollInfo.cbSize=sizeof(SCROLLINFO);
+	ScrollInfo.fMask=SIF_PAGE|SIF_RANGE|SIF_POS|SIF_DISABLENOSCROLL;
+
+	//垂直スクロールバーの設定
+	GetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hRad,SB_VERT,&ScrollInfo);
+	ScrollInfo.nMin=0;
+	if(height>NeedSize.cy) ScrollInfo.nMax=0;
+	else{
+		ScrollInfo.nMax=NeedSize.cy;
+		ScrollInfo.nPage=height;
+	}
+	SetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hRad,SB_VERT,&ScrollInfo,1);
+
+	//水平スクロールバーの設定
+	GetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hRad,SB_VERT,&ScrollInfo);
+	ScrollInfo.nMin=0;
+	if(weight>NeedSize.cx) ScrollInfo.nMax=0;
+	else{
+		ScrollInfo.nMax=NeedSize.cx;
+		ScrollInfo.nPage=weight;
+	}
+	SetScrollInfo(MdiInfo[WndNum]->MdiRadInfo->hRad,SB_HORZ,&ScrollInfo,1);
+}
+LRESULT CALLBACK RadWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern RADINFO RadInfo;
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+	HWND hParent;
+	HDC hdc;
+	RECT rect;
+	POINT mouse,pos;
+	SIZE size;
+	SCROLLINFO ScrollInfo,si2;
+	POINTANDSIZE PointAndSize;
+
+	switch(message){
+		case WM_LBUTTONDOWN:
+			{
+				SetCapture(hwnd);
+
+				SetFocus(hwnd);
+				mouse.x=GET_X_LPARAM(lParam);
+				mouse.y=GET_Y_LPARAM(lParam);
+				CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
+
+				i=GetWndNum(GetParent(hwnd));
+				i2 = GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+					if(((wParam&MK_CONTROL)||(wParam&MK_SHIFT))&&
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW){
+
+						//Shiftキー、Ctrlキーによる複数選択
+						for(i3=0;;i3++){
+							if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1){
+								MdiInfo[i]->MdiRadInfo->SelectingItem[i3]=GetItemNumOnMouse(i,i2,mouse.x,mouse.y);
+								InvalidateRect(hwnd,NULL,0);
+
+								//サポートダイアログの内容をセット
+								SetSupportDlgData( i, *pWindowInfo );
+								break;
+							}
+						}
+					}
+					else{
+						RadInfo.NowDragging=GetStateOfDraggingFrame(i,i2,mouse.x,mouse.y);
+						if(!RadInfo.NowDragging){
+							SelectItemNumOnMouse(i,i2,mouse.x,mouse.y);
+							InvalidateRect(hwnd,NULL,0);
+							RadInfo.NowDragging=GetStateOfDraggingFrame(i,i2,mouse.x,mouse.y);
+						}
+						if(RadInfo.NowDragging){
+							//アイテム選択中。サイズ、位置変更開始
+
+							if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+								RadInfo.DraggingRect[0].left=LEVER_THICK;
+								RadInfo.DraggingRect[0].top=LEVER_THICK;
+								RadInfo.DraggingRect[0].right=pWindowInfo->size.cx+LEVER_THICK;
+								RadInfo.DraggingRect[0].bottom=pWindowInfo->size.cy+LEVER_THICK;
+								RadInfo.DragStartRect[0]=RadInfo.DraggingRect[0];
+							}
+							else{
+								i3=0;
+								while(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]!=-1){
+									RadInfo.DraggingRect[i3].left=MdiInfo[i]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x;
+									RadInfo.DraggingRect[i3].top=MdiInfo[i]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y;
+									RadInfo.DraggingRect[i3].right=MdiInfo[i]->MdiRadInfo->ClientPos.x+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cx;
+									RadInfo.DraggingRect[i3].bottom=MdiInfo[i]->MdiRadInfo->ClientPos.y+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y+pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cy;
+									RadInfo.DragStartRect[i3]=RadInfo.DraggingRect[i3];
+									i3++;
+								}
+							}
+						}
+						else{
+							//範囲選択
+
+							RadInfo.NowDragging=SELECTING_FRAME;
+							RadInfo.OldDraggingRect[0].left=LEVER_THICK;
+							RadInfo.OldDraggingRect[0].top=LEVER_THICK;
+							RadInfo.OldDraggingRect[0].right=pWindowInfo->size.cx+LEVER_THICK;
+							RadInfo.OldDraggingRect[0].bottom=pWindowInfo->size.cy+LEVER_THICK;
+						}
+						RadInfo.DragStartPos.x=mouse.x;
+						RadInfo.DragStartPos.y=mouse.y;
+					}
+					SetCursorByState(RadInfo.NowDragging);
+				}
+				else{
+					RadInfo.DraggingRect[0].left=mouse.x;
+					RadInfo.DraggingRect[0].top=mouse.y;
+					RadInfo.NowDragging=ITEM_MAKING;
+				}
+				return 0;
+			}
+		case WM_LBUTTONUP:
+			{
+				ReleaseCapture();
+
+				SetFocus(hwnd);
+				mouse.x=GET_X_LPARAM(lParam);
+				mouse.y=GET_Y_LPARAM(lParam);
+				CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
+
+				hParent=GetParent(hwnd);
+				i=GetWndNum(hParent);
+				i2 = GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+					if(RadInfo.NowDragging){
+						if(RadInfo.DragStartPos.x==mouse.x&&RadInfo.DragStartPos.y==mouse.y){
+							RadInfo.NowDragging=0;
+							InvalidateRect(hwnd,NULL,0);
+							ResetState_EditMenu();
+							return 0;
+						}
+
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+							if(RadInfo.NowDragging==SELECTING_FRAME){
+								SetItemNumOnFrame(i,i2,&RadInfo.DraggingRect[0]);
+								InvalidateRect(hwnd,NULL,1);
+							}
+							else{
+								//ウィンドウ枠の調整完了
+								PointAndSize.size=pWindowInfo->size;
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+								pWindowInfo->size.cx=RadInfo.DraggingRect[0].right-LEVER_THICK;
+								pWindowInfo->size.cy=RadInfo.DraggingRect[0].bottom-LEVER_THICK;
+								DrawRadWindow(i,pWindowInfo);
+								InvalidateRect(hwnd,NULL,1);
+
+								GetClientRect(hwnd,&rect);
+								ResetScrollbarOfRadEditor(i,rect.right,rect.bottom);
+							}
+						}
+						else{
+							i3=0;
+							while(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]!=-1){
+								//アイテム枠の調整完了
+								PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+								PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x=RadInfo.DraggingRect[i3].left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y=RadInfo.DraggingRect[i3].top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cx=RadInfo.DraggingRect[i3].right-RadInfo.DraggingRect[i3].left;
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cy=RadInfo.DraggingRect[i3].bottom-RadInfo.DraggingRect[i3].top;
+								DrawRadWindow(i,pWindowInfo);
+								i3++;
+							}
+						}
+
+						SetStatusText(NULL);
+
+						//サポートダイアログの内容をセット
+						SetSupportDlgData( i, *pWindowInfo );
+					}
+				}
+				else if(RadInfo.NowDragging==ITEM_MAKING){
+					if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_BUTTON){
+						//ボタン コントロール作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=44;
+							RadInfo.DraggingRect[0].right=mouse.x+44;
+							RadInfo.DraggingRect[0].top-=10;
+							RadInfo.DraggingRect[0].bottom=mouse.y+11;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"CommandButton",
+							"Button",
+							WS_CHILD|WS_VISIBLE,0,CT_BUTTON,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_CHECKBOX){
+						//チェック ボックス作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=33;
+							RadInfo.DraggingRect[0].right=mouse.x+34;
+							RadInfo.DraggingRect[0].top-=7;
+							RadInfo.DraggingRect[0].bottom=mouse.y+8;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0]=InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"CheckBox",
+							"Check",
+							WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
+							0,
+							CT_CHECKBOX,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_COMBOBOX){
+						//コンボ ボックス作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=42;
+							RadInfo.DraggingRect[0].right=mouse.x+42;
+							RadInfo.DraggingRect[0].top-=42;
+							RadInfo.DraggingRect[0].bottom=mouse.y+42;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"ComboBox",
+							"",
+							WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|CBS_SORT|WS_VSCROLL,
+							0,
+							CT_COMBOBOX,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_EDIT){
+						//エディット コントロール作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=35;
+							RadInfo.DraggingRect[0].right=mouse.x+35;
+							RadInfo.DraggingRect[0].top-=10;
+							RadInfo.DraggingRect[0].bottom=mouse.y+11;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"EditBox",
+							"",
+							WS_CHILD|WS_VISIBLE,WS_EX_CLIENTEDGE,
+							CT_EDIT,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_GROUPBOX){
+						//グループ ボックス作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=42;
+							RadInfo.DraggingRect[0].right=mouse.x+42;
+							RadInfo.DraggingRect[0].top-=30;
+							RadInfo.DraggingRect[0].bottom=mouse.y+30;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"GroupBox",
+							"Group",
+							WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
+							0,
+							CT_GROUPBOX,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_HSCROLLBAR){
+						//水平スクロールバー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=35;
+							RadInfo.DraggingRect[0].right=mouse.x+35;
+							RadInfo.DraggingRect[0].top-=8;
+							RadInfo.DraggingRect[0].bottom=mouse.y+9;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0]=InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"HScrollBar",
+							"",
+							WS_CHILD|WS_VISIBLE|SBS_HORZ,
+							0,
+							CT_HSCROLLBAR,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_IMAGEBOX){
+						//イメージ ボックス作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=16;
+							RadInfo.DraggingRect[0].right=mouse.x+16;
+							RadInfo.DraggingRect[0].top-=16;
+							RadInfo.DraggingRect[0].bottom=mouse.y+16;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"ImageBox",
+							"",
+							WS_CHILD|WS_VISIBLE|SS_BLACKFRAME,0,CT_IMAGEBOX,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_LISTBOX){
+						//リスト ボックス作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=42;
+							RadInfo.DraggingRect[0].right=mouse.x+42;
+							RadInfo.DraggingRect[0].top-=30;
+							RadInfo.DraggingRect[0].bottom=mouse.y+30;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"ListBox",
+							"",
+							WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_SORT|LBS_NOTIFY,WS_EX_CLIENTEDGE,
+							CT_LISTBOX,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_LISTVIEW){
+						//リスト ビュー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=52;
+							RadInfo.DraggingRect[0].right=mouse.x+53;
+							RadInfo.DraggingRect[0].top-=37;
+							RadInfo.DraggingRect[0].bottom=mouse.y+38;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"ListView",
+							"",
+							WS_CHILD|WS_VISIBLE,WS_EX_CLIENTEDGE,
+							CT_LISTVIEW,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_PROGRESSBAR){
+						//プロバレス バー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=70;
+							RadInfo.DraggingRect[0].right=mouse.x+70;
+							RadInfo.DraggingRect[0].top-=10;
+							RadInfo.DraggingRect[0].bottom=mouse.y+11;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"ProgressBar",
+							"",
+							WS_CHILD|WS_VISIBLE,WS_EX_STATICEDGE,
+							CT_PROGRESSBAR,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_RADIOBUTTON){
+						//ラジオ ボタン作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=31;
+							RadInfo.DraggingRect[0].right=mouse.x+32;
+							RadInfo.DraggingRect[0].top-=7;
+							RadInfo.DraggingRect[0].bottom=mouse.y+8;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"RadioButton",
+							"radio",
+							WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
+							0,
+							CT_RADIOBUTTON,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_STATIC){
+						//スタティック コントロール作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=25;
+							RadInfo.DraggingRect[0].right=mouse.x+25;
+							RadInfo.DraggingRect[0].top-=6;
+							RadInfo.DraggingRect[0].bottom=mouse.y+6;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"Static",
+							"Text",
+							WS_CHILD|WS_VISIBLE,
+							0,
+							CT_STATIC,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_TRACKBAR){
+						//トラック バー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=87;
+							RadInfo.DraggingRect[0].right=mouse.x+88;
+							RadInfo.DraggingRect[0].top-=11;
+							RadInfo.DraggingRect[0].bottom=mouse.y+12;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"TrackBar",
+							"",
+							WS_CHILD|WS_VISIBLE|TBS_BOTH|TBS_NOTICKS,
+							0,
+							CT_TRACKBAR,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_TREEVIEW){
+						//ツリー ビュー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=52;
+							RadInfo.DraggingRect[0].right=mouse.x+53;
+							RadInfo.DraggingRect[0].top-=37;
+							RadInfo.DraggingRect[0].bottom=mouse.y+38;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"TreeView",
+							"",
+							WS_CHILD|WS_VISIBLE,
+							WS_EX_CLIENTEDGE,
+							CT_TREEVIEW,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_UPDOWN){
+						//アップ ダウン コントロール作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=8;
+							RadInfo.DraggingRect[0].right=mouse.x+8;
+							RadInfo.DraggingRect[0].top-=10;
+							RadInfo.DraggingRect[0].bottom=mouse.y+11;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"UpDown",
+							"",
+							WS_CHILD|WS_VISIBLE,
+							0,
+							CT_UPDOWN,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					else if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_VSCROLLBAR){
+						//垂直スクロールバー作成
+						if(RadInfo.DraggingRect[0].left==mouse.x&&RadInfo.DraggingRect[0].top==mouse.y){
+							RadInfo.DraggingRect[0].left-=9;
+							RadInfo.DraggingRect[0].right=mouse.x+9;
+							RadInfo.DraggingRect[0].top-=30;
+							RadInfo.DraggingRect[0].bottom=mouse.y+30;
+						}
+						else{
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+						}
+						RectNaturalFormat(&RadInfo.DraggingRect[0],&rect);
+						pos.x=rect.left-MdiInfo[i]->MdiRadInfo->ClientPos.x;
+						pos.y=rect.top-MdiInfo[i]->MdiRadInfo->ClientPos.y;
+						size.cx=rect.right-rect.left;
+						size.cy=rect.bottom-rect.top;
+						MdiInfo[i]->MdiRadInfo->SelectingItem[0] = InsertDlgItem(
+							i,
+							i2,
+							-1,
+							&pos,
+							&size,
+							"VScrollBar",
+							"",
+							WS_CHILD|WS_VISIBLE|SBS_VERT,
+							0,
+							CT_VSCROLLBAR,
+							ActiveBasic::PM::ImageReferenceType::File,
+							0,
+							1
+						);
+					}
+					SendMessage(GetWindow(MdiInfo[i]->MdiRadInfo->hTools,GW_CHILD),WM_COMMAND,IDC_TOOL_MOUSE,0);
+					SendMessage(GetWindow(GetWindow(MdiInfo[i]->MdiRadInfo->hTools,GW_CHILD),GW_CHILD),TB_CHECKBUTTON,IDC_TOOL_MOUSE,TRUE);
+					ChangePropertyWindow(i,i2);
+
+					//複数選択を解除
+					MdiInfo[i]->MdiRadInfo->SelectingItem[1]=-1;
+				}
+
+				RadInfo.NowDragging=0;
+
+				ResetState_EditMenu();
+				return 0;
+			}
+		case WM_MOUSEMOVE:
+			{
+				mouse.x=GET_X_LPARAM(lParam);
+				mouse.y=GET_Y_LPARAM(lParam);
+				CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
+
+				hParent=GetParent(hwnd);
+				i=GetWndNum(hParent);
+				i2 = GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+					if(wParam&MK_LBUTTON&&RadInfo.NowDragging){
+						////////////////////////////////////////////////
+						// ドラッグ中の場合（コントロールのサイズ変更）
+
+						if(RadInfo.NowDragging==FRAME_UPPER_LEFT){
+							if(RadInfo.DraggingRect[0].right-MIN_ITEM_X<=(mouse.x+LEVER_THICK))
+								RadInfo.DraggingRect[0].left=RadInfo.DraggingRect[0].right-MIN_ITEM_X;
+							else if(mouse.x+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.x)
+								RadInfo.DraggingRect[0].left=MdiInfo[i]->MdiRadInfo->ClientPos.x;
+							else RadInfo.DraggingRect[0].left=mouse.x+LEVER_THICK;
+
+							if(RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y<=(mouse.y+LEVER_THICK))
+								RadInfo.DraggingRect[0].top=RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y;
+							else if(mouse.y+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.y)
+								RadInfo.DraggingRect[0].top=MdiInfo[i]->MdiRadInfo->ClientPos.y;
+							else RadInfo.DraggingRect[0].top=mouse.y+LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_UPPER_RIGHT){
+							if(mouse.x-LEVER_THICK-MIN_ITEM_X<=RadInfo.DraggingRect[0].left)
+								RadInfo.DraggingRect[0].right=RadInfo.DraggingRect[0].left+MIN_ITEM_X;
+							else if(mouse.x>MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx)
+								RadInfo.DraggingRect[0].right=MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx;
+							else RadInfo.DraggingRect[0].right=mouse.x-LEVER_THICK;
+
+							if(RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y<=(mouse.y+LEVER_THICK)) RadInfo.DraggingRect[0].top=RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y;
+							else if(mouse.y+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.y)
+								RadInfo.DraggingRect[0].top=MdiInfo[i]->MdiRadInfo->ClientPos.y;
+							else RadInfo.DraggingRect[0].top=mouse.y+LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_LOWER_LEFT){
+							if(RadInfo.DraggingRect[0].right-MIN_ITEM_X<=(mouse.x+LEVER_THICK))
+								RadInfo.DraggingRect[0].left=RadInfo.DraggingRect[0].right-MIN_ITEM_X;
+							else if(mouse.x+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.x)
+								RadInfo.DraggingRect[0].left=MdiInfo[i]->MdiRadInfo->ClientPos.x;
+							else RadInfo.DraggingRect[0].left=mouse.x+LEVER_THICK;
+
+							if(mouse.y-LEVER_THICK-MIN_ITEM_Y<=RadInfo.DraggingRect[0].top)
+								RadInfo.DraggingRect[0].bottom=RadInfo.DraggingRect[0].top+MIN_ITEM_Y;
+							else if(mouse.y>MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy)
+								RadInfo.DraggingRect[0].bottom=MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy;
+							else RadInfo.DraggingRect[0].bottom=mouse.y-LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_LOWER_RIGHT){
+							if(mouse.x-LEVER_THICK-MIN_ITEM_X<=RadInfo.DraggingRect[0].left)
+								RadInfo.DraggingRect[0].right=RadInfo.DraggingRect[0].left+MIN_ITEM_X;
+							else if((mouse.x>MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx)&&MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW)
+								RadInfo.DraggingRect[0].right=MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx;
+							else RadInfo.DraggingRect[0].right=mouse.x-LEVER_THICK;
+
+							if(mouse.y-LEVER_THICK-MIN_ITEM_Y<=RadInfo.DraggingRect[0].top)
+								RadInfo.DraggingRect[0].bottom=RadInfo.DraggingRect[0].top+MIN_ITEM_Y;
+							else if((mouse.y>MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy)&&MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW)
+								RadInfo.DraggingRect[0].bottom=MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy;
+							else RadInfo.DraggingRect[0].bottom=mouse.y-LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_LEFT){
+							if(RadInfo.DraggingRect[0].right-MIN_ITEM_X<=(mouse.x+LEVER_THICK))
+								RadInfo.DraggingRect[0].left=RadInfo.DraggingRect[0].right-MIN_ITEM_X;
+							else if(mouse.x+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.x)
+								RadInfo.DraggingRect[0].left=MdiInfo[i]->MdiRadInfo->ClientPos.x;
+							else RadInfo.DraggingRect[0].left=mouse.x+LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_RIGHT){
+							if(mouse.x-LEVER_THICK-MIN_ITEM_X<=RadInfo.DraggingRect[0].left)
+								RadInfo.DraggingRect[0].right=RadInfo.DraggingRect[0].left+MIN_ITEM_X;
+							else if((mouse.x>MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx)&&MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW)
+								RadInfo.DraggingRect[0].right=MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx;
+							else RadInfo.DraggingRect[0].right=mouse.x-LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_UPPER){
+							if(RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y<=(mouse.y+LEVER_THICK))
+								RadInfo.DraggingRect[0].top=RadInfo.DraggingRect[0].bottom-MIN_ITEM_Y;
+							else if(mouse.y+LEVER_THICK<MdiInfo[i]->MdiRadInfo->ClientPos.y)
+								RadInfo.DraggingRect[0].top=MdiInfo[i]->MdiRadInfo->ClientPos.y;
+							else RadInfo.DraggingRect[0].top=mouse.y+LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_LOWER){
+							if(mouse.y-LEVER_THICK-MIN_ITEM_Y<=RadInfo.DraggingRect[0].top) 
+								RadInfo.DraggingRect[0].bottom=RadInfo.DraggingRect[0].top+MIN_ITEM_Y;
+							else if((mouse.y>MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy)&&MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW)
+								RadInfo.DraggingRect[0].bottom=MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy;
+							else RadInfo.DraggingRect[0].bottom=mouse.y-LEVER_THICK;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						else if(RadInfo.NowDragging==FRAME_INSIDE){
+							i3=0;
+							while(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]!=-1){
+								i4=RadInfo.DragStartRect[i3].left+mouse.x-RadInfo.DragStartPos.x;
+
+								if(i4>MdiInfo[i]->MdiRadInfo->ClientPos.x){
+									i4=RadInfo.DragStartRect[i3].right+mouse.x-RadInfo.DragStartPos.x;
+									if(i4<MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx) i4=0;
+									else i4-=MdiInfo[i]->MdiRadInfo->ClientPos.x+MdiInfo[i]->MdiRadInfo->ClientSize.cx;
+								}
+								else i4-=MdiInfo[i]->MdiRadInfo->ClientPos.x;
+								//i4は枠外に出たときのポインタと壁にあたったコントロールとの差
+								RadInfo.DraggingRect[i3].left=RadInfo.DragStartRect[i3].left+mouse.x-RadInfo.DragStartPos.x-i4;
+								RadInfo.DraggingRect[i3].right=RadInfo.DragStartRect[i3].right+mouse.x-RadInfo.DragStartPos.x-i4;
+
+								i4=RadInfo.DragStartRect[i3].top+mouse.y-RadInfo.DragStartPos.y;
+								if(i4>MdiInfo[i]->MdiRadInfo->ClientPos.y){
+									i4=RadInfo.DragStartRect[i3].bottom+mouse.y-RadInfo.DragStartPos.y;
+									if(i4<MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy) i4=0;
+									else i4-=MdiInfo[i]->MdiRadInfo->ClientPos.y+MdiInfo[i]->MdiRadInfo->ClientSize.cy;
+								}
+								else i4-=MdiInfo[i]->MdiRadInfo->ClientPos.y;
+								RadInfo.DraggingRect[i3].top=RadInfo.DragStartRect[i3].top+mouse.y-RadInfo.DragStartPos.y-i4;
+								RadInfo.DraggingRect[i3].bottom=RadInfo.DragStartRect[i3].bottom+mouse.y-RadInfo.DragStartPos.y-i4;
+
+								if(MdiInfo[i]->MdiRadInfo->SelectingItem[1]==-1) i4=1;
+								else i4=0;
+								DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[i3],&RadInfo.OldDraggingRect[i3],i4);
+								i3++;
+							}
+						}
+						else if(RadInfo.NowDragging==SELECTING_FRAME){
+							RadInfo.DraggingRect[0].left=RadInfo.DragStartPos.x;
+							RadInfo.DraggingRect[0].top=RadInfo.DragStartPos.y;
+							RadInfo.DraggingRect[0].right=mouse.x;
+							RadInfo.DraggingRect[0].bottom=mouse.y;
+							DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+						}
+						SetCursorByState(RadInfo.NowDragging);
+
+						SetStatusText(NULL);
+
+						//サポートダイアログの内容をセット
+						SetSupportDlgData( i, *pWindowInfo );
+					}
+					else{
+						//ドラッグ中でないとき
+						SetCursorByState(GetStateOfDraggingFrame(i,i2,mouse.x,mouse.y));
+					}
+				}
+				else{
+					//アイテム（子ウィンドウ作成中）
+					if(wParam&MK_LBUTTON&&RadInfo.NowDragging==ITEM_MAKING){
+						//ドラッグ中の場合
+
+						RadInfo.DraggingRect[0].right=mouse.x;
+						RadInfo.DraggingRect[0].bottom=mouse.y;
+						DrawFrame(hwnd,i,i2,&RadInfo.DraggingRect[0],&RadInfo.OldDraggingRect[0],0);
+					}
+				}
+				return 0;
+			}
+		case WM_LBUTTONDBLCLK:
+			{
+				mouse.x=GET_X_LPARAM(lParam);
+				mouse.y=GET_Y_LPARAM(lParam);
+				CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
+
+				hParent=GetParent(hwnd);
+				i=GetWndNum(hParent);
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+					if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]!=SELECT_WINDOW){
+						temp2[0]=0;
+						if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_BUTTON||
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX||
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_IMAGEBOX||
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON||
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC)
+						{
+							sprintf(temporary,"%s_%s_Click",
+								pWindowInfo->GetName().c_str(),
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str()
+							);
+						}
+						else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_COMBOBOX)
+						{
+							sprintf(temporary,"%s_%s_EditChange",
+								pWindowInfo->GetName().c_str(),
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+						}
+						else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_EDIT)
+						{
+							sprintf(temporary,"%s_%s_Change",
+								pWindowInfo->GetName().c_str(),
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+						}
+						else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_LISTBOX)
+						{
+							sprintf(temporary,"%s_%s_SelChange",
+								pWindowInfo->GetName().c_str(),
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+						}
+						else temporary[0]=0;
+						if(temporary[0]) SelectProcedureOfMessageCall(i2,temporary,temp2);
+					}
+				}
+				return 0;
+			}
+		case WM_KEYDOWN:
+			{
+				hParent=GetParent(hwnd);
+				i=GetWndNum(hParent);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+					if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+						PointAndSize.pos=pWindowInfo->pos;
+						PointAndSize.size=pWindowInfo->size;
+						if(GetKeyState(VK_SHIFT)&0x8000){
+							if(wParam==VK_RIGHT||wParam==VK_LEFT||wParam==VK_DOWN||wParam==VK_UP)
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+
+							if(wParam==VK_RIGHT)
+								pWindowInfo->size.cx++;
+							else if(wParam==VK_LEFT)
+								pWindowInfo->size.cx--;
+							else if(wParam==VK_DOWN)
+								pWindowInfo->size.cy++;
+							else if(wParam==VK_UP)
+								pWindowInfo->size.cy--;
+
+							if(wParam==VK_RIGHT||wParam==VK_LEFT||wParam==VK_DOWN||wParam==VK_UP){
+								DrawRadWindow(i,pWindowInfo);
+
+								SetStatusText(NULL);
+
+								//サポートダイアログの内容をセット
+								SetSupportDlgData( i, *pWindowInfo );
+							}
+						}
+					}
+					else{
+						PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->pos;
+						PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size;
+						if(wParam==VK_RIGHT){
+							if(GetKeyState(VK_SHIFT)&0x8000){
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx++;
+							}
+							else{
+								for(i3=0;;i3++){
+									if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+									PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+									PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+									Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x++;
+								}
+							}
+							DrawRadWindow(i,pWindowInfo);
+							SetStatusText(NULL);
+
+							//サポートダイアログの内容をセット
+							SetSupportDlgData( i, *pWindowInfo );
+						}
+						else if(wParam==VK_LEFT){
+							if(GetKeyState(VK_SHIFT)&0x8000){
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx--;
+							}
+							else{
+								for(i3=0;;i3++){
+									if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+									PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+									PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+									Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x--;
+								}
+							}
+							DrawRadWindow(i,pWindowInfo);
+							SetStatusText(NULL);
+
+							//サポートダイアログの内容をセット
+							SetSupportDlgData( i, *pWindowInfo );
+						}
+						else if(wParam==VK_UP){
+							if(GetKeyState(VK_SHIFT)&0x8000){
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cy--;
+							}
+							else{
+								for(i3=0;;i3++){
+									if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+									PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+									PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+									Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y--;
+								}
+							}
+							DrawRadWindow(i,pWindowInfo);
+							SetStatusText(NULL);
+
+							//サポートダイアログの内容をセット
+							SetSupportDlgData( i, *pWindowInfo );
+						}
+						else if(wParam==VK_DOWN){
+							if(GetKeyState(VK_SHIFT)&0x8000){
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cy++;
+							}
+							else{
+								for(i3=0;;i3++){
+									if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+									PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+									PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+									Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y++;
+								}
+							}
+							DrawRadWindow(i,pWindowInfo);
+							SetStatusText(NULL);
+
+							//サポートダイアログの内容をセット
+							SetSupportDlgData( i, *pWindowInfo );
+						}
+						else if(wParam==VK_DELETE)
+							SendMessage(hwnd,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
+					}
+				}
+				return 0;
+			}
+		case WM_SETFOCUS:
+			i=GetWndNum(GetParent(hwnd));
+			if(MdiInfo[i]->MdiRadInfo->ButtonSelect==NON_TOOL)
+				MdiInfo[i]->MdiRadInfo->ButtonSelect=IDC_TOOL_MOUSE;
+			InvalidateRect(hwnd,NULL,0);
+			return 0;
+		case WM_KILLFOCUS:
+			i=GetWndNum(GetParent(hwnd));
+			if(i==-1) return 0;	//ウィンドウが破棄された場合
+			if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE)
+				MdiInfo[i]->MdiRadInfo->ButtonSelect=NON_TOOL;
+			InvalidateRect(hwnd,NULL,0);
+			return 0;
+		case WM_PAINT:
+			{
+				WTL::CPaintDC dc(hwnd);
+				SendMessage(hwnd, WM_PRINTCLIENT, reinterpret_cast<WPARAM>(dc.m_hDC), 0);
+				return 0;
+			}
+		case WM_PRINTCLIENT:
+			i=GetWndNum(GetParent(hwnd));
+			if(i==-1) break;	//ウィンドウが初期状態の場合
+			i2=GetWndInfoNum(MdiInfo[i]->path);
+
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_RANGE|SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			si2.cbSize=sizeof(SCROLLINFO);
+			si2.fMask=SIF_RANGE|SIF_POS;
+			GetScrollInfo(hwnd,SB_HORZ,&si2);
+
+			hdc=reinterpret_cast<HDC>(wParam);
+			BitBlt(hdc,0,0,ScreenX*2,ScreenY*2,
+				MdiInfo[i]->MdiRadInfo->hMemDC,si2.nPos,ScrollInfo.nPos,SRCCOPY);
+
+			if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE||MdiInfo[i]->MdiRadInfo->ButtonSelect==NON_TOOL)
+				DrawSelectingRect(hwnd,i,i2,MdiInfo[i]->MdiRadInfo->ButtonSelect);
+			return 0;
+		case WM_CONTEXTMENU:
+			if(RadInfo.NowDragging) return 0;
+
+			hParent=GetParent(hwnd);
+			BringWindowToTop(hParent);
+			SetFocus(hwnd);
+			i=GetWndNum(hParent);
+			i2=GetWndInfoNum(MdiInfo[i]->path);
+
+			if(MdiInfo[i]->MdiRadInfo->ButtonSelect==IDC_TOOL_MOUSE){
+				mouse.x=GET_X_LPARAM(lParam);
+				mouse.y=GET_Y_LPARAM(lParam);
+				ScreenToClient(hwnd,&mouse);
+				CursorPos_LocalToGlobal(hwnd,&mouse.x,&mouse.y);
+				SelectItemNumOnMouse(i,i2,mouse.x,mouse.y);
+				InvalidateRect(hwnd,NULL,0);
+				extern HMENU hRadMenuBase;
+				if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+					TrackPopupMenu(GetSubMenu(hRadMenuBase,0),TPM_LEFTALIGN,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),0,hwnd,0);
+				else TrackPopupMenu(GetSubMenu(hRadMenuBase,1),TPM_LEFTALIGN,GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam),0,hwnd,0);
+			}
+			return 0;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDM_RAD_WINDOW_EVENTCODE:
+					i=GetWndNum(GetParent(hwnd));
+					DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_RAD_EVENTCODE),hwnd,(DLGPROC)DlgEventCode,0);
+					break;
+				case IDM_RAD_WINDOW_MENUEVENTCODE:
+					i=GetWndNum(GetParent(hwnd));
+					DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_RAD_EVENTCODE),hwnd,(DLGPROC)DlgEventCode,1);
+					break;
+				case IDM_RAD_ITEM_DELETE:
+					hParent=GetParent(hwnd);
+					i=GetWndNum(hParent);
+					i2=GetWndInfoNum(MdiInfo[i]->path);
+
+					//削除順序を考慮しなければならないので、バブルソートを行う
+					int i5,i6;
+					for(i5=0;;i5++){
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[i5]==-1) break;
+					}
+					for(i3=0;i3<i5-1;i3++){
+						for(i4=i5-1;i4>i3;i4--){
+							if(MdiInfo[i]->MdiRadInfo->SelectingItem[i4] >
+								MdiInfo[i]->MdiRadInfo->SelectingItem[i4-1]){
+								i6=MdiInfo[i]->MdiRadInfo->SelectingItem[i4];
+								MdiInfo[i]->MdiRadInfo->SelectingItem[i4]=
+									MdiInfo[i]->MdiRadInfo->SelectingItem[i4-1];
+								MdiInfo[i]->MdiRadInfo->SelectingItem[i4-1]=i6;
+							}
+						}
+					}
+
+
+					for(i3=0;;i3++){
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+						DeleteDlgItem(i,i2,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],1);
+					}
+					for(i3=0;i3<MAX_RAD_SELITEM;i3++) MdiInfo[i]->MdiRadInfo->SelectingItem[i3]=-1;
+
+					ResetState_EditMenu();
+					break;
+			}
+			return 0;
+		case WM_VSCROLL:
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(LOWORD(wParam)==SB_LINEUP) i=-20;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=20;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-ScrollInfo.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-ScrollInfo.nPos,min(i,ScrollInfo.nMax-rect.bottom-ScrollInfo.nPos));
+			if(i!=0){
+				ScrollInfo.nPos+=i;
+				SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+				ScrollWindow(hwnd,0,-i,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_HSCROLL:
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_HORZ,&ScrollInfo);
+			if(LOWORD(wParam)==SB_LINEUP) i=-20;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=20;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-ScrollInfo.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-ScrollInfo.nPos,min(i,ScrollInfo.nMax-rect.right-ScrollInfo.nPos));
+			if(i!=0){
+				ScrollInfo.nPos+=i;
+				SetScrollInfo(hwnd,SB_HORZ,&ScrollInfo,1);
+				ScrollWindow(hwnd,-i,0,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_SIZE:
+			i=GetWndNum(GetParent(hwnd));
+			if(i==-1) break;	//ウィンドウが初期状態の場合
+			ResetScrollbarOfRadEditor(i,LOWORD(lParam),HIWORD(lParam));
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+void ResizeToRadToolWindows(int WndNum,int weight,int height){
+	int i,i2;
+	RECT rect;
+
+	if(height<200){
+		i=100;
+		i2=100;
+	}
+	else{
+		//ツールボタンウィンドウ(長さ、i)
+		GetClientRect(GetWindow(MdiInfo[WndNum]->MdiRadInfo->hTools,GW_CHILD),&rect);
+		if(height>rect.bottom+1) i=rect.bottom+1;
+		else i=height;
+
+		//プロパティウィンドウ(長さ、i2)
+		GetClientRect(GetWindow(MdiInfo[WndNum]->MdiRadInfo->hProperty,GW_CHILD),&rect);
+		i2=height-i;
+
+		if(i2<100){
+			i=height-100;
+			i2=100;
+		}
+	}
+	MoveWindow(MdiInfo[WndNum]->MdiRadInfo->hTools,weight-172,0,172,i,1);
+	MoveWindow(MdiInfo[WndNum]->MdiRadInfo->hProperty,weight-172,i,172,i2,1);
+
+	GetWindowRect(MdiInfo[WndNum]->MdiRadInfo->hSupport,&rect);
+	rect.right-=rect.left;
+	rect.bottom-=rect.top;
+
+	//RADウィンドウ
+	MoveWindow(MdiInfo[WndNum]->MdiRadInfo->hRad,0,0,weight-172,height-rect.bottom,1);
+
+	//サポートウィンドウ
+	MoveWindow(MdiInfo[WndNum]->MdiRadInfo->hSupport,0,height-rect.bottom,weight-172,rect.bottom,1);
+}
+LRESULT CALLBACK MDIClientWindow_Rad(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HWND hDocCombo;
+	int i,WndNum;
+
+	switch(message){
+		case WM_CREATE:
+			extern HICON hWindowDocumentIcon;
+			SendMessage(hwnd,WM_SETICON,ICON_SMALL,(LPARAM)hWindowDocumentIcon);
+			break;
+		case WM_MDIACTIVATE:
+			if(!lParam) return 0;
+			i=GetWndNum((HWND)lParam);
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+
+			i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[i]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+			SetStatusText(NULL);
+			ResetState_EditMenu();
+			return 0;
+		case WM_SIZE:
+			WndNum=GetWndNum(hwnd);
+			if(WndNum==-1) break;
+			ResizeToRadToolWindows(WndNum,LOWORD(lParam),HIWORD(lParam));
+			break;
+		case WM_CLOSE:
+			CloseDocWindow(GetWndNum(hwnd));
+			pobj_nv->bMDIZoomed=IsZoomed(hwnd);
+			i=DefMDIChildProc(hwnd,message,wParam,lParam);
+
+			//メニュー状態を設定
+			ResetState_DocMenu();
+
+			return i;
+	}
+	return DefMDIChildProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/RadSupport.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/RadSupport.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/RadSupport.cpp	(revision 774)
@@ -0,0 +1,378 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+#if defined(JPN)
+//日本語
+#include "rad_msg_jpn.h"
+#else
+//英語
+#include "rad_msg_eng.h"
+#endif
+
+HRESULT ApplyDialogTexture( HWND );
+
+int bSupportDlg_NoChange;
+
+LRESULT CALLBACK TestWindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_CREATE:
+			SetPosCenter(hwnd);
+			break;
+		case WM_KEYDOWN:
+			if(wParam==VK_ESCAPE) DestroyWindow(hwnd);
+			break;
+		case WM_PAINT:
+			break;
+		case WM_CLOSE:
+			DestroyWindow(hwnd);
+			break;
+		case WM_DESTROY:
+			PostQuitMessage(0);
+			break;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+void ShowTestWindow(int WndInfoNum){
+	extern HINSTANCE hInst;
+	extern HANDLE hHeap;
+	static HWND hWnd;
+	HWND hChild;
+	HFONT *lphFont;
+	HANDLE *lphImage;
+	int i2;
+	char temporary[MAX_PATH];
+
+	if(hWnd){
+		OpenIcon(hWnd);
+
+		_endthread();
+		return;
+	}
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	if(pWindowInfo->GetStyle()&WS_CHILD){
+		//"チャイルドウィンドウをテスト表示することはできません"
+		MessageBox(hOwner,STRING_RAD_ERROR_CANT_CHILDTEST,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+
+		_endthread();
+		return;
+	}
+
+	lphFont=(HFONT *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,pWindowInfo->childWindowInfos.size()*sizeof(DWORD));
+	lphImage=(HANDLE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,pWindowInfo->childWindowInfos.size()*sizeof(DWORD));
+
+	//テスト用のメインウィンドウを作成
+	hWnd=CreateWindowEx(pWindowInfo->GetExStyle(),
+		"TestWindow",
+		pWindowInfo->GetName().c_str(),
+		pWindowInfo->GetStyle()|WS_VISIBLE,
+		CW_USEDEFAULT,CW_USEDEFAULT,
+		pWindowInfo->size.cx,pWindowInfo->size.cy,
+		hOwner,NULL,hInst,NULL);
+
+	//子ウィンドウ作成
+	for( i2=0; i2<static_cast<int>(pWindowInfo->childWindowInfos.size()); i2++ )
+	{
+		if(pWindowInfo->childWindowInfos[i2]->Control==CT_UPDOWN){
+			CreateUpDownControl(
+				pWindowInfo->childWindowInfos[i2]->GetStyle(),
+				pWindowInfo->childWindowInfos[i2]->pos.x,pWindowInfo->childWindowInfos[i2]->pos.y,
+				pWindowInfo->childWindowInfos[i2]->size.cx,pWindowInfo->childWindowInfos[i2]->size.cy,
+				hWnd,0,hInst,
+				0,0,100,0);
+		}
+		else{
+			GetItemClassName(temporary,pWindowInfo->childWindowInfos[i2]->Control);
+			hChild=CreateWindowEx(
+				pWindowInfo->childWindowInfos[i2]->GetExStyle(),
+				temporary,
+				pWindowInfo->childWindowInfos[i2]->GetCaption().c_str(),
+				pWindowInfo->childWindowInfos[i2]->GetStyle(),
+				pWindowInfo->childWindowInfos[i2]->pos.x,
+				pWindowInfo->childWindowInfos[i2]->pos.y,
+				pWindowInfo->childWindowInfos[i2]->size.cx,
+				pWindowInfo->childWindowInfos[i2]->size.cy,
+				hWnd,0,hInst,0);
+
+			lphFont[i2]=CreateFontIndirect(&pWindowInfo->LogFont);
+			SendMessage(hChild,WM_SETFONT,(long)lphFont[i2],0);
+
+			if(pWindowInfo->childWindowInfos[i2]->Control==CT_IMAGEBOX){
+				///////////////////////////
+				// イメージ ボックスの場合
+				///////////////////////////
+				if((pWindowInfo->childWindowInfos[i2]->GetStyle()&0x000F)==SS_ICON){
+					if(pWindowInfo->childWindowInfos[i2]->image.IsFile())
+					{
+						lstrcpy(temporary,pWindowInfo->childWindowInfos[i2]->image.path.c_str());
+					}
+					else
+					{
+						temporary[0] = 0;
+						BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+						{
+							if( resourceItem.idName == pWindowInfo->childWindowInfos[i2]->image.path )
+							{
+								lstrcpy( temporary, resourceItem.filepath.c_str() );
+								break;
+							}
+						}
+					}
+					if(temporary[0]){
+						lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+						lphImage[i2]=LoadImage(hInst,temporary,IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+						SendMessage(hChild,STM_SETICON,(long)lphImage[i2],0);
+					}
+				}
+				else if((pWindowInfo->childWindowInfos[i2]->GetStyle()&0x000F)==SS_BITMAP){
+					if(pWindowInfo->childWindowInfos[i2]->image.IsFile())
+					{
+						lstrcpy(temporary,pWindowInfo->childWindowInfos[i2]->image.path.c_str());
+					}
+					else
+					{
+						temporary[0] = 0;
+						BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+						{
+							if( resourceItem.idName == pWindowInfo->childWindowInfos[i2]->image.path )
+							{
+								lstrcpy( temporary, resourceItem.filepath.c_str() );
+								break;
+							}
+						}
+					}
+					if(temporary[0]){
+						lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+						lphImage[i2]=LoadImage(hInst,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
+
+						SendMessage(hChild,STM_SETIMAGE,IMAGE_BITMAP,(long)lphImage[i2]);
+					}
+				}
+			}
+		}
+	}
+
+	MSG msg;
+	while(GetMessage(&msg,NULL,0,0)){
+		if(IsDialogMessage(hWnd,&msg)) continue;
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+
+	//フォントハンドルを破棄
+	for(i2=0;i2<static_cast<int>(pWindowInfo->childWindowInfos.size());i2++){
+		if(lphFont[i2]) DeleteObject(lphFont[i2]);
+	}
+	HeapDefaultFree(lphFont);
+
+	//イメージハンドルを破棄
+	for(i2=0;i2<static_cast<int>(pWindowInfo->childWindowInfos.size());i2++){
+		if(lphImage[i2]){
+			if((pWindowInfo->childWindowInfos[i2]->GetStyle()&0x000F)==SS_ICON)
+				DestroyIcon((HICON)lphImage[i2]);
+			else if((pWindowInfo->childWindowInfos[i2]->GetStyle()&0x000F)==SS_BITMAP)
+				DeleteObject(lphImage[i2]);
+		}
+	}
+	HeapDefaultFree(lphImage);
+
+	hWnd=0;
+
+	_endthread();
+}
+
+void SetSupportDlgData(int WndNum, const ActiveBasic::PM::WindowInfo &windowInfo )
+{
+	////////////////////////////////////
+	// サポートダイアログの内容をセット
+	////////////////////////////////////
+	extern RADINFO RadInfo;
+	char temporary[255];
+	HWND hSupport;
+
+	bSupportDlg_NoChange=1;
+
+	hSupport=MdiInfo[WndNum]->MdiRadInfo->hSupport;
+
+	if(RadInfo.NowDragging>=FRAME_CHANGEPOS_START&&RadInfo.NowDragging<=FRAME_CHANGEPOS_END&&
+		(!(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]!=-1&&MdiInfo[WndNum]->MdiRadInfo->SelectingItem[1]!=-1))){
+		sprintf(temporary,"%d",RadInfo.DraggingRect[0].left-MdiInfo[WndNum]->MdiRadInfo->ClientPos.x);
+		SetDlgItemText(hSupport,IDC_XPOS,temporary);
+
+		sprintf(temporary,"%d",RadInfo.DraggingRect[0].top-MdiInfo[WndNum]->MdiRadInfo->ClientPos.y);
+		SetDlgItemText(hSupport,IDC_YPOS,temporary);
+
+		sprintf(temporary,"%d",RadInfo.DraggingRect[0].right-RadInfo.DraggingRect[0].left);
+		SetDlgItemText(hSupport,IDC_WIDTH,temporary);
+
+		sprintf(temporary,"%d",RadInfo.DraggingRect[0].bottom-RadInfo.DraggingRect[0].top);
+		SetDlgItemText(hSupport,IDC_HEIGHT,temporary);
+	}
+	else if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+		EnableWindow(GetDlgItem(hSupport,IDC_XPOS),0);
+		EnableWindow(GetDlgItem(hSupport,IDC_YPOS),0);
+		EnableWindow(GetDlgItem(hSupport,IDC_SPIN1),0);
+		EnableWindow(GetDlgItem(hSupport,IDC_SPIN2),0);
+		EnableWindow(GetDlgItem(hSupport,IDC_SPIN3),1);
+		EnableWindow(GetDlgItem(hSupport,IDC_SPIN4),1);
+
+		SetDlgItemText(hSupport,IDC_XPOS,"");
+		SetDlgItemText(hSupport,IDC_YPOS,"");
+
+		sprintf(temporary,"%d",windowInfo.size.cx);
+		SetDlgItemText(hSupport,IDC_WIDTH,temporary);
+
+		sprintf(temporary,"%d",windowInfo.size.cy);
+		SetDlgItemText(hSupport,IDC_HEIGHT,temporary);
+	}
+	else{
+		EnableWindow(GetDlgItem(hSupport,IDC_XPOS),1);
+		EnableWindow(GetDlgItem(hSupport,IDC_YPOS),1);
+
+		if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[1]!=-1){
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN1),0);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN2),0);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN3),0);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN4),0);
+
+			SetDlgItemText(hSupport,IDC_XPOS,"");
+			SetDlgItemText(hSupport,IDC_YPOS,"");
+			SetDlgItemText(hSupport,IDC_WIDTH,"");
+			SetDlgItemText(hSupport,IDC_HEIGHT,"");
+		}
+		else{
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN1),1);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN2),1);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN3),1);
+			EnableWindow(GetDlgItem(hSupport,IDC_SPIN4),1);
+
+			sprintf(temporary,"%d",windowInfo.childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.x);
+			SetDlgItemText(hSupport,IDC_XPOS,temporary);
+
+			sprintf(temporary,"%d",windowInfo.childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.y);
+			SetDlgItemText(hSupport,IDC_YPOS,temporary);
+
+			sprintf(temporary,"%d",windowInfo.childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cx);
+			SetDlgItemText(hSupport,IDC_WIDTH,temporary);
+
+			sprintf(temporary,"%d",windowInfo.childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cy);
+			SetDlgItemText(hSupport,IDC_HEIGHT,temporary);
+		}
+	}
+
+	bSupportDlg_NoChange=0;
+}
+
+INT_PTR CALLBACK DlgRadSupport(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static BOOL bTimer;
+	int i,i3;
+	char temporary[255];
+	POINTANDSIZE PointAndSize;
+	RECT rect;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SendDlgItemMessage(hwnd,IDC_SPIN1,UDM_SETBUDDY,(LONG_PTR)GetDlgItem(hwnd,IDC_XPOS),0);
+			SendDlgItemMessage(hwnd,IDC_SPIN2,UDM_SETBUDDY,(LONG_PTR)GetDlgItem(hwnd,IDC_YPOS),0);
+			SendDlgItemMessage(hwnd,IDC_SPIN3,UDM_SETBUDDY,(LONG_PTR)GetDlgItem(hwnd,IDC_WIDTH),0);
+			SendDlgItemMessage(hwnd,IDC_SPIN4,UDM_SETBUDDY,(LONG_PTR)GetDlgItem(hwnd,IDC_HEIGHT),0);
+
+			SendDlgItemMessage(hwnd,IDC_SPIN1,UDM_SETRANGE32,0,0x7FFF);
+			SendDlgItemMessage(hwnd,IDC_SPIN2,UDM_SETRANGE32,0,0x7FFF);
+			SendDlgItemMessage(hwnd,IDC_SPIN3,UDM_SETRANGE32,0,0x7FFF);
+			SendDlgItemMessage(hwnd,IDC_SPIN4,UDM_SETRANGE32,0,0x7FFF);
+
+			ApplyDialogTexture(hwnd);
+			return 0;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_TEST:
+					_beginthread(
+						(void (__cdecl *)(void *))ShowTestWindow,
+						0,
+						(void *)GetWndInfoNum(MdiInfo[GetWndNum(GetParent(hwnd))]->path));
+					return 1;
+				case IDC_XPOS:
+				case IDC_YPOS:
+				case IDC_WIDTH:
+				case IDC_HEIGHT:
+					if(HIWORD(wParam)==EN_UPDATE){
+						if(bSupportDlg_NoChange) return 1;
+
+						if(bTimer) KillTimer(hwnd,0);
+
+						bTimer=1;
+						SetTimer(hwnd,0,650,NULL);
+					}
+					return 1;
+			}
+			break;
+		case WM_TIMER:
+			KillTimer(hwnd,0);
+			bTimer=0;
+
+			i=GetWndNum(GetParent(hwnd));
+			ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+			for(i3=0;;i3++){
+				if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+				PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos;
+				PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size;
+				Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[i3],(DWORD)&PointAndSize);
+			}
+
+			GetDlgItemText(hwnd,IDC_XPOS,temporary,255);
+			if(temporary[0]){
+				for(i3=0;;i3++){
+					if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+					pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.x=atol(temporary);
+				}
+			}
+
+			GetDlgItemText(hwnd,IDC_YPOS,temporary,255);
+			if(temporary[0]){
+				for(i3=0;;i3++){
+					if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+					pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->pos.y=atol(temporary);
+				}
+			}
+
+			GetDlgItemText(hwnd,IDC_WIDTH,temporary,255);
+			if(temporary[0]){
+				if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+					pWindowInfo->size.cx=atol(temporary);
+				else{
+					for(i3=0;;i3++){
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cx=atol(temporary);
+					}
+				}
+			}
+
+			GetDlgItemText(hwnd,IDC_HEIGHT,temporary,255);
+			if(temporary[0]){
+				if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+					pWindowInfo->size.cy=atol(temporary);
+				else{
+					for(i3=0;;i3++){
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[i3]==-1) break;
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[i3]]->size.cy=atol(temporary);
+					}
+				}
+			}
+
+			//描画
+			DrawRadWindow(i,pWindowInfo);
+
+			//スクロールバーをリセット
+			GetClientRect(MdiInfo[i]->MdiRadInfo->hRad,&rect);
+			ResetScrollbarOfRadEditor(i,rect.right,rect.bottom);
+
+			return 1;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/RadToolsAndPropertyProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/RadToolsAndPropertyProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/RadToolsAndPropertyProc.cpp	(revision 774)
@@ -0,0 +1,4702 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+#if defined(JPN)
+//日本語
+#include "rad_msg_jpn.h"
+#else
+//英語
+#include "rad_msg_eng.h"
+#endif
+
+HRESULT ApplyDialogTexture( HWND );
+
+void ShowControlAdvice(int Control){
+	if(Control==IDC_TOOL_MOUSE) SetStatusText("");
+
+#if defined(JPN)
+	//日本語
+	else if(Control==IDC_TOOL_BUTTON) SetStatusText("[ボタン] クリックすることができるボタンです。");
+	else if(Control==IDC_TOOL_CHECKBOX) SetStatusText("[チェック ボックス] ON/OFFの設定ができるボタンです。");
+	else if(Control==IDC_TOOL_COMBOBOX) SetStatusText("[コンボ ボックス] ドロップダウン リストの中から項目を選択することができます。");
+	else if(Control==IDC_TOOL_EDIT) SetStatusText("[エディット ボックス] ユーザーが文字列の編集操作を行うことができます。");
+	else if(Control==IDC_TOOL_GROUPBOX) SetStatusText("[グループ ボックス] 複数のコントロールを囲むことができます。");
+	else if(Control==IDC_TOOL_HSCROLLBAR) SetStatusText("[水平スクロールバー] 現在位置を表示、設定します。");
+	else if(Control==IDC_TOOL_IMAGEBOX) SetStatusText("[イメージ ボックス] 四角形やビットマップ、アイコンを表示します。");
+	else if(Control==IDC_TOOL_LISTBOX) SetStatusText("[リスト ボックス] 複数の項目を表示、選択できるリストです。");
+	else if(Control==IDC_TOOL_LISTVIEW) SetStatusText("[リスト ビュー] リスト ボックス内にアイコンやテキストを並べて表示するビューです。");
+	else if(Control==IDC_TOOL_PROGRESSBAR) SetStatusText("[プログレス バー] 進行状況を表示するバー。");
+	else if(Control==IDC_TOOL_RADIOBUTTON) SetStatusText("[ラジオ ボタン] 複数の項目から１つを選択するボタンです。");
+	else if(Control==IDC_TOOL_STATIC) SetStatusText("[スタティック テキスト] テキストを表示します。");
+	else if(Control==IDC_TOOL_TRACKBAR) SetStatusText("[トラック バー] 目盛が付いた移動バー。");
+	else if(Control==IDC_TOOL_TREEVIEW) SetStatusText("[ツリー ビュー] リストを階層構造で表示します。");
+	else if(Control==IDC_TOOL_UPDOWN) SetStatusText("[アップ ダウン コントロール] 上下のボタンで数値を設定します。");
+	else if(Control==IDC_TOOL_VSCROLLBAR) SetStatusText("[垂直スクロールバー] 現在位置を表示、設定します。");
+#else
+	//英語
+	else if(Control==IDC_TOOL_BUTTON) SetStatusText("[Button] The button which can be clicked");
+	else if(Control==IDC_TOOL_CHECKBOX) SetStatusText("[CheckBox] The button which can switch on/off");
+	else if(Control==IDC_TOOL_COMBOBOX) SetStatusText("[ComboBox] Choose an item from drop down lists");
+	else if(Control==IDC_TOOL_EDIT) SetStatusText("[EditBox] A user can edit a character sequence");
+	else if(Control==IDC_TOOL_GROUPBOX) SetStatusText("[GroupBox] Two or more control can be packed");
+	else if(Control==IDC_TOOL_HSCROLLBAR) SetStatusText("[Horizontal Scrollbar] The present position is displayed and setup");
+	else if(Control==IDC_TOOL_IMAGEBOX) SetStatusText("[ImageBox] A rectangle, a bitmap, and an icon are displayed.");
+	else if(Control==IDC_TOOL_LISTBOX) SetStatusText("[ListBox] The list which can display and choose two or more items");
+	else if(Control==IDC_TOOL_LISTVIEW) SetStatusText("[ListView] The view which displays an icon and a text in a list box");
+	else if(Control==IDC_TOOL_PROGRESSBAR) SetStatusText("[Progressbar] The bar which displays an advance situation");
+	else if(Control==IDC_TOOL_RADIOBUTTON) SetStatusText("[RadioButton] The button which chooses one from two or more items");
+	else if(Control==IDC_TOOL_STATIC) SetStatusText("[StaticText] Display the text messages");
+	else if(Control==IDC_TOOL_TRACKBAR) SetStatusText("[Trackbar] The bar to which the scale was attached");
+	else if(Control==IDC_TOOL_TREEVIEW) SetStatusText("[TreeView] Lists are displayed by the layered structure");
+	else if(Control==IDC_TOOL_UPDOWN) SetStatusText("[Up/Down Control] A numerical value is set up with a up/down button");
+	else if(Control==IDC_TOOL_VSCROLLBAR) SetStatusText("[Vertical Scrollbar] The present position is displayed and setup");
+#endif
+}
+
+char *GetControlName(DWORD id){
+	char *pTemp;
+	pTemp="";
+
+#if defined(JPN)
+	//日本語
+	if(id==IDC_TOOL_MOUSE) pTemp="選択";
+	else if(id==IDC_TOOL_STATIC) pTemp="スタティック テキスト";
+	else if(id==IDC_TOOL_EDIT) pTemp="エディット ボックス";
+	else if(id==IDC_TOOL_GROUPBOX) pTemp="グループ ボックス";
+	else if(id==IDC_TOOL_COMBOBOX) pTemp="コンボ ボックス";
+	else if(id==IDC_TOOL_LISTBOX) pTemp="リスト ボックス";
+	else if(id==IDC_TOOL_BUTTON) pTemp="ボタン";
+	else if(id==IDC_TOOL_CHECKBOX) pTemp="チェック ボックス";
+	else if(id==IDC_TOOL_RADIOBUTTON) pTemp="ラジオ ボタン";
+	else if(id==IDC_TOOL_LISTVIEW) pTemp="リスト ビュー";
+	else if(id==IDC_TOOL_TREEVIEW) pTemp="ツリー ビュー";
+	else if(id==IDC_TOOL_HSCROLLBAR) pTemp="水平スクロール バー";
+	else if(id==IDC_TOOL_VSCROLLBAR) pTemp="垂直スクロール バー";
+	else if(id==IDC_TOOL_UPDOWN) pTemp="アップ ダウン コントロール";
+	else if(id==IDC_TOOL_IMAGEBOX) pTemp="イメージ ボックス";
+	else if(id==IDC_TOOL_TRACKBAR) pTemp="トラック バー";
+	else if(id==IDC_TOOL_PROGRESSBAR) pTemp="プログレス バー";
+#else
+	//英語
+	if(id==IDC_TOOL_MOUSE) pTemp="Tool";
+	else if(id==IDC_TOOL_STATIC) pTemp="StaticText";
+	else if(id==IDC_TOOL_EDIT) pTemp="EditBox";
+	else if(id==IDC_TOOL_GROUPBOX) pTemp="GroupBox";
+	else if(id==IDC_TOOL_COMBOBOX) pTemp="ComboBox";
+	else if(id==IDC_TOOL_LISTBOX) pTemp="ListBox";
+	else if(id==IDC_TOOL_BUTTON) pTemp="Button";
+	else if(id==IDC_TOOL_CHECKBOX) pTemp="CheckBox";
+	else if(id==IDC_TOOL_RADIOBUTTON) pTemp="RadioButton";
+	else if(id==IDC_TOOL_LISTVIEW) pTemp="ListView";
+	else if(id==IDC_TOOL_TREEVIEW) pTemp="TreeView";
+	else if(id==IDC_TOOL_HSCROLLBAR) pTemp="Horizontal Scrollbar";
+	else if(id==IDC_TOOL_VSCROLLBAR) pTemp="Vertical Scrollbar";
+	else if(id==IDC_TOOL_UPDOWN) pTemp="Up/Down Control";
+	else if(id==IDC_TOOL_IMAGEBOX) pTemp="ImageBox";
+	else if(id==IDC_TOOL_TRACKBAR) pTemp="Trackbar";
+	else if(id==IDC_TOOL_PROGRESSBAR) pTemp="Progressbar";
+#endif
+
+	return pTemp;
+}
+INT_PTR CALLBACK RadToolButtonsProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,WndNum;
+	HWND hParent;
+	HWND hToolBar;
+	RECT rect;
+	TBBUTTON CtrlToolBar[]={
+		{0,IDC_TOOL_MOUSE,TBSTATE_ENABLED|TBSTATE_WRAP|TBSTATE_CHECKED,TBSTYLE_CHECKGROUP,0,0},
+		{1,IDC_TOOL_STATIC,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{2,IDC_TOOL_EDIT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{3,IDC_TOOL_GROUPBOX,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{BMPNUM_RADTOOLBAR-1,0,TBSTATE_INDETERMINATE,TBSTYLE_CHECKGROUP,0,0},
+		{4,IDC_TOOL_COMBOBOX,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{5,IDC_TOOL_LISTBOX,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{6,IDC_TOOL_BUTTON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{7,IDC_TOOL_CHECKBOX,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{8,IDC_TOOL_RADIOBUTTON,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{BMPNUM_RADTOOLBAR-1,0,TBSTATE_INDETERMINATE,TBSTYLE_CHECKGROUP,0,0},
+		{9,IDC_TOOL_LISTVIEW,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{10,IDC_TOOL_TREEVIEW,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{11,IDC_TOOL_HSCROLLBAR,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{12,IDC_TOOL_VSCROLLBAR,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{13,IDC_TOOL_UPDOWN,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{BMPNUM_RADTOOLBAR-1,0,TBSTATE_INDETERMINATE,TBSTYLE_CHECKGROUP,0,0},
+		{14,IDC_TOOL_IMAGEBOX,TBSTATE_ENABLED|TBSTATE_WRAP,TBSTYLE_CHECKGROUP,0,0},
+		{15,IDC_TOOL_TRACKBAR,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+		{16,IDC_TOOL_PROGRESSBAR,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0},
+	};
+	TOOLTIPTEXT *pTipText;
+
+	switch(message){
+		case WM_INITDIALOG:
+			hToolBar=CreateToolbarEx(hwnd,WS_CHILD|WS_VISIBLE|CCS_NODIVIDER|TBSTYLE_FLAT|TBSTYLE_TOOLTIPS,
+				NULL,
+				BMPNUM_RADTOOLBAR,	/*ビットマップの個数*/
+				hResInst,(unsigned int)MAKEINTRESOURCE(IDR_CONTROL),CtrlToolBar,
+				(BMPNUM_RADTOOLBAR-1)+SEPNUM_RADTOOLBAR,	/*アイテムの個数*/
+				0,0,16,15,sizeof(TBBUTTON));
+
+			//Windows9x系OSでの不具合を防ぐため
+			PostMessage(hwnd,WM_USER+120,0,0);
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_USER+120:
+			GetClientRect(hwnd,&rect);
+			MoveWindow(hwnd,5,22,rect.right,rect.bottom,1);
+			MoveWindow(GetWindow(hwnd,GW_CHILD),0,0,rect.right,rect.bottom,1);
+			return 1;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_TOOL_MOUSE:
+					ShowControlAdvice(LOWORD(wParam));
+					hParent=GetParent(GetParent(hwnd));
+					BringWindowToTop(hParent);
+					i=GetWndNum(hParent);
+					i2=GetWndInfoNum(MdiInfo[i]->path);
+					MdiInfo[i]->MdiRadInfo->ButtonSelect=IDC_TOOL_MOUSE;
+					DrawSelectingRect(MdiInfo[i]->MdiRadInfo->hRad,i,i2,IDC_TOOL_MOUSE);
+					SetFocus(MdiInfo[i]->MdiRadInfo->hRad);
+					return 1;
+				case IDC_TOOL_BUTTON:
+				case IDC_TOOL_CHECKBOX:
+				case IDC_TOOL_COMBOBOX:
+				case IDC_TOOL_EDIT:
+				case IDC_TOOL_GROUPBOX:
+				case IDC_TOOL_HSCROLLBAR:
+				case IDC_TOOL_IMAGEBOX:
+				case IDC_TOOL_LISTBOX:
+				case IDC_TOOL_LISTVIEW:
+				case IDC_TOOL_PROGRESSBAR:
+				case IDC_TOOL_RADIOBUTTON:
+				case IDC_TOOL_STATIC:
+				case IDC_TOOL_TRACKBAR:
+				case IDC_TOOL_TREEVIEW:
+				case IDC_TOOL_UPDOWN:
+				case IDC_TOOL_VSCROLLBAR:
+					ShowControlAdvice(LOWORD(wParam));
+					hParent=GetParent(GetParent(hwnd));
+					BringWindowToTop(hParent);
+					WndNum=GetWndNum(hParent);
+					MdiInfo[WndNum]->MdiRadInfo->ButtonSelect=LOWORD(wParam);
+					InvalidateRect(MdiInfo[WndNum]->MdiRadInfo->hRad,NULL,0);
+					return 1;
+			}
+			break;
+		case WM_NOTIFY:
+			pTipText=(TOOLTIPTEXT *)lParam;
+			if(pTipText->hdr.code==TTN_NEEDTEXT){
+				//ステータスバーに説明文を表示
+				ShowControlAdvice(pTipText->hdr.idFrom);
+
+				//コントロール名を取得し、ツールヒントとして表示する
+				pTipText->lpszText=GetControlName(pTipText->hdr.idFrom);
+			}
+			break;
+	}
+	return 0;
+}
+LRESULT CALLBACK RadToolsWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HFONT hStatusFont;
+	int i;
+	RECT rect;
+	SCROLLINFO ScrollInfo;
+	HDC hdc;
+	PAINTSTRUCT ps;
+	HFONT hOldFont;
+	POINT pos;
+
+	switch(message){
+		case WM_CREATE:
+			CreateDialog(hResInst,MAKEINTRESOURCE(IDD_RAD_CTRLBUTTONS),hwnd,(DLGPROC)RadToolButtonsProc);
+			return 0;
+		case WM_VSCROLL:
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(LOWORD(wParam)==SB_LINEUP) i=-20;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=20;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-ScrollInfo.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-ScrollInfo.nPos,min(i,ScrollInfo.nMax-rect.bottom-ScrollInfo.nPos));
+			if(i!=0){
+				ScrollInfo.nPos+=i;
+				SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+				ScrollWindow(hwnd,0,-i,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_SIZE:
+			GetClientRect(GetWindow(hwnd,GW_CHILD),&rect);
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
+
+			//垂直スクロールバーの設定
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			ScrollInfo.nMin=0;
+			ScrollInfo.nMax=rect.bottom;
+			ScrollInfo.nPage=HIWORD(lParam);
+			SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+
+			i=ScrollInfo.nPos;
+			ScrollInfo.fMask=SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(i>ScrollInfo.nPos){
+				ScrollWindow(hwnd,0,i-ScrollInfo.nPos,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_PAINT:
+			hdc=BeginPaint(hwnd,&ps);
+			hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+			SetBkMode(hdc,TRANSPARENT);
+			pos.x=30;
+			pos.y=3;
+			CursorPos_GlobalToLocal(hwnd,&pos.x,&pos.y);
+#if defined(JPN)
+			//日本語
+			TextOut(hdc,pos.x,pos.y,"- コントロール -",lstrlen("- コントロール -"));
+#else
+			//英語
+			TextOut(hdc,pos.x,pos.y,"-   Control   -",lstrlen("-   Control   -"));
+#endif
+			SelectObject(hdc,hOldFont);
+			EndPaint(hwnd,&ps);
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+
+/////////////////////////
+//ウィンドウ プロパティ
+
+void RadProperty_Window_Caption_StylingOrder(HWND hwnd,DWORD *style){
+	if((*style&WS_CAPTION)==WS_CAPTION){
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_SYSMENU),1);
+		if(!(*style&WS_CHILD)){
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZEBOX),1);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZEBOX),1);
+		}
+		if(SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_GETCURSEL,0,0)==0){
+			if(*style&WS_THICKFRAME) SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_SETCURSEL,2,0);
+			else SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_SETCURSEL,1,0);
+		}
+	}
+	else{
+		*style&=~(WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX);
+		SendDlgItemMessage(hwnd,IDC_STYLE_SYSMENU,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZEBOX,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZEBOX,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_SYSMENU),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZEBOX),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZEBOX),0);
+	}
+}
+void RadProperty_Window_Border_StylingOrder(HWND hwnd,DWORD *style){
+	if(*style&(WS_BORDER|WS_THICKFRAME)){
+		if(*style&(WS_POPUP|WS_CHILD)) EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),1);
+		else{
+			*style|=WS_CAPTION;
+			SendDlgItemMessage(hwnd,IDC_STYLE_CAPTION,BM_SETCHECK,BST_CHECKED,0);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),0);
+		}
+	}
+	else{
+		*style&=~WS_CAPTION;
+		SendDlgItemMessage(hwnd,IDC_STYLE_CAPTION,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),0);
+	}
+	RadProperty_Window_Caption_StylingOrder(hwnd,style);
+}
+void RadProperty_Window_Window_StylingOrder(HWND hwnd,DWORD *style){
+	if(*style&WS_POPUP){
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZEBOX),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZEBOX),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZE),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZE),1);
+	}
+	else if(*style&WS_CHILD){
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),1);
+
+		*style&=~(WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZE|WS_MAXIMIZE);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZEBOX,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZEBOX,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZE,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZE,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZEBOX),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZEBOX),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZE),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZE),0);
+	}
+	else{
+		if(*style&WS_BORDER){
+			*style|=WS_CAPTION;
+			SendDlgItemMessage(hwnd,IDC_STYLE_CAPTION,BM_SETCHECK,BST_CHECKED,0);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_CAPTION),0);
+
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZEBOX),1);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZEBOX),1);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MINIMIZE),1);
+			EnableWindow(GetDlgItem(hwnd,IDC_STYLE_MAXIMIZE),1);
+		}
+	}
+	RadProperty_Window_Border_StylingOrder(hwnd,style);
+}
+INT_PTR CALLBACK DlgRadProperty_Window_Rename(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HWND hClient,hOwner;
+	int i,i3;
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+				i=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				SetDlgItemText(hwnd,IDC_WINDOWNAME,pWindowInfo->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_WINDOWHANDLE,( "h" + pWindowInfo->GetName() ).c_str());
+				SetDlgItemText(hwnd,IDC_WINDOWPROC,( pWindowInfo->GetName() + "Proc" ).c_str());
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					{
+						if(GetWindowTextLength(GetDlgItem(hwnd,IDC_WINDOWNAME))==0){
+							//MsgBox "ウィンドウ識別名を入力して下さい。"
+							MessageBox(hOwner,STRING_WINDOW_RENAME_MUST_WINDOWNAME,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+							break;
+						}
+						if(GetWindowTextLength(GetDlgItem(hwnd,IDC_WINDOWHANDLE))==0){
+							//MsgBox "ハンドル名を入力して下さい。"
+							MessageBox(hOwner,STRING_WINDOW_RENAME_MUST_HANDLENAME,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+							break;
+						}
+						if(GetWindowTextLength(GetDlgItem(hwnd,IDC_WINDOWPROC))==0){
+							//MsgBox "プロシージャ名を入力して下さい。"
+							MessageBox(hOwner,STRING_WINDOW_RENAME_MUST_PROCEDURENAME,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+							break;
+						}
+
+						i=GetWndNum(GetWindow(hClient,GW_CHILD));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						RAD_UNDOSTATE_NAME names,NoticeNames;
+
+						i3=GetWindowTextLength(GetDlgItem(hwnd,IDC_WINDOWNAME))+1;
+						GetDlgItemText(hwnd,IDC_WINDOWNAME,temporary,i3);
+						names.name = temporary;
+
+						if( names.name == pWindowInfo->GetName() )
+						{
+							SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+							return 1;
+						}
+
+						//MsgBox "これらのウィンドウ識別名を変更すると、ソースコード内の識別子は手動で変換する必要があります。変更しますか？"
+						if(IDCANCEL==MessageBox(hwnd,STRING_WINDOW_RENAME_CHECK,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) return 1;
+
+						//変更情報を更新
+						NoticeNames.name=pWindowInfo->GetName();
+						Rad_NoticeChanging(i,RAD_UNDO_NAME,SELECT_WINDOW,(DWORD)&NoticeNames);
+
+						pWindowInfo->SetName( names.name );
+						MdiInfo[i]->path = names.name;
+
+						EndDialog(hwnd,1);
+						return 1;
+					}
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+				case IDC_WINDOWNAME:
+					{
+						GetDlgItemText(hwnd,IDC_WINDOWNAME,temporary,MAX_PATH);
+						if(temporary[0]){
+							sprintf(temp2,"h%s",temporary);
+							SetDlgItemText(hwnd,IDC_WINDOWHANDLE,temp2);
+							sprintf(temp2,"%sProc",temporary);
+							SetDlgItemText(hwnd,IDC_WINDOWPROC,temp2);
+						}
+						else{
+							SetDlgItemText(hwnd,IDC_WINDOWHANDLE,"");
+							SetDlgItemText(hwnd,IDC_WINDOWPROC,"");
+						}
+					}
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgRadProperty_Window_ExStyle(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+				i=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				if(pWindowInfo->GetExStyle()&WS_EX_TOPMOST) SendDlgItemMessage(hwnd,IDC_EXSTYLE_TOPMOST,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_ACCEPTFILES) SendDlgItemMessage(hwnd,IDC_EXSTYLE_ACCEPTFILES,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_TRANSPARENT) SendDlgItemMessage(hwnd,IDC_EXSTYLE_TRANSPARENT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_TOOLWINDOW) SendDlgItemMessage(hwnd,IDC_EXSTYLE_TOOLWINDOW,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_CLIENTEDGE) SendDlgItemMessage(hwnd,IDC_EXSTYLE_CLIENTEDGE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_STATICEDGE) SendDlgItemMessage(hwnd,IDC_EXSTYLE_STATICEDGE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_NOPARENTNOTIFY) SendDlgItemMessage(hwnd,IDC_EXSTYLE_NOPARENTNOTIFY,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_CONTEXTHELP) SendDlgItemMessage(hwnd,IDC_EXSTYLE_CONTEXTHELP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetExStyle()&WS_EX_CONTROLPARENT) SendDlgItemMessage(hwnd,IDC_EXSTYLE_CONTROLPARENT,BM_SETCHECK,BST_CHECKED,0);
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					{
+						i=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+						DWORD style;
+						style=0;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_TOPMOST,BM_GETCHECK,0,0))
+							style|=WS_EX_TOPMOST;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_ACCEPTFILES,BM_GETCHECK,0,0))
+							style|=WS_EX_ACCEPTFILES;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_TRANSPARENT,BM_GETCHECK,0,0))
+							style|=WS_EX_TRANSPARENT;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_TOOLWINDOW,BM_GETCHECK,0,0))
+							style|=WS_EX_TOOLWINDOW;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_CLIENTEDGE,BM_GETCHECK,0,0))
+							style|=WS_EX_CLIENTEDGE;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_STATICEDGE,BM_GETCHECK,0,0))
+							style|=WS_EX_STATICEDGE;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_NOPARENTNOTIFY,BM_GETCHECK,0,0))
+							style|=WS_EX_NOPARENTNOTIFY;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_CONTEXTHELP,BM_GETCHECK,0,0))
+							style|=WS_EX_CONTEXTHELP;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_CONTROLPARENT,BM_GETCHECK,0,0))
+							style|=WS_EX_CONTROLPARENT;
+
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						if(style==pWindowInfo->GetExStyle()){
+							SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+							return 1;
+						}
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_EXSTYLE,SELECT_WINDOW,pWindowInfo->GetExStyle());
+
+						pWindowInfo->SetExStyle( style );
+						EndDialog(hwnd,1);
+						return 1;
+					}
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK RadProperty_WindowProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	int i,i3,i4;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_WINDOWNAME,pWindowInfo->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_HANDLE,pWindowInfo->GetHandleName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->GetCaption().c_str());
+
+				//"3D FACE（標準）"
+				SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_BGCOLOR1);
+				//"色指定"
+				SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_BGCOLOR2);
+
+				BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+				{
+					SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_ADDSTRING,0,(LPARAM)resourceItem.idName.c_str());
+				}
+				if( pWindowInfo->IsModalDlg() || pWindowInfo->IsModelessDlg() )
+				{
+					SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,0,0);
+					EnableWindow(GetDlgItem(hwnd,IDC_BGCOLOR),0);
+				}
+				else{
+					if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE){
+						//3DFACE
+						SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,0,0);
+					}
+					else if(pWindowInfo->GetBackgroundColor()<=0){
+						//色指定
+						SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,1,0);
+					}
+					else if(pWindowInfo->GetBackgroundColor()>=0x1000){
+						//ビットマップ指定
+						SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,2+pWindowInfo->GetBackgroundColor()-0x1000,0);
+					}
+				}
+
+
+				////////////
+				// メニュー
+				////////////
+
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_WINDOWMENU,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+
+				for(i3=0,i4=0;i3<projectInfo.NumberOfMenu;i3++){
+					if( pWindowInfo->HasMenu() )
+					{
+						if(lstrcmpi(projectInfo.pMenuInfo[i3].IdName,pWindowInfo->GetMenuIdName().c_str())==0)
+							i4=i3+1;
+					}
+					SendDlgItemMessage(hwnd,IDC_WINDOWMENU,CB_ADDSTRING,0,(LPARAM)projectInfo.pMenuInfo[i3].IdName);
+				}
+				if(i4==0&&pWindowInfo->HasMenu()){
+					//メニューが存在しない場合、無効にする
+					pWindowInfo->SetMenuIdName( "" );
+					DrawRadWindow(i,pWindowInfo);
+				}
+				SendDlgItemMessage(hwnd,IDC_WINDOWMENU,CB_SETCURSEL,i4,0);
+
+
+				////////////
+				// アイコン
+				////////////
+
+				//"Windowsロゴ（標準）"
+				SendDlgItemMessage(hwnd,IDC_ICONRES,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_ICONDEFAULT);
+
+				for(i3=0,i4=0;i3<static_cast<int>(projectInfo.resourceManager.iconResources.size());i3++){
+					SendDlgItemMessage(hwnd,IDC_ICONRES,CB_ADDSTRING,0,(LPARAM)projectInfo.resourceManager.iconResources[i3].idName.c_str());
+
+					if( pWindowInfo->HasIcon() )
+					{
+						if( projectInfo.resourceManager.iconResources[i3].idName == pWindowInfo->GetIconResourceName() )
+						{
+							i4=i3+1;
+						}
+					}
+				}
+				if( i4 == 0 && pWindowInfo->HasIcon() )
+				{
+					//アイコンが存在しない場合、無効にする
+					pWindowInfo->SetIconResourceName( "" );
+					DrawRadWindow(i,pWindowInfo);
+				}
+				SendDlgItemMessage(hwnd,IDC_ICONRES,CB_SETCURSEL,i4,0);
+
+
+				////////////
+				// スタイル
+				////////////
+
+				//"オーバーラップ"
+				SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_OVERLAPPED);
+				//"ポップアップ"
+				SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_POPUP);
+				//"チャイルド"
+				SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_CHILD);
+
+				if(pWindowInfo->GetStyle()&WS_POPUP) SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->GetStyle()&WS_CHILD) SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_SETCURSEL,0,0);
+
+				//"枠なし"
+				SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_FRAME_NONE);
+				//"細枠"
+				SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_FRAME_THICK);
+				//"サイズ変更枠"
+				SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_ADDSTRING,0,(LPARAM)STRING_WINDOWPROP_STYLE_FRAME_BORDER);
+
+				//WS_CAPTION（WS_BORDER含む）を考慮してWS_THICKFRAMEを最初に比較する
+				if(pWindowInfo->GetStyle()&WS_THICKFRAME) SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_SETCURSEL,2,0);
+				else if(pWindowInfo->GetStyle()&WS_BORDER) SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_SETCURSEL,1,0);
+				else SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->GetStyle()&WS_CAPTION) SendDlgItemMessage(hwnd,IDC_STYLE_CAPTION,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_SYSMENU) SendDlgItemMessage(hwnd,IDC_STYLE_SYSMENU,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_MINIMIZEBOX) SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZEBOX,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_MAXIMIZEBOX) SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZEBOX,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_MINIMIZE) SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_MAXIMIZE) SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_HSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLLBAR,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_VSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLLBAR,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_CLIPSIBLINGS) SendDlgItemMessage(hwnd,IDC_STYLE_CLIPSIBLINGS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_CLIPCHILDREN) SendDlgItemMessage(hwnd,IDC_STYLE_CLIPCHILDREN,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+
+				SetDlgItemText(hwnd,IDC_SETFONT,pWindowInfo->LogFont.lfFaceName);
+
+				DWORD tempStyle = pWindowInfo->GetStyle();
+				RadProperty_Window_Window_StylingOrder(hwnd,&tempStyle);
+				pWindowInfo->SetStyle( tempStyle );
+
+
+				//////////
+				//タイプ
+				if( pWindowInfo->IsDefaultWindow() )
+				{
+					SendDlgItemMessage(hwnd,IDC_DEFWINDOW,BM_SETCHECK,BST_CHECKED,0);
+				}
+				else if( pWindowInfo->IsModalDlg() )
+				{
+					SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_SETCHECK,BST_CHECKED,0);
+				}
+				else if( pWindowInfo->IsModelessDlg() )
+				{
+					SendDlgItemMessage(hwnd,IDC_MODELESSDLG,BM_SETCHECK,BST_CHECKED,0);
+				}
+				else
+				{
+					throw;
+				}
+
+
+				bInitial=0;
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_RENAMEWINDOW:
+					{
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_WINDOW_RENAME),hwnd,DlgRadProperty_Window_Rename)) return 1;
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+						SetDlgItemText(hwnd,IDC_WINDOWNAME,pWindowInfo->GetName().c_str());
+						SetDlgItemText(hwnd,IDC_HANDLE,pWindowInfo->GetHandleName().c_str());
+						return 1;
+					}
+				case IDC_RENAMECAPTION:
+					{
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_RENAMECAPTION),hwnd,DlgRadProperty_Item_RenameCaption)) return 1;
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+						SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->GetCaption().c_str());
+						return 1;
+					}
+				case IDC_SETFONT:
+					{
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+						LOGFONT lf;
+						lf=pWindowInfo->LogFont;
+						if(!SetFontDialog(hwnd,&pWindowInfo->LogFont,0)) return 1;
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_FONT,SELECT_WINDOW,(DWORD)&lf);
+
+						SetDlgItemText(hwnd,IDC_SETFONT,pWindowInfo->LogFont.lfFaceName);
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+				case IDC_BGCOLOR:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						i3=SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_GETCURSEL,0,0);
+						if(i3==0){
+							//3DFACE
+
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_BGCOLOR,SELECT_WINDOW,pWindowInfo->GetBackgroundColor());
+
+							pWindowInfo->SetBackgroundColor( COLOR_3DFACE );
+						}
+						else if(i3==1){
+							//色指定
+							CHOOSECOLOR cc;
+							COLORREF CusColors[16]={
+								RGB(255,255,255),
+								RGB(0,0,0),
+								RGB(128,128,128),
+								RGB(192,192,192),
+								RGB(128,0,0),
+								RGB(255,0,0),
+								RGB(128,128,0),
+								RGB(255,255,0),
+								RGB(0,128,0),
+								RGB(0,255,0),
+								RGB(0,128,128),
+								RGB(0,255,255),
+								RGB(0,0,128),
+								RGB(0,0,255),
+								RGB(128,0,128),
+								RGB(255,0,255)};
+							cc.lStructSize=sizeof(CHOOSECOLOR);
+							cc.hwndOwner=hwnd;
+							if(pWindowInfo->GetBackgroundColor()<=0)
+								cc.rgbResult=-pWindowInfo->GetBackgroundColor();
+							else cc.rgbResult=RGB(255,255,255);
+							cc.lpCustColors=CusColors;
+							cc.Flags=CC_RGBINIT|CC_FULLOPEN;
+							if(!ChooseColor(&cc)){
+								//キャンセル動作
+								if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE){
+									//3DFACE
+									SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,0,0);
+								}
+								else if(pWindowInfo->GetBackgroundColor()<=0){
+									//色指定
+									SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,1,0);
+								}
+								else if(pWindowInfo->GetBackgroundColor()>=0x1000){
+									//ビットマップ指定
+									SendDlgItemMessage(hwnd,IDC_BGCOLOR,CB_SETCURSEL,2+pWindowInfo->GetBackgroundColor()-0x1000,0);
+								}
+								return 1;
+							}
+
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_BGCOLOR,SELECT_WINDOW,pWindowInfo->GetBackgroundColor());
+
+							pWindowInfo->SetBackgroundColor( -(int)cc.rgbResult );
+						}
+						else{
+							//ビットマップ
+							i3-=2;
+
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_BGCOLOR,SELECT_WINDOW,pWindowInfo->GetBackgroundColor());
+
+							pWindowInfo->SetBackgroundColor( 0x1000+i3 );
+						}
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_WINDOWMENU:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_WINDOWMENU,SELECT_WINDOW,(DWORD)&pWindowInfo->GetMenuIdName());
+
+						i3=SendDlgItemMessage(hwnd,IDC_WINDOWMENU,CB_GETCURSEL,0,0);
+
+						if(i3==0)
+						{
+							pWindowInfo->SetMenuIdName( "" );
+						}
+						else
+						{
+							char temporary[1024];
+							SendDlgItemMessage(hwnd,IDC_WINDOWMENU,CB_GETLBTEXT,i3,(LPARAM)temporary);
+							pWindowInfo->SetMenuIdName( temporary );
+						}
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_ICONRES:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_ICONRES,SELECT_WINDOW,(DWORD)&pWindowInfo->GetIconResourceName());
+
+						i3=SendDlgItemMessage(hwnd,IDC_ICONRES,CB_GETCURSEL,0,0);
+						if(i3==0)
+						{
+							pWindowInfo->SetIconResourceName( "" );
+						}
+						else
+						{
+							char temporary[1024];
+							SendDlgItemMessage(hwnd,IDC_ICONRES,CB_GETLBTEXT,i3,(LPARAM)temporary);
+							pWindowInfo->SetIconResourceName( temporary );
+						}
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+
+				case IDC_WINDOWSTYLE:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						i3=SendDlgItemMessage(hwnd,IDC_WINDOWSTYLE,CB_GETCURSEL,0,0);
+						pWindowInfo->SetStyle( pWindowInfo->GetStyle() & 0x3FFFFFFF );
+						if(i3==1) pWindowInfo->AddStyle( WS_POPUP );
+						else if(i3==2) pWindowInfo->AddStyle( WS_CHILD );
+
+						DWORD tempStyle = pWindowInfo->GetStyle();
+						RadProperty_Window_Window_StylingOrder(hwnd,&tempStyle);
+						pWindowInfo->SetStyle( tempStyle );
+
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_BORDERSTYLE:
+					if(HIWORD(wParam)==CBN_SELCHANGE){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						i3=SendDlgItemMessage(hwnd,IDC_BORDERSTYLE,CB_GETCURSEL,0,0);
+						pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~(WS_BORDER|WS_THICKFRAME) );
+						if(i3==1) pWindowInfo->AddStyle( WS_BORDER );
+						else if(i3==2){
+							pWindowInfo->AddStyle( WS_BORDER );
+							pWindowInfo->AddStyle( WS_THICKFRAME );
+						}
+						DWORD tempStyle = pWindowInfo->GetStyle();
+						RadProperty_Window_Border_StylingOrder(hwnd,&tempStyle);
+						pWindowInfo->SetStyle( tempStyle );
+
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+
+				case IDC_STYLE_CAPTION:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_CAPTION,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_CAPTION );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_CAPTION );
+						DWORD tempStyle = pWindowInfo->GetStyle();
+						RadProperty_Window_Caption_StylingOrder(hwnd,&tempStyle);
+						pWindowInfo->SetStyle( tempStyle );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_SYSMENU:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_SYSMENU,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_SYSMENU );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_SYSMENU );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_MINIMIZEBOX:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZEBOX,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_MINIMIZEBOX );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_MINIMIZEBOX );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_MAXIMIZEBOX:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZEBOX,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_MAXIMIZEBOX );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_MAXIMIZEBOX );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_MINIMIZE:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_MINIMIZE,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_MINIMIZE );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_MINIMIZE );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_MAXIMIZE:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_MAXIMIZE,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_MAXIMIZE );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_MAXIMIZE );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+				case IDC_STYLE_HSCROLLBAR:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLLBAR,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_HSCROLL );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_HSCROLL );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+				case IDC_STYLE_VSCROLLBAR:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLLBAR,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_VSCROLL );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_VSCROLL );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_DISABLED:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_DISABLED );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_DISABLED );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_CLIPSIBLINGS:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_CLIPSIBLINGS,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_CLIPSIBLINGS );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_CLIPSIBLINGS );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_CLIPCHILDREN:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_CLIPCHILDREN,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_CLIPCHILDREN );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_CLIPCHILDREN );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+				case IDC_STYLE_VISIBLE:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_STYLE,SELECT_WINDOW,pWindowInfo->GetStyle());
+
+						if(SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_GETCHECK,0,0))
+							pWindowInfo->AddStyle( WS_VISIBLE );
+						else
+							pWindowInfo->SetStyle( pWindowInfo->GetStyle() & ~WS_VISIBLE );
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+					}
+					break;
+
+				case IDC_EXSTYLE:
+					if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_WINDOW_EXSTYLE),hwnd,DlgRadProperty_Window_ExStyle)) return 1;
+					i=GetWndNum(GetParent(GetParent(hwnd)));
+					DrawRadWindow(i,GetWndInfo(MdiInfo[i]->path));
+					return 1;
+
+				case IDC_DEFWINDOW:
+				case IDC_MODALDLG:
+				case IDC_MODELESSDLG:
+					if(HIWORD(wParam)==BN_CLICKED){
+						i=GetWndNum(GetParent(GetParent(hwnd)));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_TYPE,SELECT_WINDOW,(DWORD)pWindowInfo->GetType());
+
+						if(SendDlgItemMessage(hwnd,IDC_DEFWINDOW,BM_GETCHECK,0,0))
+						{
+							pWindowInfo->SetType( ActiveBasic::PM::WindowType::Default );
+						}
+						else if(SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_GETCHECK,0,0))
+						{
+							pWindowInfo->SetType( ActiveBasic::PM::WindowType::ModalDlg );
+						}
+						else if(SendDlgItemMessage(hwnd,IDC_MODELESSDLG,BM_GETCHECK,0,0))
+						{
+							pWindowInfo->SetType( ActiveBasic::PM::WindowType::ModelessDlg );
+						}
+						return 1;
+					}
+					break;
+			}
+			break;
+	}
+	return 0;
+}
+
+INT_PTR CALLBACK DlgRadProperty_Item_RenameCaption(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	int i,i3;
+	char *temporary;
+	POINTANDSIZE PointAndSize;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+				i=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+					SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->GetCaption().c_str());
+				else
+					SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					{
+						i=GetWndNum(GetWindow(hClient,GW_CHILD));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						i3=GetWindowTextLength(GetDlgItem(hwnd,IDC_CAPTION))+1;
+						temporary=(char *)HeapAlloc(hHeap,0,i3);
+						GetDlgItemText(hwnd,IDC_CAPTION,temporary,i3);
+						if(MdiInfo[i]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+							if( pWindowInfo->GetCaption() == temporary){
+								HeapDefaultFree(temporary);
+								SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+								return 1;
+							}
+
+							//変更情報を更新
+							Rad_NoticeChanging(i,RAD_UNDO_CAPTION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->GetCaption());
+
+							pWindowInfo->SetCaption( temporary );
+						}
+						else{
+							if( pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption() == temporary )
+							{
+								HeapDefaultFree(temporary);
+								SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+								return 1;
+							}
+
+							//変更情報を更新
+							Rad_NoticeChanging(i,RAD_UNDO_CAPTION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption());
+
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetCaption( temporary );
+
+							if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_STATIC){
+								//スタティック テキスト
+								//テキストが表示できるようにサイズを拡大する
+
+								PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->pos;
+								PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size;
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+
+								HFONT hFont,hOldFont;
+								hFont=CreateFontIndirect(&pWindowInfo->LogFont);
+								hOldFont=(HFONT)SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hFont);
+								GetTextExtentPoint32(MdiInfo[i]->MdiRadInfo->hMemDC,temporary,lstrlen(temporary),&PointAndSize.size);
+								SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hOldFont);
+								DeleteObject(hFont);
+
+								//テキストの終端に余裕を持たせる
+								PointAndSize.size.cx+=5;
+
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx<PointAndSize.size.cx)
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx=PointAndSize.size.cx;
+							}
+							if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_CHECKBOX){
+								//チェック ボックス
+								//テキストが表示できるようにサイズを拡大する
+
+								PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->pos;
+								PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size;
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+
+								HFONT hFont,hOldFont;
+								hFont=CreateFontIndirect(&pWindowInfo->LogFont);
+								hOldFont=(HFONT)SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hFont);
+								GetTextExtentPoint32(MdiInfo[i]->MdiRadInfo->hMemDC,temporary,lstrlen(temporary),&PointAndSize.size);
+								SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hOldFont);
+								DeleteObject(hFont);
+
+								//テキストの終端に余裕を持たせる
+								PointAndSize.size.cx+=21;
+
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx<PointAndSize.size.cx)
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx=PointAndSize.size.cx;
+							}
+							if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->Control==CT_RADIOBUTTON){
+								//ラジオ ボックス
+								//テキストが表示できるようにサイズを拡大する
+
+								PointAndSize.pos=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->pos;
+								PointAndSize.size=pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size;
+								Rad_NoticeChanging(i,RAD_UNDO_POSITION,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&PointAndSize);
+
+								HFONT hFont,hOldFont;
+								hFont=CreateFontIndirect(&pWindowInfo->LogFont);
+								hOldFont=(HFONT)SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hFont);
+								GetTextExtentPoint32(MdiInfo[i]->MdiRadInfo->hMemDC,temporary,lstrlen(temporary),&PointAndSize.size);
+								SelectObject(MdiInfo[i]->MdiRadInfo->hMemDC,hOldFont);
+								DeleteObject(hFont);
+
+								//テキストの終端に余裕を持たせる
+								PointAndSize.size.cx+=20;
+
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx<PointAndSize.size.cx)
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->size.cx=PointAndSize.size.cx;
+							}
+						}
+						DrawRadWindow(i,pWindowInfo);
+						EndDialog(hwnd,1);
+
+						HeapDefaultFree(temporary);
+						return 1;
+					}
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgRadProperty_Item_RenameID(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HWND hClient,hOwner;
+	int i,i3;
+	char *temporary;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+				i=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				ApplyDialogTexture(hwnd);
+			}
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					{
+						i=GetWndNum(GetWindow(hClient,GW_CHILD));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						i3=GetWindowTextLength(GetDlgItem(hwnd,IDC_IDNAME))+1;
+						if(i3==1){
+							//MsgBox "ID名を入力して下さい。"
+							MessageBox(hOwner,STRING_ITEM_RENAME_MUST_ID,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+							break;
+						}
+						temporary=(char *)HeapAlloc(hHeap,0,i3);
+						GetDlgItemText(hwnd,IDC_IDNAME,temporary,i3);
+						if( pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName() == temporary )
+						{
+							HeapDefaultFree(temporary);
+							SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+							return 1;
+						}
+
+						//MsgBox "アイテムのID名を変更すると、ソースコード内のID名は手動で変換する必要があります。変更しますか？"
+						if(IDCANCEL==MessageBox(hwnd,STRING_ITEM_RENAME_CHECK,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION)) return 1;
+
+						//変更情報を更新
+						Rad_NoticeChanging(i,RAD_UNDO_NAME,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName());
+
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetName( temporary );
+
+						EndDialog(hwnd,1);
+						return 1;
+					}
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+BOOL DefaultItemStyles(HWND hwnd,int WndNum,int WndInfoNum,WPARAM wParam){
+	extern HANDLE hHeap;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	switch(LOWORD(wParam)){
+		case IDC_RENAMEID:
+			if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_RENAMEID),hwnd,DlgRadProperty_Item_RenameID)) return 1;
+			SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+			return 1;
+		case IDC_RENAMECAPTION:
+			if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_RENAMECAPTION),hwnd,DlgRadProperty_Item_RenameCaption)) return 1;
+			SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+			return 1;
+		case IDC_STYLE_DISABLED:
+			if(HIWORD(wParam)==BN_CLICKED){
+				//変更情報
+				Rad_NoticeChanging(WndNum,RAD_UNDO_STYLE,MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+				if(SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_GETCHECK,0,0))
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_DISABLED );
+				else
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_DISABLED );
+				DrawRadWindow(WndNum,pWindowInfo);
+				return 1;
+			}
+			break;
+		case IDC_STYLE_VISIBLE:
+			if(HIWORD(wParam)==BN_CLICKED){
+				//変更情報
+				Rad_NoticeChanging(WndNum,RAD_UNDO_STYLE,MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+				if(SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_GETCHECK,0,0))
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_VISIBLE );
+				else
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_VISIBLE );
+				return 1;
+			}
+			break;
+		case IDC_STYLE_GROUP:
+			if(HIWORD(wParam)==BN_CLICKED){
+				//変更情報
+				Rad_NoticeChanging(WndNum,RAD_UNDO_STYLE,MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+				if(SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_GETCHECK,0,0))
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_GROUP );
+				else
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_GROUP );
+				return 1;
+			}
+			break;
+		case IDC_STYLE_TABSTOP:
+			if(HIWORD(wParam)==BN_CLICKED){
+				//変更情報
+				Rad_NoticeChanging(WndNum,RAD_UNDO_STYLE,MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+				if(SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_GETCHECK,0,0))
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_TABSTOP );
+				else
+					pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_TABSTOP );
+				return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgRadProperty_Item_ExStyle(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				SetPosCenter(hwnd);
+				i=GetWndNum(GetWindow(hClient,GW_CHILD));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()&WS_EX_ACCEPTFILES) SendDlgItemMessage(hwnd,IDC_EXSTYLE_ACCEPTFILES,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()&WS_EX_TRANSPARENT) SendDlgItemMessage(hwnd,IDC_EXSTYLE_TRANSPARENT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()&WS_EX_DLGMODALFRAME) SendDlgItemMessage(hwnd,IDC_EXSTYLE_DLGMODALFRAME,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()&WS_EX_CLIENTEDGE) SendDlgItemMessage(hwnd,IDC_EXSTYLE_CLIENTEDGE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()&WS_EX_STATICEDGE) SendDlgItemMessage(hwnd,IDC_EXSTYLE_STATICEDGE,BM_SETCHECK,BST_CHECKED,0);
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					{
+						i=GetWndNum(GetWindow(hClient,GW_CHILD));
+						ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+						DWORD style;
+						style=0;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_ACCEPTFILES,BM_GETCHECK,0,0))
+							style|=WS_EX_ACCEPTFILES;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_TRANSPARENT,BM_GETCHECK,0,0))
+							style|=WS_EX_TRANSPARENT;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_DLGMODALFRAME,BM_GETCHECK,0,0))
+							style|=WS_EX_DLGMODALFRAME;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_CLIENTEDGE,BM_GETCHECK,0,0))
+							style|=WS_EX_CLIENTEDGE;
+						if(SendDlgItemMessage(hwnd,IDC_EXSTYLE_STATICEDGE,BM_GETCHECK,0,0))
+							style|=WS_EX_STATICEDGE;
+
+						if(style==pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle()){
+							SendMessage(hwnd,WM_COMMAND,IDCANCEL,0);
+							return 1;
+						}
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_EXSTYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetExStyle());
+
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetExStyle( style );
+						EndDialog(hwnd,1);
+						return 1;
+					}
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+
+
+/////////////////////
+// BUTTON プロパティ
+
+INT_PTR CALLBACK RadProperty_ButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				////////////
+				//スタイル
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_OWNERDRAW)==BS_OWNERDRAW) SendDlgItemMessage(hwnd,IDC_BS_OWNERDRAW,BM_SETCHECK,BST_CHECKED,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_DEFPUSHBUTTON) SendDlgItemMessage(hwnd,IDC_BS_DEFPUSHBUTTON,BM_SETCHECK,BST_CHECKED,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_ICON) SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BITMAP) SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_MULTILINE) SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_NOTIFY) SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// 水平方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_DEFAULT);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_LEFT);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_RIGHT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_CENTER);
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_CENTER)==BS_CENTER) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_RIGHT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,0,0);
+
+
+				//////////////////
+				// 垂直方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_DEFAULT);
+				//"上端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_TOP);
+				//"下端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_BOTTOM);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LONG_PTR)STRING_CENTER);
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_VCENTER)==BS_VCENTER) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_TOP) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BOTTOM) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,0,0);
+
+				bInitial=0;
+				ApplyDialogTexture(hwnd);
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[i2];
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_BS_DEFPUSHBUTTON:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_DEFPUSHBUTTON,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_OWNERDRAW );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_DEFPUSHBUTTON );
+								SendDlgItemMessage(hwnd,IDC_BS_OWNERDRAW,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_DEFPUSHBUTTON );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_OWNERDRAW:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_OWNERDRAW,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_DEFPUSHBUTTON );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_OWNERDRAW );
+								SendDlgItemMessage(hwnd,IDC_BS_DEFPUSHBUTTON,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_OWNERDRAW );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_ICON:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_ICON );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+								SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_BITMAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BITMAP );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+								SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_MULTILINE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_MULTILINE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_MULTILINE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_NOTIFY );
+							return 1;
+						}
+						break;
+
+					case IDC_BS_HPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_LEFT|BS_RIGHT|BS_CENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFT );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_RIGHT );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_VPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_TOP|BS_BOTTOM|BS_VCENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_TOP );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BOTTOM );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_VCENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+////////////////////////
+// CHECKBOX プロパティ
+INT_PTR CALLBACK RadProperty_CheckBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				////////////
+				//スタイル
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_AUTOCHECKBOX)==BS_AUTOCHECKBOX) SendDlgItemMessage(hwnd,IDC_BS_AUTO,BM_SETCHECK,BST_CHECKED,0);
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_AUTO3STATE)==BS_AUTO3STATE){
+					SendDlgItemMessage(hwnd,IDC_BS_AUTO,BM_SETCHECK,BST_CHECKED,0);
+					SendDlgItemMessage(hwnd,IDC_BS_3STATE,BM_SETCHECK,BST_CHECKED,0);
+				}
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_3STATE)==BS_3STATE) SendDlgItemMessage(hwnd,IDC_BS_3STATE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_PUSHLIKE) SendDlgItemMessage(hwnd,IDC_BS_PUSHLIKE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFTTEXT) SendDlgItemMessage(hwnd,IDC_BS_LEFTTEXT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_ICON) SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BITMAP) SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_MULTILINE) SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_NOTIFY) SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// 水平方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_CENTER)==BS_CENTER) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_RIGHT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,0,0);
+
+
+				//////////////////
+				// 垂直方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"上端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_TOP);
+				//"下端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_BOTTOM);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_VCENTER)==BS_VCENTER) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_TOP) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BOTTOM) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,0,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[i2];
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_BS_AUTO:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_AUTO,BM_GETCHECK,0,0)){
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x04){
+									//3state
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_AUTO3STATE );
+								}
+								else{
+									//2state
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_AUTOCHECKBOX );
+								}
+							}
+							else{
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x04){
+									//3state
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_3STATE );
+								}
+								else{
+									//2state
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CHECKBOX );
+								}
+							}
+							return 1;
+						}
+						break;
+					case IDC_BS_3STATE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_3STATE,BM_GETCHECK,0,0)){
+								if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0F)==BS_CHECKBOX){
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_3STATE );
+								}
+								else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0F)==BS_AUTOCHECKBOX){
+									//自動チェック
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_AUTO3STATE );
+								}
+							}
+							else{
+								if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0F)==BS_3STATE){
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CHECKBOX );
+								}
+								else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0F)==BS_AUTO3STATE){
+									//自動チェック
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+									pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_AUTOCHECKBOX );
+								}
+							}
+							return 1;
+						}
+						break;
+					case IDC_BS_PUSHLIKE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_PUSHLIKE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_PUSHLIKE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_PUSHLIKE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_LEFTTEXT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_LEFTTEXT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFTTEXT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_LEFTTEXT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_ICON:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_ICON );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+								SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_BITMAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BITMAP );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+								SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_MULTILINE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_MULTILINE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_MULTILINE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_NOTIFY );
+							return 1;
+						}
+						break;
+
+					case IDC_BS_HPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_LEFT|BS_RIGHT|BS_CENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFT );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_RIGHT );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_VPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_TOP|BS_BOTTOM|BS_VCENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_TOP );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BOTTOM );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_VCENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+			}
+	}
+	return 0;
+}
+
+
+///////////////////////
+// COMBOBOX プロパティ
+
+void RadProperty_ComboBox_StylingOrder(HWND hwnd,DWORD *style){
+	if(!(*style&(CBS_OWNERDRAWFIXED|CBS_OWNERDRAWVARIABLE))){
+		*style&=~(CBS_HASSTRINGS);
+		SendDlgItemMessage(hwnd,IDC_CBS_HASSTRINGS,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_CBS_HASSTRINGS),0);
+	}
+	else EnableWindow(GetDlgItem(hwnd,IDC_CBS_HASSTRINGS),1);
+}
+INT_PTR CALLBACK RadProperty_ComboBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				/////////////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				////////
+				// 選択
+				////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"ドロップ ダウン"
+				SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_COMBOBOXPROP_STYLE_DROPDOWN);
+				//"ドロップ ダウン リスト"
+				SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_COMBOBOXPROP_STYLE_DROPDOWNLIST);
+
+				//ビットを考慮してCBS_DROPDOWNLISTを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_DROPDOWNLIST)==CBS_DROPDOWNLIST) SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_SETCURSEL,2,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_SIMPLE) SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_SETCURSEL,0,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_DROPDOWN) SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_SETCURSEL,1,0);
+
+
+				////////////////
+				// オーナー描画
+				////////////////
+
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+				//"固定"
+				SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_OWNERDRAW_FIXED);
+				//"可変"
+				SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_OWNERDRAW_VARIABLE);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_OWNERDRAWFIXED) SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_OWNERDRAWVARIABLE) SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_HASSTRINGS) SendDlgItemMessage(hwnd,IDC_CBS_HASSTRINGS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_SORT) SendDlgItemMessage(hwnd,IDC_CBS_SORT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_NOINTEGRALHEIGHT) SendDlgItemMessage(hwnd,IDC_CBS_NOINTEGRALHEIGHT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_OEMCONVERT) SendDlgItemMessage(hwnd,IDC_CBS_OEMCONVERT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_AUTOHSCROLL) SendDlgItemMessage(hwnd,IDC_CBS_AUTOHSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_DISABLENOSCROLL) SendDlgItemMessage(hwnd,IDC_CBS_DISABLENOSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_UPPERCASE) SendDlgItemMessage(hwnd,IDC_CBS_UPPERCASE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&CBS_LOWERCASE) SendDlgItemMessage(hwnd,IDC_CBS_LOWERCASE,BM_SETCHECK,BST_CHECKED,0);
+
+				DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+				RadProperty_ComboBox_StylingOrder(hwnd,&tempStyle);
+				pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[i2];
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_CBS_TYPE:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_CBS_TYPE,CB_GETCURSEL,0,0);
+							//CBS_DROPDOWNLIST=CBS_SIMPLE | CBS_DROPDOWN
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_DROPDOWNLIST );
+							if(i3==0) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_SIMPLE );
+							else if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_DROPDOWN );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_DROPDOWNLIST );
+
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_CBS_OWNERDRAW:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_CBS_OWNERDRAW,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_OWNERDRAWFIXED|CBS_OWNERDRAWVARIABLE );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_OWNERDRAWFIXED );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_OWNERDRAWVARIABLE );
+
+							DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+							RadProperty_ComboBox_StylingOrder(hwnd,&tempStyle);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+							return 1;
+						}
+						break;
+
+					case IDC_CBS_HASSTRINGS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_HASSTRINGS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_HASSTRINGS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_HASSTRINGS );
+							return 1;
+						}
+						break;
+					case IDC_CBS_SORT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_SORT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_SORT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_SORT );
+							return 1;
+						}
+						break;
+					case IDC_CBS_NOINTEGRALHEIGHT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_NOINTEGRALHEIGHT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_NOINTEGRALHEIGHT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_NOINTEGRALHEIGHT );
+							return 1;
+						}
+						break;
+					case IDC_CBS_OEMCONVERT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_OEMCONVERT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_OEMCONVERT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_OEMCONVERT );
+							return 1;
+						}
+						break;
+					case IDC_STYLE_VSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_VSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_VSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_CBS_AUTOHSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_AUTOHSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_AUTOHSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_AUTOHSCROLL );
+							return 1;
+						}
+						break;
+					case IDC_CBS_DISABLENOSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_DISABLENOSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_DISABLENOSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_DISABLENOSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_CBS_UPPERCASE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_UPPERCASE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_UPPERCASE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_UPPERCASE );
+							return 1;
+						}
+						break;
+					case IDC_CBS_LOWERCASE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_CBS_LOWERCASE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( CBS_LOWERCASE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( CBS_LOWERCASE );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+/////////////////////
+// EDIT プロパティ
+
+void RadProperty_Edit_StylingOrder(HWND hwnd,DWORD *style){
+	if(*style&ES_MULTILINE){
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_HSCROLL),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_VSCROLL),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_ES_AUTOVSCROLL),1);
+
+		*style&=~(ES_PASSWORD);
+		SendDlgItemMessage(hwnd,IDC_ES_PASSWORD,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_ES_PASSWORD),0);
+	}
+	else{
+		EnableWindow(GetDlgItem(hwnd,IDC_ES_PASSWORD),1);
+
+		*style&=~(WS_HSCROLL|WS_VSCROLL|ES_AUTOVSCROLL);
+		SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLL,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_SETCHECK,BST_UNCHECKED,0);
+		SendDlgItemMessage(hwnd,IDC_ES_AUTOVSCROLL,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_HSCROLL),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_STYLE_VSCROLL),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_ES_AUTOVSCROLL),0);
+	}
+}
+INT_PTR CALLBACK RadProperty_EditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_MULTILINE) SendDlgItemMessage(hwnd,IDC_ES_MULTILINE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_NUMBER) SendDlgItemMessage(hwnd,IDC_ES_NUMBER,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_HSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_AUTOHSCROLL) SendDlgItemMessage(hwnd,IDC_ES_AUTOHSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_AUTOVSCROLL) SendDlgItemMessage(hwnd,IDC_ES_AUTOVSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_PASSWORD) SendDlgItemMessage(hwnd,IDC_ES_PASSWORD,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_NOHIDESEL) SendDlgItemMessage(hwnd,IDC_ES_NOHIDESEL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_OEMCONVERT) SendDlgItemMessage(hwnd,IDC_ES_OEMCONVERT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_WANTRETURN) SendDlgItemMessage(hwnd,IDC_ES_WANTRETURN,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_UPPERCASE) SendDlgItemMessage(hwnd,IDC_ES_UPPERCASE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_LOWERCASE) SendDlgItemMessage(hwnd,IDC_ES_LOWERCASE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_READONLY) SendDlgItemMessage(hwnd,IDC_ES_READONLY,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// テキストの配置
+				//////////////////
+
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+
+				//ビットを考慮してES_LEFTを最後に検討する
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_CENTER) SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&ES_RIGHT) SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_SETCURSEL,0,0);
+
+				DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+				RadProperty_Edit_StylingOrder(hwnd,&tempStyle);
+				pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_ES_MULTILINE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_MULTILINE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_MULTILINE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_MULTILINE );
+
+							DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+							RadProperty_Edit_StylingOrder(hwnd,&tempStyle);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_NUMBER:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_NUMBER,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_NUMBER );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_NUMBER );
+							return 1;
+						}
+						break;
+					case IDC_STYLE_HSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_HSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_HSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_AUTOHSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_AUTOHSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_AUTOHSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_AUTOHSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_STYLE_VSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_VSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_VSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_AUTOVSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_AUTOVSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_AUTOVSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_AUTOVSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_PASSWORD:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_PASSWORD,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_PASSWORD );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_PASSWORD );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_NOHIDESEL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_NOHIDESEL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_NOHIDESEL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_NOHIDESEL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_OEMCONVERT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_OEMCONVERT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_OEMCONVERT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_OEMCONVERT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_WANTRETURN:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_WANTRETURN,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_WANTRETURN );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_WANTRETURN );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_UPPERCASE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_UPPERCASE,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_LOWERCASE );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_UPPERCASE );
+								SendDlgItemMessage(hwnd,IDC_ES_LOWERCASE,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_UPPERCASE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_LOWERCASE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_LOWERCASE,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_UPPERCASE );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_LOWERCASE );
+								SendDlgItemMessage(hwnd,IDC_ES_UPPERCASE,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_LOWERCASE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_ES_READONLY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_ES_READONLY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_READONLY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_READONLY );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_ES_TEXTPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_ES_TEXTPOS,CB_GETCURSEL,0,0);
+							//ES_LEFT=0
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( ES_CENTER|ES_RIGHT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_CENTER );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( ES_RIGHT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+////////////////////////
+// GROUPBOX プロパティ
+
+INT_PTR CALLBACK RadProperty_GroupBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				/////////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// 水平方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+
+				//ビットを考慮してBS_CENTERを最初に検討する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_CENTER)==BS_CENTER) SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFT) SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_RIGHT) SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_ICON) SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BITMAP) SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_NOTIFY) SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_BS_POSITION:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_POSITION,CB_GETCURSEL,0,0);
+							//BS_CENTER=BS_LEFT | BS_RIGHT
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_CENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFT );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_RIGHT );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_BS_ICON:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_ICON );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_BITMAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BITMAP );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_NOTIFY );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+////////////////////////
+// IMAGEBOX プロパティ
+
+void RadProperty_ImageBox_StylingOrder(HWND hwnd,DWORD *style){
+	if((*style&0x000F)==SS_ICON||
+		(*style&0x000F)==SS_BITMAP){
+		EnableWindow(GetDlgItem(hwnd,IDC_PATH),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_SS_CENTERIMAGE),1);
+		EnableWindow(GetDlgItem(hwnd,IDC_SS_RIGHTJUST),1);
+	}
+	else{
+		EnableWindow(GetDlgItem(hwnd,IDC_PATH),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_SS_CENTERIMAGE),0);
+		EnableWindow(GetDlgItem(hwnd,IDC_SS_RIGHTJUST),0);
+	}
+}
+INT_PTR CALLBACK RadProperty_ImageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char temporary[MAX_PATH];
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				/////////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				//////////
+				// タイプ
+				//////////
+
+				//"フレーム（黒）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_FRAME_BLACK);
+				//"フレーム（灰色）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_FRAME_GRAY);
+				//"フレーム（白）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_FRAME_WHITE);
+				//"フレーム（縁取り）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_FRAME_ETCHED);
+				//"四角形（黒）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_RECT_BLACK);
+				//"四角形（灰色）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_RECT_GRAY);
+				//"四角形（白）"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_RECT_WHITE);
+				//"アイコン"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_ICON);
+				//"ビットマップ"
+				SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_ADDSTRING,0,(LPARAM)STRING_IMAGEBOXPROP_STYLE_BITMAP);
+
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BLACKFRAME) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,0,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_GRAYFRAME) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,1,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_WHITEFRAME) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,2,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000001F)==SS_ETCHEDFRAME) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,3,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BLACKRECT) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,4,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_GRAYRECT) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,5,0);
+				else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_WHITERECT) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,6,0);
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON||
+					(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP){
+					if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,7,0);
+					else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP) SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_SETCURSEL,8,0);
+
+					//リソース／ファイル スイッチチェックを表示
+					ShowWindow(GetDlgItem(hwnd,IDC_FILE),SW_SHOW);
+					ShowWindow(GetDlgItem(hwnd,IDC_RESOURCE),SW_SHOW);
+					
+					//イメージ状態テキストを表示
+					ShowWindow(GetDlgItem(hwnd,IDC_IMAGE_SITUATION),SW_SHOW);
+
+					if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsFile()){
+						//ファイル指定を表示
+						ShowWindow(GetDlgItem(hwnd,IDC_PATH),SW_SHOW);
+						ShowWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),SW_SHOW);
+						SetDlgItemText(hwnd,IDC_PATH,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path.c_str());
+
+						//イメージ状態テキスト
+						//"ファイル指定:"
+						SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMFILE);
+
+						SendDlgItemMessage(hwnd,IDC_FILE,BM_SETCHECK,BST_CHECKED,0);
+					}
+					else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsResource()){
+						//リソース指定を表示
+						ShowWindow(GetDlgItem(hwnd,IDC_RESCOMBO),SW_SHOW);
+
+						//イメージ状態テキスト
+						//"リソース指定:"
+						SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMRESOURCE);
+
+						SendDlgItemMessage(hwnd,IDC_RESOURCE,BM_SETCHECK,BST_CHECKED,0);
+
+						SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_RESETCONTENT,0,0);
+
+						if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON){
+							//アイコンリソースをコンボボックスに挿入
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+							{
+								SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(LPARAM)resourceItem.idName.c_str());
+							}
+						}
+						else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP){
+							//ビットマップリソースをコンボボックスに挿入
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+							{
+								SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(LPARAM)resourceItem.idName.c_str());
+							}
+						}
+
+						//リストから選択
+						i3=SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_FINDSTRING,0,(LPARAM)pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path.c_str());
+						SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_SETCURSEL,i3,0);
+					}
+				}
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_NOTIFY) SendDlgItemMessage(hwnd,IDC_SS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_CENTERIMAGE) SendDlgItemMessage(hwnd,IDC_SS_CENTERIMAGE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_RIGHTJUST) SendDlgItemMessage(hwnd,IDC_SS_RIGHTJUST,BM_SETCHECK,BST_CHECKED,0);
+
+				DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+				RadProperty_ImageBox_StylingOrder(hwnd,&tempStyle);
+				pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_IMAGE_TYPE:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_IMAGE_TYPE,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( 0x0000001F );
+							if(i3==0) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_BLACKFRAME );
+							else if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_GRAYFRAME );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_WHITEFRAME );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_ETCHEDFRAME );
+							else if(i3==4) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_BLACKRECT );
+							else if(i3==5) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_GRAYRECT );
+							else if(i3==6) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_WHITERECT );
+							else if(i3==7) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_ICON );
+							else if(i3==8) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_BITMAP );
+
+							if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON||
+								(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP){
+								//リソース／ファイル スイッチチェックを表示
+								ShowWindow(GetDlgItem(hwnd,IDC_FILE),SW_SHOW);
+								ShowWindow(GetDlgItem(hwnd,IDC_RESOURCE),SW_SHOW);
+
+								//イメージ状態テキストを表示
+								ShowWindow(GetDlgItem(hwnd,IDC_IMAGE_SITUATION),SW_SHOW);
+
+								if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsFile()){
+									//ファイル指定を表示
+									ShowWindow(GetDlgItem(hwnd,IDC_PATH),SW_SHOW);
+									ShowWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),SW_SHOW);
+									SetDlgItemText(hwnd,IDC_PATH,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path.c_str());
+
+									//イメージ状態テキスト
+									//"ファイル指定:"
+									SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMFILE);
+
+									SendDlgItemMessage(hwnd,IDC_FILE,BM_SETCHECK,BST_CHECKED,0);
+								}
+								else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsResource()){
+									//リソース指定を表示
+									ShowWindow(GetDlgItem(hwnd,IDC_RESCOMBO),SW_SHOW);
+
+									//イメージ状態テキスト
+									//"リソース指定:"
+									SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMRESOURCE);
+
+									SendDlgItemMessage(hwnd,IDC_RESOURCE,BM_SETCHECK,BST_CHECKED,0);
+
+									SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_RESETCONTENT,0,0);
+
+									if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON){
+										//アイコンリソースをコンボボックスに挿入
+										for(i3=0;i3<static_cast<int>(projectInfo.resourceManager.iconResources.size());i3++){
+											SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(long)projectInfo.resourceManager.iconResources[i3].idName.c_str());
+
+											if( projectInfo.resourceManager.iconResources[i3].idName == pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path )
+											{
+												SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_SETCURSEL,i3,0);
+											}
+										}
+									}
+									else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP){
+										//ビットマップリソースをコンボボックスに挿入
+										for(i3=0;i3<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i3++){
+											SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(long)projectInfo.resourceManager.bitmapResources[i3].idName.c_str());
+
+											if( projectInfo.resourceManager.bitmapResources[i3].idName == pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path )
+											{
+												SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_SETCURSEL,i3,0);
+											}
+										}
+									}
+								}
+							}
+							else{
+								//リソース／ファイル スイッチチェックを非表示
+								ShowWindow(GetDlgItem(hwnd,IDC_FILE),SW_HIDE);
+								ShowWindow(GetDlgItem(hwnd,IDC_RESOURCE),SW_HIDE);
+
+								//イメージ状態テキストを非表示
+								ShowWindow(GetDlgItem(hwnd,IDC_IMAGE_SITUATION),SW_HIDE);
+
+								//ファイル指定を非表示
+								ShowWindow(GetDlgItem(hwnd,IDC_PATH),SW_HIDE);
+								ShowWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),SW_HIDE);
+
+								//リソース指定を非表示
+								ShowWindow(GetDlgItem(hwnd,IDC_RESCOMBO),SW_HIDE);
+							}
+
+							DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+							RadProperty_ImageBox_StylingOrder(hwnd,&tempStyle);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_FILE:
+						if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsFile()){
+							//変更無し
+							break;
+						}
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_IMAGESTATE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image);
+
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.type
+							= ActiveBasic::PM::ImageReferenceType::File;
+
+						//ファイル指定を表示
+						ShowWindow(GetDlgItem(hwnd,IDC_PATH),SW_SHOW);
+						ShowWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),SW_SHOW);
+						SetDlgItemText(hwnd,IDC_PATH,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path.c_str());
+
+						//リソース指定を非表示
+						ShowWindow(GetDlgItem(hwnd,IDC_RESCOMBO),SW_HIDE);
+
+						//イメージ状態テキスト
+						//"ファイル指定:"
+						SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMFILE);
+
+						SendDlgItemMessage(hwnd,IDC_FILE,BM_SETCHECK,BST_CHECKED,0);
+						break;
+
+					case IDC_RESOURCE:
+						if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsResource()){
+							//変更無し
+							break;
+						}
+
+						//変更情報
+						Rad_NoticeChanging(i,RAD_UNDO_IMAGESTATE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image);
+
+						pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.type
+							= ActiveBasic::PM::ImageReferenceType::Resource;
+
+						//ファイル指定を非表示
+						ShowWindow(GetDlgItem(hwnd,IDC_PATH),SW_HIDE);
+						ShowWindow(GetDlgItem(hwnd,IDC_CHANGEPATH),SW_HIDE);
+
+						//リソース指定を表示
+						ShowWindow(GetDlgItem(hwnd,IDC_RESCOMBO),SW_SHOW);
+
+						//イメージ状態テキスト
+						//"リソース指定:"
+						SetDlgItemText(hwnd,IDC_IMAGE_SITUATION,STRING_IMAGEBOXPROP_STYLE_FROMRESOURCE);
+
+						SendDlgItemMessage(hwnd,IDC_RESOURCE,BM_SETCHECK,BST_CHECKED,0);
+
+						SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_RESETCONTENT,0,0);
+
+						if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_ICON){
+							//アイコンリソースをコンボボックスに挿入
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+							{
+								SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(long)resourceItem.idName.c_str());
+							}
+						}
+						else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x0000000F)==SS_BITMAP){
+							//ビットマップリソースをコンボボックスに挿入
+							BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+							{
+								SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_ADDSTRING,0,(long)resourceItem.idName.c_str());
+							}
+						}
+						break;
+
+					case IDC_RESCOMBO:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_IMAGESTATE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image);
+
+							i3=SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_GETCURSEL,0,0);
+							SendDlgItemMessage(hwnd,IDC_RESCOMBO,CB_GETLBTEXT,i3,(long)temporary);
+
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path = temporary;
+
+							DrawRadWindow(i,pWindowInfo);
+						}
+						break;
+
+					case IDC_CHANGEPATH:
+						if(HIWORD(wParam)==BN_CLICKED){
+							if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.IsFile()){
+								if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x000F)==SS_ICON){
+									extern LPSTR IconFileFilter;
+									//"アイコン ファイルを指定して下さい"
+									if(!GetFilePathDialog(hwnd,temporary,IconFileFilter,STRING_IMAGEBOXPROP_GETPATH_ICON,1)) return 1;
+								}
+								else if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&0x000F)==SS_BITMAP){
+									extern LPSTR BitmapFileFilter;
+									//"ビットマップ ファイルを指定して下さい"
+									if(!GetFilePathDialog(hwnd,temporary,BitmapFileFilter,STRING_IMAGEBOXPROP_GETPATH_BITMAP,1)) return 1;
+								}
+
+								//変更情報
+								Rad_NoticeChanging(i,RAD_UNDO_IMAGESTATE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],(DWORD)&pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image);
+
+								lstrcpy( temporary, projectInfo.GetWorkDir().GetRelationalPath( temporary ).c_str() );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->image.path = temporary;
+
+								SetDlgItemText(hwnd,IDC_PATH,temporary);
+								DrawRadWindow(i,pWindowInfo);
+							}
+							return 1;
+						}
+						break;
+
+					case IDC_SS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_NOTIFY );
+							return 1;
+						}
+						break;
+					case IDC_SS_CENTERIMAGE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_CENTERIMAGE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_CENTERIMAGE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_CENTERIMAGE );
+							return 1;
+						}
+						break;
+					case IDC_SS_RIGHTJUST:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_RIGHTJUST,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_RIGHTJUST );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_RIGHTJUST );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+////////////////////////
+// LISTVIEW プロパティ
+INT_PTR CALLBACK RadProperty_ListViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				/////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				////////
+				// 表示
+				////////
+
+				//"アイコン"
+				SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_ADDSTRING,0,(LPARAM)STRING_LISTVIEWPROP_STYLE_ICON);
+				//"小さいアイコン"
+				SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_ADDSTRING,0,(LPARAM)STRING_LISTVIEWPROP_STYLE_SMALLICON);
+				//"リスト"
+				SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_ADDSTRING,0,(LPARAM)STRING_LISTVIEWPROP_STYLE_LIST);
+				//"レポート"
+				SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_ADDSTRING,0,(LPARAM)STRING_LISTVIEWPROP_STYLE_REPORT);
+
+				//ビットを考慮してLVS_LISTを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_LIST)==LVS_LIST) SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_SETCURSEL,2,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SMALLICON) SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_REPORT) SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_SETCURSEL,3,0);
+				else SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_SETCURSEL,0,0);
+
+
+				////////
+				// 配置
+				////////
+
+				//"上端"
+				SendDlgItemMessage(hwnd,IDC_LVS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_TOP);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_LVS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_ALIGNLEFT) SendDlgItemMessage(hwnd,IDC_LVS_POSITION,CB_SETCURSEL,1,0);
+				else SendDlgItemMessage(hwnd,IDC_LVS_POSITION,CB_SETCURSEL,0,0);
+
+
+				//////////
+				// ソート
+				//////////
+
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+				//"昇順"
+				SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_ADDSTRING,0,(LPARAM)STRING_SORT_ASCENDING);
+				//"降順"
+				SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_ADDSTRING,0,(LPARAM)STRING_SORT_DESCENDING);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SORTASCENDING) SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SORTDESCENDING) SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SINGLESEL) SendDlgItemMessage(hwnd,IDC_LVS_SINGLESEL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_AUTOARRANGE) SendDlgItemMessage(hwnd,IDC_LVS_AUTOARRANGE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_NOLABELWRAP) SendDlgItemMessage(hwnd,IDC_LVS_NOLABELWRAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_EDITLABELS) SendDlgItemMessage(hwnd,IDC_LVS_EDITLABELS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_NOSCROLL) SendDlgItemMessage(hwnd,IDC_LVS_NOSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_NOCOLUMNHEADER) SendDlgItemMessage(hwnd,IDC_LVS_NOCOLUMNHEADER,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_NOSORTHEADER) SendDlgItemMessage(hwnd,IDC_LVS_NOSORTHEADER,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SHOWSELALWAYS) SendDlgItemMessage(hwnd,IDC_LVS_SHOWSELALWAYS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_OWNERDRAWFIXED) SendDlgItemMessage(hwnd,IDC_LVS_OWNERDRAWFIXED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LVS_SHAREIMAGELISTS) SendDlgItemMessage(hwnd,IDC_LVS_SHAREIMAGELISTS,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_LVS_VIEW:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_LVS_VIEW,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_SMALLICON|LVS_LIST|LVS_REPORT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SMALLICON );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_LIST );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_REPORT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_LVS_POSITION:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_LVS_POSITION,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_ALIGNLEFT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_ALIGNLEFT );
+							return 1;
+						}
+						break;
+					case IDC_LVS_SORT:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_LVS_SORT,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_SORTASCENDING|LVS_SORTDESCENDING );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SORTASCENDING );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SORTDESCENDING );
+							return 1;
+						}
+						break;
+
+					case IDC_LVS_SINGLESEL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_SINGLESEL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SINGLESEL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_SINGLESEL );
+							return 1;
+						}
+						break;
+					case IDC_LVS_AUTOARRANGE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_AUTOARRANGE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_AUTOARRANGE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_AUTOARRANGE );
+							return 1;
+						}
+						break;
+					case IDC_LVS_NOLABELWRAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_NOLABELWRAP,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_NOLABELWRAP );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_NOLABELWRAP );
+							return 1;
+						}
+						break;
+					case IDC_LVS_EDITLABELS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_EDITLABELS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_EDITLABELS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_EDITLABELS );
+							return 1;
+						}
+						break;
+					case IDC_LVS_NOSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_NOSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_NOSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_NOSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_LVS_NOCOLUMNHEADER:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_NOCOLUMNHEADER,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_NOCOLUMNHEADER );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_NOCOLUMNHEADER );
+							return 1;
+						}
+						break;
+					case IDC_LVS_NOSORTHEADER:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_NOSORTHEADER,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_NOSORTHEADER );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_NOSORTHEADER );
+							return 1;
+						}
+						break;
+					case IDC_LVS_SHOWSELALWAYS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_SHOWSELALWAYS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SHOWSELALWAYS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_SHOWSELALWAYS );
+							return 1;
+						}
+						break;
+					case IDC_LVS_OWNERDRAWFIXED:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_OWNERDRAWFIXED,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_OWNERDRAWFIXED );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_OWNERDRAWFIXED );
+							return 1;
+						}
+						break;
+					case IDC_LVS_SHAREIMAGELISTS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LVS_SHAREIMAGELISTS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LVS_SHAREIMAGELISTS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LVS_SHAREIMAGELISTS );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+///////////////////////
+// LISTBOX プロパティ
+
+void RadProperty_ListBox_StylingOrder(HWND hwnd,DWORD *style){
+	if(*style&LBS_OWNERDRAWVARIABLE){
+		*style&=~(LBS_MULTICOLUMN);
+		SendDlgItemMessage(hwnd,IDC_LBS_MULTICOLUMN,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_LBS_MULTICOLUMN),0);
+	}
+	else
+		EnableWindow(GetDlgItem(hwnd,IDC_LBS_MULTICOLUMN),1);
+
+	if(!(*style&(LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE))){
+		*style&=~(LBS_HASSTRINGS);
+		SendDlgItemMessage(hwnd,IDC_LBS_HASSTRINGS,BM_SETCHECK,BST_UNCHECKED,0);
+		EnableWindow(GetDlgItem(hwnd,IDC_LBS_HASSTRINGS),0);
+	}
+	else
+		EnableWindow(GetDlgItem(hwnd,IDC_LBS_HASSTRINGS),1);
+}
+INT_PTR CALLBACK RadProperty_ListBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				////////
+				// 選択
+				////////
+
+				//"シングル"
+				SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_ADDSTRING,0,(LPARAM)STRING_LISTBOXPROP_STYLE_SEL_SINGLE);
+				//"マルチ"
+				SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_ADDSTRING,0,(LPARAM)STRING_LISTBOXPROP_STYLE_SEL_MULTI);
+				//"拡張"
+				SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_ADDSTRING,0,(LPARAM)STRING_LISTBOXPROP_STYLE_SEL_EXTENDED);
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_MULTIPLESEL) SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_EXTENDEDSEL) SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_SETCURSEL,2,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_NOSEL) SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_SETCURSEL,3,0);
+				else SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_SETCURSEL,0,0);
+
+
+				////////////////
+				// オーナー描画
+				////////////////
+
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+				//"固定"
+				SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_OWNERDRAW_FIXED);
+				//"可変"
+				SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_ADDSTRING,0,(LPARAM)STRING_OWNERDRAW_VARIABLE);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_OWNERDRAWFIXED) SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_OWNERDRAWVARIABLE) SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_HASSTRINGS) SendDlgItemMessage(hwnd,IDC_LBS_HASSTRINGS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_SORT) SendDlgItemMessage(hwnd,IDC_LBS_SORT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_NOTIFY) SendDlgItemMessage(hwnd,IDC_LBS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_MULTICOLUMN) SendDlgItemMessage(hwnd,IDC_LBS_MULTICOLUMN,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_HSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VSCROLL) SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_DISABLENOSCROLL) SendDlgItemMessage(hwnd,IDC_LBS_DISABLENOSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_NOREDRAW) SendDlgItemMessage(hwnd,IDC_LBS_NOREDRAW,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_USETABSTOPS) SendDlgItemMessage(hwnd,IDC_LBS_USETABSTOPS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&LBS_WANTKEYBOARDINPUT) SendDlgItemMessage(hwnd,IDC_LBS_WANTKEYBOARDINPUT,BM_SETCHECK,BST_CHECKED,0);
+
+				DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+				RadProperty_ListBox_StylingOrder(hwnd,&tempStyle);
+				pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_LBS_SELECT:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_LBS_SELECT,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_MULTIPLESEL|LBS_EXTENDEDSEL|LBS_NOSEL );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_MULTIPLESEL );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_EXTENDEDSEL );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_NOSEL );
+							return 1;
+						}
+						break;
+					case IDC_LBS_OWNERDRAW:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_LBS_OWNERDRAW,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_OWNERDRAWFIXED );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_OWNERDRAWVARIABLE );
+
+							DWORD tempStyle = pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle();
+							RadProperty_ListBox_StylingOrder(hwnd,&tempStyle);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->SetStyle( tempStyle );
+							return 1;
+						}
+						break;
+
+					case IDC_LBS_HASSTRINGS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_HASSTRINGS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_HASSTRINGS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_HASSTRINGS );
+							return 1;
+						}
+						break;
+					case IDC_LBS_SORT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_SORT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_SORT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_SORT );
+							return 1;
+						}
+						break;
+					case IDC_LBS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_NOTIFY );
+							return 1;
+						}
+						break;
+					case IDC_LBS_MULTICOLUMN:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_MULTICOLUMN,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_MULTICOLUMN );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_MULTICOLUMN );
+							return 1;
+						}
+						break;
+					case IDC_STYLE_HSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_STYLE_HSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_HSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_HSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_STYLE_VSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_STYLE_VSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( WS_VSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( WS_VSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_LBS_DISABLENOSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_DISABLENOSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_DISABLENOSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_DISABLENOSCROLL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_LBS_NOREDRAW:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_NOREDRAW,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_NOREDRAW );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_NOREDRAW );
+							return 1;
+						}
+						break;
+					case IDC_LBS_USETABSTOPS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_USETABSTOPS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_USETABSTOPS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_USETABSTOPS );
+							return 1;
+						}
+						break;
+					case IDC_LBS_WANTKEYBOARDINPUT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_LBS_WANTKEYBOARDINPUT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( LBS_WANTKEYBOARDINPUT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( LBS_WANTKEYBOARDINPUT );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+///////////////////////////
+// PROGRESSBAR プロパティ
+INT_PTR CALLBACK RadProperty_ProgressBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				////////////
+				//スタイル
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&PBS_VERTICAL) SendDlgItemMessage(hwnd,IDC_PBS_VERTICAL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&PBS_SMOOTH) SendDlgItemMessage(hwnd,IDC_PBS_SMOOTH,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_PBS_VERTICAL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_PBS_VERTICAL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( PBS_VERTICAL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( PBS_VERTICAL );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_PBS_SMOOTH:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_PBS_SMOOTH,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( PBS_SMOOTH );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( PBS_SMOOTH );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+			}
+	}
+	return 0;
+}
+
+
+///////////////////////////
+// RADIOBUTTON プロパティ
+
+INT_PTR CALLBACK RadProperty_RadioButtonProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				/////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_AUTORADIOBUTTON)==BS_AUTORADIOBUTTON) SendDlgItemMessage(hwnd,IDC_BS_AUTO,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_PUSHLIKE) SendDlgItemMessage(hwnd,IDC_BS_PUSHLIKE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFTTEXT) SendDlgItemMessage(hwnd,IDC_BS_LEFTTEXT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_ICON) SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BITMAP) SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_MULTILINE) SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_NOTIFY) SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// 水平方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+
+				//ビットを考慮してBS_CENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_CENTER)==BS_CENTER) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_LEFT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_RIGHT) SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_SETCURSEL,0,0);
+
+
+				//////////////////
+				// 垂直方向の配置
+				//////////////////
+
+				//"デフォルト"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_DEFAULT);
+				//"上端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_TOP);
+				//"下端"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_BOTTOM);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+
+				//ビットを考慮してBS_VCENTERを最初に比較する
+				if((pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_VCENTER)==BS_VCENTER) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,3,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_TOP) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&BS_BOTTOM) SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_SETCURSEL,0,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_BS_AUTO:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_AUTO,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_AUTORADIOBUTTON );
+							}
+							else{
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AndStyle( 0xFFFFFFF0 );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_RADIOBUTTON );
+							}
+							return 1;
+						}
+						break;
+					case IDC_BS_PUSHLIKE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_PUSHLIKE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_PUSHLIKE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_PUSHLIKE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_LEFTTEXT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_LEFTTEXT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFTTEXT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_LEFTTEXT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_ICON:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_ICON );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+								SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_BITMAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_BITMAP,BM_GETCHECK,0,0)){
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BITMAP );
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_ICON );
+								SendDlgItemMessage(hwnd,IDC_BS_ICON,BM_SETCHECK,BST_UNCHECKED,0);
+							}
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_BITMAP );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_MULTILINE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_MULTILINE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_MULTILINE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_MULTILINE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_BS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_NOTIFY );
+							return 1;
+						}
+						break;
+
+					case IDC_BS_HPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_HPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_LEFT|BS_RIGHT|BS_CENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_LEFT );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_RIGHT );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_CENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_BS_VPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_BS_VPOS,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( BS_TOP|BS_BOTTOM|BS_VCENTER );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_TOP );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_BOTTOM );
+							else if(i3==3) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( BS_VCENTER );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+/////////////////////////
+// SCROLLBAR プロパティ
+
+INT_PTR CALLBACK RadProperty_ScrollBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+
+				////////
+				// 配置
+				////////
+
+				//"指定無し"
+				SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_SCROLLBARPROP_STYLE_FREE);
+				//"上/左"
+				SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_SCROLLBARPROP_STYLE_TOPORLEFT);
+				//"下/右"
+				SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_ADDSTRING,0,(LPARAM)STRING_SCROLLBARPROP_STYLE_BOTTOMORRIGHT);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SBS_TOPALIGN) SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SBS_BOTTOMALIGN) SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_SETCURSEL,0,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_SBS_POSITION:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_SBS_POSITION,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SBS_TOPALIGN|SBS_BOTTOMALIGN );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SBS_TOPALIGN );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SBS_BOTTOMALIGN );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+//////////////////////
+// STATIC プロパティ
+
+INT_PTR CALLBACK RadProperty_StaticProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_NOPREFIX) SendDlgItemMessage(hwnd,IDC_SS_NOPREFIX,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_LEFTNOWORDWRAP) SendDlgItemMessage(hwnd,IDC_SS_LEFTNOWORDWRAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_NOTIFY) SendDlgItemMessage(hwnd,IDC_SS_NOTIFY,BM_SETCHECK,BST_CHECKED,0);
+
+
+				//////////////////
+				// テキストの配置
+				//////////////////
+
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"中央"
+				SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_CENTER);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+
+				//ビットを考慮してSS_LEFTを最後に検討する
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_CENTER) SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&SS_RIGHT) SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_SETCURSEL,0,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_SS_NOPREFIX:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_NOPREFIX,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_NOPREFIX );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_NOPREFIX );
+							return 1;
+						}
+						break;
+					case IDC_SS_LEFTNOWORDWRAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_LEFTNOWORDWRAP,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_LEFTNOWORDWRAP );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_LEFTNOWORDWRAP );
+
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_SS_NOTIFY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_SS_NOTIFY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_NOTIFY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_NOTIFY );
+							return 1;
+						}
+						break;
+
+					case IDC_SS_TEXTPOS:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_SS_TEXTPOS,CB_GETCURSEL,0,0);
+							//SS_LEFT=0
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( SS_CENTER|SS_RIGHT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_CENTER );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( SS_RIGHT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+////////////////////////
+// TRACKBAR プロパティ
+INT_PTR CALLBACK RadProperty_TrackBarProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				///////////////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+
+				////////
+				// 表示
+				////////
+
+				//"水平方向"
+				SendDlgItemMessage(hwnd,IDC_TBS_SITUATION,CB_ADDSTRING,0,(LPARAM)STRING_DIRECTION_HORIZONTAL);
+				//"垂直方向"
+				SendDlgItemMessage(hwnd,IDC_TBS_SITUATION,CB_ADDSTRING,0,(LPARAM)STRING_DIRECTION_VERTICAL);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_VERT) SendDlgItemMessage(hwnd,IDC_TBS_SITUATION,CB_SETCURSEL,1,0);
+				else SendDlgItemMessage(hwnd,IDC_TBS_SITUATION,CB_SETCURSEL,0,0);
+
+
+				////////////
+				// ポイント
+				////////////
+
+				//"両方"
+				SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_ADDSTRING,0,(LPARAM)STRING_TRACKBARPROP_STYLE_POSITION_BOTH);
+				//"上/左"
+				SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_ADDSTRING,0,(LPARAM)STRING_TRACKBARPROP_STYLE_POSITION_TOPORLEFT);
+				//"下/右"
+				SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_ADDSTRING,0,(LPARAM)STRING_TRACKBARPROP_STYLE_POSITION_BOTTOMORRIGHT);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_BOTH) SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_SETCURSEL,0,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_TOP) SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_SETCURSEL,1,0);
+				else SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_SETCURSEL,2,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_NOTICKS) SendDlgItemMessage(hwnd,IDC_TBS_NOTICKS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_AUTOTICKS) SendDlgItemMessage(hwnd,IDC_TBS_AUTOTICKS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TBS_ENABLESELRANGE) SendDlgItemMessage(hwnd,IDC_TBS_ENABLESELRANGE,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_TBS_SITUATION:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_TBS_SITUATION,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TBS_VERT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_VERT );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_TBS_POINT:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_TBS_POINT,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TBS_BOTH|TBS_TOP );
+							if(i3==0) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_BOTH );
+							else if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_TOP );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_TBS_NOTICKS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TBS_NOTICKS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_NOTICKS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TBS_NOTICKS );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_TBS_AUTOTICKS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TBS_AUTOTICKS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_AUTOTICKS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TBS_AUTOTICKS );
+							return 1;
+						}
+						break;
+					case IDC_TBS_ENABLESELRANGE:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TBS_ENABLESELRANGE,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TBS_ENABLESELRANGE );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TBS_ENABLESELRANGE );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+//////////////////////////
+// TREEVIEW プロパティ
+INT_PTR CALLBACK RadProperty_TreeViewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+
+
+				////////////
+				//スタイル
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_HASBUTTONS) SendDlgItemMessage(hwnd,IDC_TVS_HASBUTTONS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_HASLINES) SendDlgItemMessage(hwnd,IDC_TVS_HASLINES,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_LINESATROOT) SendDlgItemMessage(hwnd,IDC_TVS_LINESATROOT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_EDITLABELS) SendDlgItemMessage(hwnd,IDC_TVS_EDITLABELS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_DISABLEDRAGDROP) SendDlgItemMessage(hwnd,IDC_TVS_DISABLEDRAGDROP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_SHOWSELALWAYS) SendDlgItemMessage(hwnd,IDC_TVS_SHOWSELALWAYS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_NOSCROLL) SendDlgItemMessage(hwnd,IDC_TVS_NOSCROLL,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_NOTOOLTIPS) SendDlgItemMessage(hwnd,IDC_TVS_NOTOOLTIPS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_CHECKBOXES) SendDlgItemMessage(hwnd,IDC_TVS_CHECKBOXES,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_FULLROWSELECT) SendDlgItemMessage(hwnd,IDC_TVS_FULLROWSELECT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_TRACKSELECT) SendDlgItemMessage(hwnd,IDC_TVS_TRACKSELECT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&TVS_SINGLEEXPAND) SendDlgItemMessage(hwnd,IDC_TVS_SINGLEEXPAND,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_TVS_HASBUTTONS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_HASBUTTONS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_HASBUTTONS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_HASBUTTONS );
+							return 1;
+						}
+						break;
+					case IDC_TVS_HASLINES:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_HASLINES,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_HASLINES );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_HASLINES );
+							return 1;
+						}
+						break;
+					case IDC_TVS_LINESATROOT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_LINESATROOT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_LINESATROOT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_LINESATROOT );
+							return 1;
+						}
+						break;
+					case IDC_TVS_EDITLABELS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_EDITLABELS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_EDITLABELS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_EDITLABELS );
+							return 1;
+						}
+						break;
+					case IDC_TVS_DISABLEDRAGDROP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_DISABLEDRAGDROP,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_DISABLEDRAGDROP );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_DISABLEDRAGDROP );
+							return 1;
+						}
+						break;
+					case IDC_TVS_SHOWSELALWAYS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_SHOWSELALWAYS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_SHOWSELALWAYS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_SHOWSELALWAYS );
+							return 1;
+						}
+						break;
+					case IDC_TVS_NOSCROLL:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_NOSCROLL,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_NOSCROLL );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_NOSCROLL );
+							return 1;
+						}
+						break;
+					case IDC_TVS_NOTOOLTIPS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_NOTOOLTIPS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_NOTOOLTIPS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_NOTOOLTIPS );
+							return 1;
+						}
+						break;
+					case IDC_TVS_CHECKBOXES:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_CHECKBOXES,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_CHECKBOXES );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_CHECKBOXES );
+							return 1;
+						}
+						break;
+					case IDC_TVS_FULLROWSELECT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_FULLROWSELECT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_FULLROWSELECT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_FULLROWSELECT );
+							return 1;
+						}
+						break;
+					case IDC_TVS_TRACKSELECT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_TRACKSELECT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_TRACKSELECT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_TRACKSELECT );
+							return 1;
+						}
+						break;
+					case IDC_TVS_SINGLEEXPAND:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_TVS_SINGLEEXPAND,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( TVS_SINGLEEXPAND );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( TVS_SINGLEEXPAND );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+				break;
+			}
+	}
+	return 0;
+}
+
+
+//////////////////////
+// UPDOWN プロパティ
+INT_PTR CALLBACK RadProperty_UpDownProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2,i3;
+	static BOOL bInitial;
+
+	switch(message){
+		case WM_INITDIALOG:
+			{
+				bInitial=1;
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				SetDlgItemText(hwnd,IDC_IDNAME,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetName().c_str());
+				SetDlgItemText(hwnd,IDC_CAPTION,pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetCaption().c_str());
+
+
+				//////////////////
+				// スタイル
+				////////////
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_DISABLED) SendDlgItemMessage(hwnd,IDC_STYLE_DISABLED,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_VISIBLE) SendDlgItemMessage(hwnd,IDC_STYLE_VISIBLE,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_GROUP) SendDlgItemMessage(hwnd,IDC_STYLE_GROUP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&WS_TABSTOP) SendDlgItemMessage(hwnd,IDC_STYLE_TABSTOP,BM_SETCHECK,BST_CHECKED,0);
+
+
+				////////
+				// 方向
+				////////
+
+				//"水平方向"
+				SendDlgItemMessage(hwnd,IDC_UDS_SITUATION,CB_ADDSTRING,0,(LPARAM)STRING_DIRECTION_HORIZONTAL);
+				//"垂直方向"
+				SendDlgItemMessage(hwnd,IDC_UDS_SITUATION,CB_ADDSTRING,0,(LPARAM)STRING_DIRECTION_VERTICAL);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_HORZ) SendDlgItemMessage(hwnd,IDC_UDS_SITUATION,CB_SETCURSEL,0,0);
+				else SendDlgItemMessage(hwnd,IDC_UDS_SITUATION,CB_SETCURSEL,1,0);
+
+				////////////
+				// アタッチ
+				////////////
+
+				//"なし"
+				SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_ADDSTRING,0,(LPARAM)STRING_NONE_);
+				//"左端"
+				SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_ADDSTRING,0,(LPARAM)STRING_LEFT);
+				//"右端"
+				SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_ADDSTRING,0,(LPARAM)STRING_RIGHT);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_ALIGNLEFT) SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_SETCURSEL,1,0);
+				else if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_ALIGNRIGHT) SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_SETCURSEL,2,0);
+				else SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_SETCURSEL,0,0);
+
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_AUTOBUDDY) SendDlgItemMessage(hwnd,IDC_UDS_AUTOBUDDY,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_SETBUDDYINT) SendDlgItemMessage(hwnd,IDC_UDS_SETBUDDYINT,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_NOTHOUSANDS) SendDlgItemMessage(hwnd,IDC_UDS_NOTHOUSANDS,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_WRAP) SendDlgItemMessage(hwnd,IDC_UDS_WRAP,BM_SETCHECK,BST_CHECKED,0);
+				if(pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle()&UDS_ARROWKEYS) SendDlgItemMessage(hwnd,IDC_UDS_ARROWKEYS,BM_SETCHECK,BST_CHECKED,0);
+
+				ApplyDialogTexture(hwnd);
+				bInitial=0;
+				break;
+			}
+		case WM_COMMAND:
+			{
+				i=GetWndNum(GetParent(GetParent(hwnd)));
+				if(i==-1) return 1;
+				i2=GetWndInfoNum(MdiInfo[i]->path);
+				ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[i]->path);
+
+				//共通スタイル
+				if(bInitial==0){
+					if(DefaultItemStyles(hwnd,i,i2,wParam)) return 1;
+				}
+
+				switch(LOWORD(wParam)){
+					case IDC_UDS_SITUATION:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_UDS_SITUATION,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_HORZ );
+							if(i3==0) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_HORZ );
+							DrawRadWindow(i,pWindowInfo);
+							return 1;
+						}
+						break;
+					case IDC_UDS_ATTACH:
+						if(HIWORD(wParam)==CBN_SELCHANGE){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							i3=SendDlgItemMessage(hwnd,IDC_UDS_ATTACH,CB_GETCURSEL,0,0);
+							pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_ALIGNLEFT|UDS_ALIGNRIGHT );
+							if(i3==1) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_ALIGNLEFT );
+							else if(i3==2) pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_ALIGNRIGHT );
+							return 1;
+						}
+						break;
+
+					case IDC_UDS_AUTOBUDDY:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_UDS_AUTOBUDDY,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_AUTOBUDDY );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_AUTOBUDDY );
+							return 1;
+						}
+						break;
+					case IDC_UDS_SETBUDDYINT:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_UDS_SETBUDDYINT,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_SETBUDDYINT );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_SETBUDDYINT );
+							return 1;
+						}
+						break;
+					case IDC_UDS_NOTHOUSANDS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_UDS_NOTHOUSANDS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_NOTHOUSANDS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_NOTHOUSANDS );
+							return 1;
+						}
+						break;
+					case IDC_UDS_WRAP:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_UDS_WRAP,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_WRAP );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_WRAP );
+							return 1;
+						}
+						break;
+					case IDC_UDS_ARROWKEYS:
+						if(HIWORD(wParam)==BN_CLICKED){
+							//変更情報
+							Rad_NoticeChanging(i,RAD_UNDO_STYLE,MdiInfo[i]->MdiRadInfo->SelectingItem[0],pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->GetStyle());
+
+							if(SendDlgItemMessage(hwnd,IDC_UDS_ARROWKEYS,BM_GETCHECK,0,0))
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->AddStyle( UDS_ARROWKEYS );
+							else
+								pWindowInfo->childWindowInfos[MdiInfo[i]->MdiRadInfo->SelectingItem[0]]->DeleteStyle( UDS_ARROWKEYS );
+							return 1;
+						}
+						break;
+
+					case IDC_EXSTYLE:
+						if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_RAD_PROP_ITEM_EXSTYLE),hwnd,DlgRadProperty_Item_ExStyle)) return 1;
+						DrawRadWindow(i,pWindowInfo);
+						return 1;
+				}
+			}
+	}
+	return 0;
+}
+
+
+LRESULT CALLBACK RadPropertyWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i;
+	RECT rect;
+	SCROLLINFO ScrollInfo;
+
+	switch(message){
+		case WM_MOUSEACTIVATE:
+			BringWindowToTop(GetParent(hwnd));
+			return 0;
+		case WM_VSCROLL:
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(LOWORD(wParam)==SB_LINEUP) i=-20;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=20;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=ScrollInfo.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-ScrollInfo.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-ScrollInfo.nPos,min(i,ScrollInfo.nMax-rect.bottom-ScrollInfo.nPos));
+			if(i!=0){
+				ScrollInfo.nPos+=i;
+				SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+				ScrollWindow(hwnd,0,-i,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+		case WM_SIZE:
+			i=GetWndNum(GetParent(hwnd));
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+			ScrollInfo.cbSize=sizeof(SCROLLINFO);
+			ScrollInfo.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			GetClientRect(MdiInfo[i]->MdiRadInfo->hProp_Dlg,&rect);
+			ScrollInfo.nMin=0;
+			ScrollInfo.nMax=rect.bottom;
+			ScrollInfo.nPage=HIWORD(lParam);
+			SetScrollInfo(hwnd,SB_VERT,&ScrollInfo,1);
+
+			i=ScrollInfo.nPos;
+			ScrollInfo.fMask=SIF_POS;
+			GetScrollInfo(hwnd,SB_VERT,&ScrollInfo);
+			if(i>ScrollInfo.nPos){
+				ScrollWindow(hwnd,0,i-ScrollInfo.nPos,NULL,NULL);
+				UpdateWindow(hwnd);
+			}
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/Rad_UndoRedo.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Rad_UndoRedo.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Rad_UndoRedo.cpp	(revision 774)
@@ -0,0 +1,556 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+void Rad_UndoCommand(int WndNum){
+	extern HINSTANCE hInst;
+	int i;
+	DWORD dw;
+	RAD_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiRadInfo->undo;
+	i=pUndoState->NowPos-1;
+	if(i==-1) i=MAX_UNDONUM-1;
+	if(!pUndoState->Command[i]){
+		MessageBeep(0);
+		return;
+	}
+	pUndoState->NowPos=i;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+	int WndInfoNum = GetWndInfoNum(MdiInfo[WndNum]->path);
+	switch(pUndoState->Command[pUndoState->NowPos]){
+		case RAD_UNDO_INSERTITEM:
+			DeleteDlgItem(WndNum,WndInfoNum,pUndoState->SelectItemNum[pUndoState->NowPos],0);
+			MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]=-1;
+			break;
+		case RAD_UNDO_DELETEITEM:
+			ActiveBasic::PM::ChildWindowInfo *pChildInfo;
+			RECT rect;
+			pChildInfo=(ActiveBasic::PM::ChildWindowInfo *)pUndoState->lpdwData[pUndoState->NowPos];
+			rect.left=pChildInfo->pos.x;
+			rect.top=pChildInfo->pos.y;
+			rect.right=pChildInfo->pos.x+pChildInfo->size.cx;
+			rect.bottom=pChildInfo->pos.y+pChildInfo->size.cy;
+			InsertDlgItem(WndNum,WndInfoNum,pUndoState->SelectItemNum[pUndoState->NowPos],
+				&pChildInfo->pos,&pChildInfo->size,
+				pChildInfo->GetName().c_str(),pChildInfo->GetCaption().c_str(),pChildInfo->GetStyle(),pChildInfo->GetExStyle(),pChildInfo->Control,pChildInfo->image.type,pChildInfo->image.path.c_str(),0);
+			break;
+		case RAD_UNDO_NAME:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				RAD_UNDOSTATE_NAME *names = (RAD_UNDOSTATE_NAME *)pUndoState->lpdwData[pUndoState->NowPos];
+
+				std::string tempStr = pWindowInfo->GetName();
+				pWindowInfo->SetName( names->name );
+				names->name = tempStr;
+
+				MdiInfo[WndNum]->path = pWindowInfo->GetName();
+			}
+			else{
+				std::string tempStr = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetName();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+		case RAD_UNDO_CAPTION:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				std::string tempStr = pWindowInfo->GetCaption();
+				pWindowInfo->SetCaption( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			else{
+				std::string tempStr = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetCaption();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetCaption( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_FONT:
+			LOGFONT *pLogFont,lf;
+			pLogFont=(LOGFONT *)pUndoState->lpdwData[pUndoState->NowPos];
+			lf=pWindowInfo->LogFont;
+			pWindowInfo->LogFont=*pLogFont;
+			*pLogFont=lf;
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_BGCOLOR:
+			{
+				int tempBgColor = pWindowInfo->GetBackgroundColor();
+				pWindowInfo->SetBackgroundColor( static_cast<int>(pUndoState->lpdwData[pUndoState->NowPos]) );
+				pUndoState->lpdwData[pUndoState->NowPos] = static_cast<DWORD>(tempBgColor);
+
+				if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+					ChangePropertyWindow(WndNum,WndInfoNum);
+				DrawRadWindow(WndNum,pWindowInfo);
+				break;
+			}
+		case RAD_UNDO_WINDOWMENU:
+			{
+				std::string tempMenuIdName = pWindowInfo->GetMenuIdName();
+				pWindowInfo->SetMenuIdName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos] = (DWORD)( new std::string( tempMenuIdName ) );
+				if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				{
+					ChangePropertyWindow(WndNum,WndInfoNum);
+				}
+				DrawRadWindow(WndNum,pWindowInfo);
+				break;
+			}
+		case RAD_UNDO_ICONRES:
+			{
+				std::string tempStr = pWindowInfo->GetIconResourceName();
+				pWindowInfo->SetIconResourceName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+		case RAD_UNDO_STYLE:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				dw=pWindowInfo->GetStyle();
+				pWindowInfo->SetStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			else{
+				dw=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetStyle();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_EXSTYLE:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				dw=pWindowInfo->GetExStyle();
+				pWindowInfo->SetExStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			else{
+				dw=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetExStyle();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetExStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_POSITION:
+			POINTANDSIZE PointAndSize,*pReadPointAndSize;
+			pReadPointAndSize=(POINTANDSIZE *)pUndoState->lpdwData[pUndoState->NowPos];
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				PointAndSize.size=pWindowInfo->size;
+				pWindowInfo->size=pReadPointAndSize->size;
+			}
+			else{
+				PointAndSize.pos=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->pos;
+				PointAndSize.size=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->size;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->pos=pReadPointAndSize->pos;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->size=pReadPointAndSize->size;
+			}
+			*pReadPointAndSize=PointAndSize;
+			DrawRadWindow(WndNum,pWindowInfo);
+			SetStatusText(NULL);
+
+			//サポートダイアログの内容をセット
+			SetSupportDlgData( WndNum, *pWindowInfo );
+			break;
+		case RAD_UNDO_IMAGESTATE:
+			{
+				ActiveBasic::PM::ImageControlInfo *pImageCtrlInfo = (ActiveBasic::PM::ImageControlInfo *)pUndoState->lpdwData[pUndoState->NowPos];
+
+				ActiveBasic::PM::ImageReferenceType::EnumType tempType = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.type;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.type = pImageCtrlInfo->type;
+				pImageCtrlInfo->type = tempType;
+
+				std::string tempPath = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.path;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.path = pImageCtrlInfo->path;
+				pImageCtrlInfo->path = tempPath;
+
+				if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+					ChangePropertyWindow(WndNum,WndInfoNum);
+				DrawRadWindow(WndNum,pWindowInfo);
+			}
+			break;
+		case RAD_UNDO_TYPE:
+			dw=(DWORD)pWindowInfo->GetType();
+			pWindowInfo->SetType( (ActiveBasic::PM::WindowType::EnumType)pUndoState->lpdwData[pUndoState->NowPos] );
+			pUndoState->lpdwData[pUndoState->NowPos]=dw;
+
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+	}
+
+	projectInfo.ModifyOfMaterial=1;
+
+	ResetState_UndoMenu();
+}
+void Rad_RedoCommand(int WndNum){
+	extern HINSTANCE hInst;
+	DWORD dw;
+	RAD_UNDOSTATE *pUndoState;
+	ActiveBasic::PM::ChildWindowInfo *pChildInfo;
+	RECT rect;
+
+	pUndoState=&MdiInfo[WndNum]->MdiRadInfo->undo;
+	if(!pUndoState->Command[pUndoState->NowPos]){
+		MessageBeep(0);
+		return;
+	}
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+	int WndInfoNum = GetWndInfoNum(MdiInfo[WndNum]->path);
+	switch(pUndoState->Command[pUndoState->NowPos]){
+		case RAD_UNDO_INSERTITEM:
+			pChildInfo=(ActiveBasic::PM::ChildWindowInfo *)pUndoState->lpdwData[pUndoState->NowPos];
+			rect.left=pChildInfo->pos.x;
+			rect.top=pChildInfo->pos.y;
+			rect.right=pChildInfo->pos.x+pChildInfo->size.cx;
+			rect.bottom=pChildInfo->pos.y+pChildInfo->size.cy;
+			InsertDlgItem(WndNum,WndInfoNum,pUndoState->SelectItemNum[pUndoState->NowPos],
+				&pChildInfo->pos,&pChildInfo->size,
+				pChildInfo->GetName().c_str(),pChildInfo->GetCaption().c_str(),pChildInfo->GetStyle(),pChildInfo->GetExStyle(),pChildInfo->Control,pChildInfo->image.type,pChildInfo->image.path.c_str(),0);
+			break;
+		case RAD_UNDO_DELETEITEM:
+			DeleteDlgItem(WndNum,WndInfoNum,pUndoState->SelectItemNum[pUndoState->NowPos],0);
+			MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]=-1;
+			break;
+		case RAD_UNDO_NAME:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				RAD_UNDOSTATE_NAME *names = (RAD_UNDOSTATE_NAME *)pUndoState->lpdwData[pUndoState->NowPos];
+
+				std::string tempStr = pWindowInfo->GetName();
+				pWindowInfo->SetName( names->name );
+				names->name = tempStr;
+
+				MdiInfo[WndNum]->path = pWindowInfo->GetName();
+			}
+			else{
+				std::string tempStr = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetName();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+		case RAD_UNDO_CAPTION:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				std::string tempStr = pWindowInfo->GetCaption();
+				pWindowInfo->SetCaption( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			else{
+				std::string tempStr = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetCaption();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetCaption( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_FONT:
+			LOGFONT *pLogFont,lf;
+			pLogFont=(LOGFONT *)pUndoState->lpdwData[pUndoState->NowPos];
+			lf=pWindowInfo->LogFont;
+			pWindowInfo->LogFont=*pLogFont;
+			*pLogFont=lf;
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_BGCOLOR:
+			{
+				int tempBgColor = pWindowInfo->GetBackgroundColor();
+				pWindowInfo->SetBackgroundColor( static_cast<int>(pUndoState->lpdwData[pUndoState->NowPos]) );
+				pUndoState->lpdwData[pUndoState->NowPos] = static_cast<DWORD>(tempBgColor);
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_WINDOWMENU:
+			{
+				std::string tempMenuIdName = pWindowInfo->GetMenuIdName();
+				pWindowInfo->SetMenuIdName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos] = (DWORD)( new std::string( tempMenuIdName ) );
+				if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				{
+					ChangePropertyWindow(WndNum,WndInfoNum);
+				}
+				DrawRadWindow(WndNum,pWindowInfo);
+				break;
+			}
+		case RAD_UNDO_ICONRES:
+			{
+				std::string tempStr = pWindowInfo->GetIconResourceName();
+				pWindowInfo->SetIconResourceName( *(std::string *)pUndoState->lpdwData[pUndoState->NowPos] );
+				delete (std::string *)pUndoState->lpdwData[pUndoState->NowPos];
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)( new std::string( tempStr ) );
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+		case RAD_UNDO_STYLE:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				dw=pWindowInfo->GetStyle();
+				pWindowInfo->SetStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			else{
+				dw=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetStyle();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_EXSTYLE:
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				dw=pWindowInfo->GetExStyle();
+				pWindowInfo->SetExStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			else{
+				dw=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->GetExStyle();
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->SetExStyle( pUndoState->lpdwData[pUndoState->NowPos] );
+				pUndoState->lpdwData[pUndoState->NowPos]=dw;
+			}
+			DrawRadWindow(WndNum,pWindowInfo);
+			break;
+		case RAD_UNDO_POSITION:
+			POINTANDSIZE PointAndSize,*pReadPointAndSize;
+			pReadPointAndSize=(POINTANDSIZE *)pUndoState->lpdwData[pUndoState->NowPos];
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==SELECT_WINDOW){
+				PointAndSize.size=pWindowInfo->size;
+				pWindowInfo->size=pReadPointAndSize->size;
+			}
+			else{
+				PointAndSize.pos=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->pos;
+				PointAndSize.size=pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->size;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->pos=pReadPointAndSize->pos;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->size=pReadPointAndSize->size;
+			}
+			*pReadPointAndSize=PointAndSize;
+			DrawRadWindow(WndNum,pWindowInfo);
+			SetStatusText(NULL);
+
+			//サポートダイアログの内容をセット
+			SetSupportDlgData( WndNum, *pWindowInfo );
+			break;
+		case RAD_UNDO_IMAGESTATE:
+			{
+				ActiveBasic::PM::ImageControlInfo *pImageCtrlInfo = (ActiveBasic::PM::ImageControlInfo *)pUndoState->lpdwData[pUndoState->NowPos];
+
+				ActiveBasic::PM::ImageReferenceType::EnumType tempType = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.type;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.type = pImageCtrlInfo->type;
+				pImageCtrlInfo->type = tempType;
+
+				std::string tempPath = pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.path;
+				pWindowInfo->childWindowInfos[pUndoState->SelectItemNum[pUndoState->NowPos]]->image.path = pImageCtrlInfo->path;
+				pImageCtrlInfo->path = tempPath;
+
+				if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+					ChangePropertyWindow(WndNum,WndInfoNum);
+				DrawRadWindow(WndNum,pWindowInfo);
+				break;
+			}
+		case RAD_UNDO_TYPE:
+			dw=(DWORD)pWindowInfo->GetType();
+			pWindowInfo->SetType( (ActiveBasic::PM::WindowType::EnumType)pUndoState->lpdwData[pUndoState->NowPos] );
+			pUndoState->lpdwData[pUndoState->NowPos]=dw;
+
+			if(pUndoState->SelectItemNum[pUndoState->NowPos]==MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0])
+				ChangePropertyWindow(WndNum,WndInfoNum);
+			break;
+	}
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
+
+	projectInfo.ModifyOfMaterial=1;
+
+	ResetState_UndoMenu();
+}
+void Rad_DeleteUndoData(int WndNum,int pos){
+	extern HANDLE hHeap;
+	RAD_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiRadInfo->undo;
+	switch(pUndoState->Command[pos]){
+		case RAD_UNDO_INSERTITEM:
+		case RAD_UNDO_DELETEITEM:
+			ActiveBasic::PM::ChildWindowInfo *pChildInfo;
+			pChildInfo=(ActiveBasic::PM::ChildWindowInfo *)pUndoState->lpdwData[pos];
+			delete pChildInfo;
+			break;
+		case RAD_UNDO_NAME:
+			if(pUndoState->SelectItemNum[pos]==SELECT_WINDOW){
+				RAD_UNDOSTATE_NAME *names = (RAD_UNDOSTATE_NAME *)pUndoState->lpdwData[pos];
+				delete names;
+			}
+			else
+			{
+				std::string *pTempStr = (std::string *)pUndoState->lpdwData[pos];
+				delete pTempStr;
+			}
+			break;
+		case RAD_UNDO_CAPTION:
+			{
+				std::string *pTempStr = (std::string *)pUndoState->lpdwData[pos];
+				delete pTempStr;
+			}
+			break;
+		case RAD_UNDO_FONT:
+			HeapDefaultFree((void *)pUndoState->lpdwData[pos]);
+			break;
+		case RAD_UNDO_WINDOWMENU:
+			{
+				std::string *pTempMenuId = (std::string *)pUndoState->lpdwData[pos];
+				delete pTempMenuId;
+			}
+			break;
+		case RAD_UNDO_ICONRES:
+			{
+				std::string *pTempStr = (std::string *)pUndoState->lpdwData[pos];
+				delete pTempStr;
+			}
+			break;
+		case RAD_UNDO_POSITION:
+			HeapDefaultFree((void *)pUndoState->lpdwData[pos]);
+			break;
+		case RAD_UNDO_IMAGESTATE:
+			{
+				ActiveBasic::PM::ImageControlInfo *pImageCtrlInfo = (ActiveBasic::PM::ImageControlInfo *)pUndoState->lpdwData[pUndoState->NowPos];
+
+				delete pImageCtrlInfo;
+
+				break;
+			}
+	}
+	pUndoState->Command[pos]=0;
+}
+void Rad_NoticeChanging(int WndNum,int Command,int SelectItemNum,DWORD dwData){
+	extern HANDLE hHeap;
+	int i;
+	RAD_UNDOSTATE *pUndoState;
+
+	pUndoState=&MdiInfo[WndNum]->MdiRadInfo->undo;
+
+	//Redoされた場合の不要なデータを削除する
+	for(i=pUndoState->NowPos;;i++){
+		if(i==MAX_UNDONUM) i=0;
+		if(pUndoState->Command[i]==0) break;
+		Rad_DeleteUndoData(WndNum,i);
+	}
+
+	pUndoState->Command[pUndoState->NowPos]=Command;
+	pUndoState->SelectItemNum[pUndoState->NowPos]=SelectItemNum;
+	switch(Command){
+		case RAD_UNDO_INSERTITEM:
+		case RAD_UNDO_DELETEITEM:
+			ActiveBasic::PM::ChildWindowInfo *pChildInfo,*pSaveChildInfo;
+			pChildInfo=(ActiveBasic::PM::ChildWindowInfo *)dwData;
+			pSaveChildInfo = new ActiveBasic::PM::ChildWindowInfo();
+			pSaveChildInfo->SetName( pChildInfo->GetName() );
+			pSaveChildInfo->pos=pChildInfo->pos;
+			pSaveChildInfo->size=pChildInfo->size;
+			pSaveChildInfo->SetCaption( pChildInfo->GetCaption() );
+			pSaveChildInfo->SetStyle( pChildInfo->GetStyle() );
+			pSaveChildInfo->SetExStyle( pChildInfo->GetExStyle() );
+			pSaveChildInfo->Control=pChildInfo->Control;
+			if(pChildInfo->Control==CT_IMAGEBOX){
+				//イメージ ボックスの場合
+				pSaveChildInfo->image = pChildInfo->image;
+			}
+			pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pSaveChildInfo;
+			break;
+		case RAD_UNDO_NAME:
+			if(SelectItemNum==SELECT_WINDOW){
+				RAD_UNDOSTATE_NAME *names = (RAD_UNDOSTATE_NAME *)dwData;
+				RAD_UNDOSTATE_NAME *SaveNames = new RAD_UNDOSTATE_NAME();
+				SaveNames->name = names->name;
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)SaveNames;
+			}
+			else{
+				std::string *pTempStr = new std::string( *(std::string *)dwData );
+				pUndoState->lpdwData[pUndoState->NowPos] = (DWORD)pTempStr;
+			}
+			break;
+		case RAD_UNDO_CAPTION:
+			{
+				std::string *pTempStr = new std::string( *(std::string *)dwData );
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pTempStr;
+			}
+			break;
+		case RAD_UNDO_FONT:
+			LOGFONT *pLogFont,*pSaveLogFont;
+			pLogFont=(LOGFONT *)dwData;
+			pSaveLogFont=(LOGFONT *)HeapAlloc(hHeap,0,sizeof(LOGFONT));
+			*pSaveLogFont=*pLogFont;
+			pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pSaveLogFont;
+			break;
+		case RAD_UNDO_BGCOLOR:
+			pUndoState->lpdwData[pUndoState->NowPos]=dwData;
+			break;
+		case RAD_UNDO_WINDOWMENU:
+			{
+				std::string *pTempStr = new std::string( *(std::string *)dwData );
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pTempStr;
+			}
+			break;
+		case RAD_UNDO_ICONRES:
+			{
+				std::string *pTempStr = new std::string( *(std::string *)dwData );
+				pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pTempStr;
+			}
+			break;
+		case RAD_UNDO_STYLE:
+		case RAD_UNDO_EXSTYLE:
+			pUndoState->lpdwData[pUndoState->NowPos]=dwData;
+			break;
+		case RAD_UNDO_POSITION:
+			POINTANDSIZE *pPointAndSize,*pSavePointAndSize;
+			pPointAndSize=(POINTANDSIZE *)dwData;
+			pSavePointAndSize=(POINTANDSIZE *)HeapAlloc(hHeap,0,sizeof(POINTANDSIZE));
+			pSavePointAndSize->pos=pPointAndSize->pos;
+			pSavePointAndSize->size=pPointAndSize->size;
+			pUndoState->lpdwData[pUndoState->NowPos]=(DWORD)pSavePointAndSize;
+			break;
+		case RAD_UNDO_IMAGESTATE:
+			{
+				ActiveBasic::PM::ImageControlInfo *pImageCtrlInfo = (ActiveBasic::PM::ImageControlInfo *)dwData;
+				ActiveBasic::PM::ImageControlInfo *pSaveImageCtrlInfo = new ActiveBasic::PM::ImageControlInfo( *pImageCtrlInfo );
+				pUndoState->lpdwData[pUndoState->NowPos] = (DWORD)( new ActiveBasic::PM::ImageControlInfo( *pImageCtrlInfo ) );
+				break;
+			}
+		case RAD_UNDO_TYPE:
+			pUndoState->lpdwData[pUndoState->NowPos]=dwData;
+			break;
+	}
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
+	if(pUndoState->Command[pUndoState->NowPos]){
+		//一番古い情報を切り捨てる
+		Rad_DeleteUndoData(WndNum,pUndoState->NowPos);
+	}
+
+	projectInfo.ModifyOfMaterial=1;
+
+	ResetState_UndoMenu();
+}
Index: branches/egtra/ab5.0/abdev/abdev/Replace.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Replace.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Replace.cpp	(revision 774)
@@ -0,0 +1,492 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void TextEdit_ResetWordColor(int WndNum,CHARRANGE *pCharRange,int DocType){
+	extern HANDLE hHeap;
+	int i,i2,IsStr;
+	char *pBuf,*pTemp;
+	CHARRANGE Range,cr2;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//行の先頭位置を取得
+	i=pCharRange->cpMin;
+	for(;i>0;i--){
+		if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
+			i++;
+			break;
+		}
+	}
+	Range.cpMin=i;
+
+	//行の末端位置を取得
+	i=pCharRange->cpMax;
+	for(;;i++){
+		if(pBuf[i]=='\0') break;
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') break;
+	}
+	Range.cpMax=i;
+
+	//初期化（すべて黒色に戻す）
+	for(i=Range.cpMin;i<Range.cpMax;i++){
+		MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
+	}
+
+	if(DocType==WNDTYPE_TEXT) return;
+
+	pTemp=(char *)HeapAlloc(hHeap,0,Range.cpMax-Range.cpMin+1);
+
+	for(i=Range.cpMin,IsStr=0;i<Range.cpMax;i++){
+		if((IsVariableTopChar(pBuf[i])||pBuf[i]=='#')&&IsStr==0){
+			cr2.cpMin=i;
+			for(i2=0;;i++,i2++){
+				if((!IsVariableChar(pBuf[i]))||pBuf[i]=='.'){
+					pTemp[i2]=0;
+					break;
+				}
+				pTemp[i2]=pBuf[i];
+			}
+			cr2.cpMax=i;
+
+			//予約語（青色）
+			bool result = false;
+			if(DocType==WNDTYPE_BASIC)
+			{
+				result = ActiveBasic::IDE::Program::ablang->IsExistKeyword( pTemp );
+			}
+			else if(DocType==WNDTYPE_HTML) result=IsHtmlReservedWord(pTemp);
+
+			if(result){
+				for(i2=cr2.cpMin;i2<cr2.cpMax;i2++){
+					MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i2]=tci.rgbStatement;
+				}
+			}
+		}
+		if(IsStr||ActiveBasic::IDE::Program::ablang->IsQuoteMark( pBuf[i] )&&IsStr==0){
+			//文字列カラー（""で囲まれる範囲）
+			MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbString;
+		}
+		if(pBuf[i]=='\0') break;
+		if( ActiveBasic::IDE::Program::ablang->IsQuoteMark( pBuf[i] ) )
+		{
+			IsStr^=1;
+		}
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			i++;
+			IsStr=0;
+		}
+	}
+
+	HeapDefaultFree(pTemp);
+}
+
+void TextEdit_Replace(int WndNum,char *str,BOOL bRedraw){
+	extern HANDLE hHeap;
+	CHARRANGE Range,DelRange;
+
+	TextEdit_GetSel(WndNum,&DelRange);
+
+	Range.cpMin=DelRange.cpMin;
+	Range.cpMax=DelRange.cpMin+lstrlen(str);
+
+	//バッファ長を取得
+	int length;
+	length=lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer);
+
+	int delta;
+	delta=DelRange.cpMin-DelRange.cpMax+(Range.cpMax-Range.cpMin);
+	if(0<delta){
+		////////////////////
+		// バッファを再確保
+		////////////////////
+
+		MdiInfo[WndNum]->pMdiTextEdit->buffer=(char *)HeapReAlloc(hHeap,
+			0,
+			MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			length+1+delta);
+
+		MdiInfo[WndNum]->pMdiTextEdit->pColorRef=(COLORREF *)HeapReAlloc(hHeap,
+			0,
+			MdiInfo[WndNum]->pMdiTextEdit->pColorRef,
+			(length+1+delta)*sizeof(COLORREF));
+	}
+
+
+	//ブレークポイントのオフセット分を計算
+	if( projectInfo.IsOpened() ){
+		projectInfo.pobj_DBBreakPoint->replace(
+			MdiInfo[WndNum]->path.c_str(),
+			MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			&DelRange,
+			&Range,
+			str);
+	}
+	else{
+		extern CDBBreakPoint *pobj_DBBreakPoint;
+		pobj_DBBreakPoint->replace(
+			MdiInfo[WndNum]->path.c_str(),
+			MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			&DelRange,
+			&Range,
+			str);
+	}
+
+
+	//文字列バッファをスライドして、挿入
+	SlideString(MdiInfo[WndNum]->pMdiTextEdit->buffer+DelRange.cpMax,
+		delta);
+	memcpy(MdiInfo[WndNum]->pMdiTextEdit->buffer+Range.cpMin,str,lstrlen(str));
+
+	//文字カラーバッファをスライド
+	SlideBuffer(((char *)MdiInfo[WndNum]->pMdiTextEdit->pColorRef)+DelRange.cpMax*sizeof(COLORREF),
+		(length-DelRange.cpMax) * sizeof(COLORREF),
+		delta*sizeof(COLORREF));
+	//色づけ
+	TextEdit_ResetWordColor(WndNum,&Range,MdiInfo[WndNum]->DocType);
+
+	//新しいキャレット位置に変更
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		Range.cpMax,
+		&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+	MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+
+	//コントロールタブスペースの幅と行番号の文字数を更新
+	MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace=
+		GetControlTabSpace(WndNum,&MdiInfo[WndNum]->pMdiTextEdit->iLineNumberTextCount);
+
+	if(bRedraw){
+		///////////////
+		// 再描画
+		///////////////
+
+		if(!TextEdit_ScrollCaret(WndNum,0)){
+			UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);	//ちらつき防止
+			InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
+		}
+
+		ResetCaretPos(WndNum,1);
+	}
+
+	//上下キャレット移動時の左右位置保持機能を解除
+	MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+	//編集メニューをリセット
+	ResetState_EditMenu();
+
+	if( ! MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
+		//変更フラグをセット
+		MdiInfo[WndNum]->pMdiTextEdit->Modify();
+	}
+
+
+	//if( projectInfo.IsOpened() ){
+		//プロジェクトが開かれているとき
+		if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
+			//クラスツリーを再表示
+			HTREEITEM hFileTreeItem = projectInfo.fileSystem.root.IsExistFile( MdiInfo[WndNum]->path )
+				? projectInfo.fileSystem.root.FindFile( MdiInfo[WndNum]->path ).GetTreeItemHandle()
+				: (HTREEITEM)-1;
+			ResetClassTree( hFileTreeItem );
+		}
+	//}
+}
+void TextEdit_ReplaceUpdateUndoData(int WndNum,char *str,BOOL bPaste,BOOL bRedraw){
+	extern HANDLE hHeap;
+	int Command;
+	char *KeyStr,*DelStr;
+	char temporary[255];
+	CHARRANGE Range,DelRange;
+
+	if(MdiInfo[WndNum]->IndentStr){
+		//自動インデントを有効にする
+		lstrcpy(temporary,MdiInfo[WndNum]->IndentStr);
+
+		CancelBeforeAutoIndent(WndNum);
+		TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+	}
+
+	TextEdit_GetSel(WndNum,&DelRange);
+	if(DelRange.cpMin!=DelRange.cpMax){
+		Command=TEXTEDIT_UNDO_SELKEY;
+		DelStr=(char *)HeapAlloc(hHeap,0,DelRange.cpMax-DelRange.cpMin+1);
+
+		TextEdit_GetSelText(WndNum,&DelRange,DelStr);
+
+		Range.cpMin=DelRange.cpMin;
+		Range.cpMax=DelRange.cpMin;
+	}
+	else{
+		if(bPaste) Command=TEXTEDIT_UNDO_PASTE;
+		else Command=TEXTEDIT_UNDO_KEY;
+		DelStr=0;
+
+		Range=DelRange;
+	}
+	if(str[0]){
+		KeyStr=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
+		lstrcpy(KeyStr,str);
+		Range.cpMax+=lstrlen(KeyStr);
+	}
+	else KeyStr=0;
+	TextEdit_NoticeChanging(WndNum,Command,KeyStr,DelStr,&Range,&DelRange);
+
+	TextEdit_Replace(WndNum,str,bRedraw);
+}
+
+
+void TextEdit_Convert(int id){
+	int i,i2;
+
+	int WndNum;
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+	CHARRANGE CharRange;
+	int length;
+	TextEdit_GetSel(WndNum,&CharRange);
+
+#ifdef THETEXT
+	if(id==IDM_CONV_HASRETURN||id==IDM_CONV_QUOTE){
+#else
+	if(id==IDM_CODEFORMAT){
+#endif
+		char *pBuf;
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+		//行全体を選択(min)
+		for(i=CharRange.cpMin;i>0;i--){
+			if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
+				i++;
+				break;
+			}
+		}
+		CharRange.cpMin=i;
+
+		//行全体を選択(max)
+		for(i=CharRange.cpMax;;i++){
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'||pBuf[i]=='\0') break;
+		}
+		CharRange.cpMax=i;
+
+		TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,0);
+	}
+
+	length=CharRange.cpMax-CharRange.cpMin;
+
+	char *buffer,*temporary;
+	buffer=(char *)HeapAlloc(hHeap,0,length*3+1024);
+	temporary=(char *)HeapAlloc(hHeap,0,length*3+1024);
+	memcpy(buffer,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,length);
+	buffer[length]=0;
+
+	int x=0;
+	switch(id){
+		case IDM_CONV_ALPHA_SMALL:
+			CharLower(buffer);
+			break;
+		case IDM_CONV_ALPHA_BIG:
+			CharUpper(buffer);
+			break;
+		case IDM_CONV_HALF:
+			LCMapString(GetUserDefaultLCID(),LCMAP_HALFWIDTH,buffer,length+1,temporary,length*2+1);
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_MULTI:
+			LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH,buffer,length+1,temporary,length*2+1);
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_KATAKANA:
+			LCMapString(GetUserDefaultLCID(),LCMAP_KATAKANA,buffer,length+1,temporary,length*2+1);
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_HIRAGANA:
+			LCMapString(GetUserDefaultLCID(),LCMAP_HIRAGANA,buffer,length+1,temporary,length*2+1);
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_SPACE:
+			temporary=(char *)HeapReAlloc(hHeap,0,temporary,length*pobj_nv->TabSize+1);
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,length*pobj_nv->TabSize+1);
+			for(i=0,i2=0;;i++,i2++){
+				if(buffer[i]=='\t'){
+					memset(temporary+i2,' ',pobj_nv->TabSize);
+					i2+=pobj_nv->TabSize-1;
+					continue;
+				}
+				temporary[i2]=buffer[i];
+				if(buffer[i]=='\0') break;
+			}
+
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_TAB:
+			char szSpaceTemp[255];
+			memset(szSpaceTemp,' ',pobj_nv->TabSize);
+			szSpaceTemp[pobj_nv->TabSize]=0;
+
+			for(i=0,i2=0;;i++,i2++){
+				if(memcmp(buffer+i,szSpaceTemp,pobj_nv->TabSize)==0){
+					temporary[i2]='\t';
+					i+=pobj_nv->TabSize-1;
+					continue;
+				}
+				temporary[i2]=buffer[i];
+				if(buffer[i]=='\0') break;
+			}
+
+			lstrcpy(buffer,temporary);
+			break;
+
+#ifdef THETEXT
+		case IDM_CONV_HASRETURN:
+			//折り返し改行を挿入
+			int i3;
+			for(i=0,i2=0,x=0;;i++,i2++,x++){
+				if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+					temporary[i2++]=buffer[i++];
+					temporary[i2]=buffer[i];
+					x=-1;
+					continue;
+				}
+				if(x>pobj_nv->iMaxOneLineTextLength-2){
+					//自動改行（英単語を考慮）
+					int i3=0;
+					while(IsVariableChar(buffer[i-1])){
+						i--;
+						i2--;
+						x--;
+						i3++;
+						if(x==1){
+							i+=i3;
+							i2+=i3;
+							x+=i3;
+							break;
+						}
+					}
+					if(i3==1){
+						i++;
+						i2++;
+						x++;
+					}
+					temporary[i2++]='\r';
+					temporary[i2]='\n';
+					i--;
+					x=-1;
+					continue;
+				}
+
+				if(IsDBCSLeadByte(buffer[i])){
+					temporary[i2++]=buffer[i++];
+					temporary[i2]=buffer[i];
+					x++;
+				}
+				else{
+					temporary[i2]=buffer[i];
+
+					if(buffer[i]=='\t'){
+						//タブ文字
+						int tab;
+						tab=pobj_nv->TabSize;
+
+						if(x%tab==0) i3=tab;
+						else i3=tab-x%tab;
+						x+=i3-1;
+					}
+				}
+
+				if(buffer[i]=='\0') break;
+			}
+
+			lstrcpy(buffer,temporary);
+			break;
+		case IDM_CONV_QUOTE:
+			//引用文に変換
+			for(i=0,i2=0,x=0;;i++,i2++,x++){
+				if(x==0){
+					//"> " を挿入
+					temporary[i2++]='>';
+					temporary[i2++]=' ';
+				}
+				if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+					temporary[i2++]=buffer[i++];
+					temporary[i2]=buffer[i];
+					x=-1;
+					continue;
+				}
+				if(x>pobj_nv->iMaxOneLineTextLength-4){
+					//自動改行（英単語を考慮）
+					int i3=0;
+					while(IsVariableChar(buffer[i-1])){
+						i--;
+						i2--;
+						x--;
+						i3++;
+						if(x==1){
+							i+=i3;
+							i2+=i3;
+							x+=i3;
+							break;
+						}
+					}
+					if(i3==1){
+						i++;
+						i2++;
+						x++;
+					}
+					temporary[i2++]='\r';
+					temporary[i2]='\n';
+					i--;
+					x=-1;
+					continue;
+				}
+
+				if(IsDBCSLeadByte(buffer[i])){
+					temporary[i2++]=buffer[i++];
+					temporary[i2]=buffer[i];
+					x++;
+				}
+				else{
+					temporary[i2]=buffer[i];
+					if(buffer[i]=='\t'){
+						//タブ文字
+						int tab;
+						tab=pobj_nv->TabSize;
+
+						if(x%tab==0) i3=tab;
+						else i3=tab-x%tab;
+						x+=i3-1;
+					}
+				}
+
+				if(buffer[i]=='\0') break;
+			}
+
+			lstrcpy(buffer,temporary);
+			break;
+
+#else	//ProjectEditor
+
+		case IDM_CODEFORMAT:
+			char *temp2;
+			temp2=CodeFormatter(buffer);
+			HeapDefaultFree(buffer);
+			buffer=temp2;
+			break;
+
+#endif
+	}
+
+
+
+	//テキストエディタの文字列をリプレイス
+	TextEdit_ReplaceUpdateUndoData(WndNum,
+		buffer,
+		1,
+		1);
+
+	HeapDefaultFree(buffer);
+	HeapDefaultFree(temporary);
+
+	//キャレット位置までスクロールする
+	TextEdit_ScrollCaret(WndNum,0);
+	ResetCaretPos(WndNum);
+}
Index: branches/egtra/ab5.0/abdev/abdev/Resource.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Resource.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Resource.cpp	(revision 774)
@@ -0,0 +1,383 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+
+void Project_CursorResInsert(void){
+	extern HANDLE hHeap;
+	extern LPSTR CursorFileFilter;
+	int i3;
+	char temporary[MAX_PATH];
+
+	//"カーソル ファイルを指定してください"
+	if(!GetFilePathDialog(hOwner,temporary,CursorFileFilter,STRING_FILEOPENTITLE_CURSOR,TRUE)) return;
+
+	ActiveBasic::Common::ResourceItem item;
+	item.filepath = projectInfo.GetWorkDir().GetRelationalPath( temporary );
+
+	for(i3=1;;i3++){
+		sprintf(temporary,"IDC_CURSOR%d",i3);
+		bool isDuplicate = false;
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.cursorResources )
+		{
+			if( resourceItem.idName == temporary )
+			{
+				isDuplicate = true;
+				break;
+			}
+		}
+
+		if( !isDuplicate )
+		{
+			break;
+		}
+	}
+	item.idName = temporary;
+
+	//ツリービューに追加
+	extern HWND hMaterialTreeView;
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.item.iImage=6;
+	tv.item.iSelectedImage=6;
+	tv.hParent = hCursorTreeItemForProjectView;
+	tv.item.pszText=temporary;
+
+	item.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
+
+	TreeView_SelectItem( hMaterialTreeView, item.hTreeItem );
+
+	projectInfo.resourceManager.cursorResources.push_back( item );
+
+	projectInfo.ModifuOfResource=1;
+}
+void Project_Cursor_Delete(int CursorInfoNum){
+	//ツリービューから削除
+	extern HWND hMaterialTreeView;
+	TreeView_DeleteItem(hMaterialTreeView,projectInfo.resourceManager.cursorResources[CursorInfoNum].hTreeItem);
+
+	//projectInfo.pCursorInfo構造体から削除
+	Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.cursorResources, CursorInfoNum );
+
+	projectInfo.ModifuOfResource=1;
+}
+void Project_Cursor_RenameID(int CursorInfoNum){
+	extern HANDLE hHeap;
+	extern char NewIdName[MAX_PATH];
+	extern HWND hMaterialTreeView;
+	int i2;
+	char temporary[MAX_PATH];
+	TVITEM tvItem;
+
+	if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_ResourceID_Input,(long)projectInfo.resourceManager.cursorResources[CursorInfoNum].idName.c_str())) return;
+
+	//重複チェック
+	for(i2=0;i2<static_cast<int>(projectInfo.resourceManager.cursorResources.size());i2++){
+		if(i2==CursorInfoNum) continue;
+		if( projectInfo.resourceManager.cursorResources[i2].idName == NewIdName )
+		{
+			//"ID \"%s\" は既にプロジェクト内に存在します。"
+			sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	projectInfo.resourceManager.cursorResources[CursorInfoNum].idName = NewIdName;
+
+	tvItem.hItem=projectInfo.resourceManager.cursorResources[CursorInfoNum].hTreeItem;
+	tvItem.mask=TVIF_TEXT;
+	lstrcpy( temporary, projectInfo.resourceManager.cursorResources[CursorInfoNum].idName.c_str() );
+	tvItem.pszText=temporary;
+	tvItem.cchTextMax=lstrlen(temporary)+1;
+	TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+	projectInfo.ModifuOfResource=1;
+
+	TreeView_SortChildren(hMaterialTreeView,
+		TreeView_GetParent(hMaterialTreeView,projectInfo.resourceManager.cursorResources[CursorInfoNum].hTreeItem),
+		0);
+}
+
+void Project_BitmapResInsert(void){
+	extern HANDLE hHeap;
+	extern LPSTR BitmapFileFilter;
+	int i2,i3;
+	char temporary[MAX_PATH];
+
+	//"ビットマップ ファイルを指定してください"
+	if(!GetFilePathDialog(hOwner,temporary,BitmapFileFilter,STRING_FILEOPENTITLE_BITMAP,TRUE)) return;
+
+	ActiveBasic::Common::ResourceItem item;
+	item.filepath = projectInfo.GetWorkDir().GetRelationalPath( temporary );
+
+	for(i3=1;;i3++){
+		sprintf(temporary,"IDB_BITMAP%d",i3);
+		bool isDuplicate = false;
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
+		{
+			if( resourceItem.idName == temporary )
+			{
+				isDuplicate = true;
+				break;
+			}
+		}
+
+		if( !isDuplicate )
+		{
+			break;
+		}
+	}
+	item.idName = temporary;
+
+	//ツリービューに追加
+	extern HWND hMaterialTreeView;
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.item.iImage=5;
+	tv.item.iSelectedImage=5;
+	tv.hParent = hBitmapTreeItemForProjectView;
+	tv.item.pszText=temporary;
+
+	item.hTreeItem = TreeView_InsertItem(hMaterialTreeView,&tv);
+
+	TreeView_SelectItem(hMaterialTreeView,item.hTreeItem);
+
+	projectInfo.resourceManager.bitmapResources.push_back( item );
+
+	projectInfo.ModifuOfResource=1;
+
+
+	////////////////////////////////
+	// ウィンドウ プロパティを更新
+	for(i2=0;i2<MdiInfo.size();i2++){
+		if(MdiInfo[i2]->hwnd&&MdiInfo[i2]->DocType==WNDTYPE_RAD){
+			if(MdiInfo[i2]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+				ChangePropertyWindow(i2,GetWndInfoNum(MdiInfo[i2]->path));
+		}
+	}
+}
+void Project_Bitmap_Delete(int BitmapInfoNum){
+	//ツリービューから削除
+	extern HWND hMaterialTreeView;
+	TreeView_DeleteItem(hMaterialTreeView,projectInfo.resourceManager.bitmapResources[BitmapInfoNum].hTreeItem);
+
+	//projectInfo.pBitmapInfo構造体から削除
+	Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.bitmapResources, BitmapInfoNum );
+
+	projectInfo.ModifuOfResource=1;
+}
+void Project_Bitmap_RenameID(int BitmapInfoNum){
+	extern HANDLE hHeap;
+	extern char NewIdName[MAX_PATH];
+	extern HWND hMaterialTreeView;
+	int i2;
+	char temporary[MAX_PATH];
+	TVITEM tvItem;
+
+	if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_ResourceID_Input,(long)projectInfo.resourceManager.bitmapResources[BitmapInfoNum].idName.c_str())) return;
+
+	//重複チェック
+	for(i2=0;i2<static_cast<int>(projectInfo.resourceManager.bitmapResources.size());i2++){
+		if(i2==BitmapInfoNum) continue;
+		if( projectInfo.resourceManager.bitmapResources[i2].idName == NewIdName )
+		{
+			//"ID \"%s\" は既にプロジェクト内に存在します。"
+			sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	projectInfo.resourceManager.bitmapResources[BitmapInfoNum].idName = NewIdName;
+
+	tvItem.hItem=projectInfo.resourceManager.bitmapResources[BitmapInfoNum].hTreeItem;
+	tvItem.mask=TVIF_TEXT;
+	lstrcpy( temporary, projectInfo.resourceManager.bitmapResources[BitmapInfoNum].idName.c_str() );
+	tvItem.pszText = temporary;
+	tvItem.cchTextMax=lstrlen(temporary)+1;
+	TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+	projectInfo.ModifuOfResource=1;
+
+	TreeView_SortChildren(hMaterialTreeView,
+		TreeView_GetParent(hMaterialTreeView,projectInfo.resourceManager.bitmapResources[BitmapInfoNum].hTreeItem),
+		0);
+}
+void Project_IconResInsert(void){
+	extern HANDLE hHeap;
+	extern LPSTR IconFileFilter;
+	int i2,i3;
+	char temporary[MAX_PATH];
+
+	//"アイコン ファイルを指定してください"
+	if(!GetFilePathDialog(hOwner,temporary,IconFileFilter,STRING_FILEOPENTITLE_ICON,TRUE)) return;
+
+	ActiveBasic::Common::ResourceItem item;
+	item.filepath = projectInfo.GetWorkDir().GetRelationalPath( temporary );
+
+	for(i3=1;;i3++){
+		sprintf(temporary,"IDI_ICON%d",i3);
+		bool isDuplicate = false;
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
+		{
+			if( resourceItem.idName == temporary )
+			{
+				isDuplicate = true;
+				break;
+			}
+		}
+
+		if( !isDuplicate )
+		{
+			break;
+		}
+	}
+	item.idName = temporary;
+
+	//ツリービューに追加
+	extern HWND hMaterialTreeView;
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.item.iImage=4;
+	tv.item.iSelectedImage=4;
+	tv.hParent = hIconTreeItemForProjectView;
+	if(projectInfo.resourceManager.iconResources.size()==0) lstrcat(temporary," (Main)");
+	tv.item.pszText=temporary;
+
+	item.hTreeItem=
+		TreeView_InsertItem(hMaterialTreeView,&tv);
+
+	TreeView_SelectItem(hMaterialTreeView,item.hTreeItem);
+
+	projectInfo.resourceManager.iconResources.push_back( item );
+
+	projectInfo.ModifuOfResource=1;
+
+	////////////////////////////////
+	// ウィンドウ プロパティを更新
+	for(i2=0;i2<MdiInfo.size();i2++){
+		if(MdiInfo[i2]->hwnd&&MdiInfo[i2]->DocType==WNDTYPE_RAD){
+			if(MdiInfo[i2]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+				ChangePropertyWindow(i2,GetWndInfoNum(MdiInfo[i2]->path));
+		}
+	}
+}
+void Project_Icon_Delete(int IconInfoNum){
+	extern HANDLE hHeap;
+	int i2;
+	char temporary[MAX_PATH];
+	TVITEM tv;
+
+	//ツリービューから削除
+	extern HWND hMaterialTreeView;
+	TreeView_DeleteItem(hMaterialTreeView,projectInfo.resourceManager.iconResources[IconInfoNum].hTreeItem);
+
+	//projectInfo.pIconInfo構造体から削除
+	Jenga::Common::EraseVectorItem<ActiveBasic::Common::ResourceItems>( projectInfo.resourceManager.iconResources, IconInfoNum );
+
+	if(IconInfoNum==0&&projectInfo.resourceManager.iconResources.size()){
+		tv.mask=TVIF_TEXT|TVIF_HANDLE;
+		tv.pszText=temporary;
+		tv.cchTextMax=MAX_PATH;
+		tv.hItem=projectInfo.resourceManager.iconResources[0].hTreeItem;
+		TreeView_GetItem(hMaterialTreeView,&tv);
+		lstrcat(tv.pszText," (Main)");
+		TreeView_SetItem(hMaterialTreeView,&tv);
+	}
+
+	projectInfo.ModifuOfResource=1;
+
+	////////////////////////////////
+	// ウィンドウ プロパティを更新
+	for(i2=0;i2<MdiInfo.size();i2++){
+		if(MdiInfo[i2]->hwnd&&MdiInfo[i2]->DocType==WNDTYPE_RAD){
+			if(MdiInfo[i2]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW)
+				ChangePropertyWindow(i2,GetWndInfoNum(MdiInfo[i2]->path));
+		}
+	}
+}
+void Project_Icon_RenameID(int IconInfoNum){
+	extern HANDLE hHeap;
+	extern char NewIdName[MAX_PATH];
+	extern HWND hMaterialTreeView;
+	int i2;
+	char temporary[MAX_PATH];
+	TVITEM tvItem;
+
+	if(!DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_INPUTID),hOwner,(DLGPROC)DlgProject_ResourceID_Input,(long)projectInfo.resourceManager.iconResources[IconInfoNum].idName.c_str())) return;
+
+	//重複チェック
+	for(i2=0;i2<static_cast<int>(projectInfo.resourceManager.iconResources.size());i2++){
+		if(i2==IconInfoNum) continue;
+		if( projectInfo.resourceManager.iconResources[i2].idName == NewIdName )
+		{
+			//"ID \"%s\" は既にプロジェクト内に存在します。"
+			sprintf(temporary,STRING_DUPLICATIONERROR_ID_IN_PROJECT,NewIdName);
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	projectInfo.resourceManager.iconResources[IconInfoNum].idName = NewIdName;
+
+	tvItem.hItem=projectInfo.resourceManager.iconResources[IconInfoNum].hTreeItem;
+	tvItem.mask=TVIF_TEXT;
+	if(IconInfoNum==0){
+		sprintf(temporary,"%s (Main)",projectInfo.resourceManager.iconResources[IconInfoNum].idName.c_str());
+	}
+	else
+	{
+		sprintf(temporary,"%s",projectInfo.resourceManager.iconResources[IconInfoNum].idName.c_str());
+	}
+	tvItem.pszText=temporary;
+	tvItem.cchTextMax=lstrlen(temporary)+1;
+	TreeView_SetItem(hMaterialTreeView,&tvItem);
+
+	projectInfo.ModifuOfResource=1;
+
+	TreeView_SortChildren(hMaterialTreeView,
+		TreeView_GetParent(hMaterialTreeView,projectInfo.resourceManager.iconResources[IconInfoNum].hTreeItem),
+		0);
+}
+
+BOOL CALLBACK DlgProject_ResourceID_Input(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern char NewIdName[MAX_PATH];
+	switch(message){
+		case WM_INITDIALOG:
+			//"IDの変更"
+			SetWindowText(hwnd,STRING_RENAME_ID);
+
+			SetDlgItemText(hwnd,IDC_IDNAME,(char *)lParam);
+			SetPosCenter(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDC_IDNAME,NewIdName,MAX_PATH);
+					if(!NewIdName[0]){
+						//"ID名を入力して下さい。"
+						MessageBox(hwnd,STRING_ERROR_MUST_IDNAME,APPLICATION_NAME,MB_OK);
+						return 1;
+					}
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/Ruler.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Ruler.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Ruler.cpp	(revision 774)
@@ -0,0 +1,121 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void OnPaint(HWND hwnd,HDC hdc)
+{
+	CRuler *pobj_Ruler = reinterpret_cast<CRuler *>(GetWindowLongPtr(hwnd,GWLP_USERDATA));
+	pobj_Ruler->draw(hdc);
+}
+
+LRESULT CALLBACK RulerProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_PAINT:
+			PAINTSTRUCT ps;
+			OnPaint(hwnd,BeginPaint(hwnd,&ps));
+			EndPaint(hwnd,&ps);
+			break;
+		case WM_PRINTCLIENT:
+			OnPaint(hwnd, reinterpret_cast<HDC>(wParam));
+			break;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+CRuler::CRuler(HWND hParent,MDIINFO *pMdiInfo)
+	: pMdiInfo( pMdiInfo )
+{
+	hRulerWnd=CreateWindowEx(0,"Ruler","Ruler",
+		WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE,
+		0,0,0,0,
+		hParent,0,hInst,0);
+	SetWindowLongPtr(hRulerWnd,GWLP_USERDATA,(LONG_PTR)this);
+
+	HDC hdc;
+	hdc=GetDC(hRulerWnd);
+
+	memdc=CreateCompatibleDC(hdc);
+	hMemBmp=CreateCompatibleBitmap(hdc,ScreenX,HEIGHT_RULER);
+	SelectObject(memdc,hMemBmp);
+
+	ReleaseDC(hRulerWnd,hdc);
+}
+CRuler::~CRuler(){
+	DeleteDC(memdc);
+	DeleteObject(hMemBmp);
+
+	DestroyWindow(hRulerWnd);
+}
+
+void CRuler::resize(int x,int y,int cx,int cy){
+	MoveWindow(hRulerWnd,x,y,cx,cy,1);
+}
+void CRuler::draw(HDC hdc){
+	int i;
+
+	//スクロールバーによるベースポジションを取得
+	int BaseX,BaseY;
+	BaseX=0;
+	BaseY=0;
+	GetScrollBaseCaretPos(this->pMdiInfo,&BaseX,&BaseY);
+
+	int iControlTabSpace;
+	iControlTabSpace=this->pMdiInfo->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	HBRUSH hBrush,hOldBrush;
+	hBrush=CreateSolidBrush(RGB(230,230,230));
+
+	HPEN hPen,hOldPen;
+	hPen=CreatePen(PS_SOLID,0,RGB(60,60,60));
+
+	//背景色を塗りつぶす
+	hOldBrush=(HBRUSH)SelectObject(memdc,hBrush);
+	PatBlt(memdc,0,0,ScreenX,HEIGHT_RULER,PATCOPY);
+	SelectObject(memdc,hOldBrush);
+
+
+	extern HFONT hRulerFont;
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(memdc,hRulerFont);
+
+	hOldPen=(HPEN)SelectObject(memdc,hPen);
+
+	//ラインを描画
+	extern int font_width;
+	int x;
+	for(x=iControlTabSpace,i=-BaseX;x<ScreenX;x+=font_width,i++){
+		if(i%10==0){
+			MoveToEx(memdc,x,0,NULL);
+			LineTo(memdc,x,HEIGHT_RULER);
+		}
+		else if(i%5==0){
+			MoveToEx(memdc,x,HEIGHT_RULER/2,NULL);
+			LineTo(memdc,x,HEIGHT_RULER);
+		}
+		else{
+			MoveToEx(memdc,x,HEIGHT_RULER-3,NULL);
+			LineTo(memdc,x,HEIGHT_RULER);
+		}
+	}
+
+	//桁番号を描画
+	char temporary[32];
+	SetBkColor(memdc,RGB(230,230,230));
+	SetTextColor(memdc,RGB(60,60,60));
+	for(x=iControlTabSpace,i=-BaseX;x<ScreenX;x+=font_width,i++){
+		if(i%10==0){
+			sprintf(temporary,"%d",i);
+			TextOut(memdc,x+2,0,temporary,lstrlen(temporary));
+		}
+	}
+
+	SelectObject(memdc,hOldPen);
+	SelectObject(memdc,hOldFont);
+
+
+	//画面に描画
+	BitBlt(hdc,0,0,ScreenX,HEIGHT_RULER,memdc,0,0,SRCCOPY);
+
+	DeleteObject(hBrush);
+	DeleteObject(hPen);
+}
Index: branches/egtra/ab5.0/abdev/abdev/Ruler.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Ruler.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Ruler.h	(revision 774)
@@ -0,0 +1,20 @@
+
+#define HEIGHT_RULER 10
+
+LRESULT CALLBACK RulerProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+struct MDIINFO;
+
+class CRuler
+{
+	MDIINFO *pMdiInfo;
+	HDC memdc;
+	HBITMAP hMemBmp;
+public:
+	HWND hRulerWnd;
+	CRuler(HWND hParent,MDIINFO *pMdiInfo);
+	~CRuler();
+
+	void resize(int x,int y,int cx,int cy);
+	void draw(HDC hdc);
+};
Index: branches/egtra/ab5.0/abdev/abdev/Search.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/Search.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/Search.cpp	(revision 774)
@@ -0,0 +1,537 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+HRESULT ApplyDialogTexture( HWND );
+
+long *pFindPos;
+int FindPosCounter;
+
+char *CompareSuper(HWND hDlg,char *buffer,char *szFind,BOOL IsBigSmall,bool isWordUnit,BOOL IsRegExp,int *pLength ){
+	char *pTemp;
+
+	if(buffer[0]=='\0') return 0;
+
+	if(IsRegExp){
+		//正規表現を有効にしながら検索
+		pTemp=obj_RegExp.compare(hDlg,buffer,szFind,IsBigSmall, isWordUnit, pLength);
+	}
+	else{
+		//通常の検索
+		pTemp=ComparisonString(buffer,szFind,IsBigSmall?true:false, isWordUnit );
+
+		*pLength=lstrlen(szFind);
+	}
+
+	return pTemp;
+}
+
+void SetSearchData(HWND hDlg,char *str,_int8 IsBigSmall, bool isWordUnit){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,length;
+	int WndNum;
+	char *buffer,*FindStr,*LineStr;
+	HWND hEdit;
+
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+	if(WndNum==-1) return;
+	hEdit=GetWindow(GetWindow(hClient,GW_CHILD),GW_CHILD);
+
+	i=lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer)+1;
+
+	buffer=(char *)HeapAlloc(hHeap,0,i);
+	lstrcpy(buffer,MdiInfo[WndNum]->pMdiTextEdit->buffer);
+
+	LineStr=(char *)HeapAlloc(hHeap,0,i+64);
+
+	pFindPos[0]=(long)hEdit;
+	i=0;
+	i3=1;
+	while(1){
+		FindStr=CompareSuper(hDlg,buffer+i,str,IsBigSmall, isWordUnit, pobj_nv->bRegExp,&length);
+		if(FindStr==(char *)-1){
+			//エラー
+			return;
+		}
+		if(!FindStr) break;
+
+		i=FindStr-buffer;
+		for(i4=0,i5=1;i>i4;i4++){
+			if(buffer[i4-1]=='\r'&&buffer[i4]=='\n') i5++;
+		}
+		for(;i>0;i--){
+			if(buffer[i-2]=='\r'&&buffer[i-1]=='\n') break;
+		}
+
+		FindPosCounter+=sizeof(long);
+		pFindPos=(long *)HeapReAlloc(hHeap,0,pFindPos,FindPosCounter);
+		pFindPos[i3]=i;
+
+		sprintf(LineStr,"Line:%d  ",i5);
+		for(i2=lstrlen(LineStr);;i++,i2++){
+			if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+				LineStr[i2]=0;
+				break;
+			}
+			LineStr[i2]=buffer[i];
+		}
+		SendDlgItemMessage(hDlg,IDC_FINDLIST,LB_ADDSTRING,0,(LPARAM)LineStr);
+		i3++;
+	}
+	HeapDefaultFree(buffer);
+	HeapDefaultFree(LineStr);
+}
+BOOL CALLBACK DlgFindAll(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,WndNum;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_SHOWITEM:
+					i=SendDlgItemMessage(hwnd,IDC_FINDLIST,LB_GETCURSEL,0,0);
+					if(i==LB_ERR) return 1;
+					i++;
+
+					if(!IsWindow((HWND)pFindPos[0])){
+						MessageBeep(0);
+						return 1;
+					}
+
+					WndNum=GetWndNum(GetParent((HWND)pFindPos[0]));
+					if(WndNum==-1) return 1;
+
+					CHARRANGE CharRange;
+					CharRange.cpMin=pFindPos[i];
+
+					char *pBuf;
+					pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+					//行の末端位置を取得
+					for(i=CharRange.cpMin;;i++){
+						if(pBuf[i]=='\0') break;
+						if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') break;
+					}
+					CharRange.cpMax=i;
+
+					TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,TRUE);
+
+					SetFocus((HWND)pFindPos[0]);
+					return 1;
+				case IDCANCEL:
+					HeapDefaultFree(pFindPos);
+					EndDialog(hwnd,0);
+					return 1;
+				case IDC_FINDLIST:
+					if(HIWORD(wParam)==LBN_DBLCLK) SendMessage(hwnd,WM_COMMAND,IDC_SHOWITEM,0);
+					return 1;
+			}
+			break;
+		case WM_SIZE:
+			RECT rect;
+			GetClientRect(hwnd,&rect);
+			MoveWindow(GetDlgItem(hwnd,IDC_FINDLIST),rect.left,26,rect.right,rect.bottom-26,1);
+			return 1;
+	}
+	return 0;
+}
+BOOL StartSearch(HWND hDlg,char *FindString,_int8 IsBigSmall, bool isWordUnit, BOOL IsShowMessage){
+	int i;
+	char *pBuf,msg[255];
+	CHARRANGE CharRange;
+
+	int WndNum;
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+	if(WndNum==-1) return 0;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	TextEdit_GetSel(WndNum,&CharRange);
+	i=CharRange.cpMax;
+
+FindStart:
+
+	int length;
+
+	i=(int)CompareSuper(hDlg,pBuf+i,FindString,IsBigSmall, isWordUnit, pobj_nv->bRegExp,&length);
+	if(i==-1){
+		//エラー
+		return 0;
+	}
+
+	if(i){
+		//検索文字列を反転表示
+		i-=(int)pBuf;
+		CharRange.cpMin=i;
+		CharRange.cpMax=i+length;
+		TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax,TRUE);
+
+		return 1;
+	}
+	else{
+		if(!IsShowMessage) return 0;
+
+		i=(int)CompareSuper(hDlg,pBuf,FindString,IsBigSmall, isWordUnit, pobj_nv->bRegExp,&length);
+		if(i==-1){
+			//エラー
+			return 0;
+		}
+
+		if(i){
+			//"ファイルの最初から検索しますか？"
+			if(MessageBox(hDlg,STRING_SEARCH_AGAIN,"ProjectEditor - Search",MB_YESNO|MB_ICONINFORMATION)==IDYES){
+				i=0;
+				goto FindStart;
+			}
+		}
+		else{
+			//"文字列 \"%s\" が見つかりません"
+			sprintf(msg,STRING_SEARCH_NOTFOUND,FindString);
+			MessageBox(hDlg,msg,"ProjectEditor - Search",MB_OK|MB_ICONINFORMATION);
+		}
+	}
+	return 0;
+}
+void AddFindData(HWND hwnd,char ppData[MAX_FINDLIST][MAX_PATH],char *str){
+	int i;
+	for(i=0;i<MAX_FINDLIST;i++){
+		if(lstrcmp(ppData[i],str)==0) break;
+	}
+	if(i==MAX_FINDLIST) i--;
+	for(;i>0;i--) lstrcpy(ppData[i],ppData[i-1]);
+	lstrcpy(ppData[0],str);
+	SendMessage(hwnd,CB_RESETCONTENT,0,0);
+	for(i=0;i<MAX_FINDLIST;i++){
+		if(ppData[i][0]=='\0') break;
+		SendMessage(hwnd,CB_ADDSTRING,0,(LPARAM)ppData[i]);
+	}
+	SendMessage(hwnd,CB_SETCURSEL,0,0);
+}
+INT_PTR CALLBACK DlgFind(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	HWND FindAllDlg;
+	int i,WndNum;
+	char temporary[8192],*pTemp;
+	CHARRANGE CharRange;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			//大文字・小文字
+			if(pobj_nv->bFindStrBigSmall) SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_SETCHECK,BST_CHECKED,0);
+
+			// 単語単位
+			if( pobj_nv->isWordUnit ){
+				SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_SETCHECK, BST_CHECKED, 0 );
+			}
+
+			//正規表現
+			if(pobj_nv->bRegExp) SendDlgItemMessage(hwnd,IDC_REGEXP,BM_SETCHECK,BST_CHECKED,0);
+
+			//検索文字列コンボボックスを初期化
+			SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_RESETCONTENT,0,0);
+			for(i=0;i<MAX_FINDLIST;i++){
+				if(pobj_nv->FindStr[i][0]=='\0') break;
+				SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_ADDSTRING,0,(LPARAM)pobj_nv->FindStr[i]);
+			}
+			SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_LIMITTEXT,8192,0);
+
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+			//選択されている文字列を取得
+			TextEdit_GetSel(WndNum,&CharRange);
+			pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
+			memcpy(pTemp,
+				MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,
+				CharRange.cpMax-CharRange.cpMin);
+			pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+
+			if(pTemp[0]) SetDlgItemText(hwnd,IDC_FINDSTR,pTemp);
+			else SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_SETCURSEL,0,0);
+
+			HeapDefaultFree(pTemp);
+
+			SetFocus(GetDlgItem(hwnd,IDC_FINDSTR));
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
+					if(temporary[0]==0) return 1;
+					AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
+
+					//大文字・小文字
+					if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
+					else pobj_nv->bFindStrBigSmall=0;
+
+					// 単語単位
+					pobj_nv->isWordUnit =
+						( SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_GETCHECK, 0, 0 ) != 0 );
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall, pobj_nv->isWordUnit, 1);
+					return 1;
+				case IDC_FINDALL:
+					GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
+					if(temporary[0]==0) return 1;
+					AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
+
+					//大文字・小文字
+					if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
+					else pobj_nv->bFindStrBigSmall=0;
+
+					// 単語単位
+					pobj_nv->isWordUnit =
+						( SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_GETCHECK, 0, 0 ) != 0 );
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					FindAllDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_FINDALL),GetWindow(hwnd,GW_OWNER),(DLGPROC)DlgFindAll);
+					ShowWindow(FindAllDlg,SW_SHOW);
+
+					FindPosCounter=sizeof(long);
+					pFindPos=(long *)HeapAlloc(hHeap,0,FindPosCounter);
+					SetSearchData(FindAllDlg,temporary,pobj_nv->bFindStrBigSmall, pobj_nv->isWordUnit );
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+INT_PTR CALLBACK DlgPermutation(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HINSTANCE hInst;
+	int i;
+	int WndNum;
+	char temporary[8192],temp2[8192],*pTemp;
+	CHARRANGE CharRange;
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			//大文字・小文字
+			if(pobj_nv->bFindStrBigSmall) SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_SETCHECK,BST_CHECKED,0);
+
+			// 単語単位
+			if( pobj_nv->isWordUnit ){
+				SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_SETCHECK, BST_CHECKED, 0 );
+			}
+
+			//正規表現
+			if(pobj_nv->bRegExp) SendDlgItemMessage(hwnd,IDC_REGEXP,BM_SETCHECK,BST_CHECKED,0);
+
+
+			//検索文字列コンボボックスを初期化
+			SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_RESETCONTENT,0,0);
+			for(i=0;i<MAX_FINDLIST;i++){
+				if(pobj_nv->FindStr[i][0]=='\0') break;
+				SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_ADDSTRING,0,(LPARAM)pobj_nv->FindStr[i]);
+			}
+			SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_LIMITTEXT,8192,0);
+
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+			//選択されている文字列を取得
+			TextEdit_GetSel(WndNum,&CharRange);
+			pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
+			memcpy(pTemp,
+				MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,
+				CharRange.cpMax-CharRange.cpMin);
+			pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+
+			if(pTemp[0]) SetDlgItemText(hwnd,IDC_FINDSTR,pTemp);
+			else SendDlgItemMessage(hwnd,IDC_FINDSTR,CB_SETCURSEL,0,0);
+
+			HeapDefaultFree(pTemp);
+
+			//置換文字列コンボボックスを初期化
+			SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_RESETCONTENT,0,0);
+			for(i=0;i<MAX_FINDLIST;i++){
+				if(pobj_nv->PermutationStr[i][0]=='\0') break;
+				SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_ADDSTRING,0,(LPARAM)pobj_nv->PermutationStr[i]);
+			}
+			SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_SETCURSEL,0,0);
+			SendDlgItemMessage(hwnd,IDC_PERMUTATIONSTR,CB_LIMITTEXT,8192,0);
+
+			SetFocus(GetDlgItem(hwnd,IDC_FINDSTR));
+
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDC_FIND:
+					//大文字・小文字
+					if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
+					else pobj_nv->bFindStrBigSmall=0;
+
+					// 単語単位
+					pobj_nv->isWordUnit =
+						( SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_GETCHECK, 0, 0 ) != 0 );
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
+					if(temporary[0]==0) return 1;
+					AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
+
+					StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall, pobj_nv->isWordUnit, 1);
+					return 1;
+				case IDC_PERMUTATIONNEXT:
+					//////////
+					// 置換
+					//////////
+
+					//大文字・小文字
+					if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
+					else pobj_nv->bFindStrBigSmall=0;
+
+					// 単語単位
+					pobj_nv->isWordUnit =
+						( SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_GETCHECK, 0, 0 ) != 0 );
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					//検索する文字列を取得
+					GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
+					if(temporary[0]==0) return 1;
+					AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
+
+					//置換する文字列を取得
+					GetDlgItemText(hwnd,IDC_PERMUTATIONSTR,temp2,MAX_PATH);
+					AddFindData(GetDlgItem(hwnd,IDC_PERMUTATIONSTR),pobj_nv->PermutationStr,temp2);
+
+					WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+					//選択されている文字列を取得
+					TextEdit_GetSel(WndNum,&CharRange);
+					pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
+					memcpy(pTemp,
+						MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,
+						CharRange.cpMax-CharRange.cpMin);
+					pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+
+					int length;
+					i=(int)CompareSuper(hwnd,pTemp,temporary,pobj_nv->bFindStrBigSmall, pobj_nv->isWordUnit, pobj_nv->bRegExp,&length);
+					if(i==-1){
+						HeapDefaultFree(pTemp);
+						return 1;
+					}
+
+					if(i){
+						if(pobj_nv->bRegExp){
+							char *pTempPermu;
+
+							//正規表現の結果文字列を取得（置換後用の文字列を取得）
+							pTempPermu=obj_RegExp.GetPermuStr(hwnd,pTemp,temporary,temp2,pobj_nv->bFindStrBigSmall);
+							if(pTempPermu==(char *)-1||pTempPermu==0){
+								HeapDefaultFree(pTemp);
+								return 1;
+							}
+
+							//置換する
+							TextEdit_ReplaceUpdateUndoData(WndNum,pTempPermu,0,1);
+
+							HeapDefaultFree(pTempPermu);
+						}
+						else{
+							//置換する
+							TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
+						}
+					}
+					HeapDefaultFree(pTemp);
+
+					//次を検索
+					SendMessage(hwnd,WM_COMMAND,IDC_FIND,0);
+
+					return 1;
+				case IDC_PERMUTATIONALL:
+					//////////////
+					// すべて置換
+					//////////////
+
+					//大文字・小文字
+					if(SendDlgItemMessage(hwnd,IDC_ISBIGSMALL,BM_GETCHECK,0,0)) pobj_nv->bFindStrBigSmall=1;
+					else pobj_nv->bFindStrBigSmall=0;
+
+					// 単語単位
+					pobj_nv->isWordUnit =
+						( SendDlgItemMessage( hwnd, IDC_ISWORDUNIT, BM_GETCHECK, 0, 0 ) != 0 );
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					//検索する文字列を取得
+					GetDlgItemText(hwnd,IDC_FINDSTR,temporary,MAX_PATH);
+					if(temporary[0]==0) return 1;
+					AddFindData(GetDlgItem(hwnd,IDC_FINDSTR),pobj_nv->FindStr,temporary);
+
+					//置換する文字列を取得
+					GetDlgItemText(hwnd,IDC_PERMUTATIONSTR,temp2,MAX_PATH);
+					AddFindData(GetDlgItem(hwnd,IDC_PERMUTATIONSTR),pobj_nv->PermutationStr,temp2);
+
+					//正規表現
+					if(SendDlgItemMessage(hwnd,IDC_REGEXP,BM_GETCHECK,0,0)) pobj_nv->bRegExp=1;
+					else pobj_nv->bRegExp=0;
+
+					WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+					TextEdit_SetSel(WndNum,0,0,TRUE);
+
+					while(StartSearch(hwnd,temporary,pobj_nv->bFindStrBigSmall, pobj_nv->isWordUnit, 0)){
+						if(pobj_nv->bRegExp){
+							//選択されている文字列を取得
+							TextEdit_GetSel(WndNum,&CharRange);
+							pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
+							memcpy(pTemp,
+								MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,
+								CharRange.cpMax-CharRange.cpMin);
+							pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+
+							char *pTempPermu;
+
+							//正規表現の結果文字列を取得（置換後用の文字列を取得）
+							pTempPermu=obj_RegExp.GetPermuStr(hwnd,pTemp,temporary,temp2,pobj_nv->bFindStrBigSmall);
+							if(pTempPermu==(char *)-1||pTempPermu==0){
+								HeapDefaultFree(pTemp);
+								return 1;
+							}
+
+							//置換する
+							TextEdit_ReplaceUpdateUndoData(WndNum,pTempPermu,0,1);
+
+							HeapDefaultFree(pTempPermu);
+							HeapDefaultFree(pTemp);
+						}
+						else{
+							//置換する
+							TextEdit_ReplaceUpdateUndoData(WndNum,temp2,0,1);
+						}
+					}
+
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/StringCount.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/StringCount.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/StringCount.cpp	(revision 774)
@@ -0,0 +1,102 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+#ifdef THETEXT
+
+BOOL CALLBACK DlgStringCount(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	if(message==WM_INITDIALOG){
+		SetPosCenter(hwnd);
+
+		int i,WndNum;
+
+		WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+
+		char *pBuf;
+		if(lParam){
+			//選択範囲
+			CHARRANGE CharRange;
+			TextEdit_GetSel(WndNum,&CharRange);
+			pBuf=(char *)HeapAlloc(hHeap,0,(CharRange.cpMax-CharRange.cpMin)+1);
+			TextEdit_GetSelText(WndNum,&CharRange,pBuf);
+
+			SetWindowText(hwnd,"選択範囲の文字カウント");
+		}
+		else{
+			//すべての範囲
+			pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer)+1);
+			lstrcpy(pBuf,MdiInfo[WndNum]->pMdiTextEdit->buffer);
+		}
+
+		//総バイト数を取得
+		int iByte;
+		iByte=lstrlen(pBuf);
+
+		//文字数（スペースを含めない）を取得
+		int iOmitSpace=0;
+		for(i=0;i<iByte;i++){
+			if(pBuf[i]==' '||pBuf[i]=='\t') continue;
+			if(pBuf[i]==(char)0x81&&pBuf[i+1]==(char)0x40){
+				i++;
+				continue;
+			}
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+				i++;
+				continue;
+			}
+			iOmitSpace++;
+			if(IsDBCSLeadByte(pBuf[i])){
+				i++;
+				continue;
+			}
+		}
+
+		//文字数（スペースを含む）を取得
+		int iWithSpace=0,iLineNum=0;
+		for(i=0;i<iByte;i++){
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+
+				//行数
+				iLineNum++;
+
+				i++;
+				continue;
+			}
+			iWithSpace++;
+			if(IsDBCSLeadByte(pBuf[i])){
+				i++;
+				continue;
+			}
+		}
+
+		if(iByte) iLineNum++;
+
+		char temporary[255];
+
+		//総バイト数
+		Digit(iByte,temporary);
+		SetDlgItemText(hwnd,IDC_SCOUNT_BYTE,temporary);
+
+		//文字数（スペースを含めない）
+		Digit(iOmitSpace,temporary);
+		SetDlgItemText(hwnd,IDC_SCOUNT_OMIT_SPACE,temporary);
+
+		//文字数（スペースを含む）
+		Digit(iWithSpace,temporary);
+		SetDlgItemText(hwnd,IDC_SCOUNT_WITH_SPACE,temporary);
+
+		//行数
+		Digit(iLineNum,temporary);
+		SetDlgItemText(hwnd,IDC_SCOUNT_LINENUM,temporary);
+
+
+		HeapDefaultFree(pBuf);
+	}
+	if(message==WM_COMMAND&&LOWORD(wParam)==IDCANCEL) EndDialog(hwnd,NULL);
+	return 0;
+}
+
+#endif //THETEXT
+
+
+
Index: branches/egtra/ab5.0/abdev/abdev/SubOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/SubOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/SubOperation.cpp	(revision 774)
@@ -0,0 +1,1294 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+using namespace ActiveBasic::IDE;
+
+void ScreenToClient(HWND hwnd,RECT *pRect){
+	ScreenToClient(hwnd,reinterpret_cast<POINT*>(pRect));
+	ScreenToClient(hwnd,reinterpret_cast<POINT*>(reinterpret_cast<char*>(pRect)+sizeof(POINT)));
+}
+void ClientToScreen(HWND hwnd,RECT *pRect){
+	ClientToScreen(hwnd,reinterpret_cast<POINT*>(pRect));
+	ClientToScreen(hwnd,reinterpret_cast<POINT*>(reinterpret_cast<char*>(pRect)+sizeof(POINT)));
+}
+
+
+typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process);
+BOOL IsWow64(void){
+	///////////////////////////////////////////////////////////
+	// ProjectEditor.exeがWOW64技術で動作しているのかどうか
+	///////////////////////////////////////////////////////////
+	BOOL bIsWow64 = FALSE;
+	LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
+
+	if (NULL != fnIsWow64Process)
+	{
+		if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
+		{
+			// handle error
+			bIsWow64 = FALSE;
+		}
+	}
+	return bIsWow64;
+}
+
+void URLEncode(LPSTR pszSrc){
+	char *temp;
+	temp=(char *)malloc(65535);
+
+	int i,i2;
+	for (i = 0,i2=0; ; i++,i2++)
+	{
+		if(pszSrc[i]=='\0'){
+			temp[i2] = 0;
+			break;
+		}
+
+		// 英数字 _ . - は変換しないでそのまま
+		if (isalnum((BYTE)pszSrc[i]) || pszSrc[i] == '_' || pszSrc[i] == '.' || pszSrc[i] == '-'){
+			temp[i2] = pszSrc[i];
+		}
+		// それ以外は %3B のような形式に変換
+		else{
+			sprintf(temp+i2,"%%%02X", (BYTE)pszSrc[i]);
+			i2+=lstrlen(temp+i2);
+			i2--;
+		}
+	}
+
+	lstrcpy(pszSrc,temp);
+	free(temp);
+}
+
+void Digit(int num,char *buffer){
+	char temporary[255];
+	int i,iPos;
+
+	sprintf(temporary,"%d",abs(num));
+
+	//カンマが不要の場合は抜ける
+	if(lstrlen(temporary)<=3){
+		wsprintf(buffer,"%d",num);
+		return;
+	}
+
+	//合計の文字数からバッファを確保
+	if(num<0){
+		buffer[0]='-';
+		iPos=1;
+	}
+	else{
+		buffer[0]=0;
+		iPos=0;
+	}
+
+	//3桁毎にカンマを加えながら文字列をコピーする
+	int iFirst;
+	iFirst=lstrlen(temporary)%3;
+	if(iFirst==0) iFirst=3;
+	memcpy(buffer+iPos,temporary,iFirst);
+	iPos+=iFirst;
+
+	int i2;
+	i2=(lstrlen(temporary)-4)/3;
+
+	for(i=0;i<=i2;i++){
+		buffer[iPos]=',';
+		iPos++;
+		memcpy(buffer+iPos,temporary+i*3+iFirst,3);
+		iPos+=3;
+		buffer[iPos]=0;
+	}
+}
+
+void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect){
+	if(ReadRect->left > ReadRect->right){
+		CopyRect->left=ReadRect->right;
+		CopyRect->right=ReadRect->left;
+	}
+	else{
+		CopyRect->left=ReadRect->left;
+		CopyRect->right=ReadRect->right;
+	}
+	if(ReadRect->top > ReadRect->bottom){
+		CopyRect->top=ReadRect->bottom;
+		CopyRect->bottom=ReadRect->top;
+	}
+	else{
+		CopyRect->top=ReadRect->top;
+		CopyRect->bottom=ReadRect->bottom;
+	}
+}
+void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2){
+	int temp;
+	if(*x1>*x2){
+		temp=*x1;
+		*x1=*x2;
+		*x2=temp;
+	}
+	if(*y1>*y2){
+		temp=*y1;
+		*y1=*y2;
+		*y2=temp;
+	}
+}
+void KillSpaces(char *str1,char *str2){
+	int i,i2,IsStr;
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		while((str1[i]==' '||str1[i]=='\t')&&IsStr==0&&str1[i]!='\0') i++;
+		if(str1[i]=='\"') IsStr^=1;
+		str2[i2]=str1[i];
+		if(str1[i]=='\0') break;
+	}
+}
+void RemoveStringQuotes(char *str){
+	int i;
+	if(str[0]!='\"') return;
+	for(i=0;;i++){
+		str[i]=str[i+1];
+		if(str[i]=='\"') break;
+	}
+	str[i]=0;
+}
+void SlideString(char *buffer, int slide){
+	SlideBuffer(buffer, strlen(buffer) + 1, slide);
+}
+void SlideBuffer(char *buffer,int length,int slide){
+	memmove(buffer+slide, buffer, length);
+}
+BOOL IsVariableTopChar(char c){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
+	return 0;
+}
+bool IsNumberChar( char c ){
+	if(c>='0'&&c<='9'){
+		return true;
+	}
+	return false;
+}
+BOOL IsVariableChar(char c){
+	if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
+		c=='_'||c=='.'||c=='$') return 1;
+	return 0;
+}
+
+BOOL IsCommandBackDelimitation(char *buffer,int pos){
+	if(buffer[pos]=='\n'||buffer[pos]==':') return 1;
+	return 0;
+}
+BOOL IsCommandDelimitation(char *buffer,int p){
+	if(buffer[p]=='\r'&&buffer[p+1]=='\n') return 2;
+	if(buffer[p]=='\n'||buffer[p]==':'||buffer[p]=='\0') return 1;
+	return 0;
+}
+
+char *ComparisonString( char *str1, char *str2, bool isBigSmall, bool isWordUnit ){
+	char *temp1 = (char *)malloc( lstrlen( str1 ) +1 );
+	char *temp2 = (char *)malloc( lstrlen( str2 ) +1 );
+
+	lstrcpy( temp1, str1 );
+	lstrcpy( temp2, str2 );
+
+	if( isBigSmall == false ){
+		// 大文字小文字を区別しない場合
+		// すべて大文字にしておく
+		CharUpper( temp1 );
+		CharUpper( temp2 );
+	}
+
+	int len2 = lstrlen( temp2 );
+
+	const char *temp3 = strstr( temp1, temp2 );
+	while( temp3 ){
+		if( isWordUnit ){
+			int pos = (int)temp3 - (int)temp1;
+			if( pos == 0 ){
+				if( !( IsVariableTopChar( temp1[len2] ) || IsNumberChar( temp1[len2] ) ) ){
+						break;
+				}
+			}
+			else{
+				if( !( IsVariableTopChar( temp1[pos-1] ) || IsNumberChar( temp1[pos-1] ) )
+					&& !( IsVariableTopChar( temp1[pos+len2] ) || IsNumberChar( temp1[pos+len2] ) )
+					){
+						break;
+				}
+			}
+		}
+		else{
+			break;
+		}
+
+		temp3 = strstr( temp3 + 1, temp2 );
+	}
+
+	char *result = NULL;
+	if( temp3 ){
+		int pos = (int)temp3 - (int)temp1;
+		result = str1 + pos;
+	}
+
+	free( temp1 );
+	free( temp2 );
+
+	return result;
+}
+int GetOneParameter(char *Parameter,int pos,char *retAns){
+	int i,i2,IsStr,PareNum;
+	for(i=pos,i2=0,IsStr=0,PareNum=0;;i++,i2++){
+		if(IsDBCSLeadByte(Parameter[i])){
+			retAns[i2]=Parameter[i];
+			retAns[++i2]=Parameter[++i];
+			continue;
+		}
+		if(Parameter[i]=='\"') IsStr^=1;
+		if(Parameter[i]=='('&&IsStr==0) PareNum++;
+		if(Parameter[i]==')'&&IsStr==0) PareNum--;
+		if(Parameter[i]==','&&IsStr==0&&PareNum==0){
+			retAns[i2]=0;
+			break;
+		}
+		retAns[i2]=Parameter[i];
+		if(Parameter[i]=='\0'||Parameter[i]=='\r'&&Parameter[i+1]=='\n'){
+			retAns[i2]=0;
+			break;
+		}
+	}
+	if(Parameter[i]==',') i++;
+	return i;
+}
+int GetStringInPare(char *buffer,char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+int GetStringInBracket(char *buffer,char *ReadBuffer){
+	int i,IsStr,PareNum;
+	for(i=0,IsStr=0,PareNum=0;;i++){
+		buffer[i]=ReadBuffer[i];
+		if(IsDBCSLeadByte(ReadBuffer[i])){
+			i++;
+			buffer[i]=ReadBuffer[i];
+			continue;
+		}
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
+		else if(ReadBuffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(PareNum==0){
+				i++;
+				buffer[i]=0;
+				break;
+			}
+		}
+		else if(ReadBuffer[i]=='\0') return 0;
+	}
+	return i;
+}
+void JumpBlank(char *pBuf,int *piPos){
+	int i;
+	i=*piPos;
+
+	while(1){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		if(pBuf[i]=='\0') break;
+		if(pBuf[i]=='\''){
+			//注釈文（一行）
+			for(i++;;i++){
+				if(pBuf[i]=='\0') break;
+				if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+					i+=2;
+					break;
+				}
+			}
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		if(pBuf[i]=='/'&&pBuf[i+1]=='*'){
+			//注釈文（複数行）
+			i+=2;
+			while(!(pBuf[i]=='*'&&pBuf[i+1]=='/')){
+				i++;
+				if(pBuf[i]=='\0') break;
+			}
+			if(pBuf[i]){
+				i+=2;
+			}
+		}
+		while(pBuf[i]=='\r'&&pBuf[i+1]=='\n') i+=2;
+
+		if(!(
+			pBuf[i]==' '||
+			pBuf[i]=='\t'||
+			pBuf[i]=='\''||
+			(pBuf[i]=='/'&&pBuf[i+1]=='*')
+			)) break;
+	}
+
+	*piPos=i;
+}
+
+BOOL CheckParenthesis(char *buffer){
+	int i,IsStr,PareNum,sw;
+	_int8 bracket[1024];
+
+	for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
+		if(buffer[i]=='\"'){
+			IsStr^=1;
+			continue;
+		}
+
+		else if(buffer[i]=='('&&IsStr==0){
+			bracket[PareNum]=0;
+			PareNum++;
+		}
+		else if(buffer[i]=='['&&IsStr==0){
+			bracket[PareNum]=1;
+			PareNum++;
+		}
+
+		else if(buffer[i]==')'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=0||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+		else if(buffer[i]==']'&&IsStr==0){
+			PareNum--;
+			if(bracket[PareNum]!=1||PareNum<0){
+				//"カッコ \'( )\'"
+				return 0;
+			}
+		}
+
+		else if(buffer[i]=='\n'||buffer[i]=='\0'){
+
+			//"カッコ \'( )\'"
+			if(buffer[i]=='\0'){
+				if(PareNum!=0){
+					return 0;
+				}
+
+				if(IsStr!=0){
+					return 0;
+				}
+			}
+			if(buffer[i]=='\0') break;
+
+			sw=0;
+		}
+	}
+	return 1;
+}
+
+DWORD GetValue(char *value){
+	unsigned long ans;
+	if(value[0]=='&'){
+		if(value[1]=='o'||value[1]=='O') sscanf(value+2,"%o",&ans);
+		if(value[1]=='h'||value[1]=='H') sscanf(value+2,"%x",&ans);
+	}
+	else ans=atol(value);
+	return ans;
+}
+HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
+	//グラデーションビットマップを生成
+
+	BITMAPINFO BitmapInfo;
+	memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+	BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	BitmapInfo.bmiHeader.biWidth=pSize->cx;
+	BitmapInfo.bmiHeader.biHeight=pSize->cy;
+	BitmapInfo.bmiHeader.biPlanes=1;
+	BitmapInfo.bmiHeader.biBitCount=24;
+
+	HDC hdc;
+	hdc=GetDC(GetDesktopWindow());
+
+	HBITMAP hBitmap;
+	BYTE *pByte;
+	hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
+
+	int i,i2,x,y;
+	COLORREF rgb;
+	i=BitmapInfo.bmiHeader.biWidth*3;
+	if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+	for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
+		if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
+		else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
+		else{
+			double ratio;
+			ratio=((double)y-((double)BitmapInfo.bmiHeader.biHeight/(double)2-(double)2))/(double)4;
+			//ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
+			rgb=RGB(
+				LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio),	//赤要素
+				HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio),	//緑要素
+				LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio)		//青要素
+				);
+		}
+		for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
+			i2=y*i+x*3;
+			pByte[i2+2]=LOBYTE(LOWORD(rgb));
+			pByte[i2+1]=HIBYTE(LOWORD(rgb));
+			pByte[i2]=LOBYTE(HIWORD(rgb));
+		}
+	}
+
+	ReleaseDC(GetDesktopWindow(),hdc);
+
+	return hBitmap;
+}
+HBITMAP CreateVertGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
+	//グラデーションビットマップを生成
+
+	BITMAPINFO BitmapInfo;
+	memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+	BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	BitmapInfo.bmiHeader.biWidth=pSize->cx;
+	BitmapInfo.bmiHeader.biHeight=pSize->cy;
+	BitmapInfo.bmiHeader.biPlanes=1;
+	BitmapInfo.bmiHeader.biBitCount=24;
+
+	HDC hdc;
+	hdc=GetDC(GetDesktopWindow());
+
+	HBITMAP hBitmap;
+	BYTE *pByte;
+	hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
+
+	int i,i2,x,y;
+	COLORREF rgb;
+	i=BitmapInfo.bmiHeader.biWidth*3;
+	if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+	for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
+		if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
+		else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
+		else{
+			double ratio;
+			ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
+			rgb=RGB(
+				LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio),	//赤要素
+				HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio),	//緑要素
+				LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio)		//青要素
+				);
+		}
+		for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
+			i2=y*i+x*3;
+			pByte[i2+2]=LOBYTE(LOWORD(rgb));
+			pByte[i2+1]=HIBYTE(LOWORD(rgb));
+			pByte[i2]=LOBYTE(HIWORD(rgb));
+		}
+	}
+
+	ReleaseDC(GetDesktopWindow(),hdc);
+
+	return hBitmap;
+}
+HBITMAP CreateHorzGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
+	//グラデーションビットマップを生成
+
+	BITMAPINFO BitmapInfo;
+	memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+	BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	BitmapInfo.bmiHeader.biWidth=pSize->cx;
+	BitmapInfo.bmiHeader.biHeight=pSize->cy;
+	BitmapInfo.bmiHeader.biPlanes=1;
+	BitmapInfo.bmiHeader.biBitCount=24;
+
+	HDC hdc;
+	hdc=GetDC(GetDesktopWindow());
+
+	HBITMAP hBitmap;
+	BYTE *pByte;
+	hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
+
+	int i,i2,x,y;
+	COLORREF rgb;
+	i=BitmapInfo.bmiHeader.biWidth*3;
+	if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+	for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
+		double ratio;
+		ratio=(double)x/(double)BitmapInfo.bmiHeader.biWidth;
+		rgb=RGB(
+			LOBYTE(LOWORD(color1))+(int)(double)(LOBYTE(LOWORD(color2))-LOBYTE(LOWORD(color1)))*(ratio),	//赤要素
+			HIBYTE(LOWORD(color1))+(int)(double)(HIBYTE(LOWORD(color2))-HIBYTE(LOWORD(color1)))*(ratio),	//緑要素
+			LOBYTE(HIWORD(color1))+(int)(double)(LOBYTE(HIWORD(color2))-LOBYTE(HIWORD(color1)))*(ratio)		//青要素
+			);
+		for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
+			i2=y*i+x*3;
+			pByte[i2+2]=LOBYTE(LOWORD(rgb));
+			pByte[i2+1]=HIBYTE(LOWORD(rgb));
+			pByte[i2]=LOBYTE(HIWORD(rgb));
+		}
+	}
+
+	ReleaseDC(GetDesktopWindow(),hdc);
+
+	return hBitmap;
+}
+HICON CreateGrayIcon(HICON hBaseIcon){
+	////////////////////////
+	// 淡色アイコンを生成
+	////////////////////////
+
+	HICON hGrayIcon;
+
+	ICONINFO IconInfo;
+	if(GetIconInfo(hBaseIcon,&IconInfo) == FALSE){
+		return 0;
+	}
+
+	//ビットマップを加工
+	BITMAP Bitmap;
+	if(GetObject(IconInfo.hbmColor,sizeof(Bitmap),&Bitmap) == 0){
+		return 0;
+	}
+
+	BITMAPINFO BitmapInfo;
+	memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
+	BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+	BitmapInfo.bmiHeader.biWidth=Bitmap.bmWidth;
+	BitmapInfo.bmiHeader.biHeight=Bitmap.bmHeight;
+	BitmapInfo.bmiHeader.biPlanes=1;
+	BitmapInfo.bmiHeader.biBitCount=24;
+	BitmapInfo.bmiHeader.biCompression=BI_RGB;
+
+	HDC hdc=GetDC(0);
+
+	BYTE *pByte=(BYTE *)HeapAlloc(hHeap,0,Bitmap.bmWidth*Bitmap.bmHeight*sizeof(COLORREF));
+	if(pByte==0){
+		return 0;
+	}
+	GetDIBits(hdc,
+		IconInfo.hbmColor,
+		0,
+		Bitmap.bmHeight,
+		(void *)pByte,
+		&BitmapInfo,
+		DIB_RGB_COLORS);
+
+	int i,i2,x,y;
+	i=BitmapInfo.bmiHeader.biWidth*3;
+	if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
+	for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
+		for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
+			i2=y*i+x*3;
+			if(pByte[i2+2]==0&&pByte[i2+1]==0&&pByte[i2]==0){
+				//透明色
+				//何もしない
+			}
+			else{
+				double ratio=0.5;	//明るさ
+
+				pByte[i2+2]+=(BYTE)((double)(255-pByte[i2+2])*ratio);
+				pByte[i2+1]+=(BYTE)((double)(255-pByte[i2+1])*ratio);
+				pByte[i2]+=(BYTE)((double)(255-pByte[i2])*ratio);
+
+				pByte[i2+2]=(BYTE)(((int)pByte[i2+2]+(int)pByte[i2+1]+(int)pByte[i2])/3);
+				pByte[i2+1]=pByte[i2+2];
+				pByte[i2]=pByte[i2+2];
+			}
+		}
+	}
+
+	SetDIBits(hdc,
+		IconInfo.hbmColor,
+		0,
+		Bitmap.bmHeight,
+		(void *)pByte,
+		&BitmapInfo,
+		DIB_RGB_COLORS);
+
+	HeapDefaultFree(pByte);
+
+	ReleaseDC(GetDesktopWindow(),hdc);
+
+
+	hGrayIcon=CreateIconIndirect(&IconInfo);
+
+	//不要なビットマップを破棄
+	DeleteObject(IconInfo.hbmMask);
+	DeleteObject(IconInfo.hbmColor);
+
+	return hGrayIcon;
+}
+void GetSize(SIZE *pSize,RECT *pRect){
+	pSize->cx=pRect->right-pRect->left;
+	pSize->cy=pRect->bottom-pRect->top;
+}
+BOOL HitTest(RECT *pRect,POINT *pPos){
+	if(pRect->left<=pPos->x&&pPos->x<pRect->right&&
+		pRect->top<=pPos->y&&pPos->y<pRect->bottom) return 1;
+	return 0;
+}
+BOOL Rectangle(HDC hdc,RECT *pRect){
+	return Rectangle(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom);
+}
+
+void ComboBox_SetSelText(HWND hCombo,char *lpszText){
+	SendMessage(hCombo,CB_SETCURSEL,
+		SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)lpszText),
+		0);
+}
+
+void SetCursorByState(int state){
+	if(state==FRAME_UPPER_LEFT||state==FRAME_LOWER_RIGHT) SetCursor(LoadCursor(0,IDC_SIZENWSE));
+	else if(state==FRAME_UPPER_RIGHT||state==FRAME_LOWER_LEFT) SetCursor(LoadCursor(0,IDC_SIZENESW));
+	else if(state==FRAME_LEFT||state==FRAME_RIGHT) SetCursor(LoadCursor(0,IDC_SIZEWE));
+	else if(state==FRAME_UPPER||state==FRAME_LOWER) SetCursor(LoadCursor(0,IDC_SIZENS));
+	else if(state==FRAME_INSIDE) SetCursor(LoadCursor(0,IDC_SIZEALL));
+	else SetCursor(LoadCursor(0,IDC_ARROW));
+}
+
+void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw){
+	pColorInfo->rgbDefault=pobj_Theme->TextColorInfo.rgbDefault;
+	pColorInfo->rgbComment=pobj_Theme->TextColorInfo.rgbComment;
+	pColorInfo->rgbStatement=pobj_Theme->TextColorInfo.rgbStatement;
+	pColorInfo->rgbString=pobj_Theme->TextColorInfo.rgbString;
+	pColorInfo->rgbCursorBack=pobj_Theme->TextColorInfo.rgbCursorBack;
+	pColorInfo->rgbBackground=pobj_Theme->TextColorInfo.rgbBackground;
+
+	//アクティブテーマにセット
+	lstrcpy(pobj_nv->szActiveTheme,pobj_Theme->m_name);
+
+	//テーマ依存の描画リソースを取得
+	pobj_DBTheme->unlock();
+	pobj_DBTheme->lock();
+
+	if(bRedraw){
+		//再描画
+		int i;
+		for(i=0;i<MdiInfo.size();i++){
+			if(MdiInfo[i]->hwnd){
+				if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
+					SetTextEditWordColor(i);
+					InvalidateRect(MdiInfo[i]->pMdiTextEdit->hEdit,NULL,0);
+				}
+			}
+		}
+	}
+}
+
+BOOL SetupProjectEditor(void){
+	extern HINSTANCE hInst;
+	int i;
+	char str[MAX_PATH],temporary[MAX_PATH];
+
+
+	//リソース用DLLをマッピング
+	const std::string resDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\res.dll";
+	hResInst = LoadLibrary( resDllPath.c_str() );
+
+	//アイコンリソースDLLをマッピング
+	const std::string iconResDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\icon_res.dll";
+	hIconResInst = LoadLibrary( iconResDllPath.c_str() );
+
+	//LuxCtrl.dllをマッピング
+	const std::string luxCtrlDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\LuxCtrl.dll";
+	hLib_LuxCtrl = LoadLibrary( luxCtrlDllPath.c_str() );
+	if(!hLib_LuxCtrl){
+		MessageBox(0,"LuxCtrl.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+		return 0;
+	}
+	LuxToolbar_CreateInstance=
+		(PROC_LuxToolbar_CreateInstance)GetProcAddress(hLib_LuxCtrl,"LuxToolbar_CreateInstance");
+
+
+	//モジュールディレクトリを取得
+	GetModuleFileName(hInst,temporary,MAX_PATH);
+	_splitpath(temporary,pj_editor_Dir,str,NULL,NULL);
+	lstrcat(pj_editor_Dir,str);
+
+	//ヒープオブジェクトを作成
+	extern HANDLE hHeap;
+	hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0);
+
+
+	//自動バックアップ用のディレクトリを生成
+	CreateBackupDir();
+
+
+	//COMを初期化
+	CoInitialize(0);
+
+	//スクリーンサイズを取得
+	ScreenX=GetSystemMetrics(SM_CXSCREEN);
+	ScreenY=GetSystemMetrics(SM_CYSCREEN);
+
+	//不揮発性のデータを取得
+	pobj_nv=new CNonVolatile;
+	pobj_nv->load();
+
+
+	//アルファブレンド用のAPIを取得
+	extern FWINLAYER pSetLayeredWindowAttributes;
+	extern HINSTANCE hUser32Lib;
+	hUser32Lib=GetModuleHandle(TEXT("user32.dll"));
+	pSetLayeredWindowAttributes=reinterpret_cast<FWINLAYER>(GetProcAddress(hUser32Lib,"SetLayeredWindowAttributes"));
+
+
+
+
+	/////////////////////
+	// フォントを定義
+	/////////////////////
+
+	NONCLIENTMETRICS NCMetrics = {0};
+	NCMetrics.cbSize = sizeof( NONCLIENTMETRICS );
+	SystemParametersInfo( SPI_GETNONCLIENTMETRICS, NCMetrics.cbSize, &NCMetrics, 0 );
+
+	//パラメータ ヒント フォント
+	extern METHODCHECKINFO MethodCheckInfo;
+	MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+	i=MethodCheckInfo.LogFont.lfWeight;
+	MethodCheckInfo.LogFont.lfWeight=FW_BOLD;
+	MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
+	MethodCheckInfo.LogFont.lfWeight=i;
+
+	//ステータスバー フォント
+	extern HFONT hStatusFont;
+	hStatusFont=CreateFontIndirect(&NCMetrics.lfStatusFont);
+
+	//ハイパーリンク フォント
+	extern HFONT hHyperLinkFont;
+	LOGFONT LogFont;
+	LogFont.lfHeight=-12;
+	LogFont.lfWidth=0;
+	LogFont.lfEscapement=0;
+	LogFont.lfOrientation=0;
+	LogFont.lfWeight=FW_REGULAR;
+	LogFont.lfItalic=NULL;
+	LogFont.lfUnderline=TRUE;
+	LogFont.lfStrikeOut=NULL;
+	LogFont.lfCharSet=SHIFTJIS_CHARSET;
+	LogFont.lfOutPrecision=OUT_STRING_PRECIS;
+	LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
+	LogFont.lfQuality=DRAFT_QUALITY;
+	LogFont.lfPitchAndFamily=VARIABLE_PITCH;
+	_tcscpy(LogFont.lfFaceName,TEXT("ＭＳ Ｐゴシック"));
+	hHyperLinkFont=CreateFontIndirect(&LogFont);
+
+	//ルーラー フォント
+	extern HFONT hRulerFont;
+	LogFont.lfHeight=-10;
+	LogFont.lfWidth=0;
+	LogFont.lfEscapement=0;
+	LogFont.lfOrientation=0;
+	LogFont.lfWeight=FW_REGULAR;
+	LogFont.lfItalic=NULL;
+	LogFont.lfUnderline=0;
+	LogFont.lfStrikeOut=NULL;
+	LogFont.lfCharSet=SHIFTJIS_CHARSET;
+	LogFont.lfOutPrecision=OUT_STRING_PRECIS;
+	LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
+	LogFont.lfQuality=DRAFT_QUALITY;
+	LogFont.lfPitchAndFamily=VARIABLE_PITCH;
+	_tcscpy(LogFont.lfFaceName,TEXT("ＭＳ ゴシック"));
+	hRulerFont=CreateFontIndirect(&LogFont);
+
+	//行番号の描画用
+	extern HFONT hFont_LineNumber;
+	LogFont.lfHeight=-11;
+	LogFont.lfWidth=0;
+	LogFont.lfEscapement=0;
+	LogFont.lfOrientation=0;
+	LogFont.lfWeight=FW_BOLD;
+	LogFont.lfItalic=NULL;
+	LogFont.lfUnderline=NULL;
+	LogFont.lfStrikeOut=NULL;
+	LogFont.lfCharSet=ANSI_CHARSET;
+	LogFont.lfOutPrecision=OUT_STRING_PRECIS;
+	LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
+	LogFont.lfQuality=DRAFT_QUALITY;
+	LogFont.lfPitchAndFamily=VARIABLE_PITCH;
+	_tcscpy(LogFont.lfFaceName,TEXT("Courier New"));
+	hFont_LineNumber=CreateFontIndirect(&LogFont);
+
+	//メニューフォント
+	hMenuFont=CreateFontIndirect(&NCMetrics.lfMenuFont);
+
+
+
+	//背景ブラシ
+	extern HBRUSH h3DFaceBackBrush;
+	h3DFaceBackBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+
+	//アイコン
+	extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
+	hOwnerIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_MAIN),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+	hBasicProgramIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_BASICPROGRAM),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+	hTextDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+	hWindowDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_WINDOW),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
+
+
+
+
+	//メインメニュー
+	pobj_MainMenu=new CMenuEx(LoadMenu(hResInst,MAKEINTRESOURCE(IDR_MAINMENU)));
+
+	pobj_MainMenu->InitOwnerDraw(1);			//オーナー描画の初期化
+
+	CSubMenuEx *pobj_FileMenu;
+	pobj_FileMenu=pobj_MainMenu->ppobj_MenuItemData[0]->pobj_SubMenu;
+
+	//未完成
+	extern HMENU hFirstMainMenu;
+	hFirstMainMenu=0;
+
+	//「最近使ったファイル」サブメニューを取得（と同時にも正規のメニュー文字列を指定）
+	for(i=0;i<pobj_FileMenu->iMenuItemNum;i++){
+		if(pobj_FileMenu->ppobj_MenuItemData[i]->str){
+			if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"FileHistory")==0){
+				pobj_FileMenu->RenameMenuItem(i,"最近使ったファイル(&F)");
+
+				extern CSubMenuEx *pobj_FileHistoryMenu;
+				pobj_FileHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
+			}
+
+#ifndef THETEXT
+			//「最近使ったプロジェクト」サブメニューを取得（と同時にも正規のメニュー文字列を指定）
+			//※ProjectEditorのみ
+			if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"ProjectHistory")==0){
+				pobj_FileMenu->RenameMenuItem(i,"最近使ったプロジェクト(&J)");
+
+				extern CSubMenuEx *pobj_ProjectHistoryMenu;
+				pobj_ProjectHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
+			}
+#endif
+		}
+	}
+
+#define ICONSET(itemID,iconID) pobj_MainMenu->SetIcon(itemID,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0));
+	//メニューアイコンをセット
+
+	//ファイル
+	ICONSET(IDM_NEW,IDI_NEW);
+	ICONSET(IDM_OPEN,IDI_OPEN);
+	ICONSET(IDM_SAVE,IDI_SAVE);
+	ICONSET(IDM_ALLSAVE,IDI_ALLSAVE);
+	ICONSET(IDM_PREVIEW,IDI_PREVIEW);
+	ICONSET(IDM_PRINTOUT,IDI_PRINT);
+
+	//編集
+	ICONSET(IDM_CUT,IDI_CUT);
+	ICONSET(IDM_COPY,IDI_COPY);
+	ICONSET(IDM_PASTE,IDI_PASTE);
+	ICONSET(IDM_UNDO,IDI_UNDO);
+	ICONSET(IDM_REDO,IDI_REDO);
+	ICONSET(IDM_FIND,IDI_FIND);
+
+	//表示
+	ICONSET(IDM_SET,IDI_OPTION);
+
+	//変換
+	ICONSET(IDM_CONV_ALPHA_SMALL,IDI_CONV_ALPHA_SMALL);
+	ICONSET(IDM_CONV_ALPHA_BIG,IDI_CONV_ALPHA_BIG);
+	ICONSET(IDM_CONV_HALF,IDI_CONV_HALF);
+	ICONSET(IDM_CONV_MULTI,IDI_CONV_MULTI);
+	ICONSET(IDM_CONV_KATAKANA,IDI_CONV_KATAKANA);
+	ICONSET(IDM_CONV_HIRAGANA,IDI_CONV_HIRAGANA);
+
+	//ヘルプ
+	ICONSET(IDM_TOPIC,IDI_HELP);
+
+#ifdef THETEXT
+	//TheTextのみの機能
+	ICONSET(IDM_STRING_COUNT,IDI_STRINGCOUNT);
+#else
+	//ProjectEditorのみの機能
+
+	//リリース
+	ICONSET(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE);
+	ICONSET(IDM_RELEASERUN,IDI_RELEASERUN);
+
+	//デバッグ
+	ICONSET(IDM_ATTACH,IDI_ATTACH);
+	ICONSET(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE);
+	ICONSET(IDM_DEBUG,IDI_DEBUGRUN);
+	ICONSET(IDM_BREAKPOINT,IDI_BREAKPOINT);
+	ICONSET(IDM_STEP_IN,IDI_STEPIN);
+	ICONSET(IDM_STEP_OVER,IDI_STEPOVER);
+	ICONSET(IDM_STEP_CURSOR,IDI_STEPTOCURSOR);
+	ICONSET(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE);
+	ICONSET(IDM_DEBUG_STOP,IDI_DEBUGSTOP);
+
+	//コミュニティ
+	ICONSET(IDM_COMMUNITY,IDI_COMMUNITY_MAIN);
+	ICONSET(IDM_COMMU_SEARCH,IDI_COMMUNITY_FIND);
+	ICONSET(IDM_COMMU_PM,IDI_COMMUNITY_PRIVATEMSG);
+	ICONSET(ID_COMMU_FORUM1,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM2,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM3,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM4,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM5,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM6,IDI_COMMUNITY_FORUM_SECRET);
+	ICONSET(ID_COMMU_FORUM7,IDI_COMMUNITY_FORUM);
+	ICONSET(ID_COMMU_FORUM8,IDI_COMMUNITY_FORUM);
+#endif
+
+#undef ICONSET
+
+
+
+
+	extern HMENU hEditMenuBase,hEditMenu;
+	hEditMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_EDITMENU));
+	hEditMenu=GetSubMenu(hEditMenuBase,0);
+
+	extern HMENU hRebarMenuBase,hRebarMenu;
+	hRebarMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_REBARMENU));
+	hRebarMenu=GetSubMenu(hRebarMenuBase,0);
+
+	extern HMENU hTabMenuBase,hTabMenu,hTabColorMenu;
+	hTabMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_TABMENU));
+	hTabMenu=GetSubMenu(hTabMenuBase,0);
+	hTabColorMenu=GetSubMenu(hTabMenu,0);
+
+	extern HMENU hFileTreeMenuBase;
+	hFileTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_FILETREEMENU));
+
+	extern HMENU hProcedureTreeMenuBase;
+	hProcedureTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_PROCEDURETREEMENU));
+
+	extern HMENU hMaterialTreeMenuBase;
+	hMaterialTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_MATERIALTREEMENU));
+
+	extern HMENU hRadMenuBase;
+	hRadMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_RADCONTEXTMENU));
+
+	//クリップボードのデータ形式（RAD用）を新規登録
+	extern DWORD dwRadClipboardID;
+	dwRadClipboardID=RegisterClipboardFormat("ProjectEditor-RAD");
+
+	//256色の標準パレットを読み込む
+	extern RGBQUAD DefaultColorTable256[256];
+	const std::string pltPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\8bit.plt";
+	{
+		ATL::CHandle hFile(CreateFile(pltPath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		if(hFile==INVALID_HANDLE_VALUE){
+			hFile.Detach();
+			//"\"%s\" ファイルの読み込みに失敗しました。"
+			sprintf(str,STRING_ERROR_CANT_FILEOPEN,temporary);
+			MessageBox(NULL,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return 0;
+		}
+		DWORD dw;
+		ReadFile(hFile,DefaultColorTable256,sizeof(RGBQUAD)*256,&dw,NULL);
+	}
+
+
+
+	//デザインテーマオブジェクトを生成
+	pobj_DBTheme=new CDBTheme();
+
+
+	/////////////////////////
+	// カラーデザインを設定
+	CTheme *pobj_Theme;
+	pobj_Theme=pobj_DBTheme->GetActiveTheme();
+	if(!pobj_Theme) pobj_Theme=pobj_DBTheme->ppobj_Theme[0];
+
+	SetTextEditColorDesign(&tci,pobj_Theme,0);
+
+
+#ifndef THETEXT
+	/////////////////////////////////////////////////////
+	// ProjectEditorのみ
+	/////////////////////////////////////////////////////
+
+
+	//クラスビュー管理オブジェクトを生成
+	pobj_ClassTreeView=new CClassTreeView();
+
+
+	/////////////////////////
+	// basic.sbpの内容を取得
+	/////////////////////////
+
+	extern char *pHeaderBuf;
+	sprintf(temporary,"%sbasic.sbp",pobj_nv->szIncludeDir);
+	GetFullPath( temporary, pj_editor_Dir );
+	pHeaderBuf = ReadBuffer_NonErrMsg( temporary );
+
+	if( !pHeaderBuf ){
+		pHeaderBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+	}
+
+	//ファイルをインクルード
+	pHeaderBuf=IncludeFiles(pHeaderBuf);
+
+
+	//デバッガ管理オブジェクトを生成
+	pobj_Debugger=new CDebugger();
+#endif
+
+
+	//ブレークポイント管理オブジェクトを生成
+	extern CDBBreakPoint *pobj_DBBreakPoint;
+	pobj_DBBreakPoint=new CDBBreakPoint();
+
+
+	return 1;
+}
+void EndProjectEditor(void){
+
+#ifndef THETEXT
+	/////////////////////////////////////////////////////
+	// ProjectEditorのみ
+	/////////////////////////////////////////////////////
+
+
+	//クラスビュー管理オブジェクトを破棄
+	delete pobj_ClassTreeView;
+	pobj_ClassTreeView=0;
+
+	//basic.sbpのソースコードバッファを解放
+	extern char *pHeaderBuf;
+	HeapDefaultFree(pHeaderBuf);
+
+	//デバッガ管理オブジェクトを破棄
+	delete pobj_Debugger;
+#endif
+
+	//ブレークポイント管理オブジェクトを破棄
+	extern CDBBreakPoint *pobj_DBBreakPoint;
+	delete pobj_DBBreakPoint;
+
+	//デザインテーマオブジェクトを破棄
+	delete pobj_DBTheme;
+
+	//不揮発性のデータを保存
+	pobj_nv->save();
+	delete pobj_nv;
+	pobj_nv=0;
+
+	//メインメニューオブジェクトを破棄
+	delete pobj_MainMenu;
+	pobj_MainMenu=0;
+
+	extern HFONT hStatusFont;
+	DeleteObject(hStatusFont);
+	extern HFONT hHyperLinkFont;
+	DeleteObject(hHyperLinkFont);
+	extern HFONT hRulerFont;
+	DeleteObject(hRulerFont);
+	extern HFONT hFont_LineNumber;
+	DeleteObject(hFont_LineNumber);
+	extern METHODCHECKINFO MethodCheckInfo;
+	DeleteObject(MethodCheckInfo.hFont);
+	DeleteObject(MethodCheckInfo.hBoldFont);
+	extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
+	DestroyIcon(hOwnerIcon);
+	DestroyIcon(hBasicProgramIcon);
+	DestroyIcon(hTextDocumentIcon);
+	DestroyIcon(hWindowDocumentIcon);
+	extern HMENU hEditMenuBase,hRebarMenuBase,hTabMenuBase;
+	DestroyMenu(hEditMenuBase);
+	DestroyMenu(hRebarMenuBase);
+	DestroyMenu(hTabMenuBase);
+	extern HMENU hFileTreeMenuBase;
+	DestroyMenu(hFileTreeMenuBase);
+	extern HMENU hProcedureTreeMenuBase;
+	DestroyMenu(hProcedureTreeMenuBase);
+	extern HMENU hMaterialTreeMenuBase;
+	DestroyMenu(hMaterialTreeMenuBase);
+	extern HMENU hRadMenuBase;
+	DestroyMenu(hRadMenuBase);
+
+	//背景ブラシ
+	extern HBRUSH h3DFaceBackBrush;
+	DeleteObject(h3DFaceBackBrush);
+
+	//スタンダードツールバーを破棄
+	if(pobj_StandardToolbar){
+		pobj_StandardToolbar->Release();
+		pobj_StandardToolbar=0;
+	}
+
+	//ビルドツールバーを破棄
+	if(pobj_ReleaseToolbar){
+		pobj_ReleaseToolbar->Release();
+		pobj_ReleaseToolbar=0;
+	}
+
+	//デバッガ用ツールバーを破棄
+	if(pobj_DebuggerToolbar){
+		pobj_DebuggerToolbar->Release();
+		pobj_DebuggerToolbar=0;
+	}
+
+	//ヒープオブジェクトを解放
+	extern HANDLE hHeap;
+	HeapDestroy(hHeap);
+
+	//////////////////////////////////////
+	// バックアップ用ファイルを削除
+	//////////////////////////////////////
+	extern char szBackupDirPath[MAX_PATH];
+	RemoveDirectoryStrong(szBackupDirPath);
+
+	//DLLを解放
+	FreeLibrary(hResInst);
+	FreeLibrary(hIconResInst);
+	FreeLibrary(hLib_LuxCtrl);
+}
+
+//各ウィンドウ生成
+void SetupWindow(HWND hwnd)
+{
+	extern HINSTANCE hInst;
+	extern HMENU hFirstMainMenu;
+
+	INITCOMMONCONTROLSEX InitCommCtrl;
+	InitCommCtrl.dwSize=sizeof(INITCOMMONCONTROLSEX);
+	InitCommCtrl.dwICC=ICC_COOL_CLASSES|ICC_PAGESCROLLER_CLASS|ICC_WIN95_CLASSES|ICC_TAB_CLASSES;
+	InitCommonControlsEx(&InitCommCtrl);
+
+	//タブウィンドウ
+	pobj_MainTab=new CMainTab(hwnd);
+
+	//レバーオブジェクトを生成
+	pobj_Rebar=new CMainRebar(hwnd);
+
+	//ステータスバー
+	extern HWND hStatusBar;
+	extern HFONT hStatusFont;
+	hStatusBar=CreateStatusWindow(
+		WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBARS_SIZEGRIP|CCS_BOTTOM,
+		NULL,hwnd,NULL);
+	SetWindowFont(hStatusBar,hStatusFont,FALSE);
+
+	//プロジェクト ビュー
+	extern HWND hProjectView;
+	extern HWND hProjectView_ToolWindow;
+	RECT *prc;
+	prc=&pobj_nv->rectProjectView;
+	hProjectView_ToolWindow=CreateWindowEx(WS_EX_TOOLWINDOW,"ProjectView_ToolWindow","ProjectView",
+		WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_CLIPCHILDREN,
+		prc->left,prc->top,prc->right-prc->left,prc->bottom-prc->top,
+		hwnd,0,hInst,0);
+	hProjectView=CreateWindowEx(WS_EX_STATICEDGE,"ProjectView","ProjectView",
+		WS_CHILD|WS_CLIPCHILDREN,
+		0,0,0,0,
+		hwnd,0,hInst,0);
+	if(pobj_nv->bClipProjectView==0){
+		SetWindowLongPtr(hProjectView,GWL_EXSTYLE,0);
+		SetParent(hProjectView,hProjectView_ToolWindow);
+		ResizeProjectView_ToolWindow();
+	}
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+
+
+	//SideWebを生成
+	//pobj_SideWeb=new CSideWeb(hwnd);
+}
+
+//実行コマンド
+BOOL SetRunning(HWND hChild){
+	extern LPSTR DefFileFilter;
+	int WndNum;
+	char temp2[MAX_PATH];
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	hFind=FindFirstFile(ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(),&wfd);
+	if(hFind==INVALID_HANDLE_VALUE){
+		//"BasicCompiler.exe が見つかりません"
+		MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+		return FALSE;
+	}
+	FindClose(hFind);
+
+	WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		if(MdiInfo[WndNum]->path.empty()){
+			//"保存先のファイルを指定してください"
+			if(!GetFilePathDialog(hOwner,temp2,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,0)) return FALSE;
+
+			if(!SaveDocument(hChild,temp2)) return 0;
+		}
+		else{
+			if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
+				if(!SaveDocument(hChild,NULL)) return 0;
+			}
+			else{
+				hFind=FindFirstFile(MdiInfo[WndNum]->path.c_str(),&wfd);
+				if(hFind==INVALID_HANDLE_VALUE){
+					if(!SaveDocument(hChild,NULL)) return 0;
+				}
+				else FindClose(hFind);
+			}
+		}
+	}
+	return 1;
+}
+
+BOOL IsNeedCompile( const std::string &filepath, BOOL bDebug )
+{
+	char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH];
+	HANDLE hFind;
+	WIN32_FIND_DATA wfd;
+	FILETIME SourceTime,ExeTime;
+
+	_splitpath(filepath.c_str(),temporary,temp2,temp3,NULL);
+	lstrcat(temporary,temp2);
+	lstrcat(temporary,temp3);
+	if(bDebug) lstrcat(temporary,"_debug.exe");
+	else lstrcat(temporary,".exe");
+
+	hFind=FindFirstFile(temporary,&wfd);
+	if(hFind==INVALID_HANDLE_VALUE) return 1;
+	FindClose(hFind);
+
+	{
+		CHandle hFile(CreateFile(filepath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		GetFileTime(hFile,NULL,NULL,&SourceTime);
+	}
+	{
+		CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		GetFileTime(hFile,NULL,NULL,&ExeTime);
+	}
+
+	if(SourceTime.dwHighDateTime<ExeTime.dwHighDateTime) return 0;
+	else if(SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
+		SourceTime.dwLowDateTime<=ExeTime.dwLowDateTime) return 0;
+	return 1;
+}
+
+std::string GetLastErrorString(){
+	char *lpMsgBuf;
+
+	FormatMessage( 
+		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
+		FORMAT_MESSAGE_FROM_SYSTEM | 
+		FORMAT_MESSAGE_IGNORE_INSERTS,
+		NULL,
+		GetLastError(),
+		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // デフォルト言語
+		(LPTSTR) &lpMsgBuf,
+		0,
+		NULL 
+	);
+
+	std::string result = lpMsgBuf;
+
+	LocalFree( lpMsgBuf );
+
+	return result;
+}
Index: branches/egtra/ab5.0/abdev/abdev/TabCtrl.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TabCtrl.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TabCtrl.cpp	(revision 774)
@@ -0,0 +1,456 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+struct ItemInfo
+{
+	HWND hwndChild;
+	COLORREF Color;
+
+	ItemInfo( HWND hChild, COLORREF color) :
+		hwndChild( hChild ),
+		Color( color )
+	{
+	}
+};
+
+ItemInfo* GetItemInfo( HWND hTab, int i )
+{
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_PARAM;
+	TabCtrl_GetItem( hTab, i, &tcItem );
+	return reinterpret_cast<ItemInfo*>( tcItem.lParam );
+}
+
+void SetTabOrder( HWND hTab, ItemInfo* itemInfo, int pos )
+{
+	HWND next =
+		pos + 1 < TabCtrl_GetItemCount( hTab )
+		? GetItemInfo( hTab, pos + 1 )->hwndChild
+		: 0
+		;
+	ActiveBasic::IDE::Program::mainFrame.SetTabOrder( itemInfo->hwndChild, next );
+}
+
+CMainTab *pobj_MainTab=0;
+WNDPROC OldMainTabWndProc;
+
+
+LRESULT CALLBACK MainTabWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static BOOL indexDrag=-1;
+	TCHITTESTINFO tcHitTest;
+	int iNewPos;
+	char temporary[MAX_PATH];
+	switch(message){
+		case WM_LBUTTONDOWN:
+			//クリックされたアイテムインデックスを取得
+			GetCursorPos(&tcHitTest.pt);
+			ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
+			indexDrag=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
+			if(indexDrag==-1) break;
+
+			SetCapture(hwnd);
+			break;
+		case WM_LBUTTONUP:
+			indexDrag=-1;
+			ReleaseCapture();
+			break;
+		case WM_MOUSEMOVE:
+			if(indexDrag!=-1){
+				GetCursorPos(&tcHitTest.pt);
+				ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
+				iNewPos=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
+				if(iNewPos==-1) break;
+				if(indexDrag!=iNewPos){
+					LockWindowUpdate(hOwner);
+
+					TC_ITEM tcItem;
+					tcItem.mask=TCIF_TEXT|TCIF_PARAM;
+					tcItem.pszText=temporary;
+					tcItem.cchTextMax=MAX_PATH;
+					TabCtrl_GetItem(pobj_MainTab->hTab,indexDrag,&tcItem);
+
+					TabCtrl_DeleteItem(pobj_MainTab->hTab,indexDrag);
+
+					TabCtrl_InsertItem(pobj_MainTab->hTab,iNewPos,&tcItem);
+
+					int iTemp;
+					iTemp=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
+					if(iTemp!=iNewPos){
+						TabCtrl_DeleteItem(pobj_MainTab->hTab,iNewPos);
+						TabCtrl_InsertItem(pobj_MainTab->hTab,indexDrag,&tcItem);
+
+						LockWindowUpdate(0);
+						break;
+					}
+
+					indexDrag=iNewPos;
+					SetTabOrder( hwnd, GetItemInfo( hwnd, iNewPos ), iNewPos );
+
+					LockWindowUpdate(0);
+				}
+			}
+			return 0;
+		case WM_PAINT:
+			HDC hdc;
+			PAINTSTRUCT ps;
+			hdc=BeginPaint(hwnd,&ps);
+			if(pobj_MainTab)
+				pobj_MainTab->draw(hdc);
+			EndPaint(hwnd,&ps);
+			return 0;
+	}
+	return CallWindowProc(OldMainTabWndProc,hwnd,message,wParam,lParam);
+}
+
+
+int CMainTab::SearchItemIndex( const char *lpszText ){
+	int i2,i3;
+	char temporary[MAX_PATH];
+
+	i3=TabCtrl_GetItemCount(hTab);
+
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+	tcItem.pszText=temporary;
+	tcItem.cchTextMax=MAX_PATH;
+
+	for(i2=0;i2<i3;i2++){
+		TabCtrl_GetItem(hTab,i2,&tcItem);
+
+		//アスタリスクを取り除いて評価する
+		if( tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] == '*' ){
+			tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] = 0;
+		}
+
+		if(lstrcmpi(lpszText,tcItem.pszText)==0) break;
+	}
+	if(i2==i3) return -1;
+
+	return i2;
+}
+void CMainTab::SetItemText( int index, const char *ItemText ){
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+	tcItem.pszText=(LPSTR)ItemText;
+	tcItem.cchTextMax=MAX_PATH;
+
+	TabCtrl_SetItem(hTab,index,&tcItem);
+}
+void CMainTab::GetItemText( int index, char *ItemText ){
+	TC_ITEM tcItem;
+	tcItem.mask = TCIF_TEXT;
+	tcItem.pszText = ItemText;
+	tcItem.cchTextMax = MAX_PATH;
+	TabCtrl_GetItem( hTab, index, &tcItem );
+}
+bool CMainTab::IsModified( int index ){
+	//アスタリスク表示かどうかを判断する
+
+	//アイテム文字列を取得
+	char ItemText[MAX_PATH];
+	GetItemText( index, ItemText );
+
+	if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){
+		//アスタリスクがあったとき
+		return true;
+	}
+
+	//その他
+	return false;
+}
+
+
+CMainTab::CMainTab(HWND hParent){
+	extern HFONT hStatusFont;
+	hTab=CreateWindowEx(0,WC_TABCONTROL,NULL,
+		WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|TCS_OWNERDRAWFIXED,
+		0,0,0,0,
+		hParent,0,hInst,0);
+
+	TabCtrl_SetPadding(hTab,5,4);
+
+	DWORD dwStyle;
+    dwStyle = TabCtrl_GetExtendedStyle(hTab);
+    dwStyle &= ~TCS_EX_FLATSEPARATORS;
+    TabCtrl_SetExtendedStyle(hTab, dwStyle);
+
+
+	//サブクラス化
+	OldMainTabWndProc = (WNDPROC)SetWindowLongPtr(hTab,GWLP_WNDPROC,(LONG_PTR)MainTabWndProc);
+
+	//ボールド体フォントを生成
+	LOGFONT lf;
+	GetObject(hStatusFont,sizeof(LOGFONT),&lf);
+	lf.lfWeight=FW_BOLD;
+	hBoldFont=CreateFontIndirect(&lf);
+
+	SetWindowFont(hTab,hBoldFont,FALSE);
+}
+
+CMainTab::~CMainTab(){
+	DeleteObject(hBoldFont);
+}
+
+void CMainTab::InsertItem( HWND hwnd, const char *lpszText, bool isResize, COLORREF color ){
+	int sw=0;
+	if(TabCtrl_GetItemCount(hTab)==0) sw=1;
+OutputDebugString("CMainTab::InsertItem--------------------------------------------------------\r\n");
+	if(color==-1) color=RGB(230,230,230);
+
+	ItemInfo* itemInfo = new ItemInfo( hwnd, color );
+
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT|TCIF_PARAM;
+	tcItem.pszText=(LPSTR)lpszText;
+	tcItem.lParam=reinterpret_cast<LPARAM>( itemInfo );
+	TabCtrl_InsertItem(hTab,0,&tcItem);
+	TabCtrl_SetCurSel(hTab,0);
+	ActiveBasic::IDE::Program::mainFrame.AddChildWindow( hwnd );
+	SetTabOrder( hTab, itemInfo, 0 );
+
+	if(isResize){
+		if(sw) ActiveBasic::IDE::Program::mainFrame.Resized();
+	}
+}
+
+void CMainTab::DeleteItem( const char *lpszText, bool isResize ){
+	int i2;
+	i2=SearchItemIndex(lpszText);
+	if(i2==-1) return;
+OutputDebugString("CMainTab::DeleteItem--------------------------------------------------------\r\n");
+	ItemInfo* p = GetItemInfo( hTab, i2 );
+	ActiveBasic::IDE::Program::mainFrame.DeleteChildWindow( p->hwndChild );
+	delete p;
+	TabCtrl_DeleteItem(hTab,i2);
+
+	if(isResize){
+		if(TabCtrl_GetItemCount(hTab)==0) ActiveBasic::IDE::Program::mainFrame.Resized();
+	}
+}
+
+void CMainTab::RenameItem( const char *lpszOldText, const char *lpszNewText ){
+	int i2=SearchItemIndex(lpszOldText);
+	if(i2==-1) return;
+
+	SetItemText( i2, lpszNewText );
+}
+
+void CMainTab::NofityModifyDocument( const char *ItemText ){
+	//ドキュメントが変更されたとき、アスタリスクを付けて表示する
+
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return;
+
+	//既にアスタリスク表示されていた場合は抜ける
+	if( IsModified( index ) ) return;
+
+	//アスタリスクを付加
+	char temporary[MAX_PATH];
+	lstrcpy( temporary, ItemText );
+	lstrcat( temporary, "*" );
+
+	//タブアイテムを更新
+	SetItemText( index, temporary );
+}
+void CMainTab::NofityUnModifyDocument( const char *ItemText ){
+	//ドキュメントが保存されたとき、アスタリスクを非表示にする
+
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return;
+
+	//既にアスタリスクが非表示の場合は抜ける
+	if( ! IsModified( index ) ) return;
+
+	//タブアイテムを更新
+	SetItemText( index, ItemText );
+}
+
+COLORREF CMainTab::GetItemColor( char const *ItemText ){
+	//インデックスを取得
+	int index = SearchItemIndex( ItemText );
+	if( index == -1 ) return static_cast<COLORREF>(-1);
+
+	TC_ITEM tcItem;
+	tcItem.mask = TCIF_PARAM;
+	TabCtrl_GetItem( hTab, index, &tcItem );
+	return reinterpret_cast<ItemInfo*>( tcItem.lParam )->Color;
+}
+
+void CMainTab::SelChangeEvent(){
+	int i;
+	i=TabCtrl_GetCurSel(hTab);
+
+	char ItemText[MAX_PATH];
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+	tcItem.pszText=ItemText;
+	tcItem.cchTextMax=MAX_PATH;
+	TabCtrl_GetItem(hTab,i,&tcItem);
+
+	if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){
+		//アスタリスクがあったときは取り除く
+		ItemText[ lstrlen( ItemText ) -1 ] = 0;
+	}
+
+	for(i=0;i<MdiInfo.size();i++){
+		if(lstrcmpi(ItemText,MdiInfo[i]->title.c_str())==0) break;
+	}
+	BringWindowToTop(MdiInfo[i]->hwnd);
+}
+void CMainTab::MdiActiveEvent(const char *lpszText){
+	int i2;
+	i2=SearchItemIndex(lpszText);
+	if(i2==-1) return;
+
+	TabCtrl_SetCurSel(hTab,i2);
+//	ActiveBasic::IDE::Program::mainFrame.ActivateChildWindow( *GetItemInfo( hTab, i2 )->TaskbarButtonWindow );
+}
+
+void CMainTab::draw(HDC hdc){
+	COLORREF colorGray;
+	HBRUSH hGrayBrush;
+
+	int nMaxPage;
+	nMaxPage=TabCtrl_GetItemCount(hTab);
+
+	//ペンを生成
+	HPEN hPen,hOldPen;
+	COLORREF colorPen;
+	colorPen=RGB(127,140,155);
+	hPen=CreatePen(PS_SOLID,0,colorPen);
+	hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+	//描画領域を塗りつぶす
+	RECT rc;
+	GetClientRect(hTab,&rc);
+	FillRect(hdc,&rc,GetSysColorBrush(COLOR_3DFACE));
+
+	//リージョンを生成
+	HRGN hDefaultRgn;
+	hDefaultRgn=CreateRectRgnIndirect(&rc);
+
+	int i;
+	char temporary[MAX_PATH];
+	HFONT hOldFont;
+	TCITEM item;
+	memset(&item,0,sizeof(TCITEM));
+	item.mask=TCIF_TEXT|TCIF_PARAM;
+	item.pszText=temporary;
+	item.cchTextMax=MAX_PATH;
+	for(i=nMaxPage-1;i>=0;i--){
+		if(i==TabCtrl_GetCurSel(hTab)){
+			//フォーカスを持つタブは最後に描画するため、飛び越す
+			continue;
+		}
+
+		TabCtrl_GetItem(hTab,i,&item);
+
+		//座標取得
+		TabCtrl_GetItemRect(hTab,i,&rc);
+
+
+
+		////////////////////////////
+		// タブ枠を描画
+		////////////////////////////
+		colorGray=reinterpret_cast<ItemInfo*>( item.lParam )->Color;
+
+		//ブラシを生成
+		hGrayBrush=CreateSolidBrush(colorGray);
+
+		SetBkColor(hdc,colorGray);
+
+		HBRUSH hOldBrush;
+		hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
+
+		HRGN hRgn1,hRgn2;
+		hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
+		hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
+
+		SelectObject(hdc,hRgn1);
+		RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
+		SelectObject(hdc,hRgn2);
+		RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
+		SelectObject(hdc,hDefaultRgn);
+
+		DeleteObject(hRgn1);
+		DeleteObject(hRgn2);
+
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hGrayBrush);
+
+
+		extern HFONT hStatusFont;
+		hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+
+
+
+		//文字を描画
+		DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+
+		SelectObject(hdc,hOldFont);
+	}
+
+
+	/////////////////////////////////
+	// フォーカスを持つタブを描画
+	/////////////////////////////////
+	i=TabCtrl_GetCurSel(hTab);
+
+	TabCtrl_GetItem(hTab,i,&item);
+
+	//座標取得
+	TabCtrl_GetItemRect(hTab,i,&rc);
+
+	{
+		rc.top-=2;
+		////////////////////////////
+		// タブ枠を描画
+		////////////////////////////
+		colorGray=reinterpret_cast<ItemInfo*>( item.lParam )->Color;
+
+		//ブラシを生成
+		hGrayBrush=CreateSolidBrush(colorGray);
+
+		SetBkColor(hdc,colorGray);
+
+		HBRUSH hOldBrush;
+		hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
+
+		HRGN hRgn1,hRgn2;
+		hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
+		hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
+
+		SelectObject(hdc,hRgn1);
+		RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
+		SelectObject(hdc,hRgn2);
+		RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
+		SelectObject(hdc,hDefaultRgn);
+
+		DeleteObject(hRgn1);
+		DeleteObject(hRgn2);
+
+		SelectObject(hdc,hOldBrush);
+		DeleteObject(hGrayBrush);
+
+		rc.top+=2;
+	}
+
+	hOldFont=(HFONT)SelectObject(hdc,hBoldFont);
+
+	//文字を描画
+	DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+	SelectObject(hdc,hOldFont);
+
+
+
+	SelectObject(hdc,hOldPen);
+	DeleteObject(hPen);
+
+	DeleteObject(hDefaultRgn);
+}
Index: branches/egtra/ab5.0/abdev/abdev/TabCtrl.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TabCtrl.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TabCtrl.h	(revision 774)
@@ -0,0 +1,46 @@
+#pragma once
+
+class CMainTab{
+	HFONT hBoldFont;
+
+	//アイテム文字列を元にインデックスを取得する
+	int SearchItemIndex( const char *lpszText );
+
+	//アイテム文字列を変更する
+	void SetItemText( int index, const char *ItemText );
+
+	//アイテム文字列を取得する
+	void GetItemText( int index, char *ItemText );
+
+	//アスタリスク表示かどうかを調べる（true/変更あり, false/変更なし）
+	bool IsModified( int index );
+
+public:
+	HWND hTab;
+
+	CMainTab(HWND hParent);
+	~CMainTab();
+
+	//アイテムを挿入
+	void InsertItem( HWND hwnd, const char *lpszText, bool isResize, COLORREF color = -1 );
+
+	//アイテムを削除
+	void DeleteItem( const char *lpszText, bool isResize );
+
+	//アイテムの名前を変更
+	void RenameItem( const char *lpszOldText, const char *lpszNewText );
+
+	//変更あり通知
+	void NofityModifyDocument( const char *ItemText );
+
+	//変更なし通知
+	void NofityUnModifyDocument( const char *ItemText );
+
+	COLORREF GetItemColor( char const *ItemText );
+
+	void SelChangeEvent();
+	void MdiActiveEvent(const char *lpszText);
+
+	void draw(HDC hdc);
+};
+extern CMainTab *pobj_MainTab;
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor.cpp	(revision 774)
@@ -0,0 +1,345 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
+extern int font_width,font_height;
+
+
+int GetControlTabSpace(int WndNum,int *piCount){
+	if(pobj_nv->bEditor_LineNumber){
+
+		char *pBuf;
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+		int i,iNum=1,x=0;
+		for(i=0;;i++,x++){
+			if(IsRightTurn(pBuf,i,x)){
+				//右端で折り返す
+				iNum++;
+				x=-1;
+				i--;
+				continue;
+			}
+			if(pBuf[i]=='\0') break;
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+				iNum++;
+
+				x=-1;
+			}
+		}
+		char temporary[255];
+		sprintf(temporary,"%d",iNum);
+
+		extern SIZE sizeLineNumberFont;
+
+		i=lstrlen(temporary);
+		if(piCount) *piCount=i;
+
+		return sizeLineNumberFont.cx*(i+2);
+	}
+
+	return CONTROL_TAB_SPACE_DEFAULT;
+}
+
+void ResetTextEditFont(HWND hwnd){
+	if(hFont_TextEdit) DeleteObject(hFont_TextEdit);
+	hFont_TextEdit=CreateFontIndirect(&pobj_nv->lf);
+
+	//下線フォント
+	LOGFONT lf;
+	lf=pobj_nv->lf;
+	lf.lfUnderline=TRUE;
+	if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit);
+	hFont_HyperLink_TextEdit=CreateFontIndirect(&lf);
+
+	HDC hdc;
+	HFONT hOldFont;
+	hdc=GetDC(hwnd);
+
+
+	hOldFont=(HFONT)SelectObject(hdc,hFont_TextEdit);
+
+	//単位文字の幅、高さ
+	SIZE size;
+	GetTextExtentPoint32(hdc,"A",1,&size);
+	font_width=size.cx;
+	font_height=size.cy;
+
+	SelectObject(hdc,hOldFont);
+
+
+	//行番号表示用フォントのサイズ
+	extern HFONT hFont_LineNumber;
+	hOldFont=(HFONT)SelectObject(hdc,hFont_LineNumber);
+	extern SIZE sizeLineNumberFont;
+	GetTextExtentPoint32(hdc,"A",1,&sizeLineNumberFont);
+	SelectObject(hdc, hOldFont);
+	
+	
+	ReleaseDC(hwnd,hdc);
+}
+void SetTextEditWordColor(int WndNum){
+	int i,i2,i3,IsStr;
+	char str[255];
+	char *pBuf;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	if(MdiInfo[WndNum]->DocType==WNDTYPE_TEXT){
+		//通常のテキストはすべてをデフォルトカラー（標準で黒）にする
+		for(i=0;;i++){
+			if(pBuf[i]=='\0') break;
+			MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
+		}
+		return;
+	}
+
+
+	for(i=0,IsStr=0;;i++){
+		if(pBuf[i]=='\0') break;
+
+		if((IsVariableTopChar(pBuf[i]))&&IsStr==0){
+			for(i2=0;;i++,i2++){
+				if((!IsVariableChar(pBuf[i]))||pBuf[i]=='.'){
+					str[i2]=0;
+					break;
+				}
+				str[i2]=pBuf[i];
+			}
+
+			bool result = false;
+			if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
+			{
+				result = ActiveBasic::IDE::Program::ablang->IsExistKeyword( str );
+			}
+			else if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML){
+				result=IsHtmlReservedWord(str);
+			}
+
+			if(result){
+				for(i3=i-i2;i3<i;i3++){
+					MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i3]=tci.rgbStatement;
+				}
+			}
+			else{
+				for(i3=i-i2;i3<i;i3++){
+					MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i3]=tci.rgbDefault;
+				}
+			}
+			i--;
+			continue;
+		}
+		else{
+			if( IsStr || ActiveBasic::IDE::Program::ablang->IsQuoteMark( pBuf[i] ) && IsStr == 0 )
+			{
+				//文字列カラー（""で囲まれる範囲）
+				MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbString;
+			}
+			else{
+				//通常カラー
+				MdiInfo[WndNum]->pMdiTextEdit->pColorRef[i]=tci.rgbDefault;
+			}
+		}
+
+		if( ActiveBasic::IDE::Program::ablang->IsQuoteMark( pBuf[i] ) )
+		{
+			IsStr^=1;
+		}
+
+		if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+			IsStr=0;
+			continue;
+		}
+	}
+}
+void ResetScrollbar(int WndNum,int max_x,int max_y){
+	RECT rect;
+
+	//エディタ画面左端のコントロールタブ
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	HWND hEdit;
+	hEdit=GetWindow(MdiInfo[WndNum]->hwnd,GW_CHILD);
+	GetClientRect(hEdit,&rect);
+
+	SCROLLINFO si;
+	si.cbSize=sizeof(SCROLLINFO);
+	si.fMask=SIF_PAGE|SIF_RANGE|SIF_DISABLENOSCROLL;
+
+	//垂直スクロールバーの設定
+	GetScrollInfo(hEdit,SB_VERT,&si);
+	si.nPage=(rect.bottom/font_height)-1;
+	si.nMin=0;
+	si.nMax=max_y+si.nPage/5*3;
+	SetScrollInfo(hEdit,SB_VERT,&si,1);
+
+	//水平スクロールバーの設定
+	GetScrollInfo(hEdit,SB_HORZ,&si);
+	si.nMin=0;
+	si.nPage=(rect.right-iControlTabSpace)/font_width   -1;
+	si.nMax=max_x+si.nPage/3;
+	SetScrollInfo(hEdit,SB_HORZ,&si,1);
+
+	//ルーラーを再描画
+	InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
+	UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd);
+}
+
+#define HIRA_START	(unsigned char)0x9F		//ひらがなの2バイト目の範囲
+#define HIRA_END	(unsigned char)0xF1
+#define KATA_START	(unsigned char)0x40		//カタカナの2バイト目の範囲
+#define KATA_END	(unsigned char)0x96
+BOOL IsHiragana(char *pBuf){
+	if((unsigned char)pBuf[0]==(unsigned char)0x82&&
+		HIRA_START<=(unsigned char)pBuf[1]&&(unsigned char)pBuf[1]<=HIRA_END) return 1;
+	return 0;
+}
+BOOL IsKatakana(char *pBuf){
+	if(((unsigned char)pBuf[0]==(unsigned char)0x83&&
+		KATA_START<=(unsigned char)pBuf[1]&&(unsigned char)pBuf[1]<=KATA_END)||
+		(unsigned char)pBuf[0]==(unsigned char)0x81&&(unsigned char)pBuf[1]==(unsigned char)0x5B) return 1;
+	return 0;
+}
+BOOL IsKanji(char *pBuf){
+	if((unsigned char)0x88<=(unsigned char)pBuf[0] && (unsigned char)pBuf[0]<=(unsigned char)0xEA) return 1;
+	return 0;
+}
+BOOL IsAlphabet(char c){
+	if('a'<=c&&c<='z'||'A'<=c&&c<='Z') return 1;
+	return 0;
+}
+BOOL IsReturnCode(char *pBuf){
+	if(pBuf[0]=='\r'&&pBuf[1]=='\n') return 1;
+	return 0;
+}
+void TextEdit_GetWordCaret(HWND hwnd,int WndNum,POINT *pPos,int *piStart,int *piEnd,BOOL bBeforeAfterFlag){
+	int i,start,end;
+	char *pBuf;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//ダブルクリック位置を取得（バッファインデックス）
+	i=GetBufferIndexFromCaretPos(pBuf,
+		pPos->x,
+		pPos->y);
+
+	if(IsDBCSLeadByte(pBuf[i])){
+		///////////////////
+		// 全角文字のとき
+		///////////////////
+
+		if(IsHiragana(pBuf+i)){
+			//ひらがな
+
+			//単語の先頭位置を取得
+			start=i;
+			for(;;start-=2){
+				if(0>start){
+					start+=2;
+					break;
+				}
+				if(!IsHiragana(pBuf+start)){
+					start+=2;
+					break;
+				}
+			}
+
+			//単語の終端位置を取得
+			end=i;
+			for(;;end+=2){
+				if(!IsHiragana(pBuf+end)) break;
+			}
+		}
+		else if(IsKatakana(pBuf+i)){
+			//カタカナ
+
+			//単語の先頭位置を取得
+			start=i;
+			for(;;start-=2){
+				if(0>start){
+					start+=2;
+					break;
+				}
+				if(!IsKatakana(pBuf+start)){
+					start+=2;
+					break;
+				}
+			}
+
+			//単語の終端位置を取得
+			end=i;
+			for(;;end+=2){
+				if(!IsKatakana(pBuf+end)) break;
+			}
+		}
+		else if(IsKanji(pBuf+i)){
+			//漢字
+
+			//単語の先頭位置を取得
+			start=i;
+			for(;;start-=2){
+				if(0>start){
+					start+=2;
+					break;
+				}
+				if(!IsKanji(pBuf+start)){
+					start+=2;
+					break;
+				}
+			}
+
+			//単語の終端位置を取得
+			end=i;
+			for(;;end+=2){
+				if(!IsKanji(pBuf+end)) break;
+			}
+		}
+		else{
+			//漢字とその他の全角文字
+			start=i;
+			end=start+2;
+		}
+	}
+	else{
+		///////////////////
+		// 半角文字のとき
+		///////////////////
+
+		//単語の先頭位置を取得
+		start=i;
+		for(;0<=start;start--){
+			if(!(IsVariableChar(pBuf[start])&&pBuf[start]!='.')){
+				break;
+			}
+		}
+		start++;
+
+		//単語の終端位置を取得
+		end=i;
+		for(;;end++){
+			if(!(IsVariableChar(pBuf[end])&&pBuf[end]!='.')) break;
+		}
+	}
+
+	*piStart=start;
+	*piEnd=end;
+}
+void CancelBeforeAutoIndent(int WndNum){
+	int i;
+
+	i=GetBufferIndexFromCaretPos(
+		MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+	GetCaretPosFromBufferIndex(
+		MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		i-lstrlen(MdiInfo[WndNum]->IndentStr),
+		&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+	TextEdit_Replace(WndNum,"",1);
+
+	HeapDefaultFree(MdiInfo[WndNum]->IndentStr);
+	MdiInfo[WndNum]->IndentStr=0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor_EventProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor_EventProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor_EventProc.cpp	(revision 774)
@@ -0,0 +1,277 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+
+//IME関連のイベント
+void TextEditEvent_IME_StartComposition(HWND hwnd);
+BOOL TextEditEvent_IME_Composition(HWND hwnd,LPARAM lParam);
+LRESULT TextEditEvent_IME_RecomvertString(HWND hwnd,RECONVERTSTRING* prcs);
+BOOL TextEditEvent_IME_ConfirmRecomvertString(HWND hwnd,RECONVERTSTRING* prcs);
+
+//マウス関連のイベント
+void TextEditEvent_LButtonDown(HWND hwnd,POINT *pMousePos);
+void TextEditEvent_LButtonUp(HWND hwnd,POINT *pMousePos);
+void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos);
+void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos);
+
+//キーボード関連のイベント
+void TextEditEvent_KeyUp(HWND hwnd,int nVirtualKey);
+void TextEditEvent_Char(HWND hwnd,int nVirtualKey);
+void TextEditEvent_KeyDown(HWND hwnd,int nVirtualKey,int lKeyData);
+
+
+
+HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
+int font_width,font_height;
+
+//改行時のキャレットちらつき防止用
+int hide_caret_switch;
+
+LRESULT CALLBACK TextEditProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	extern HANDLE hHeap;
+	extern HWND hDocCombo;
+	static DWORD dwAutoScroll;
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i,WndNum;
+	SCROLLINFO si;
+	RECT rect;
+	POINT pos;
+
+	switch(message){
+		case WM_MDIACTIVATE:
+			if(!lParam) return 0;
+			i=GetWndNum((HWND)lParam);
+			if(i==-1) return 0;	//ウィンドウが初期状態の場合
+
+			i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i]->title.c_str());
+			SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+			SetStatusText(NULL);
+			ResetState_EditMenu();
+			return 0;
+
+
+
+		///////////////////////
+		// IME関連のイベント
+		///////////////////////
+
+		case WM_IME_STARTCOMPOSITION:
+			TextEditEvent_IME_StartComposition(hwnd);
+			//デフォルト処理を行う
+			break;
+		case WM_IME_COMPOSITION:
+			if(!TextEditEvent_IME_Composition(hwnd,lParam)) return 0;
+
+			//デフォルト処理を行う
+			break;
+		case WM_IME_REQUEST:
+			//再変換処理を行う
+			if(wParam==IMR_RECONVERTSTRING)
+				return TextEditEvent_IME_RecomvertString(hwnd,reinterpret_cast<RECONVERTSTRING*>(lParam));
+			else if (wParam==IMR_CONFIRMRECONVERTSTRING)
+				return TextEditEvent_IME_ConfirmRecomvertString(hwnd,reinterpret_cast<RECONVERTSTRING*>(lParam));
+			break;
+
+
+
+		//////////////////////////
+		// マウス関連のイベント
+		//////////////////////////
+
+		case WM_LBUTTONDOWN:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+			TextEditEvent_LButtonDown(hwnd,&pos);
+			return 0;
+		case WM_LBUTTONUP:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+			TextEditEvent_LButtonUp(hwnd,&pos);
+			return 0;
+		case WM_MOUSEMOVE:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+			TextEditEvent_MouseMove(hwnd,&pos);
+			return 0;
+		case WM_LBUTTONDBLCLK:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+			TextEditEvent_LButtonDblClk(hwnd,&pos);
+			return 0;
+		case WM_RBUTTONUP:
+			pos.x=LOWORD(lParam);
+			pos.y=HIWORD(lParam);
+			ClientToScreen(hwnd,&pos);
+
+			//ポップアップメニューを表示
+			extern HMENU hEditMenu;
+			TrackPopupMenu(hEditMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,0,hOwner,NULL);
+			return 0;
+
+
+
+		//////////////////////////////
+		// キーボード関係のイベント
+		//////////////////////////////
+
+		case WM_KEYUP:
+			TextEditEvent_KeyUp(hwnd,wParam);
+			return 0;
+		case WM_CHAR:
+			TextEditEvent_Char(hwnd,wParam);
+			return 0;
+		case WM_KEYDOWN:
+			TextEditEvent_KeyDown(hwnd,wParam,lParam);
+			return 0;
+
+
+
+		case WM_PAINT:
+			PAINTSTRUCT ps;
+			HDC hdc;
+
+			WndNum=GetWndNum(GetParent(hwnd));
+			if(WndNum==-1) return 0;
+
+			hdc=BeginPaint(hwnd,&ps);
+			TextEdit_DrawBuffer(hdc,WndNum);
+			EndPaint(hwnd,&ps);
+			ActiveBasic::IDE::Program::mainFrame.InvalidateBitmap(GetParent(hwnd));
+			return 0;
+		case WM_PRINTCLIENT:
+			WndNum=GetWndNum(GetParent(hwnd));
+			if(WndNum==-1) return 0;
+			TextEdit_DrawBuffer(reinterpret_cast<HDC>(wParam),WndNum);
+			return 0;
+		case WM_SETFOCUS:
+			WndNum=GetWndNum(GetParent(hwnd));
+			if(WndNum==-1) return 0;
+
+			//線型キャレットを作成
+			CreateCaret(hwnd,NULL,1,font_height);
+
+			//キャレットポジションを設定
+			ResetCaretPos(WndNum);
+
+			//キャレットを表示（改行の処理中のキャレットちらつきを防止の考慮に注意）
+			if(hide_caret_switch==0) ShowCaret(hwnd);
+			return 0;
+		case WM_RESETCARETPOS:
+			WndNum=GetWndNum(GetParent(hwnd));
+			ResetCaretPos(WndNum);
+			return 0;
+		case WM_KILLFOCUS:
+			HideCaret(hwnd);
+			DestroyCaret();
+			return 0;
+		case WM_MOUSEWHEEL:
+			int zDelta;
+			zDelta=GET_WHEEL_DELTA_WPARAM(wParam);
+
+			WndNum=GetWndNum(GetParent(hwnd));
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&si);
+
+			UINT scrollLines;
+			SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &scrollLines, 0);
+			i=zDelta*(int)scrollLines/-WHEEL_DELTA;
+
+			if(i){
+				GetClientRect(hwnd,&rect);
+				i=max(-si.nPos,min(i,si.nMax-(rect.bottom/font_height-2)-si.nPos));
+				if(i!=0){
+					si.nPos+=i;
+					SetScrollInfo(hwnd,SB_VERT,&si,1);
+
+					InvalidateRect(hwnd,NULL,0);
+				}
+				ResetCaretPos(WndNum);
+			}
+			return 0;
+		case WM_SIZE:
+			WndNum=GetWndNum(GetParent(hwnd));
+			if(WndNum==-1) return 0;
+			InvalidateRect(hwnd,NULL,0);
+			return 0;
+		case WM_VSCROLL:
+			WndNum=GetWndNum(GetParent(hwnd));
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_VERT,&si);
+			if(LOWORD(wParam)==SB_LINEUP) i=-1;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
+			else i=0;
+			GetClientRect(hwnd,&rect);
+			i=max(-si.nPos,min(i,si.nMax-(rect.bottom/font_height-2)-si.nPos));
+			if(i!=0){
+				si.nPos+=i;
+				SetScrollInfo(hwnd,SB_VERT,&si,1);
+
+				InvalidateRect(hwnd,NULL,0);
+			}
+			ResetCaretPos(WndNum);
+			return 0;
+		case WM_HSCROLL:
+			WndNum=GetWndNum(GetParent(hwnd));
+			si.cbSize=sizeof(SCROLLINFO);
+			si.fMask=SIF_POS|SIF_PAGE|SIF_RANGE;
+			GetScrollInfo(hwnd,SB_HORZ,&si);
+			if(LOWORD(wParam)==SB_LINEUP) i=-1;
+			else if(LOWORD(wParam)==SB_LINEDOWN) i=1;
+			else if(LOWORD(wParam)==SB_PAGEUP) i=-(signed int)si.nPage;
+			else if(LOWORD(wParam)==SB_PAGEDOWN) i=si.nPage;
+			else if(LOWORD(wParam)==SB_THUMBTRACK) i=HIWORD(wParam)-si.nPos;
+			else i=0;
+
+			GetClientRect(hwnd,&rect);
+
+			int iControlTabSpace;
+			iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+			i=max(-si.nPos,min(i,si.nMax-((rect.right-iControlTabSpace)/font_width)-si.nPos));
+			if(i!=0){
+				si.nPos+=i;
+				SetScrollInfo(hwnd,SB_HORZ,&si,1);
+
+				InvalidateRect(hwnd,NULL,0);
+			}
+			ResetCaretPos(WndNum);
+
+			//ルーラーを再描画
+			InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
+			UpdateWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd);
+
+			return 0;
+		case WM_CLOSE:
+			CloseDocWindow(GetWndNum(hwnd));
+			pobj_nv->bMDIZoomed=IsZoomed(hwnd);
+			i=DefMDIChildProc(hwnd,message,wParam,lParam);
+
+			//メニュー状態を設定
+			ResetState_DocMenu();
+
+			return i;
+
+
+
+		case WM_SEARCH_TAB_CREATE:
+			HWND hOneTabWnd;
+			hOneTabWnd=CreateWindowEx(0,"OneTab","OneTab",
+				WS_CHILD|WS_VISIBLE,
+				0,0,0,0,
+				MdiInfo[wParam]->pMdiTextEdit->pobj_WebResult->hwnd,0,hInst,0);
+
+			SetWindowLongPtr(hOneTabWnd,GWLP_USERDATA,lParam);
+
+			return (LRESULT)hOneTabWnd;
+		case WM_SEARCH_TAB_CLOSE:
+			DestroyWindow((HWND)lParam);
+			return 0;
+	}
+	return DefMDIChildProc(hwnd,message,wParam,lParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor_ImeEvent.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor_ImeEvent.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor_ImeEvent.cpp	(revision 774)
@@ -0,0 +1,161 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
+extern int font_width,font_height;
+
+void TextEditEvent_IME_StartComposition(HWND hwnd){
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	HIMC hIMC;
+	hIMC=ImmGetContext(hwnd);
+
+	//コンポジションをセット
+	POINT pos;
+	COMPOSITIONFORM CompForm;
+	CompForm.dwStyle=CFS_POINT;
+	pos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+	GetScrollBaseCaretPos(MdiInfo[WndNum],(int *)&pos.x,(int *)&pos.y);
+	CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace;
+	CompForm.ptCurrentPos.y=pos.y*font_height;
+	ImmSetCompositionWindow(hIMC, &CompForm);
+
+	//フォントをセット
+	ImmSetCompositionFont(hIMC,&pobj_nv->lf);
+
+	ImmReleaseContext(hwnd,hIMC);
+}
+
+namespace
+{
+	void SetNextCompositionWindowPos(HIMC himc, int WndNum){
+		int iControlTabSpace;
+		iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+		COMPOSITIONFORM CompForm;
+		CompForm.dwStyle=CFS_POINT;
+		POINT pos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+		GetScrollBaseCaretPos(MdiInfo[WndNum],(int *)&pos.x,(int *)&pos.y);
+		CompForm.ptCurrentPos.x=pos.x*font_width+iControlTabSpace;
+		CompForm.ptCurrentPos.y=pos.y*font_height;
+		ImmSetCompositionWindow(himc, &CompForm);
+	}
+}
+
+BOOL TextEditEvent_IME_Composition(HWND hwnd,LPARAM lParam){
+	if(lParam&GCS_RESULTSTR){
+		int WndNum;
+		WndNum=GetWndNum(GetParent(hwnd));
+
+		////////////////////
+		// 確定文字列を取得
+		////////////////////
+
+		//コンテキストを取得
+		HIMC hIMC;
+		hIMC=ImmGetContext(hwnd);
+
+		int i;
+		char temporary[4096];
+		i=ImmGetCompositionString(hIMC, GCS_RESULTSTR, temporary,4096);
+		if(i==0) return 0;
+		temporary[i]=0;
+
+		//バッファをリプレイス
+		TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+		UpdateWindow(hwnd);
+
+		//コンポジションをセット（立て続けにIME入力が行われる場合を考慮）
+		SetNextCompositionWindowPos(hIMC, WndNum);
+
+		//コンテキストを解放
+		ImmReleaseContext(hwnd,hIMC);
+
+		return 0; //DefWindowProcへ渡さないようTextEditProcへ指示
+	}
+
+	return 1;
+}
+
+namespace
+{
+	//PCSTRを受け渡すようにした_mbschrのラッパ
+	inline PCSTR cmbschr(PCSTR p, UINT c)
+	{
+		return reinterpret_cast<PCSTR>(_mbschr(reinterpret_cast<UCHAR const*>(p), c));
+	}
+
+	//chPos文字目が含まれる行の先頭へのオフセットを返す。
+	ptrdiff_t FindLineStartPos(PCSTR pBufStart, LONG CharPos)
+	{
+		//行頭を探す
+		PCSTR pBufLineStart = pBufStart+CharPos;
+		for(;;){
+			PCSTR p = CharPrev(pBufStart, pBufLineStart);
+			if (*p=='\n' || pBufLineStart==pBufStart)
+				break;
+			pBufLineStart = p;
+		}
+		return pBufLineStart-pBufStart;
+	}
+}
+
+LRESULT TextEditEvent_IME_RecomvertString(HWND hwnd, RECONVERTSTRING* prcs){
+	int WndNum = GetWndNum(GetParent(hwnd));
+	CHARRANGE SelRange;
+	TextEdit_GetSel(WndNum, &SelRange);
+	//選択範囲（キャレット）を含む行を探す（その行全体を返すため）
+	PCSTR pBufStart = MdiInfo[WndNum]->pMdiTextEdit->buffer;
+	ptrdiff_t LineStartPos = FindLineStartPos(pBufStart, SelRange.cpMin);
+
+	ptrdiff_t LineEndPos;
+	//行末を探す
+	if(PCSTR pEnd = cmbschr(pBufStart+SelRange.cpMax,'\r')){
+		LineEndPos = pEnd-pBufStart;
+	}
+	else{
+		LineEndPos = static_cast<ptrdiff_t>(strlen(pBufStart));
+	}
+	ptrdiff_t SelStrLen = LineEndPos-LineStartPos; //選択部分の長さ（選択範囲がなければそのまま0で良い）
+	LRESULT lr = sizeof (RECONVERTSTRING)+SelStrLen+1;
+	if(prcs){
+		//必要な情報の設定
+		//1行分の文字列と変換部分のオフセットを渡すようにしている
+		PSTR pszBuf = reinterpret_cast<LPSTR>(&prcs[1]);
+		memcpy(pszBuf, pBufStart+LineStartPos, static_cast<size_t>(SelStrLen));
+		pszBuf[SelStrLen] = '\0';
+
+		DWORD StrLen = SelRange.cpMax-SelRange.cpMin;
+		DWORD StrOffset = SelRange.cpMin-LineStartPos;
+		prcs->dwStrLen = SelStrLen;
+		prcs->dwStrOffset = sizeof(*prcs);
+		prcs->dwCompStrLen = StrLen;
+		prcs->dwCompStrOffset = StrOffset;
+		prcs->dwTargetStrLen = StrLen;
+		prcs->dwTargetStrOffset = StrOffset;
+	}
+	return lr;
+}
+
+BOOL TextEditEvent_IME_ConfirmRecomvertString(HWND hwnd, RECONVERTSTRING* prcs){
+	int WndNum = GetWndNum(GetParent(hwnd));
+	CHARRANGE SelRange;
+	TextEdit_GetSel(WndNum, &SelRange);
+	//選択範囲（キャレット）を含む行を探す（その行全体を返すため）
+	PCSTR pBufStart = MdiInfo[WndNum]->pMdiTextEdit->buffer;
+	ptrdiff_t LineStartPos = FindLineStartPos(pBufStart, SelRange.cpMin);
+
+	//再変換部分が通知されるので、そこを選択状態にする。
+	int ReconvStartPos = static_cast<int>(LineStartPos+prcs->dwCompStrOffset);
+	TextEdit_SetSel(WndNum, ReconvStartPos, ReconvStartPos+static_cast<int>(prcs->dwCompStrLen));
+	//候補ウィンドウの位置の設定
+	if (HIMC himc = ImmGetContext(hwnd)){
+		SetNextCompositionWindowPos(himc, WndNum);
+		ImmReleaseContext(hwnd, himc);
+	}
+	return TRUE;
+}
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor_KeyEvent.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor_KeyEvent.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor_KeyEvent.cpp	(revision 774)
@@ -0,0 +1,1002 @@
+#include "stdafx.h"
+
+#include "common.h"
+#include "HtmlAnalysis.h"
+
+
+void TextEditEvent_StartAnalysis_Basic(HWND hwnd,int WndNum,int nVirtualKey);
+void TextEditEvent_StartAnalysis_Html(HWND hwnd,int WndNum,int nVirtualKey);
+
+
+void TextEditEvent_KeyUp(HWND hwnd,int nVirtualKey){
+	if(nVirtualKey==VK_CONTROL&&pobj_nv->bCtrlKeyHyperLink){
+		int WndNum;
+		WndNum=GetWndNum(GetParent(hwnd));
+
+		if(MdiInfo[WndNum]->pMdiTextEdit->iUnderStart!=-1){
+			//ハイパーリンク下線の表示を解除
+			MdiInfo[WndNum]->pMdiTextEdit->iUnderStart=-1;
+			MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd=-1;
+
+			//再描画
+			InvalidateRect(hwnd,NULL,0);
+			UpdateWindow(hwnd);
+		}
+
+		obj_WebStrings.clear();
+	}
+}
+
+
+int IsIndentAdditionCommand_FromBuffer(char *buffer){
+	int i;
+	char temporary[255];
+
+	for(i=0;;i++){
+		if(!IsVariableChar(buffer[i])){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=buffer[i];
+	}
+
+	if(lstrcmpi(temporary,"If")==0){
+		//If文の場合はブロック形式の有無を判定
+
+		for(;;i++){
+			if(buffer[i]=='\''||
+				IsCommandDelimitation(buffer,i)){
+				i--;
+				break;
+			}
+		}
+
+		while(buffer[i]==' '||buffer[i]=='\t') i--;
+
+		if(memicmp(buffer+i-3,"Then",4)==0){
+			//ブロック形式のIf
+			return 1;
+		}
+		else{
+			//一行のみのIf
+			return 0;
+		}
+	}
+
+	if(
+		lstrcmpi(temporary,"Case")==0||
+		lstrcmpi(temporary,"Class")==0||
+		lstrcmpi(temporary,"Do")==0||
+		lstrcmpi(temporary,"Else")==0||
+		lstrcmpi(temporary,"ElseIf")==0||
+		lstrcmpi(temporary,"Enum")==0||
+		lstrcmpi(temporary,"For")==0||
+		lstrcmpi(temporary,"Foreach")==0||
+		lstrcmpi(temporary,"Function")==0||
+		lstrcmpi(temporary,"Namespace")==0||
+		lstrcmpi(temporary,"Override")==0||
+		lstrcmpi(temporary,"Sub")==0||
+		lstrcmpi(temporary,"Type")==0||
+		lstrcmpi(temporary,"Virtual")==0||
+		lstrcmpi(temporary,"Static")==0||
+		lstrcmpi(temporary,"While")==0||
+		lstrcmpi(temporary,"With")==0||
+
+		lstrcmpi(temporary,"Private")==0||
+		lstrcmpi(temporary,"Protected")==0||
+		lstrcmpi(temporary,"Public")==0||
+
+		lstrcmpi(temporary,"Try")==0||
+		lstrcmpi(temporary,"Catch")==0||
+		lstrcmpi(temporary,"Finally")==0
+		) return 1;
+	else if(lstrcmpi(temporary,"Select")==0) return 2;
+	else if(lstrcmpi(temporary,"Interface")==0) return 3;
+
+	return 0;
+}
+int IsIndentDecreaseCommand_FromBuffer(char *buffer){
+	int i;
+	char temporary[255];
+
+	for(i=0;;i++){
+		if(!IsVariableChar(buffer[i])){
+			temporary[i]=0;
+			break;
+		}
+		temporary[i]=buffer[i];
+	}
+
+	if(lstrcmpi(temporary,"End")==0&&(buffer[i]==' '||buffer[i]=='\t')){
+		//End ～の場合
+
+		int i2=i;
+
+		while(buffer[i]==' '||buffer[i]=='\t') i++;
+
+		for(;;i++,i2++){
+			if(!IsVariableChar(buffer[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=buffer[i];
+		}
+	}
+
+	if(
+		lstrcmpi(temporary,"Case")==0||
+		lstrcmpi(temporary,"EndClass")==0||
+		lstrcmpi(temporary,"Loop")==0||
+		lstrcmpi(temporary,"Else")==0||
+		lstrcmpi(temporary,"ElseIf")==0||
+		lstrcmpi(temporary,"EndIf")==0||
+		lstrcmpi(temporary,"EndEnum")==0||
+		lstrcmpi(temporary,"Next")==0||
+		lstrcmpi(temporary,"EndFunction")==0||
+		lstrcmpi(temporary,"EndNamespace")==0||
+		lstrcmpi(temporary,"EndSub")==0||
+		lstrcmpi(temporary,"EndType")==0||
+		lstrcmpi(temporary,"EndTry")==0||
+		lstrcmpi(temporary,"Wend")==0||
+		lstrcmpi(temporary,"EndWith")==0||
+
+		lstrcmpi(temporary,"Private")==0||
+		lstrcmpi(temporary,"Protected")==0||
+		lstrcmpi(temporary,"Public")==0||
+
+		lstrcmpi(temporary,"Catch")==0||
+		lstrcmpi(temporary,"Finally")==0
+		) return 1;
+	else if(lstrcmpi(temporary,"EndSelect")==0) return 2;
+	else if(lstrcmpi(temporary,"EndInterface")==0) return 3;
+
+
+	return 0;
+}
+
+int TextEdit_GetLineIndex(int WndNum,int iPos){
+	int i;
+	char *pBuf;
+
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+	for(i=iPos;i>0;i--){
+		if(pBuf[i-1]=='\r'&&pBuf[i]=='\n') return i+1;
+	}
+	return i;
+}
+void TextEditEvent_Char(HWND hwnd,int nVirtualKey){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i,i2,i3;
+	char temporary[1024];
+	char *pBuf,*pTemp;
+	CHARRANGE CharRange;
+
+
+	//BackSpaceはWM_KEYDOWNで処理
+	if(nVirtualKey==VK_BACK) return;
+
+	if(nVirtualKey==VK_ESCAPE){
+		if(ComplementWndInfo.hWnd){
+			//コード補完リストを破棄する
+			DestroyWindow(ComplementWndInfo.hWnd);
+			ComplementWndInfo.hWnd=0;
+		}
+
+		extern METHODCHECKINFO MethodCheckInfo;
+		if(MethodCheckInfo.hWnd){
+			//パラメータヒントを破棄する
+			DestroyWindow(MethodCheckInfo.hWnd);
+			MethodCheckInfo.hWnd=0;
+		}
+
+		return;
+	}
+
+	//未対応の文字コードの誤り入力を阻止
+	if(GetKeyState(VK_CONTROL)&0x8000) return;
+
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	if(ComplementWndInfo.hWnd){
+		if((!(IsVariableChar(nVirtualKey)||nVirtualKey==VK_RETURN))||nVirtualKey=='.'){
+			//コード補完リストを破棄する
+
+			//ペアステートメント補完の場合は、空白文字を容認する
+			if(!(nVirtualKey==' '&&ComplementWndInfo.pMemberInfo[0].dwAccess==ACCESS_PAIRCOMMAND)){
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+			}
+		}
+	}
+
+	if(nVirtualKey==VK_RETURN){
+		if(ComplementWndInfo.hWnd){
+			//コード補完リストが表示されているとき
+			for(i=0;i<ComplementWndInfo.MemberNum;i++){
+				if(ListView_GetItemState(ComplementWndInfo.hList,i,LVIS_SELECTED)) break;
+			}
+			if(i!=ComplementWndInfo.MemberNum){
+				SendMessage(ComplementWndInfo.hList,WM_KEYDOWN,VK_RETURN,0);
+				return;
+			}
+			else{
+				//コード補完リストを破棄する
+				DestroyWindow(ComplementWndInfo.hWnd);
+				ComplementWndInfo.hWnd=0;
+			}
+		}
+
+		temporary[0]='\r';
+		temporary[1]='\n';
+		temporary[2]=0;
+
+		if(nVirtualKey==VK_RETURN&&pobj_nv->bAutoIndent){
+			//////////////////
+			// 自動インデント
+			//////////////////
+
+			//インデント処理中はちらつき防止のため、キャレットを一時非表示にする
+			extern int hide_caret_switch;
+			HideCaret(hwnd);
+			hide_caret_switch=1;
+
+			if(MdiInfo[WndNum]->IndentStr){
+				//以前の自動インデントを消去する
+				CancelBeforeAutoIndent(WndNum);
+			}
+
+			pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+			int StartX;
+
+			//リプレイス前のカーソルバッファ位置を取得
+			i=GetBufferIndexFromCaretPos(pBuf,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+			StartX=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x;
+
+			//リプレイス
+			TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+			pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+			//リプレイス後のカーソル行のインデントをi3に取得
+			for(i3=0;;i3++){
+				if(pBuf[i+i3]!='\t') break;
+			}
+
+			//前の行のインデントをコピー（i2にタブ数を格納）
+			for(;i>0;i--){
+				if(
+					pBuf[i-1]=='\r'&&pBuf[i]=='\n'&&
+					(!(pBuf[i+1]=='\r'&&pBuf[i+2]=='\n'))
+					){
+					i++;
+					break;
+				}
+			}
+
+			for(i2=0;;i2++){
+				if(pBuf[i+i2]!='\t') break;
+			}
+
+			if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC){
+				//インデント追加のコマンドかどうかを判断
+				if(IsIndentAdditionCommand_FromBuffer(pBuf+i+i2)) i2++;
+			}
+
+			i2-=i3;
+			if(i2<0) i2=0;
+
+			//インデントが無いとき
+			if(i2==0){
+				hide_caret_switch=0;
+				ResetCaretPos(WndNum);
+				ShowCaret(hwnd);
+				return;
+			}
+
+			/*（Ｉ…カーソル）
+			（「\t\tⅠ」のような場合）、
+			（「\t\tⅠtext...」のような場合）を判断
+			*/
+			i=GetBufferIndexFromCaretPos(pBuf,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+			if(pBuf[i]=='\r'&&
+				pBuf[i+1]=='\n'){
+				//自動インデントを開始する（「\t\tⅠ」のような場合）
+				MdiInfo[WndNum]->IndentStr=(char *)HeapAlloc(hHeap,0,i2+1);
+				memset(MdiInfo[WndNum]->IndentStr,'\t',i2);
+				MdiInfo[WndNum]->IndentStr[i2]=0;
+				TextEdit_Replace(WndNum,MdiInfo[WndNum]->IndentStr,1);
+			}
+			else{
+				//自動インデントを有効にする（「\t\tⅠtext...」のような場合）
+
+				//リプレイス前のカーソルが行の先頭位置にあった場合は抜け出す
+				if(StartX==0){
+					hide_caret_switch=0;
+					ResetCaretPos(WndNum);
+					ShowCaret(hwnd);
+					return;
+				}
+
+				memset(temporary,'\t',i2);
+				temporary[i2]=0;
+				TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+			}
+
+			hide_caret_switch=0;
+			ShowCaret(hwnd);
+			return;
+		}
+	}
+	else if(nVirtualKey==VK_TAB){
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+		TextEdit_GetSel(WndNum,&CharRange);
+		for(i=CharRange.cpMin;i>0;i--){
+			if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
+				i++;
+				break;
+			}
+		}
+		CharRange.cpMin=i;
+
+		for(i2=0;i<CharRange.cpMax;i++){
+			if(pBuf[i]=='\0') break;
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n') i2++;
+		}
+		if(i2){
+			if(GetKeyState(VK_SHIFT)&0x8000){
+				//////////////////////////////////
+				// 複数行にわたってタブ文字を削除
+				//////////////////////////////////
+
+				if(pBuf[CharRange.cpMax-2]=='\r'&&pBuf[CharRange.cpMax-1]=='\n'){
+					CharRange.cpMax-=2;
+				}
+
+				TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax);
+
+				pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1);
+
+				i=CharRange.cpMin;
+				for(i3=0;i<CharRange.cpMax;i++,i3++){
+					if(i==CharRange.cpMin&&pBuf[i]=='\t'){
+						i3--;
+						continue;
+					}
+					if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'&&pBuf[i+2]=='\t'){
+						pTemp[i3]='\r';
+						pTemp[i3+1]='\n';
+						i3++;
+
+						i+=2;
+						continue;
+					}
+					pTemp[i3]=pBuf[i];
+				}
+				pTemp[i3]=0;
+			}
+			else{
+				//////////////////////////
+				// 複数行にタブ文字を追加
+				//////////////////////////
+
+				if(pBuf[CharRange.cpMax-2]=='\r'&&pBuf[CharRange.cpMax-1]=='\n'){
+					CharRange.cpMax-=2;
+				}
+
+				i2++;	//先頭行のタブ文字も追加の対象
+				TextEdit_SetSel(WndNum,CharRange.cpMin,CharRange.cpMax);
+
+				pTemp=(char *)HeapAlloc(hHeap,0,CharRange.cpMax-CharRange.cpMin+1 +i2);
+
+				i=CharRange.cpMin;
+				if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+					i3=0;
+				}
+				else{
+					pTemp[0]='\t';
+					i3=1;
+				}
+				for(;i<CharRange.cpMax;i++,i3++){
+					if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'&&
+						(!(pBuf[i+2]=='\r'&&pBuf[i+3]=='\n'))){
+						pTemp[i3]='\r';
+						pTemp[i3+1]='\n';
+						pTemp[i3+2]='\t';
+						i3+=2;
+
+						i++;
+						continue;
+					}
+					pTemp[i3]=pBuf[i];
+				}
+				pTemp[i3]=0;
+			}
+
+			//リプレイス
+			TextEdit_ReplaceUpdateUndoData(WndNum,pTemp,0,0);
+			pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+			HeapDefaultFree(pTemp);
+
+			//キャレット位置の設定
+			for(i=CharRange.cpMin+i3;;i++){
+				if(pBuf[i]=='\0') break;
+				if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+					i+=2;
+					break;
+				}
+			}
+			TextEdit_SetSel(WndNum,
+				CharRange.cpMin,
+				i);
+
+			//再描画
+			if(!TextEdit_ScrollCaret(WndNum,0))
+				InvalidateRect(hwnd,NULL,0);
+			ResetCaretPos(WndNum);
+
+			return;
+		}
+		else{
+			temporary[0]='\t';
+			temporary[1]=0;
+		}
+	}
+	else{
+		temporary[0]=nVirtualKey;
+		temporary[1]=0;
+	}
+
+
+	if(ComplementWndInfo.hWnd){
+		//コード補完リスト表示中のとき
+		ComplementWndInfo.iLength++;
+	}
+
+
+
+	///////////////////////
+	// キー入力の受け入れ
+	///////////////////////
+
+	TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+
+
+
+	////////////////////////////////////////////
+	// コード補完機能、パラメータヒントなど
+	////////////////////////////////////////////
+
+	if(MdiInfo[WndNum]->DocType==WNDTYPE_BASIC)
+		TextEditEvent_StartAnalysis_Basic(hwnd,WndNum,nVirtualKey);
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_HTML){
+		TextEditEvent_StartAnalysis_Html(hwnd,WndNum,nVirtualKey);
+	}
+}
+void TextEditEvent_KeyDown(HWND hwnd,int nVirtualKey,int lKeyData){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i,i2;
+	CHARRANGE CharRange;
+	char *pBuf;
+
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+	bool isSelectedBefore = MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x!=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x
+		|| MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y!=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y;
+
+	if(nVirtualKey==VK_LEFT||nVirtualKey==VK_UP||nVirtualKey==VK_RIGHT||nVirtualKey==VK_DOWN||nVirtualKey==VK_PRIOR||nVirtualKey==VK_NEXT){
+		if(MdiInfo[WndNum]->IndentStr){
+			//自動インデント中のインデントを無効にする
+			CancelBeforeAutoIndent(WndNum);
+			if(nVirtualKey==VK_LEFT) return;
+		}
+
+		if(ComplementWndInfo.hWnd){
+			//コード補完リスト表示中のとき
+			if(!(nVirtualKey==VK_LEFT||nVirtualKey==VK_RIGHT)){
+				//コード補完リストにフォーカスを与える
+				PostMessage(ComplementWndInfo.hList,WM_KEYDOWN,nVirtualKey,lKeyData);
+				return;
+			}
+		}
+
+		switch(nVirtualKey){
+			case VK_LEFT:
+				//上下キャレット移動時の左右位置保持機能を解除
+				MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+				if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)||
+					GetKeyState(VK_SHIFT)&0x8000){
+					//選択中でないとき、またはシフトキーが押されているとき
+					GetNaturalCaretPos_Left(WndNum);
+				}
+				else{
+					//選択中のとき
+					if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+					else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+					else{
+						if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+						else
+							MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+					}
+				}
+				break;
+			case VK_RIGHT:
+				//上下キャレット移動時の左右位置保持機能を解除
+				MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+				if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)||
+					GetKeyState(VK_SHIFT)&0x8000){
+					//選択中でないとき、またはシフトキーが押されているとき
+					GetNaturalCaretPos_Right(WndNum,
+						&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				}
+				else{
+					//選択中のとき
+					if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+					else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+					else{
+						if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+						else
+							MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+					}
+				}
+				break;
+			case VK_UP:
+				if((GetKeyState(VK_CONTROL)&0x8000)&&
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x!=0){
+					//行の先頭へキャレットを移動
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0;
+
+					//上下キャレット移動時の左右位置保持機能を解除
+					MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+				}
+				else{
+					if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+						MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)||
+						GetKeyState(VK_SHIFT)&0x8000){
+						//選択中でないとき、またはシフトキーが押されているとき
+						GetNaturalCaretPos_Up(WndNum,
+							&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+					}
+					else{
+						//選択中のとき
+						if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+							MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+						else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+							MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+						else{
+							if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x)
+								MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+							else
+								MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+						}
+
+						GetNaturalCaretPos_Up(WndNum,
+							&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+					}
+				}
+				break;
+			case VK_DOWN:
+				i2=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y;
+				if((MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)||
+					GetKeyState(VK_SHIFT)&0x8000){
+					//選択中でないとき、またはシフトキーが押されているとき
+					GetNaturalCaretPos_Down(WndNum,
+						&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				}
+				else{
+					//選択中のとき
+					if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+					else if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y>MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y)
+						MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+					else{
+						if(MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x<MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x)
+							MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos;
+						else
+							MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+					}
+
+					GetNaturalCaretPos_Down(WndNum,
+						&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				}
+
+				if(GetKeyState(VK_CONTROL)&0x8000){
+					if(i2!=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y){
+						//行の先頭へキャレットを移動
+						MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0;
+					}
+					else{
+						//行の末端へキャレットを移動（終端行の場合）
+						CaretPos_LooseToNatural(WndNum,
+							INT_MAX,
+							MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y,
+							&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+					}
+
+					//上下キャレット移動時の左右位置保持機能を解除
+					MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+				}
+				break;
+			case VK_PRIOR:
+				GetNaturalCaretPos_PageUp(WndNum,
+					&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				break;
+			case VK_NEXT:
+				GetNaturalCaretPos_PageDown(WndNum,
+					&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				break;
+		}
+
+		if(!(GetKeyState(VK_SHIFT)&0x8000)){
+			//シフトキーが押されていない、通常時
+			MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+		}
+
+		if(nVirtualKey==VK_PRIOR){
+			//ページアップスクロール
+			SendMessage(hwnd,WM_VSCROLL,SB_PAGEUP,0);
+		}
+		else if(nVirtualKey==VK_NEXT){
+			//ページダウンスクロール
+			SendMessage(hwnd,WM_VSCROLL,SB_PAGEDOWN,0);
+		}
+		else{
+			//その他、スクロールが必要な場合を考慮
+			TextEdit_ScrollCaret(WndNum,0);
+			ResetCaretPos(WndNum);
+		}
+
+		//編集メニューをリセット
+		ResetState_EditMenu();
+
+		if(!TextEdit_ScrollCaret(WndNum,0)&&isSelectedBefore){
+			UpdateWindow(hwnd);	//ちらつき防止
+			//再描画（選択時の反転表示が解除されたときを考慮）
+			InvalidateRect(hwnd,NULL,0);
+		}
+	}
+	else if(nVirtualKey==VK_HOME||nVirtualKey==VK_END){
+
+		//上下キャレット移動時の左右位置保持機能を解除
+		MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+		if(GetKeyState(VK_CONTROL)&0x8000){
+			//ファイルの先頭または末端へキャレットを移動
+			if(nVirtualKey==VK_HOME){
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0;
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y=0;
+			}
+			else if(nVirtualKey==VK_END){
+				//存在するキャレット位置に変換
+				CaretPos_LooseToNatural(WndNum,
+					INT_MAX,
+					INT_MAX,
+					&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+			}
+		}
+		else{
+			//行の先頭または末端へキャレットを移動
+			if(nVirtualKey==VK_HOME) MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0;
+			else if(nVirtualKey==VK_END){
+				//存在するキャレット位置に変換
+				CaretPos_LooseToNatural(WndNum,
+					INT_MAX,
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y,
+					&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+			}
+		}
+
+		if(!(GetKeyState(VK_SHIFT)&0x8000)){
+			//シフトキーが押されていない、通常時
+			MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+		}
+
+		if(!TextEdit_ScrollCaret(WndNum,0)&&isSelectedBefore){
+			//再描画（選択時の反転表示が解除されたときを考慮）
+			InvalidateRect(hwnd,NULL,0);
+		}
+		ResetCaretPos(WndNum);
+
+		//編集メニューをリセット
+		ResetState_EditMenu();
+	}
+	else if(nVirtualKey==VK_DELETE){
+		////////////
+		// 削除キー
+		////////////
+
+		TextEdit_GetSel(WndNum,&CharRange);
+
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+		//キャレットがファイルの終端にあるとき
+		if(CharRange.cpMin==lstrlen(pBuf)) return;
+
+		if(CharRange.cpMin==CharRange.cpMax){
+			if(MdiInfo[WndNum]->IndentStr){
+				//自動インデントを有効にする
+				char temporary[1024];
+				lstrcpy(temporary,MdiInfo[WndNum]->IndentStr);
+
+				CancelBeforeAutoIndent(WndNum);
+				TextEdit_ReplaceUpdateUndoData(WndNum,temporary,0,1);
+			}
+
+			if(pBuf[CharRange.cpMin]=='\r'&&pBuf[CharRange.cpMin+1]=='\n'||
+				IsDBCSLeadByte(pBuf[CharRange.cpMin])){
+				CharRange.cpMax+=2;
+			}
+			else CharRange.cpMax++;
+
+			GetCaretPosFromBufferIndex(
+				MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				CharRange.cpMax,
+				&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+		}
+
+		TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1);
+	}
+	else if(nVirtualKey==VK_BACK){
+		/////////////////
+		// BackSpaceキー
+		/////////////////
+
+		if(MdiInfo[WndNum]->IndentStr){
+			//自動インデント中のインデントの場合、インデントの1文字を削除する
+			if(lstrlen(MdiInfo[WndNum]->IndentStr)==1){
+				//1文字しか残っていない場合は自動インデントそのものを消去する
+				CancelBeforeAutoIndent(WndNum);
+			}
+			else{
+				MdiInfo[WndNum]->IndentStr[lstrlen(MdiInfo[WndNum]->IndentStr)-1]=0;
+
+				i=GetBufferIndexFromCaretPos(
+					MdiInfo[WndNum]->pMdiTextEdit->buffer,
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+					MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+				GetCaretPosFromBufferIndex(
+					MdiInfo[WndNum]->pMdiTextEdit->buffer,
+					i-1,
+					&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+				TextEdit_Replace(WndNum,"",1);
+			}
+			return;
+		}
+
+		TextEdit_GetSel(WndNum,&CharRange);
+
+		if(CharRange.cpMax==0) return;
+		if(CharRange.cpMin==CharRange.cpMax){
+			if(ComplementWndInfo.hWnd){
+				//コード補完リスト表示中のとき
+				ComplementWndInfo.iLength--;
+			}
+
+			SendMessage(hwnd,WM_KEYDOWN,VK_LEFT,0);
+		}
+		SendMessage(hwnd,WM_KEYDOWN,VK_DELETE,0);
+	}
+}
+
+
+
+void TextEditEvent_StartAnalysis_Basic(HWND hwnd,int WndNum,int nVirtualKey){
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i,i2,i3;
+	CHARRANGE CharRange;
+	char temporary[1024];
+
+	char *pBuf;
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+
+	////////////////////
+	// パラメータヒント
+	////////////////////
+
+	extern METHODCHECKINFO MethodCheckInfo;
+	if(pobj_nv->dwParameterHint&&
+		(!ComplementWndInfo.hWnd)&&
+		(MethodCheckInfo.hWnd||nVirtualKey==' '||nVirtualKey=='\"'||nVirtualKey=='(')){
+			//直前に入力された文字を表示
+			UpdateWindow(hwnd);
+
+			//パラメータヒントを表示
+			ShowParameterHint(WndNum);
+	}
+
+
+	///////////////////////////////
+	// ペアステートメント補完
+	///////////////////////////////
+
+	if(
+		pobj_nv->BackNum_PairStatementComplement&&
+		(nVirtualKey=='c'||nVirtualKey=='C'||		//Case、Catch
+		nVirtualKey=='e'||nVirtualKey=='E'||		//End ～
+		nVirtualKey=='f'||nVirtualKey=='F'||		//Finally
+		nVirtualKey=='l'||nVirtualKey=='L'||		//Loop
+		nVirtualKey=='n'||nVirtualKey=='N'||		//Next
+		nVirtualKey=='p'||nVirtualKey=='P'||		//Private、Protected、Public
+		nVirtualKey=='w'||nVirtualKey=='W')		//Wend
+		){
+
+		i=GetBufferIndexFromCaretPos(pBuf,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+		i2=i-2;
+		while(pBuf[i2]==' '||pBuf[i2]=='\t') i2--;
+		if(IsCommandBackDelimitation(pBuf,i2)){
+			if(GetEndPairCommandInfo(pBuf,i-1)){
+
+				//入力された頭文字と一致するかどうかを検証
+				for(i3=0;i3<ComplementWndInfo.MemberNum;i3++){
+					if((char)CharUpper((LPSTR)(char)nVirtualKey)==
+						(char)CharUpper((LPSTR)ComplementWndInfo.pMemberInfo[i3].pName[0])) break;
+				}
+				if(i3==ComplementWndInfo.MemberNum){
+					DeleteComplementInfo();
+					return;
+				}
+
+				ComplementWndInfo.iLength=1;
+				CodeComplement(WndNum,i-1);
+
+				//初期入力時に補完リストの選択をさせるため
+				ResetCaretPos(WndNum);
+			}
+		}
+	}
+
+
+	//////////////////
+	// コード補完機能
+	//////////////////
+
+	if(nVirtualKey=='.'&&pobj_nv->bShowComplementWnd){
+		TextEdit_GetSel(WndNum,&CharRange);
+
+Complement:
+		i2=CharRange.cpMin-1;
+
+		i3=TextEdit_GetLineIndex(WndNum,i2);
+		int IsStr;
+		for(IsStr=0;i3<i2;i3++){
+			if(IsDBCSLeadByte(pBuf[i3])){
+				i3++;
+				continue;
+			}
+			if(pBuf[i3]=='\r'&&pBuf[i3+1]=='\n') break;
+			if(pBuf[i3]=='\''){
+				//注釈文のとき
+				return;
+			}
+			if(pBuf[i3]=='\"') IsStr^=1;
+		}
+		if(IsStr){
+			//文字列内のとき
+			return;
+		}
+
+		for(i=i2;i>0;i--){
+			if(pBuf[i-1]=='-'&&pBuf[i]=='>')i-=2;
+			if(pBuf[i]==']'){
+				for(i3=1,i--;i>0;i--){
+					if(pBuf[i]==']') i3++;
+					if(pBuf[i]=='['){
+						i3--;
+						if(i3==0) break;
+					}
+				}
+				if(pBuf[i]=='[') continue;
+				break;
+			}
+			if(pBuf[i]==')'){
+				for(i3=1,i--;i>0;i--){
+					if(pBuf[i]==')') i3++;
+					if(pBuf[i]=='('){
+						i3--;
+						if(i3==0) break;
+					}
+				}
+				if(pBuf[i]=='(') continue;
+				break;
+			}
+			if(!(IsVariableChar(pBuf[i])||pBuf[i]=='.')){
+				i++;
+				break;
+			}
+		}
+
+		if((nVirtualKey=='.'&&i2-i==0)||
+			nVirtualKey=='>'&&i2-i==1){
+			//オブジェクト識別子がないとき、Withを検索
+			GetWithObjectVariable(pBuf,i2,temporary);
+
+			if(nVirtualKey=='.') lstrcat(temporary,".");
+			else lstrcat(temporary,"->");
+		}
+		else{
+			//オブジェクト識別子をtemporaryにコピー
+
+			//アクセス違反を防ぐため、VN_SIZE以上の参照データへの補完は行わない
+			if(i2-i>VN_SIZE) return;
+
+			if(pBuf[i]=='.'){
+				GetWithObjectVariable(pBuf,i2,temporary);
+			}
+			else if(pBuf[i]=='-'&&pBuf[i+1]=='>'){
+				GetWithObjectVariable(pBuf,i2,temporary);
+			}
+			else temporary[0]=0;
+
+			i3=lstrlen(temporary);
+			memcpy(temporary+i3,pBuf+i,i2-i+1);
+			temporary[i3+i2-i+1]=0;
+		}
+
+		if(temporary[0]){
+			//オブジェクト識別子を検出した場合
+			if(GetComplementInfo(temporary,pBuf,i2)){
+				ComplementWndInfo.iLength=0;
+				CodeComplement(WndNum,i2+1);
+			}
+		}
+	}
+	else if(nVirtualKey=='>'&&pobj_nv->bShowComplementWnd){
+		TextEdit_GetSel(WndNum,&CharRange);
+		if(pBuf[CharRange.cpMin-2]=='-'){
+			goto Complement;
+		}
+	}
+}
+void TextEditEvent_StartAnalysis_Html(HWND hwnd,int WndNum,int nVirtualKey){
+	//////////////////////////
+	// HTMLのコード補完
+	//////////////////////////
+
+	extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+	int i;
+
+	char *pBuf;
+	pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+
+
+	///////////////////////////////
+	// コード補完
+	///////////////////////////////
+
+	if(nVirtualKey==' '){
+ 
+		i=GetBufferIndexFromCaretPos(pBuf,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x,
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y);
+
+		if(GetNowTagInfo(pBuf,i-1)){
+			ComplementWndInfo.iLength=0;
+			CodeComplement(WndNum,i);
+
+			//初期入力時に補完リストの選択をさせるため
+			ResetCaretPos(WndNum);
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor_MouseEvent.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor_MouseEvent.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor_MouseEvent.cpp	(revision 774)
@@ -0,0 +1,333 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void TextEditEvent_LButtonDown(HWND hwnd,POINT *pMousePos){
+	POINT pos;
+	int i;
+
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	if((GetKeyState(VK_CONTROL)&0x8000)&&pobj_nv->bCtrlKeyHyperLink){
+		//Ctrlキーが押されているとき
+		if(MdiInfo[WndNum]->pMdiTextEdit->iUnderStart!=-1){
+			//単語が選択可能なとき
+
+			//半角文字列を選択時の全角とのズレを修正
+			int start,end;
+			start=MdiInfo[WndNum]->pMdiTextEdit->iUnderStart;
+			end=MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd;
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,start,&pos);
+			start=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,end,&pos);
+			end=GetBufferIndexFromCaretPos(MdiInfo[WndNum]->pMdiTextEdit->buffer,pos.x,pos.y);
+
+			int length;
+			length=end-start;
+			if(length<=0) return;
+
+			char *pTemp;
+			pTemp=(char *)HeapAlloc(hHeap,0,length+1);
+			memcpy(
+				pTemp,
+				MdiInfo[WndNum]->pMdiTextEdit->buffer+start,
+				length);
+			pTemp[length]=0;
+
+			obj_WebStrings.add(pTemp);
+
+			extern HWND hWebSearchCombo;
+			SetWindowText(GetWindow(hWebSearchCombo,GW_CHILD),obj_WebStrings.GetBuffer());
+
+			SendMessage(GetWindow(hWebSearchCombo,GW_CHILD),WM_CHAR,VK_RETURN,0);
+
+			HeapDefaultFree(pTemp);
+
+			return;
+		}
+	}
+
+	SetFocus(hwnd);
+	SetCapture(hwnd);
+
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	if(MdiInfo[WndNum]->IndentStr){
+		//自動インデント中のインデントを無効にする
+		CancelBeforeAutoIndent(WndNum);
+	}
+
+	MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll=0;
+
+	//上下キャレット移動時の左右位置保持機能を解除
+	MdiInfo[WndNum]->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+
+	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
+		//コントロールタブをクリックしたときの処理
+
+		//カーソルを矢印マークにする
+		SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
+
+		GetNaturalCaretPos_Click(WndNum,
+			0,
+			pMousePos->y,
+			&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+		MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+
+		////////////
+		// 行を選択
+		////////////
+
+		char *pBuf;
+		pBuf=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+		CHARRANGE CharRange;
+		TextEdit_GetSel(WndNum,&CharRange);
+		i=CharRange.cpMin;
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
+				i+=2;
+				break;
+			}
+		}
+		TextEdit_SetSel(WndNum,
+			i,
+			CharRange.cpMin);
+	}
+	else{
+		GetNaturalCaretPos_Click(WndNum,
+			pMousePos->x-iControlTabSpace,
+			pMousePos->y,
+			&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+		if(!(GetKeyState(VK_SHIFT)&0x8000)){
+			//シフトキーが押されていない、通常時
+			MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos;
+		}
+
+		ResetCaretPos(WndNum);
+
+		if(!TextEdit_ScrollCaret(WndNum,0)){
+			//再描画（選択時の反転表示が解除されたときを考慮）
+			UpdateWindow(hwnd);	//ちらつき防止
+			InvalidateRect(hwnd,NULL,0);
+		}
+	}
+}
+
+void TextEditEvent_LButtonUp(HWND hwnd,POINT *pMousePos){
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
+		//コントロールタブをクリックしたときの処理
+
+		//カーソルを矢印マークにする
+		SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
+	}
+
+	if(GetCapture()==hwnd){
+		//////////////////////////
+		// ドラッグが終了するとき
+		//////////////////////////
+
+		ReleaseCapture();
+
+		//オートスクロールスレッドを停止
+		MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll=0;
+
+		//編集メニューをリセット
+		ResetState_EditMenu();
+	}
+}
+
+void AutoScrollThread(HWND hwnd){
+	//////////////////////////////
+	// 左右方向にオートスクロール
+	//////////////////////////////
+
+	int WndNum;
+	POINT pos;
+
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	
+	//エディタ画面左端のコントロールタブ
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+
+	while(MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll){
+		GetCursorPos(&pos);
+		ScreenToClient(hwnd,&pos);
+
+		GetNaturalCaretPos_Click(WndNum,
+			pos.x-iControlTabSpace,
+			pos.y,
+			&pos);
+
+		//存在するキャレット位置に変換
+		CaretPos_LooseToNatural(WndNum,
+			pos.x,
+			pos.y,
+			&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+
+		if(!TextEdit_ScrollCaret(WndNum,1))
+			InvalidateRect(hwnd,NULL,0);
+
+		//別スレッドからResetCaretPosを呼び出す
+		SendMessage(hwnd,WM_RESETCARETPOS,0,0);
+
+		Sleep(70);
+	}
+
+	_endthread();
+}
+void TextEditEvent_MouseMove(HWND hwnd,POINT *pMousePos){
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+	if(WndNum==-1) return;
+
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	if(GetCapture()==hwnd){
+		//////////////
+		// ドラッグ中
+		//////////////
+
+		RECT rect;
+		GetClientRect(hwnd,&rect);
+
+		if(
+			(short)pMousePos->y<0||				//上方向へオートスクロール
+			rect.bottom<=(short)pMousePos->y||	//下方向へオートスクロール
+			(short)pMousePos->x<iControlTabSpace||	//左方向へオートスクロール
+			rect.right<=(short)pMousePos->x		//右方向へオートスクロール
+			){
+			////////////////////////////
+			// オートスクロール
+			////////////////////////////
+
+			if(MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll){
+				//すでにオートスクロールスレッドが作動中のときは抜け出す
+				return;
+			}
+
+			//オートスクロールスレッドを起動
+			MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll=1;
+
+			_beginthread((void (__cdecl *)(void *))AutoScrollThread,0,(void *)hwnd);
+
+			return;
+		}
+		else if(MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll){
+			//オートスクロールを解除
+			MdiInfo[WndNum]->pMdiTextEdit->bAutoScroll=0;
+		}
+
+
+		//////////////////////
+		// 通常のドラッグ選択
+		//////////////////////
+
+		POINT pos;
+		GetNaturalCaretPos_Click(WndNum,
+			pMousePos->x-iControlTabSpace,
+			pMousePos->y,
+			&pos);
+
+		if(pos.x!=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x||pos.y!=MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y){
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos=pos;
+
+			InvalidateRect(hwnd,NULL,0);
+			ResetCaretPos(WndNum);
+		}
+	}
+	else{
+		if(0<=pMousePos->x&&pMousePos->x<iControlTabSpace){
+			//コントロールタブの上にポインタがあるとき
+
+			//カーソルを矢印マークにする
+			SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
+
+			return;
+		}
+
+		if(pobj_nv->bCtrlKeyHyperLink){
+			if(GetKeyState(VK_CONTROL)&0x8000){
+				//Ctrlキーが押されているとき
+
+				POINT pos;
+				GetNaturalCaretPos_Click(WndNum,
+					pMousePos->x-iControlTabSpace,
+					pMousePos->y,
+					&pos);
+
+				TextEdit_GetWordCaret(
+					MdiInfo[WndNum]->pMdiTextEdit->hEdit,
+					WndNum,
+					&pos,
+					&MdiInfo[WndNum]->pMdiTextEdit->iUnderStart,&MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd,
+					WORDCARET_AFTER);
+
+				SetCursor(LoadCursor(0,IDC_ARROW));
+
+				InvalidateRect(hwnd,NULL,0);
+				UpdateWindow(hwnd);
+			}
+			else{
+				if(MdiInfo[WndNum]->pMdiTextEdit->iUnderStart!=-1){
+					MdiInfo[WndNum]->pMdiTextEdit->iUnderStart=-1;
+					MdiInfo[WndNum]->pMdiTextEdit->iUnderEnd=-1;
+
+					InvalidateRect(hwnd,NULL,0);
+					UpdateWindow(hwnd);
+				}
+			}
+		}
+	}
+}
+
+void TextEdit_WordSelect(HWND hwnd,int WndNum){
+	////////////////////////////////////
+	// ダブルクリックによる単語セレクト
+	////////////////////////////////////
+
+	int start,end;
+	TextEdit_GetWordCaret(hwnd,WndNum,&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos,&start,&end,WORDCARET_AFTER);
+
+	//セレクト
+	TextEdit_SetSel(WndNum,start,end);
+
+	//再描画
+	InvalidateRect(hwnd,NULL,0);
+	ResetCaretPos(WndNum);
+}
+void TextEditEvent_LButtonDblClk(HWND hwnd,POINT *pMousePos){
+	int WndNum;
+	WndNum=GetWndNum(GetParent(hwnd));
+
+	int iControlTabSpace;
+	iControlTabSpace=MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace;
+
+	if(0<=(pMousePos->x) && (pMousePos->x)<iControlTabSpace){
+		//コントロールタブをダブルクリックしたときの処理
+
+		//カーソルを矢印マーク（デフォルト）にする
+		SetCursor(LoadCursor(hResInst,MAKEINTRESOURCE(IDC_CURSOR_ARROW_TO_RIGHT)));
+
+		return;
+	}
+	else{
+		TextEdit_WordSelect(hwnd,WndNum);
+
+		//編集メニューをリセット
+		ResetState_EditMenu();
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/TextEditor_UndoRedo.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/TextEditor_UndoRedo.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/TextEditor_UndoRedo.cpp	(revision 774)
@@ -0,0 +1,159 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+void TextEdit_UndoCommand(int WndNum){
+	int i;
+	TEXTEDIT_UNDOSTATE *pUndoState;
+
+	//自動インデント中のインデントを無効にする
+	if(MdiInfo[WndNum]->IndentStr) CancelBeforeAutoIndent(WndNum);
+
+	pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
+	i=pUndoState->NowPos-1;
+	if(i==-1) i=MAX_UNDONUM-1;
+	if(!pUndoState->Command[i]){
+		MessageBeep(0);
+		return;
+	}
+	pUndoState->NowPos=i;
+
+	//選択範囲をセット
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		pUndoState->Range[pUndoState->NowPos].cpMin,
+		&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+	GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+		pUndoState->Range[pUndoState->NowPos].cpMax,
+		&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+
+	switch(pUndoState->Command[pUndoState->NowPos]){
+		case TEXTEDIT_UNDO_KEY:
+		case TEXTEDIT_UNDO_PASTE:
+			TextEdit_Replace(WndNum,"",1);
+			break;
+		case TEXTEDIT_UNDO_SELKEY:
+			TextEdit_Replace(WndNum,pUndoState->DelStr[pUndoState->NowPos],1);
+			break;
+	}
+
+	TextEdit_ScrollCaret(WndNum,0);
+	ResetCaretPos(WndNum);
+
+	//元に戻す、やり直しメニューをリセット
+	ResetState_UndoMenu();
+
+	//変更を通知
+	MdiInfo[WndNum]->pMdiTextEdit->NofityUndoRedoToModify();
+}
+void TextEdit_RedoCommand(int WndNum){
+	TEXTEDIT_UNDOSTATE *pUndoState;
+
+	pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
+	if(!pUndoState->Command[pUndoState->NowPos]){
+		MessageBeep(0);
+		return;
+	}
+
+	switch(pUndoState->Command[pUndoState->NowPos]){
+		case TEXTEDIT_UNDO_KEY:
+		case TEXTEDIT_UNDO_PASTE:
+			//選択範囲をセット
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				pUndoState->Range[pUndoState->NowPos].cpMin,
+				&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				pUndoState->Range[pUndoState->NowPos].cpMin,
+				&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+
+			TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
+			break;
+		case TEXTEDIT_UNDO_SELKEY:
+			//選択範囲をセット
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				pUndoState->DelRange[pUndoState->NowPos].cpMin,
+				&MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos);
+			GetCaretPosFromBufferIndex(MdiInfo[WndNum]->pMdiTextEdit->buffer,
+				pUndoState->DelRange[pUndoState->NowPos].cpMax,
+				&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+
+			TextEdit_Replace(WndNum,pUndoState->KeyStr[pUndoState->NowPos],1);
+			break;
+	}
+
+	TextEdit_ScrollCaret(WndNum,0);
+	ResetCaretPos(WndNum);
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
+
+	//元に戻す、やり直しメニューをリセット
+	ResetState_UndoMenu();
+
+	//変更を通知
+	MdiInfo[WndNum]->pMdiTextEdit->NofityUndoRedoToModify();
+}
+
+BOOL bUndoDelimitation(char c){
+	if(c==' '||c=='\t'||
+		c=='\"'||
+		c==','||c==':'||c==';'||
+		c=='('||c==')'||
+		c=='+'||c=='-'||c=='*'||c=='/'||c=='^'||c=='\\'||c=='<'||c=='>'||c=='=') return 1;
+	return 0;
+}
+void TextEdit_NoticeChanging(int WndNum,int Command,char *KeyStr,char *DelStr,CHARRANGE *Range,CHARRANGE *DelRange){
+	extern HANDLE hHeap;
+	int i;
+	TEXTEDIT_UNDOSTATE *pUndoState;
+
+	pUndoState=MdiInfo[WndNum]->pMdiTextEdit->pTextEditUndoState;
+
+	//Redoされた場合の不要なデータを削除する
+	for(i=pUndoState->NowPos;;i++){
+		if(i==MAX_UNDONUM) i=0;
+		if(pUndoState->Command[i]==0) break;
+		TextEdit_DeleteUndoData(pUndoState,i);
+	}
+
+	i=pUndoState->NowPos-1;
+	if(i==-1) i=MAX_UNDONUM-1;
+	if(pUndoState->Command[i]==Command&&
+		pUndoState->Command[i]==TEXTEDIT_UNDO_KEY){
+		if(pUndoState->Range[i].cpMax==Range->cpMin&&KeyStr[0]!='\r'){
+			if(!(bUndoDelimitation(pUndoState->KeyStr[i][0])^bUndoDelimitation(KeyStr[0]))){
+				pUndoState->KeyStr[i]=(char *)HeapReAlloc(hHeap,0,pUndoState->KeyStr[i],lstrlen(pUndoState->KeyStr[i])+lstrlen(KeyStr)+1);
+				lstrcat(pUndoState->KeyStr[i],KeyStr);
+				pUndoState->Range[i].cpMax+=lstrlen(KeyStr);
+
+				HeapDefaultFree(KeyStr);
+
+				//元に戻す、やり直しメニューをリセット
+				ResetState_UndoMenu();
+				return;
+			}
+		}
+	}
+
+	//データ更新
+	pUndoState->Command[pUndoState->NowPos]=Command;
+	pUndoState->KeyStr[pUndoState->NowPos]=KeyStr;
+	pUndoState->DelStr[pUndoState->NowPos]=DelStr;
+	pUndoState->Range[pUndoState->NowPos]=*Range;
+	if(DelRange) pUndoState->DelRange[pUndoState->NowPos]=*DelRange;
+
+	pUndoState->NowPos++;
+	if(pUndoState->NowPos==MAX_UNDONUM) pUndoState->NowPos=0;
+	if(pUndoState->Command[pUndoState->NowPos]){
+		//一番古い情報を切り捨てる
+		TextEdit_DeleteUndoData(pUndoState,pUndoState->NowPos);
+	}
+
+	//元に戻す、やり直しメニューをリセット
+	ResetState_UndoMenu();
+}
+
+void TextEdit_DeleteUndoData(TEXTEDIT_UNDOSTATE *pUndoState,int pos){
+	if(pUndoState->KeyStr[pos]) HeapDefaultFree(pUndoState->KeyStr[pos]);
+	if(pUndoState->DelStr[pos]) HeapDefaultFree(pUndoState->DelStr[pos]);
+	pUndoState->Command[pos]=0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/WebSearch.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/WebSearch.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/WebSearch.cpp	(revision 774)
@@ -0,0 +1,1130 @@
+#include "stdafx.h"
+
+#include "common.h"
+#include "CIEsink.h"
+
+
+#define ID_TIMER_POPUP_ANIMATION 100
+#define ID_TIMER_IDLE 200
+
+extern FWINLAYER pSetLayeredWindowAttributes;
+
+
+LRESULT CALLBACK ResultListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	CResultList *pobj_ResultList;
+	POINT pos;
+	RECT rc;
+	int iItem;
+
+	switch(message){
+		case WM_TIMER:
+			if(wParam==ID_TIMER_POPUP_ANIMATION){
+				pobj_ResultList=(CResultList *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
+
+				pSetLayeredWindowAttributes(hwnd, 0,(int)((double)255/(double)100*(double)(pobj_ResultList->iAnimeCount*10)), LWA_ALPHA);
+
+				GetWindowRect(hwnd,&rc);
+				rc.top++;
+				SetWindowPos(hwnd,0,rc.left,rc.top,0,0,SWP_NOSIZE);
+
+				pobj_ResultList->iAnimeCount+=1;
+				if(pobj_ResultList->iAnimeCount>10){
+					KillTimer(hwnd,ID_TIMER_POPUP_ANIMATION);
+
+					SetTimer(hwnd,ID_TIMER_IDLE,100,NULL);
+				}
+			}
+			else if(wParam==ID_TIMER_IDLE){
+				InvalidateRect(hwnd,NULL,0);
+			}
+			return 0;
+		case WM_PAINT:
+			pobj_ResultList=(CResultList *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
+
+			RECT ClientRect;
+			GetClientRect(hwnd,&ClientRect);
+
+			//描画を開始
+			HDC hdc;
+			PAINTSTRUCT ps;
+			hdc=BeginPaint(hwnd,&ps);
+
+			//メモリデバイスコンテキストを生成
+			HDC memdc;
+			HBITMAP hMemBmp;
+			memdc=CreateCompatibleDC(hdc);
+			hMemBmp=CreateCompatibleBitmap(hdc,ClientRect.right,ClientRect.bottom);
+			SelectObject(memdc,hMemBmp);
+
+			//フォントをセット
+			extern HFONT hStatusFont;
+			HFONT hOldFont;
+			hOldFont=(HFONT)SelectObject(memdc,hStatusFont);
+
+			//ウィンドウサイズを取得（アイテム座標を取得）
+			GetCursorPos(&pos);
+			GetWindowRect(hwnd,&rc);
+			rc.bottom=rc.top+LINK_ITEM_HEIGHT;
+
+			//クライアント アイテム 座標を取得
+			ClientRect.left+=10;
+			ClientRect.bottom=ClientRect.top+LINK_ITEM_HEIGHT;
+
+			//ブラシを生成
+			HBRUSH hFaceBrush,hShadowBrush,hOldBrush;
+			hFaceBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+			hShadowBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
+
+			for(iItem=0;iItem<10;iItem++){
+				if(rc.left<pos.x && pos.x<rc.right && rc.top<pos.y && pos.y<rc.bottom){
+
+					SetBkColor(memdc,GetSysColor(COLOR_3DSHADOW));
+
+					hOldBrush=(HBRUSH)SelectObject(memdc,hShadowBrush);
+				}
+				else{
+					extern HFONT hStatusFont;
+					hOldFont=(HFONT)SelectObject(memdc,hStatusFont);
+
+					SetBkColor(memdc,GetSysColor(COLOR_3DFACE));
+
+					hOldBrush=(HBRUSH)SelectObject(memdc,hFaceBrush);
+				}
+				SetTextColor(memdc,RGB(0,0,255));
+
+				PatBlt(memdc,ClientRect.left-10,ClientRect.top,ClientRect.right,ClientRect.bottom,PATCOPY);
+				SelectObject(memdc,hOldBrush);
+
+				DrawText(memdc,pobj_ResultList->pobj_OneTab->lpszTitle[iItem],-1,&ClientRect,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
+
+				rc.top+=LINK_ITEM_HEIGHT;
+				rc.bottom=rc.top+LINK_ITEM_HEIGHT;
+
+				ClientRect.top+=LINK_ITEM_HEIGHT;
+				ClientRect.bottom=ClientRect.top+LINK_ITEM_HEIGHT;
+			}
+
+			SelectObject(memdc,hOldFont);
+
+			GetClientRect(hwnd,&ClientRect);
+			BitBlt(hdc,0,0,ClientRect.right,ClientRect.bottom,memdc,0,0,SRCCOPY);
+
+			EndPaint(hwnd,&ps);
+
+			DeleteObject(hFaceBrush);
+			DeleteObject(hShadowBrush);
+
+			DeleteDC(memdc);
+			DeleteObject(hMemBmp);
+			break;
+
+		case WM_LBUTTONDOWN:
+			pobj_ResultList=(CResultList *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
+
+			GetCursorPos(&pos);
+			GetWindowRect(hwnd,&rc);
+			rc.bottom=rc.top+LINK_ITEM_HEIGHT;
+
+			for(iItem=0;iItem<10;iItem++){
+				if(rc.left<pos.x && pos.x<rc.right && rc.top<pos.y && pos.y<rc.bottom){
+					ShellExecute(hwnd,"open",pobj_ResultList->pobj_OneTab->lpszUrl[iItem],NULL,NULL,SW_SHOWNORMAL);
+					break;
+				}
+
+				rc.top+=LINK_ITEM_HEIGHT;
+				rc.bottom=rc.top+LINK_ITEM_HEIGHT;
+			}
+			return 0;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+CResultList::CResultList(COneTab *pot){
+	pobj_OneTab=pot;
+	iAnimeCount=0;
+
+	hwnd=CreateWindowEx(0,"ResultList","ResultList",
+		WS_POPUP|WS_CLIPCHILDREN|WS_VISIBLE|WS_BORDER,
+		0,0,0,0,
+		hOwner,0,hInst,0);
+
+	//ウィンドウを半透明にする
+	int lStyle;
+	lStyle=GetWindowLongPtr(hwnd,GWL_EXSTYLE) | WS_EX_LAYERED;
+	SetWindowLongPtr(hwnd,GWL_EXSTYLE,lStyle);
+	pSetLayeredWindowAttributes(hwnd, 0, 0, LWA_ALPHA);
+
+	SetWindowLongPtr(hwnd,GWLP_USERDATA,(long)this);
+	SetTimer(hwnd,ID_TIMER_POPUP_ANIMATION,10,NULL);
+	BringWindowToTop(hwnd);
+
+	RECT rc;
+	GetWindowRect(pobj_OneTab->hTabWnd,&rc);
+
+	HDC hdc;
+	hdc=GetDC(hwnd);
+
+	extern HFONT hStatusFont;
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+
+
+	//アイテム数を取得
+	int iItem,iMaxWidth=0;
+	for(iItem=0;iItem<10;iItem++){
+		if(pobj_OneTab->lpszTitle[iItem]==0){
+			break;
+		}
+
+		SIZE size;
+		GetTextExtentPoint32(hdc,pobj_OneTab->lpszTitle[iItem],lstrlen(pobj_OneTab->lpszTitle[iItem]),&size);
+
+		if(iMaxWidth<size.cx){
+			//最大幅を取得
+			iMaxWidth=size.cx;
+		}
+	}
+
+	SelectObject(hdc,hOldFont);
+	ReleaseDC(hwnd,hdc);
+
+	MoveWindow(hwnd,rc.left,rc.top-iItem*LINK_ITEM_HEIGHT-10,iMaxWidth+20,iItem*LINK_ITEM_HEIGHT,1);
+}
+CResultList::~CResultList(){
+	DestroyWindow(hwnd);
+}
+
+
+
+LRESULT CALLBACK OneTabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	COneTab *pobj_OneTab;
+	RECT rc;
+	POINT pos;
+
+	switch(message){
+		case WM_CREATE:
+			SetTimer(hwnd,0,100,NULL);
+			return 0;
+		case WM_TIMER:
+			InvalidateRect(hwnd,NULL,0);
+			return 0;
+		case WM_PAINT:
+			pobj_OneTab=(COneTab *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
+
+			HBRUSH hBrush,hOldBrush;
+
+			HDC hdc;
+			PAINTSTRUCT ps;
+			hdc=BeginPaint(hwnd,&ps);
+
+			GetCursorPos(&pos);
+			GetWindowRect(hwnd,&rc);
+			HFONT hOldFont;
+			if(rc.left<=pos.x && pos.x<=rc.right && rc.top<=pos.y && pos.y<=rc.bottom){
+				extern HFONT hStatusFont;
+				hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+
+				SetBkColor(hdc,GetSysColor(COLOR_3DSHADOW));
+
+				hBrush=CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
+
+				//リストを表示
+				if(pobj_OneTab->pobj_ResultList==0){
+					pobj_OneTab->pobj_ResultList=new CResultList(pobj_OneTab);
+				}
+			}
+			else{
+				extern HFONT hStatusFont;
+				hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+
+				SetBkColor(hdc,GetSysColor(COLOR_3DFACE));
+
+				hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
+
+				//リストを破棄
+				if(pobj_OneTab->pobj_ResultList){
+					GetWindowRect(pobj_OneTab->pobj_ResultList->hwnd,&rc);
+					if(!(rc.left<=pos.x && pos.x<=rc.right && rc.top<=pos.y && pos.y<=rc.bottom)){
+						delete pobj_OneTab->pobj_ResultList;
+						pobj_OneTab->pobj_ResultList=0;
+					}
+				}
+			}
+			SetTextColor(hdc,RGB(0,0,255));
+
+			GetClientRect(hwnd,&rc);
+
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+			PatBlt(hdc,0,0,rc.right,rc.bottom,PATCOPY);
+			SelectObject(hdc,hOldBrush);
+
+			rc.left++;
+			DrawText(hdc,pobj_OneTab->lpszString,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+			SelectObject(hdc,hOldFont);
+
+			//左端の境界線
+			HPEN hPen,hOldPen;
+			hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+			MoveToEx(hdc,0,0,NULL);
+			LineTo(hdc,0,rc.bottom-rc.top);
+			SelectObject(hdc,hOldPen);
+			DeleteObject(hPen);
+
+			EndPaint(hwnd,&ps);
+
+			DeleteObject(hBrush);
+			return 0;
+		case WM_LBUTTONDOWN:
+			pobj_OneTab=(COneTab *)GetWindowLongPtr(hwnd,GWLP_USERDATA);
+
+			ShellExecute(hwnd,"open",pobj_OneTab->lpszUrl[0],NULL,NULL,SW_SHOWNORMAL);
+			return 0;
+
+		case WM_COMMAND:
+			break;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+COneTab::COneTab(int WndNum,char *str){
+	//0で初期化
+	memset(this,0,sizeof(COneTab));
+
+	m_WndNum=WndNum;
+
+	lpszString=(char *)malloc(lstrlen(str)+1);
+	lstrcpy(lpszString,str);
+
+
+	//Web検索をかける
+	WebSearch();
+
+
+
+	/////////////////////////////////
+	// テキストアイテムの幅を取得
+	/////////////////////////////////
+
+	HDC hdc;
+	SIZE size;
+	hdc=GetDC(hOwner);
+
+	extern HFONT hStatusFont;
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
+
+	GetTextExtentPoint32(hdc,lpszString,lstrlen(lpszString),&size);
+
+	SelectObject(hdc,hOldFont);
+
+	ReleaseDC(hOwner,hdc);
+	iWindowWidth=size.cx+20;
+
+	if(MdiInfo[WndNum]->pMdiTextEdit==0) return;
+	hTabWnd=(HWND)SendMessage(MdiInfo[WndNum]->pMdiTextEdit->hEdit,WM_SEARCH_TAB_CREATE,(WPARAM)WndNum,(LPARAM)this);
+}
+COneTab::~COneTab(){
+	free(lpszString);
+
+	int i;
+	for(i=0;i<10;i++){
+		if(lpszTitle[i]) free(lpszTitle[i]);
+		if(lpszUrl[i]) free(lpszUrl[i]);
+	}
+
+	if(MdiInfo[m_WndNum]->pMdiTextEdit)
+		SendMessage(MdiInfo[m_WndNum]->pMdiTextEdit->hEdit,WM_SEARCH_TAB_CLOSE,0,(LPARAM)hTabWnd);
+}
+
+void COneTab::WebSearch(){
+	//URLエンコード
+	char *temporary;
+	temporary=(char *)malloc(lstrlen(lpszString)*3+1024);
+	wsprintf(temporary,"辞書 %s",lpszString);
+	URLEncode(temporary);
+
+	char *lpszTempUrl;
+	lpszTempUrl=(char *)malloc(lstrlen(temporary)+1024);
+	sprintf(lpszTempUrl,"http://www.activebasic.com/application_web_search/search.php?query=%s&type=web&utf_sw=1&start=1",temporary);
+
+	free(temporary);
+
+
+	HINTERNET hInternet;
+	HINTERNET hNetFile;
+	hInternet = InternetOpen("Agent", 0, NULL, NULL, 0);
+	if(hInternet==0){
+		return;
+	}
+	hNetFile = InternetOpenUrl(hInternet, lpszTempUrl, NULL, 0, 0, 0);
+	if(hNetFile==0){
+		InternetCloseHandle(hInternet);
+		return;
+	}
+
+	/* オープンしたURLからデータを(1000バイトずつ)読み込む */
+	DWORD dwReadSize;
+	BOOL bResult;
+	char *buffer;
+	buffer=(char *)malloc(8192);
+	buffer[0]=0;
+
+	while(1){
+		char temp3[1024];
+		bResult = InternetReadFile(
+			hNetFile,
+			temp3,
+			1000,
+			&dwReadSize);
+
+		/* 全て読み込んだらループを抜ける */
+		if(bResult && (dwReadSize == 0)) break;
+
+		temp3[dwReadSize]=0;
+		lstrcat(buffer,temp3);
+	}
+
+
+	//UTF-8からShift-JISに変換
+	char *temp2;
+	temp2=(char *)malloc(8192);
+	nkf.pSetNkfOption("-sx");	//Shift-JISに変換（xは半角カタカナを全角に変換しないオプション）
+	nkf.pNkfConvert(temp2,buffer);
+	free(buffer);
+
+
+	InternetCloseHandle(hNetFile);
+	InternetCloseHandle(hInternet);
+
+
+	//タイトル・URLを取得
+	int iItem;
+	int i=0,i2;
+	for(iItem=0;iItem<10;iItem++){
+		lpszTitle[iItem]=(char *)malloc(lstrlen(temp2)+1);
+		lpszUrl[iItem]=(char *)malloc(lstrlen(temp2)+1);
+		for(i2=0;;i++,i2++){
+			//タイトル
+			if(temp2[i]=='\n'||temp2[i]=='\0'){
+				lpszTitle[iItem][i2]=0;
+				break;
+			}
+			lpszTitle[iItem][i2]=temp2[i];
+		}
+		if(temp2[i]){
+			//URL
+			for(i++,i2=0;;i++,i2++){
+				if(temp2[i]=='\n'||temp2[i]=='\0'){
+					lpszUrl[iItem][i2]=0;
+					break;
+				}
+				lpszUrl[iItem][i2]=temp2[i];
+			}
+		}
+		if(temp2[i]){
+			//サマリー
+			for(i++,i2=0;;i++,i2++){
+				if(temp2[i]=='\n'||temp2[i]=='\0'){
+					break;
+				}
+			}
+		}
+
+		if(temp2[i]=='\0') break;
+		i++;
+	}
+
+
+	free(temp2);
+
+
+	free(lpszTempUrl);
+}
+
+
+
+
+
+
+LRESULT CALLBACK WebResultWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	switch(message){
+		case WM_COMMAND:
+			break;
+	}
+	return DefWindowProc(hwnd,message,wParam,lParam);
+}
+
+CWebResult::CWebResult(HWND hParent){
+	ppobj_OneTab=(COneTab **)malloc(1);
+	iTabNum=0;
+
+	hwnd=CreateWindowEx(0,"WebResult","WebResult",
+		WS_CHILD|WS_CLIPCHILDREN|WS_VISIBLE,
+		0,0,0,0,
+		hParent,0,hInst,0);
+}
+CWebResult::~CWebResult(){
+	int i;
+	for(i=0;i<iTabNum;i++){
+		delete ppobj_OneTab[i];
+	}
+
+	free(ppobj_OneTab);
+	ppobj_OneTab=0;
+
+	DestroyWindow(hwnd);
+}
+
+void CWebResult::resize(int x,int y,int cx,int cy){
+	MoveWindow(hwnd,x,y,cx,cy,1);
+}
+
+void CWebResult::add(int WndNum,char *lpszSearchText){
+	COneTab *pobj_temp_OneTab;
+	pobj_temp_OneTab=new COneTab(WndNum,lpszSearchText);
+	if(MdiInfo[WndNum]->pMdiTextEdit==0){
+		delete pobj_temp_OneTab;
+		return;
+	}
+
+	if(pobj_temp_OneTab->lpszTitle[0]){
+		if(pobj_temp_OneTab->lpszTitle[0][0]=='\0'){
+			delete pobj_temp_OneTab;
+			return;
+		}
+	}
+	else{
+		delete pobj_temp_OneTab;
+		return;
+	}
+
+
+	ppobj_OneTab=(COneTab **)realloc(ppobj_OneTab,(iTabNum+1)*sizeof(COneTab));
+
+	//ローテーション
+	int i;
+	for(i=iTabNum-1;i>=0;i--){
+		ppobj_OneTab[i+1]=ppobj_OneTab[i];
+	}
+
+	ppobj_OneTab[0]=pobj_temp_OneTab;
+	iTabNum++;
+
+	if(iTabNum==10){
+		//古いアイテムを破棄
+		delete ppobj_OneTab[iTabNum-1];
+		iTabNum--;
+	}
+
+	int offset=0;
+	for(i=0;i<iTabNum;i++){
+		offset+=ppobj_OneTab[i]->iWindowWidth;
+	}
+	for(i=iTabNum-1;i>=0;i--){
+		offset-=ppobj_OneTab[i]->iWindowWidth;
+		MoveWindow(ppobj_OneTab[i]->hTabWnd,
+			offset,
+			0,
+			ppobj_OneTab[i]->iWindowWidth,
+			20,
+			1);
+	}
+}
+BOOL CWebResult::DuplicateCheck(char *str){
+	int i;
+	for(i=0;i<iTabNum;i++){
+		if(lstrcmpi(ppobj_OneTab[i]->lpszString,str)==0){
+			return 1;
+		}
+	}
+	return 0;
+}
+
+
+
+BOOL bSearchingWeb;
+char *lpszRetrySearchStr;
+void WebSearchThread(void *temp_str){
+	char *str;
+	str=(char *)malloc(lstrlen((char *)temp_str)+1);
+	lstrcpy(str,(char *)temp_str);
+	HeapDefaultFree(temp_str);
+
+	int WndNum;
+	WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+	if(bSearchingWeb){
+		if(lpszRetrySearchStr) free(lpszRetrySearchStr);
+		lpszRetrySearchStr=str;
+
+		_endthread();
+		return;
+	}
+	bSearchingWeb=1;
+
+
+wait_repeat:
+	Sleep(500);
+	if(lpszRetrySearchStr){
+		free(str);
+
+		str=lpszRetrySearchStr;
+		lpszRetrySearchStr=0;
+		goto wait_repeat;
+	}
+
+
+	if(WndNum==-1){
+		goto exit;
+	}
+	if(MdiInfo[WndNum]->pMdiTextEdit==0){
+		goto exit;
+	}
+
+	//重複チェック
+	if(MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult->DuplicateCheck(str)){
+		goto exit;
+	}
+
+
+
+	MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult->add(WndNum,str);
+
+exit:
+	bSearchingWeb=0;
+
+	free(str);
+
+
+	if(lpszRetrySearchStr){
+		str=lpszRetrySearchStr;
+		lpszRetrySearchStr=0;
+		goto wait_repeat;
+	}
+
+
+	_endthread();
+}
+
+
+
+
+////////////////////////////
+// 以下、SideWeb
+////////////////////////////
+
+BEGIN_OBJECT_MAP(ObjectMap)
+END_OBJECT_MAP()
+
+HWND hNowIEWnd;
+LRESULT CALLBACK SideWebProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+	CComQIPtr<IWebBrowser2>	pWB2 ;
+
+	switch (iMsg)
+	{
+		case WM_CREATE :
+		{
+			AtlAxWinInit();
+			hNowIEWnd = CreateWindow("AtlAxWin", "Shell.Explorer.2", WS_CHILD|WS_VISIBLE, 0,0,0,0, 
+						hwnd, (HMENU)0, hInst, NULL);
+			if(!hNowIEWnd){
+				MessageBox(hOwner,"IEコンポーネントの生成に失敗しました","lockey_browser",MB_OK|MB_ICONEXCLAMATION);
+				PostQuitMessage(0);
+				return 0;
+			}
+
+			// ActiveXコントロールのインターフェースを要求
+			CComPtr<IUnknown>	 punkIE;
+			if (AtlAxGetControl(hNowIEWnd, &punkIE) == S_OK)
+			{
+				// IUnknownポインタからIWebBrowser2ポインタへキャスト
+				pWB2 = punkIE;
+
+				if(pWB2)
+				{
+					// シンクオブジェクトの作成
+					CComObject<CIESink>* sink;
+					CComObject<CIESink>::CreateInstance(&sink);
+
+					// イベントをDispatchするよう、IEコントロールにお願い
+					HRESULT hr = sink->AdviseToIE(punkIE);
+					if(SUCCEEDED(hr))
+					{
+						//成功
+						return 0;
+					}
+				}
+
+				MessageBox(hOwner,"IEコンポーネントの生成に失敗しました","ProjectEditor",MB_OK|MB_ICONEXCLAMATION);
+				PostQuitMessage(0);
+				return 0;
+			}
+
+			return 0 ;
+		}
+
+		case WM_SIZE :
+			MoveWindow(GetWindow(hwnd,GW_CHILD), 0, 0, LOWORD(lParam), HIWORD(lParam), 1) ;
+			return 0 ;
+
+		case WM_KEYDOWN:
+		{
+			// ActiveXコントロールのインターフェースを要求
+			CComPtr<IUnknown>	 punkIE;
+			if (AtlAxGetControl(hNowIEWnd, &punkIE) == S_OK)
+			{
+				// IUnknownポインタからIWebBrowser2ポインタへキャスト
+				pWB2 = punkIE;
+
+				CComQIPtr<IOleInPlaceActiveObject, &IID_IOleInPlaceActiveObject> pIOIPAO(pWB2) ;
+
+				if(pIOIPAO)
+				{
+					MSG msg;
+					msg.message = iMsg;
+					msg.wParam = wParam;
+					msg.lParam = lParam;
+
+					pIOIPAO->TranslateAccelerator(&msg);
+				}
+ 
+				return 0 ;
+			}
+		}
+
+		case WM_BROWS_GO:
+
+			{
+				// ActiveXコントロールのインターフェースを要求
+				CComPtr<IUnknown>	 punkIE;
+				if (AtlAxGetControl(hNowIEWnd, &punkIE) == S_OK)
+				{
+					// IUnknownポインタからIWebBrowser2ポインタへキャスト
+					pWB2 = punkIE;
+
+					// URLへ移動
+					CComVariant vempty, vUrl((char *)lParam);
+					pWB2->Navigate2 (&vUrl, &vempty, &vempty, &vempty, &vempty );
+				}
+			}
+
+			return 0;
+
+		case WM_BROWS_DESTROY:
+			DestroyWindow(hwnd);
+			return 0;
+
+		case WM_DESTROY :
+			{
+				// ActiveXコントロールのインターフェースを要求
+				CComPtr<IUnknown>	 punkIE;
+				if (AtlAxGetControl(hNowIEWnd, &punkIE) == S_OK)
+				{
+					// IUnknownポインタからIWebBrowser2ポインタへキャスト
+					pWB2 = punkIE;
+
+					pWB2.Release();
+				}
+
+			}
+			return 0 ;
+	}
+
+	return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
+}
+
+CChildSideWeb::CChildSideWeb(HWND hParent,HWND hTab,char *title,char *site){
+	hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,"SideWeb","SideWeb",
+		WS_CHILD|WS_CLIPCHILDREN,
+		0,0,0,0,
+		hParent,0,hInst,0);
+	hIEWnd=hNowIEWnd;
+
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+
+	tcItem.pszText=title;
+	TabCtrl_InsertItem(hTab,SendMessage(hTab,TCM_GETITEMCOUNT,0,0),&tcItem);
+
+	//タイトル
+	lpszTitle=(char *)malloc(lstrlen(title)+1);
+	lstrcpy(lpszTitle,title);
+
+	//サイト
+	lpszSite=(char *)malloc(lstrlen(site)+1);
+	lstrcpy(lpszSite,site);
+}
+CChildSideWeb::~CChildSideWeb(){
+	free(lpszTitle);
+	free(lpszSite);
+	DestroyWindow(hwnd);
+}
+
+
+CSideWeb *pobj_SideWeb=0;
+
+CSideWeb::CSideWeb(HWND hParent){
+	lpszNowUrl=0;
+	bShow=0;
+/*
+	TODO: ここをしっかりしないと動きませーん
+	extern CComModule _Module;
+	_Module.Init(ObjectMap, hInst);
+*/
+
+	//タブを生成
+	extern HFONT hStatusFont;
+	hTab=CreateWindowEx(0,WC_TABCONTROL,NULL,
+		WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE,
+		0,0,0,0,
+		hParent,0,hInst,0);
+	SendMessage(hTab,WM_SETFONT,(long)hStatusFont,0);
+
+	//→ボタンを生成
+	hRightButton=CreateWindow("BUTTON","→",WS_CHILD|WS_VISIBLE,
+		0,0,20,13,
+		hParent,(HMENU)IDC_CLIP,hInst,0);
+	SendMessage(hRightButton,WM_SETFONT,(long)hStatusFont,0);
+
+
+	iChildSideWebNum=pobj_nv->pobj_DBDomain->iDomainNum+1;
+	ppobj_ChildSideWeb=(CChildSideWeb **)malloc(iChildSideWebNum*sizeof(CChildSideWeb *));
+	ppobj_ChildSideWeb[0]=new CChildSideWeb(hParent,hTab,"全般","");
+	int i;
+	for(i=0;i<pobj_nv->pobj_DBDomain->iDomainNum;i++){
+		ppobj_ChildSideWeb[i+1]=new CChildSideWeb(hParent,hTab,
+			pobj_nv->pobj_DBDomain->ppobj_Domain[i]->lpszName,
+			pobj_nv->pobj_DBDomain->ppobj_Domain[i]->lpszDomain);
+	}
+
+
+	TabCtrl_SetCurSel(hTab,0);
+	ShowWindow(ppobj_ChildSideWeb[0]->hwnd,SW_SHOW);
+	hNowIEWnd=ppobj_ChildSideWeb[0]->hIEWnd;
+}
+CSideWeb::~CSideWeb(){
+	int i;
+	for(i=0;i<iChildSideWebNum;i++){
+		delete ppobj_ChildSideWeb[i];
+	}
+	free(ppobj_ChildSideWeb);
+	ppobj_ChildSideWeb=0;
+
+	if(lpszNowUrl) free(lpszNowUrl);
+
+	DestroyWindow(hTab);
+	DestroyWindow(hRightButton);
+}
+void CSideWeb::resize(int x,int y,int cx,int cy){
+	int iTabHeight=25;
+
+	MoveWindow(hTab,x,y,cx-30,iTabHeight,1);
+
+	SetWindowPos(hRightButton,NULL,x+cx-25,y+7,0,0,SWP_NOSIZE);
+
+	int i;
+	for(i=0;i<iChildSideWebNum;i++){
+		MoveWindow(ppobj_ChildSideWeb[i]->hwnd,x,y+iTabHeight,cx,cy-iTabHeight,1);
+	}
+
+	m_Rect.left=x;
+	m_Rect.top=y;
+	m_Rect.right=x+cx;
+	m_Rect.bottom=y+cy;
+}
+
+void CSideWeb::GoPage(char *lpszUrl){
+	char *pTemp;
+	pTemp=(char *)malloc(lstrlen(lpszUrl)+1);
+	lstrcpy(pTemp,lpszUrl);
+
+	if(lpszNowUrl) free(lpszNowUrl);
+	lpszNowUrl=pTemp;
+
+	int iTabPos;
+	iTabPos=SendMessage(hTab,TCM_GETCURSEL,0,0);
+
+
+	pTemp=(char *)malloc(lstrlen(lpszNowUrl)+1024);
+	if(ppobj_ChildSideWeb[iTabPos]->lpszSite[0])
+		sprintf(pTemp,"%s&site=%s",lpszNowUrl,ppobj_ChildSideWeb[iTabPos]->lpszSite);
+	else lstrcpy(pTemp,lpszNowUrl);
+
+	SendMessage(ppobj_ChildSideWeb[iTabPos]->hwnd,WM_BROWS_GO,0,(LPARAM)pTemp);
+
+	free(pTemp);
+
+	bShow=1;
+	ActiveBasic::IDE::Program::mainFrame.Resized();	
+}
+
+void CSideWeb::SelChangeEvent(){
+	char temporary[MAX_PATH];
+
+	int i;
+	i=TabCtrl_GetCurSel(hTab);
+
+	TC_ITEM tcItem;
+	tcItem.mask=TCIF_TEXT;
+	tcItem.pszText=temporary;
+	tcItem.cchTextMax=MAX_PATH;
+	TabCtrl_GetItem(hTab,i,&tcItem);
+
+	for(i=0;i<iChildSideWebNum;i++){
+		ShowWindow(ppobj_ChildSideWeb[i]->hwnd,SW_HIDE);
+	}
+
+	for(i=0;i<iChildSideWebNum;i++){
+		if(lstrcmpi(temporary,ppobj_ChildSideWeb[i]->lpszTitle)==0){
+			ShowWindow(ppobj_ChildSideWeb[i]->hwnd,SW_SHOW);
+			hNowIEWnd=ppobj_ChildSideWeb[i]->hIEWnd;
+			GoPage(lpszNowUrl);
+			break;
+		}
+	}
+}
+
+void CSideWeb::GetRect(RECT *prc){
+	*prc=m_Rect;
+}
+
+
+
+
+
+CWebStrings obj_WebStrings;
+
+CWebStrings::CWebStrings(){
+	buffer=(char *)malloc(1);
+	buffer[0]=0;
+
+	ppStr=(char **)malloc(1);
+	iStrNum=0;
+}
+CWebStrings::~CWebStrings(){
+	free(buffer);
+
+	int i;
+	for(i=0;i<iStrNum;i++){
+		free(ppStr[i]);
+	}
+	free(ppStr);
+}
+
+void CWebStrings::add(char *query){
+	//重複チェック
+	int i;
+	for(i=0;i<iStrNum;i++){
+		if(lstrcmpi(ppStr[i],query)==0){
+			return;
+		}
+	}
+
+	ppStr=(char **)realloc(ppStr,(iStrNum+1)*sizeof(char *));
+	ppStr[iStrNum]=(char *)malloc(lstrlen(query)+1);
+	lstrcpy(ppStr[iStrNum],query);
+	iStrNum++;
+}
+
+void CWebStrings::clear(){
+	buffer[0]=0;
+
+	int i;
+	for(i=0;i<iStrNum;i++){
+		free(ppStr[i]);
+	}
+	iStrNum=0;
+}
+
+char *CWebStrings::GetBuffer(){
+	buffer[0]=0;
+	int i;
+	for(i=0;i<iStrNum;i++){
+		buffer=(char *)realloc(buffer,lstrlen(buffer)+lstrlen(ppStr[i])+2);
+		if(i) lstrcat(buffer," ");
+		lstrcat(buffer,ppStr[i]);
+	}
+	return buffer;
+}
+
+
+
+//////////////////////////
+// Web検索用ドメイン管理
+//////////////////////////
+
+CDomain::CDomain(char *name,char *domain){
+	//表示名
+	lpszName=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);
+	lstrcpy(lpszName,name);
+
+	//ドメイン
+	lpszDomain=(char *)HeapAlloc(hHeap,0,lstrlen(domain)+1);
+	lstrcpy(lpszDomain,domain);
+}
+CDomain::~CDomain(){
+	HeapDefaultFree(lpszName);
+	HeapDefaultFree(lpszDomain);
+}
+
+
+void CDBDomain::init(){
+	int i;
+	for(i=0;i<iDomainNum;i++){
+		delete ppobj_Domain[i];
+	}
+	iDomainNum=0;
+}
+CDBDomain::CDBDomain(){
+	ppobj_Domain=(CDomain **)HeapAlloc(hHeap,0,1);
+	iDomainNum=0;
+
+	m_hListView=0;
+}
+CDBDomain::~CDBDomain(){
+	init();
+	HeapDefaultFree(ppobj_Domain);
+}
+
+void CDBDomain::load(){
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+	sprintf(temporary,"%sUserSetting\\domain.ini",pj_editor_Dir);
+
+	char *buffer;
+	buffer=ReadBuffer_NonErrMsg(temporary);
+	if(buffer){
+		int i;
+		i=0;
+		while(buffer[i]){
+			//表示名
+			i=GetOneParameter(buffer,i,temporary);
+			if(temporary[0]=='\0') break;
+
+			//ドメイン
+			i=GetOneParameter(buffer,i,temp2);
+			if(temp2[0]=='\0') break;
+
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+				i+=2;
+			}
+
+			add(temporary,temp2);
+		}
+		HeapDefaultFree(buffer);
+	}
+	else{
+		add("辞書","ja.wikipedia.org");
+		add("MSDN","msdn.microsoft.com");
+	}
+}
+void CDBDomain::save(){
+	char temporary[MAX_PATH];
+	sprintf(temporary,"%sUserSetting\\domain.ini",pj_editor_Dir);
+
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,iDomainNum*MAX_PATH*2+1);
+	buffer[0]=0;
+
+	int i;
+	for(i=0;i<iDomainNum;i++){
+		sprintf(buffer+lstrlen(buffer),"%s,%s\r\n",ppobj_Domain[i]->lpszName,ppobj_Domain[i]->lpszDomain);
+	}
+
+	WriteBuffer(temporary,buffer,lstrlen(buffer));
+
+	HeapDefaultFree(buffer);
+}
+
+void CDBDomain::copy_get(CDBDomain *pobj_DBDomain){
+	init();
+
+	int i;
+	for(i=0;i<pobj_DBDomain->iDomainNum;i++){
+		add(pobj_DBDomain->ppobj_Domain[i]->lpszName,pobj_DBDomain->ppobj_Domain[i]->lpszDomain);
+	}
+}
+
+void CDBDomain::SetListView(HWND hListView){
+	m_hListView=hListView;
+
+	int i;
+	for(i=0;i<iDomainNum;i++){
+		LV_ITEM item;
+
+		item.mask=LVIF_TEXT;
+		item.pszText=ppobj_Domain[i]->lpszName;
+		item.iItem=i;
+		item.iSubItem=0;
+		ListView_InsertItem(m_hListView,&item);
+
+		item.pszText=ppobj_Domain[i]->lpszDomain;
+		item.iItem=i;
+		item.iSubItem++;
+		ListView_SetItem(m_hListView,&item);
+	}
+}
+
+void CDBDomain::add(char *name,char *domain){
+	ppobj_Domain=(CDomain **)HeapReAlloc(hHeap,0,ppobj_Domain,(iDomainNum+1)*sizeof(CDomain *));
+	ppobj_Domain[iDomainNum]=new CDomain(name,domain);
+	iDomainNum++;
+
+
+	if(m_hListView){
+		int i;
+		i=ListView_GetItemCount(m_hListView);
+
+		//リストビューに追加
+		LV_ITEM item;
+		item.mask=LVIF_TEXT;
+		item.pszText=name;
+		item.iItem=i;
+		item.iSubItem=0;
+		ListView_InsertItem(m_hListView,&item);
+
+		item.pszText=domain;
+		item.iItem=i;
+		item.iSubItem++;
+		ListView_SetItem(m_hListView,&item);
+	}
+}
+void CDBDomain::del(char *name){
+	int i;
+	for(i=0;i<iDomainNum;i++){
+		if(lstrcmp(ppobj_Domain[i]->lpszName,name)==0) break;
+	}
+	if(i==iDomainNum) return;
+
+	if(m_hListView){
+		//リストビューから削除
+		ListView_DeleteItem(m_hListView,i);
+	}
+
+	delete ppobj_Domain[i];
+	iDomainNum--;
+	for(;i<iDomainNum;i++){
+		ppobj_Domain[i]=ppobj_Domain[i+1];
+	}
+}
+void CDBDomain::change(char *szBeforeName,char *name,char *domain){
+	int i;
+	for(i=0;i<iDomainNum;i++){
+		if(lstrcmp(ppobj_Domain[i]->lpszName,szBeforeName)==0) break;
+	}
+	if(i==iDomainNum) return;
+
+	ppobj_Domain[i]->lpszName=(char *)HeapReAlloc(hHeap,0,ppobj_Domain[i]->lpszName,lstrlen(name)+1);
+	lstrcpy(ppobj_Domain[i]->lpszName,name);
+
+	ppobj_Domain[i]->lpszDomain=(char *)HeapReAlloc(hHeap,0,ppobj_Domain[i]->lpszDomain,lstrlen(domain)+1);
+	lstrcpy(ppobj_Domain[i]->lpszDomain,domain);
+
+
+	if(m_hListView){
+		//リストビューの設定
+		ListView_SetItemText(m_hListView,i,0,name);
+		ListView_SetItemText(m_hListView,i,1,domain);
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/WebSearch.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/WebSearch.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/WebSearch.h	(revision 774)
@@ -0,0 +1,145 @@
+
+#define LINK_ITEM_HEIGHT 20
+
+LRESULT CALLBACK ResultListProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK OneTabProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+LRESULT CALLBACK WebResultWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+class COneTab;
+
+class CResultList{
+public:
+	HWND hwnd;
+	int iAnimeCount;
+	COneTab *pobj_OneTab;
+
+	CResultList(COneTab *pobj_OneTab);
+	~CResultList();
+};
+
+class COneTab{
+	int m_WndNum;
+
+public:
+	HWND hTabWnd;
+	CResultList *pobj_ResultList;
+
+	int iWindowWidth;
+
+	char *lpszString;
+	char *lpszTitle[10];
+	char *lpszUrl[10];
+
+	COneTab(int WndNum,char *str);
+	~COneTab();
+
+	void WebSearch();
+};
+
+class CWebResult{
+
+	COneTab **ppobj_OneTab;
+	int iTabNum;
+
+public:
+	HWND hwnd;
+	CWebResult(HWND hParent);
+	~CWebResult();
+
+	void resize(int x,int y,int cx,int cy);
+
+	void add(int WndNum,char *lpszSearchText);
+
+	BOOL DuplicateCheck(char *str);
+};
+
+void WebSearchThread(void *temp_str);
+
+
+
+
+LRESULT CALLBACK SideWebProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+
+class CChildSideWeb{
+public:
+	HWND hwnd;
+	HWND hIEWnd;
+	char *lpszTitle;
+	char *lpszSite;
+
+	CChildSideWeb(HWND hParent,HWND hTab,char *title,char *site);
+	~CChildSideWeb();
+
+	void resize(int x,int y,int cx,int cy);
+};
+
+class CSideWeb{
+
+	CChildSideWeb **ppobj_ChildSideWeb;
+	int iChildSideWebNum;
+
+	char *lpszNowUrl;
+
+	RECT m_Rect;
+
+	HWND hRightButton;
+
+public:
+	HWND hTab;
+	BOOL bShow;
+	CSideWeb(HWND hParent);
+	~CSideWeb();
+	void resize(int x,int y,int cx,int cy);
+
+	void GoPage(char *lpszUrl);
+
+	void SelChangeEvent();
+
+	void GetRect(RECT *prc);
+};
+extern CSideWeb *pobj_SideWeb;
+
+class CWebStrings{
+	char *buffer;
+	char **ppStr;
+	char iStrNum;
+public:
+	CWebStrings();
+	~CWebStrings();
+
+	void add(char *query);
+	void clear();
+
+	char *GetBuffer();
+};
+extern CWebStrings obj_WebStrings;
+
+
+class CDomain{
+public:
+	char *lpszName;
+	char *lpszDomain;
+	CDomain(char *name,char *domain);
+	~CDomain();
+};
+class CDBDomain{
+	HWND m_hListView;
+
+	void init();
+public:
+	CDomain **ppobj_Domain;
+	int iDomainNum;
+
+	CDBDomain();
+	~CDBDomain();
+
+	void load();
+	void save();
+	void copy_get(CDBDomain *pobj_DBDomain);
+
+	void SetListView(HWND hListView);
+
+	void add(char *name,char *domain);
+	void del(char *name);
+	void change(char *szBeforeName,char *name,char *domain);
+};
Index: branches/egtra/ab5.0/abdev/abdev/WindowControl.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/WindowControl.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/WindowControl.cpp	(revision 774)
@@ -0,0 +1,2321 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+using namespace ActiveBasic::IDE;
+
+#if defined(JPN)
+//日本語
+#include "pj_msg_jpn.h"
+#else
+//英語
+#include "pj_msg_eng.h"
+#endif
+
+int GetWndInfoNum( const std::string &name )
+{
+	for( int i=0;i<static_cast<int>(projectInfo.windowInfos.size());i++){
+		if(lstrcmpi(name.c_str(),projectInfo.windowInfos[i]->GetName().c_str())==0) return i;
+	}
+	return -1;
+}
+ActiveBasic::PM::WindowInfo *GetWndInfo( const std::string &name )
+{
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if(lstrcmpi(name.c_str(),pWindowInfo->GetName().c_str())==0) return pWindowInfo;
+	}
+	return NULL;
+}
+void ChangeDivisionToOrSign(char *CopyBuffer,const char *ReadBuffer){
+	int i,i2;
+	for(i=0,i2=0;;i++,i2++){
+		if(ReadBuffer[i]=='|'){
+			CopyBuffer[i2]=0;
+			lstrcpy(CopyBuffer+i2," or ");
+			i2+=3;
+			continue;
+		}
+		CopyBuffer[i2]=ReadBuffer[i];
+		if(ReadBuffer[i]=='\0') break;
+	}
+}
+void ChangeOrSignToDivision(char *CopyBuffer,const char *ReadBuffer){
+	int i,i2,IsStr;
+	for(i=0,i2=0,IsStr=0;;i++,i2++){
+		if(ReadBuffer[i]=='\"') IsStr^=1;
+		if(ReadBuffer[i]=='\0'){
+			CopyBuffer[i2]=0;
+			break;
+		}
+		if(ReadBuffer[i+3]=='\0'){
+			memcpy(CopyBuffer+i2,ReadBuffer+i,3);
+			CopyBuffer[i2+3]=0;
+			break;
+		}
+		if((ReadBuffer[i]==' '||ReadBuffer[i]=='\t')&&
+			(ReadBuffer[i+1]=='O'||ReadBuffer[i+1]=='o')&&(ReadBuffer[i+2]=='R'||ReadBuffer[i+2]=='r')&&
+			(ReadBuffer[i+3]==' '||ReadBuffer[i+3]=='\t')&&IsStr==0){
+			CopyBuffer[i2]='|';
+			i+=3;
+			continue;
+		}
+		CopyBuffer[i2]=ReadBuffer[i];
+	}
+}
+
+HGLOBAL Rad_GetChildInfoClipboardData(int WndNum,int WndInfoNum){
+	//ChildWindowInfo構造体をクリップボード用データ（pByteが示すバッファ）に変換する
+	HGLOBAL hGlobal;
+	BYTE *pByte;
+	int i2,i3,MemSize;
+
+	for(i3=0;;i3++){
+		if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i3]==-1) break;
+	}
+	
+
+	hGlobal=GlobalAlloc(GMEM_MOVEABLE,sizeof(int));
+	pByte=(BYTE *)GlobalLock(hGlobal);
+	*((int *)pByte)=i3;
+	GlobalUnlock(hGlobal);
+	i2=sizeof(int);
+
+	MemSize=i2;
+
+	for(i3--;i3>=0;i3--){
+		ActiveBasic::PM::ChildWindowInfo *pChildInfo = projectInfo.windowInfos[WndInfoNum]->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i3]];
+
+		MemSize+=pChildInfo->GetName().size()+1+
+			sizeof(POINT)+
+			sizeof(SIZE)+
+			pChildInfo->GetCaption().size()+1+
+			sizeof(DWORD)+
+			sizeof(DWORD)+
+			sizeof(int)+
+			sizeof(int)+
+			pChildInfo->image.path.size()+1;
+
+		hGlobal=GlobalReAlloc(hGlobal,MemSize,0);
+		pByte=(BYTE *)GlobalLock(hGlobal);
+
+		lstrcpy((char *)pByte+i2,pChildInfo->GetName().c_str());
+		i2+=pChildInfo->GetName().size()+1;
+
+		memcpy(pByte+i2,&pChildInfo->pos,sizeof(POINT));
+		i2+=sizeof(POINT);
+
+		memcpy(pByte+i2,&pChildInfo->size,sizeof(SIZE));
+		i2+=sizeof(SIZE);
+
+		lstrcpy((char *)pByte+i2,pChildInfo->GetCaption().c_str());
+		i2+=pChildInfo->GetCaption().size()+1;
+
+		*(DWORD *)(pByte+i2) = pChildInfo->GetStyle();
+		i2+=sizeof(DWORD);
+
+		*(DWORD *)(pByte+i2) = pChildInfo->GetExStyle();
+		i2+=sizeof(DWORD);
+
+		memcpy(pByte+i2,&pChildInfo->Control,sizeof(int));
+		i2+=sizeof(int);
+
+		memcpy(pByte+i2,&pChildInfo->image.type,sizeof(int));
+		i2+=sizeof(int);
+
+		if( pChildInfo->image.path.empty() )
+		{
+			lstrcpy((char *)pByte+i2,"");
+			i2++;
+		}
+		else{
+			lstrcpy((char *)pByte+i2,pChildInfo->image.path.c_str());
+			i2+=pChildInfo->image.path.size()+1;
+		}
+
+		GlobalUnlock(hGlobal);
+	}
+
+	return hGlobal;
+}
+void Rad_PasteChildInfoClipboardData(int WndNum,HGLOBAL hGlobal){
+	//hGlobalに格納されているクリップボードデータをRAD画面に挿入する
+	BYTE *pByte;
+	int i2,i3,WndInfoNum;
+	ActiveBasic::PM::ChildWindowInfo ChildInfo;
+
+	for(i2=1;i2<MAX_RAD_SELITEM;i2++) MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i2]=-1;
+
+	WndInfoNum=GetWndInfoNum(MdiInfo[WndNum]->path);
+	pByte=(BYTE *)GlobalLock(hGlobal);
+	i3=*((int *)pByte);
+	i2=sizeof(int);
+
+	for(i3--;i3>=0;i3--){
+		//IdNameメンバは変更される可能性がある
+		ChildInfo.SetName( (char *)pByte+i2 );
+		i2 += ChildInfo.GetName().size()+1;
+
+		memcpy(&ChildInfo.pos,pByte+i2,sizeof(POINT));
+		i2+=sizeof(POINT);
+
+		memcpy(&ChildInfo.size,pByte+i2,sizeof(SIZE));
+		i2+=sizeof(SIZE);
+
+		ChildInfo.SetCaption( (char *)pByte+i2 );
+		i2+=ChildInfo.GetCaption().size()+1;
+
+		ChildInfo.SetStyle( *(DWORD *)(pByte+i2) );
+		i2+=sizeof(DWORD);
+
+		ChildInfo.SetExStyle( *(DWORD *)(pByte+i2) );
+		i2+=sizeof(DWORD);
+
+		memcpy(&ChildInfo.Control,pByte+i2,sizeof(int));
+		i2+=sizeof(int);
+
+		memcpy(&ChildInfo.image.type,pByte+i2,sizeof(int));
+		i2+=sizeof(int);
+
+		ChildInfo.image.path = (char *)pByte+i2;
+		i2+=ChildInfo.image.path.size()+1;
+
+		ChildInfo.pos.x+=17;
+		ChildInfo.pos.y+=10;
+
+		MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i3]=InsertDlgItem(WndNum,
+			WndInfoNum,
+			-1,
+			&ChildInfo.pos,
+			&ChildInfo.size,
+			ChildInfo.GetName().c_str(),
+			ChildInfo.GetCaption().c_str(),
+			ChildInfo.GetStyle(),
+			ChildInfo.GetExStyle(),
+			ChildInfo.Control,
+			ChildInfo.image.type,
+			ChildInfo.image.path.c_str(),
+			2);
+	}
+
+	GlobalUnlock(hGlobal);
+
+	ChangePropertyWindow(WndNum,WndInfoNum);
+}
+
+char *FormatCaption(const char *caption){
+	extern HANDLE hHeap;
+	int i2,i3,BufSize;
+	char *buffer;
+
+	BufSize=256*2;
+	buffer=(char *)HeapAlloc(hHeap,0,BufSize);
+	for(i2=0,i3=0;;i2++,i3++){
+		if(i2+256>=BufSize){
+			BufSize+=256;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+		}
+		if(caption[i3]=='\"'){
+			lstrcpy(buffer+i2,"\"+Chr$(34)+\"");
+			i2+=lstrlen(buffer+i2);
+			i2--;
+			continue;
+		}
+		buffer[i2]=caption[i3];
+		if(caption[i3]=='\0') break;
+	}
+
+	return buffer;
+}
+char *SetCaptionSequence(const char *caption){
+	extern HANDLE hHeap;
+	int i2,i3,BufSize;
+	char *buffer;
+
+	BufSize=256*2;
+	buffer=(char *)HeapAlloc(hHeap,0,BufSize);
+	for(i2=0,i3=0;;i2++,i3++){
+		if(i2+256>=BufSize){
+			BufSize+=256;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,BufSize);
+		}
+		buffer[i2]=caption[i3];
+		if(caption[i3]=='\"'){
+			buffer[i2++]='\\';
+			buffer[i2]='1';
+		}
+		else if(caption[i3]=='\\'){
+			buffer[i2++]='\\';
+			buffer[i2]='\\';
+		}
+		else if(caption[i3]=='\0') break;
+	}
+
+	return buffer;
+}
+void RestoreCaptionSequence(char *caption){
+	int i2,i3;
+
+	for(i2=0,i3=0;;i2++,i3++){
+		caption[i2]=caption[i3];
+		if(caption[i3]=='\\'){
+			i3++;
+			if(caption[i3]=='1') caption[i2]='\"';
+			else caption[i2]=caption[i3];
+		}
+		else if(caption[i3]=='\0') break;
+	}
+}
+
+//テンプレートソースファイルに値をセットする
+char *PermutationWndPgmTemplate(char *pBuf,const char *pPjName, char *pWndName, char *pHandleName, char *pProcName){
+	extern HANDLE hHeap;
+	int i,i2;
+
+	for(i=0;;i++){
+		if(pBuf[i]=='\0') break;
+		if(memicmp(pBuf+i,"#name#",6)==0){
+			//プロジェクト名を置換
+			i2=lstrlen(pPjName);
+			if(i2>6) pBuf=(char *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pBuf,lstrlen(pBuf)+(i2-6)+1);
+			SlideString(pBuf+i+6,i2-6);
+			memcpy(pBuf+i,pPjName,i2);
+		}
+		if(memicmp(pBuf+i,"#window#",8)==0){
+			//ウィンドウ名を置換
+			i2=lstrlen(pWndName);
+			if(i2>6) pBuf=(char *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pBuf,lstrlen(pBuf)+(i2-8)+1);
+			SlideString(pBuf+i+8,i2-8);
+			memcpy(pBuf+i,pWndName,i2);
+		}
+		if(memicmp(pBuf+i,"#handle#",8)==0){
+			//ハンドル名を置換
+			i2=lstrlen(pHandleName);
+			if(i2>6) pBuf=(char *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pBuf,lstrlen(pBuf)+(i2-8)+1);
+			SlideString(pBuf+i+8,i2-8);
+			memcpy(pBuf+i,pHandleName,i2);
+		}
+		if(memicmp(pBuf+i,"#procedure#",11)==0){
+			//プロシージャ名を置換
+			i2=lstrlen(pProcName);
+			if(i2>6) pBuf=(char *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pBuf,lstrlen(pBuf)+(i2-11)+1);
+			SlideString(pBuf+i+11,i2-11);
+			memcpy(pBuf+i,pProcName,i2);
+		}
+	}
+
+	return pBuf;
+}
+const std::string PermutationWndPgmTemplate( const std::string &templateFilePath, const std::string &projectName, const std::string &windowName, const std::string &handleName, const std::string &procName )
+{
+	Jenga::Common::SourceTemplate sourceTemplate( templateFilePath );
+	Jenga::Common::SourceTemplate::Values values;
+
+	values.Insert( "#name#", projectName );
+	values.Insert( "#window#", windowName );
+	values.Insert( "#handle#", handleName );
+	values.Insert( "#procedure#", procName );
+
+	return sourceTemplate.GetResult( values );
+}
+
+BOOL GetItemNotifyMessageNameByEvent(char *buffer,int ClassID,const char *EventName){
+	if(lstrcmp(EventName,"Click")==0) lstrcpy(buffer,"NM_CLICK");
+	else if(lstrcmp(EventName,"CustomDraw")==0) lstrcpy(buffer,"NM_CUSTOMDRAW");
+	else if(lstrcmp(EventName,"DblClick")==0) lstrcpy(buffer,"NM_DBLCLK");
+	else if(lstrcmp(EventName,"KillFocus")==0) lstrcpy(buffer,"NM_KILLFOCUS");
+	else if(lstrcmp(EventName,"OutOfMemory")==0) lstrcpy(buffer,"NM_OUTOFMEMORY");
+	else if(lstrcmp(EventName,"RClick")==0) lstrcpy(buffer,"NM_RCLICK");
+	else if(lstrcmp(EventName,"RDblClick")==0) lstrcpy(buffer,"NM_RDBLCLK");
+	else if(lstrcmp(EventName,"ReleasedCapture")==0) lstrcpy(buffer,"NM_RELEASEDCAPTURE");
+	else if(lstrcmp(EventName,"Return")==0) lstrcpy(buffer,"NM_RETURN");
+	else if(lstrcmp(EventName,"SetFocus")==0) lstrcpy(buffer,"NM_SETFOCUS");
+	else{
+		if(ClassID==CT_LISTVIEW){
+			if(lstrcmp(EventName,"BeginDrag")==0) lstrcpy(buffer,"LVN_BEGINDRAG");
+			else if(lstrcmp(EventName,"BeginLabelEdit")==0) lstrcpy(buffer,"LVN_BEGINLABELEDIT");
+			else if(lstrcmp(EventName,"BeginRDrag")==0) lstrcpy(buffer,"LVN_BEGINRDRAG");
+			else if(lstrcmp(EventName,"ColumnClick")==0) lstrcpy(buffer,"LVN_COLUMNCLICK");
+			else if(lstrcmp(EventName,"DeleteAllItems")==0) lstrcpy(buffer,"LVN_DELETEALLITEMS");
+			else if(lstrcmp(EventName,"DeleteItem")==0) lstrcpy(buffer,"LVN_DELETEITEM");
+			else if(lstrcmp(EventName,"EndLabelEdit")==0) lstrcpy(buffer,"LVN_ENDLABELEDIT");
+			else if(lstrcmp(EventName,"GetDispInfo")==0) lstrcpy(buffer,"LVN_GETDISPINFO");
+			else if(lstrcmp(EventName,"InsertItem")==0) lstrcpy(buffer,"LVN_INSERTITEM");
+			else if(lstrcmp(EventName,"ItemChanged")==0) lstrcpy(buffer,"LVN_ITEMCHANGED");
+			else if(lstrcmp(EventName,"ItemChanging")==0) lstrcpy(buffer,"LVN_ITEMCHANGING");
+			else if(lstrcmp(EventName,"KeyDown")==0) lstrcpy(buffer,"LVN_KEYDOWN");
+			else if(lstrcmp(EventName,"SetDispInfo")==0) lstrcpy(buffer,"LVN_SETDISPINFO");
+			else return 0;
+		}
+		else if(ClassID==CT_UPDOWN){
+			if(lstrcmp(EventName,"Deltapos")==0) lstrcpy(buffer,"UDN_DELTAPOS");
+			else return 0;
+		}
+		else return 0;
+		//未完成
+	}
+	return 1;
+}
+BOOL GetNotifyCommandByItemMessage(ActiveBasic::PM::WindowInfo *pWindowInfo,ITEMEVENTINFO *pItemEventInfo,char *Command,char *spaces){
+	int i,i2,i3,sw;
+	char temporary[MAX_PATH];
+
+	i2=0;
+	sw=0;
+	for(i=0;;i++){
+		if(pItemEventInfo[i].IdName==0) break;
+		if(pItemEventInfo[i].ClassID==CT_LISTVIEW||
+			pItemEventInfo[i].ClassID==CT_TREEVIEW||
+			pItemEventInfo[i].ClassID==CT_UPDOWN||
+			pItemEventInfo[i].ClassID==CT_PROGRESSBAR||
+			pItemEventInfo[i].ClassID==CT_TRACKBAR){
+			//コモン コントロール（WM_NOTIFY）
+			sw=1;
+			sprintf(Command+i2,"%sCase %s\r\n",spaces,pItemEventInfo[i].IdName);
+			i2+=lstrlen(Command+i2);
+			sprintf(Command+i2,"%s\tSelect Case pnmHdr->code\r\n",spaces);
+			i2+=lstrlen(Command+i2);
+			for(i3=0;i3<pItemEventInfo[i].EventNum;i3++){
+				if(GetItemNotifyMessageNameByEvent(temporary,pItemEventInfo[i].ClassID,pItemEventInfo[i].pEventNames[i3])){
+					sprintf(Command+i2,"%s\t\tCase %s\r\n",spaces,temporary);
+					i2+=lstrlen(Command+i2);
+					sprintf(Command+i2,"%s\t\t\t%s_%s_%s(ByVal (pnmHdr As VoidPtr))\r\n",
+						spaces,
+						pWindowInfo->GetName().c_str(),
+						pItemEventInfo[i].IdName,pItemEventInfo[i].pEventNames[i3]
+					);
+					i2+=lstrlen(Command+i2);
+				}
+			}
+			sprintf(Command+i2,"%s\tEnd Select\r\n",spaces);
+			i2+=lstrlen(Command+i2);
+		}
+	}
+	return sw;
+}
+void GetItemMessageNameByEvent(char *buffer,int ClassID,const char *EventName){
+	if(ClassID==CT_BUTTON||
+		ClassID==CT_CHECKBOX||
+		ClassID==CT_RADIOBUTTON){
+		if(lstrcmp(EventName,"Click")==0) lstrcpy(buffer,"BN_CLICKED");
+		else if(lstrcmp(EventName,"DblClick")==0) lstrcpy(buffer,"BN_DBLCLK");
+	}
+	else if(ClassID==CT_COMBOBOX){
+		if(lstrcmp(EventName,"CloseUp")==0) lstrcpy(buffer,"CBN_CLOSEUP");
+		else if(lstrcmp(EventName,"DblClick")==0) lstrcpy(buffer,"CBN_DBLCLK");
+		else if(lstrcmp(EventName,"DropDown")==0) lstrcpy(buffer,"CBN_DROPDOWN");
+		else if(lstrcmp(EventName,"EditChange")==0) lstrcpy(buffer,"CBN_EDITCHANGE");
+		else if(lstrcmp(EventName,"EditUpdate")==0) lstrcpy(buffer,"CBN_EDITUPDATE");
+		else if(lstrcmp(EventName,"ErrSpace")==0) lstrcpy(buffer,"CBN_ERRSPACE");
+		else if(lstrcmp(EventName,"KillFocus")==0) lstrcpy(buffer,"CBN_KILLFOCUS");
+		else if(lstrcmp(EventName,"SelChange")==0) lstrcpy(buffer,"CBN_SELCHANGE");
+		else if(lstrcmp(EventName,"SelEndCancel")==0) lstrcpy(buffer,"CBN_SELENDCANCEL");
+		else if(lstrcmp(EventName,"SelEndOk")==0) lstrcpy(buffer,"CBN_SELENDOK");
+		else if(lstrcmp(EventName,"SetFocus")==0) lstrcpy(buffer,"CBN_SETFOCUS");
+	}
+	else if(ClassID==CT_EDIT){
+		if(lstrcmp(EventName,"Change")==0) lstrcpy(buffer,"EN_CHANGE");
+		else if(lstrcmp(EventName,"ErrSpace")==0) lstrcpy(buffer,"EN_ERRSPACE");
+		else if(lstrcmp(EventName,"HScroll")==0) lstrcpy(buffer,"EN_HSCROLL");
+		else if(lstrcmp(EventName,"KillFocus")==0) lstrcpy(buffer,"EN_KILLFOCUS");
+		else if(lstrcmp(EventName,"MaxText")==0) lstrcpy(buffer,"EN_MAXTEXT");
+		else if(lstrcmp(EventName,"SetFocus")==0) lstrcpy(buffer,"EN_SETFOCUS");
+		else if(lstrcmp(EventName,"Update")==0) lstrcpy(buffer,"EN_UPDATE");
+		else if(lstrcmp(EventName,"VScroll")==0) lstrcpy(buffer,"EN_VSCROLL");
+	}
+	else if(ClassID==CT_IMAGEBOX||
+		ClassID==CT_STATIC){
+		if(lstrcmp(EventName,"Click")==0) lstrcpy(buffer,"STN_CLICKED");
+		else if(lstrcmp(EventName,"DblClick")==0) lstrcpy(buffer,"STN_DBLCLK");
+	}
+	else if(ClassID==CT_LISTBOX){
+		if(lstrcmp(EventName,"SelChange")==0) lstrcpy(buffer,"LBN_SELCHANGE");
+		else if(lstrcmp(EventName,"DblClick")==0) lstrcpy(buffer,"LBN_DBLCLK");
+		else if(lstrcmp(EventName,"ErrSpace")==0) lstrcpy(buffer,"LBN_ERRSPACE");
+		else if(lstrcmp(EventName,"KillFocus")==0) lstrcpy(buffer,"LBN_KILLFOCUS");
+		else if(lstrcmp(EventName,"SelCancel")==0) lstrcpy(buffer,"LBN_SELCANCEL");
+		else if(lstrcmp(EventName,"SetFocus")==0) lstrcpy(buffer,"LBN_SETFOCUS");
+	}
+}
+void GetCommandByItemMessage(ActiveBasic::PM::WindowInfo *pWindowInfo,ITEMEVENTINFO *pItemEventInfo,char *Command,char *spaces){
+	extern HANDLE hHeap;
+	int i,i2,i3;
+	char temporary[MAX_PATH];
+
+	i2=0;
+	for(i=0;;i++){
+		if(pItemEventInfo[i].IdName==0) break;
+		if(pItemEventInfo[i].ClassID!=CT_LISTVIEW&&
+			pItemEventInfo[i].ClassID!=CT_PROGRESSBAR&&
+			pItemEventInfo[i].ClassID!=CT_TREEVIEW&&
+			pItemEventInfo[i].ClassID!=CT_TRACKBAR&&
+			pItemEventInfo[i].ClassID!=CT_UPDOWN
+			){
+			//WM_COMMAND
+			sprintf(Command+i2,"%sCase %s\r\n",spaces,pItemEventInfo[i].IdName);
+			i2+=lstrlen(Command+i2);
+			if(pItemEventInfo[i].ClassID==CT_MENU){
+				sprintf(Command+i2,"%s\t%s_%s_MenuClick()\r\n",spaces,pWindowInfo->GetName().c_str(),pItemEventInfo[i].IdName);
+				i2+=lstrlen(Command+i2);
+				for(i3=0;i3<pItemEventInfo[i].EventNum;i3++)
+					HeapDefaultFree(pItemEventInfo[i].pEventNames[i3]);
+			}
+			else{
+				sprintf(Command+i2,"%s\tSelect Case HIWORD(wParam)\r\n",spaces);
+				i2+=lstrlen(Command+i2);
+				for(i3=0;i3<pItemEventInfo[i].EventNum;i3++){
+					GetItemMessageNameByEvent(temporary,pItemEventInfo[i].ClassID,pItemEventInfo[i].pEventNames[i3]);
+					sprintf(Command+i2,"%s\t\tCase %s\r\n",spaces,temporary);
+					i2+=lstrlen(Command+i2);
+					sprintf(Command+i2,"%s\t\t\t%s_%s_%s()\r\n",spaces,pWindowInfo->GetName().c_str(),pItemEventInfo[i].IdName,pItemEventInfo[i].pEventNames[i3]);
+					i2+=lstrlen(Command+i2);
+					HeapDefaultFree(pItemEventInfo[i].pEventNames[i3]);
+				}
+				sprintf(Command+i2,"%s\tEnd Select\r\n",spaces);
+				i2+=lstrlen(Command+i2);
+			}
+			HeapDefaultFree(pItemEventInfo[i].IdName);
+			HeapDefaultFree(pItemEventInfo[i].pEventNames);
+		}
+		else{
+			//WM_NOTIFY情報のメモリ解放
+			for(i3=0;i3<pItemEventInfo[i].EventNum;i3++)
+				HeapDefaultFree(pItemEventInfo[i].pEventNames[i3]);
+			HeapDefaultFree(pItemEventInfo[i].IdName);
+			HeapDefaultFree(pItemEventInfo[i].pEventNames);
+		}
+	}
+}
+
+void GetItemClassName(char *buffer,int Control){
+	switch(Control){
+		case CT_BUTTON:
+		case CT_CHECKBOX:
+		case CT_GROUPBOX:
+		case CT_RADIOBUTTON:
+			lstrcpy(buffer,"BUTTON");
+			break;
+		case CT_COMBOBOX:
+			lstrcpy(buffer,"COMBOBOX");
+			break;
+		case CT_EDIT:
+			lstrcpy(buffer,"EDIT");
+			break;
+		case CT_HSCROLLBAR:
+		case CT_VSCROLLBAR:
+			lstrcpy(buffer,"SCROLLBAR");
+			break;
+		case CT_LISTBOX:
+			lstrcpy(buffer,"LISTBOX");
+			break;
+		case CT_LISTVIEW:
+			lstrcpy(buffer,"SysListView32");
+			break;
+		case CT_IMAGEBOX:
+		case CT_STATIC:
+			lstrcpy(buffer,"STATIC");
+			break;
+		case CT_PROGRESSBAR:
+			lstrcpy(buffer,"msctls_progress32");
+			break;
+		case CT_TRACKBAR:
+			lstrcpy(buffer,"msctls_trackbar32");
+			break;
+		case CT_TREEVIEW:
+			lstrcpy(buffer,"SysTreeView32");
+			break;
+		//CT_UPDOWNはCreateUpDownControl関数で独自に作成される
+	}
+}
+long GetCommandByMessage(int WndInfoNum,const char *MessageName,BOOL bProcedureCall,char *Command,char *spaces){
+	int i,i2,sw;
+	char temporary[MAX_PATH],*temp2;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	Command[0]=0;
+
+
+	/////////////////////
+	// Default コマンド
+
+	if(lstrcmp(MessageName,"Activate")==0){
+		sprintf(Command,"%sCase WM_ACTIVATE\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(LOWORD(wParam),HIWORD(wParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"Create")==0){
+		if( pWindowInfo->IsModalDlg() || pWindowInfo->IsModelessDlg() )
+		{
+			sprintf(Command,"%sCase WM_INITDIALOG\r\n",spaces);
+		}
+		else
+		{
+			sprintf(Command,"%sCase WM_CREATE\r\n",spaces);
+		}
+		i=lstrlen(Command);
+
+		sprintf(Command+i,"%s\t%s=hWnd\r\n",spaces,pWindowInfo->GetHandleName().c_str());
+		i+=lstrlen(Command+i);
+
+		if( pWindowInfo->HasMenu() )
+		{
+			//メニュー作成
+			for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
+				if(lstrcmpi(projectInfo.pMenuInfo[i2].IdName,pWindowInfo->GetMenuIdName().c_str())==0) break;
+			}
+			if(i2!=projectInfo.NumberOfMenu){
+				sprintf(Command+i,"%s\tSetMenu(hWnd,hMenu_%s)\r\n",spaces,projectInfo.pMenuInfo[i2].IdName);
+				i+=lstrlen(Command+i);
+			}
+		}
+
+		//子ウィンドウ作成
+		sw = 0;
+		BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+		{
+			if(pChildInfo->Control==CT_UPDOWN){
+				sprintf(Command+i,"%s\tCreateUpDownControl(%d,%d,%d,%d,%d,hWnd,%s,GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,0,0,100,0)\r\n",
+					spaces,
+					pChildInfo->GetStyle(),
+					pChildInfo->pos.x,pChildInfo->pos.y,
+					pChildInfo->size.cx,pChildInfo->size.cy,
+					pChildInfo->GetName().c_str());
+				i+=lstrlen(Command+i);
+			}
+			else{
+				GetItemClassName(temporary,pChildInfo->Control);
+				temp2=FormatCaption(pChildInfo->GetCaption().c_str());
+				sprintf(Command+i,"%s\tCreateWindowEx(&H%08x,\"%s\",\"%s\",&H%08x,%d,%d,%d,%d,hWnd,%s As HMENU,GetModuleHandle(0),0)\r\n",
+					spaces,
+					pChildInfo->GetExStyle(),
+					temporary,
+					temp2,
+					pChildInfo->GetStyle(),
+					pChildInfo->pos.x,
+					pChildInfo->pos.y,
+					pChildInfo->size.cx,
+					pChildInfo->size.cy,
+					pChildInfo->GetName().c_str());
+				i+=lstrlen(Command+i);
+				HeapDefaultFree(temp2);
+				sprintf(Command+i,"%s\tSendMessage(GetDlgItem(hWnd,%s),WM_SETFONT,hFont_%s As WPARAM,0)\r\n",
+					spaces,
+					pChildInfo->GetName().c_str(),
+					pWindowInfo->GetName().c_str());
+				i+=lstrlen(Command+i);
+
+				if(pChildInfo->Control==CT_IMAGEBOX){
+					//イメージ ボックスの場合
+					if((pChildInfo->GetStyle()&0x000F)==SS_ICON){
+						if(pChildInfo->image.IsFile()){
+							if(strstr(pChildInfo->image.path.c_str(),":")||
+								strstr(pChildInfo->image.path.c_str(),"\\\\")){
+								sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,\"%s\",IMAGE_ICON,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE)\r\n",
+									spaces,
+									pWindowInfo->GetName().c_str(),
+									pChildInfo->GetName().c_str(),
+									pChildInfo->image.path.c_str());
+							}
+							else{
+								if(sw==0){
+									sw=1;
+									lstrcpy(Command+i,"\r\n");
+									i+=2;
+									sprintf(Command+i,"%s\tDim ImageFilePath[MAX_PATH] As Byte\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tDim ModulePath[MAX_PATH] As Byte, i As Long\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tGetModuleFileName(GetModuleHandle(0),ModulePath,MAX_PATH)\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tFor i=lstrlen(ModulePath)-1 To 0 Step -1\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\t\tIf ModulePath[i]=&H5C Then Exit For\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tNext\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tModulePath[i+1]=0\r\n",spaces);
+									i+=lstrlen(Command+i);
+									lstrcpy(Command+i,"\r\n");
+									i+=2;
+								}
+								sprintf(Command+i,"%s\twsprintf(ImageFilePath,\"%%s%s\",ModulePath)\r\n",spaces,pChildInfo->image.path.c_str());
+								i+=lstrlen(Command+i);
+								sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,ImageFilePath,IMAGE_ICON,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE)\r\n",
+									spaces,
+									pWindowInfo->GetName().c_str(),
+									pChildInfo->GetName().c_str());
+							}
+							i+=lstrlen(Command+i);
+						}
+						else if(pChildInfo->image.IsResource()){
+							sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,%s As *Byte,IMAGE_ICON,0,0,LR_DEFAULTSIZE)\r\n",
+								spaces,
+								pWindowInfo->GetName().c_str(),
+								pChildInfo->GetName().c_str(),
+								pChildInfo->image.path.c_str());
+							i+=lstrlen(Command+i);
+						}
+						sprintf(Command+i,"%s\tSendMessage(GetDlgItem(hWnd,%s),STM_SETICON,hImage_%s_%s As WPARAM,0)\r\n",
+							spaces,
+							pChildInfo->GetName().c_str(),
+							pWindowInfo->GetName().c_str(),
+							pChildInfo->GetName().c_str());
+						i+=lstrlen(Command+i);
+					}
+					else if((pChildInfo->GetStyle()&0x000F)==SS_BITMAP){
+						if(pChildInfo->image.IsFile()){
+							if(strstr(pChildInfo->image.path.c_str(),":")||
+								strstr(pChildInfo->image.path.c_str(),"\\\\")){
+								sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,\"%s\",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE)\r\n",
+									spaces,
+									pWindowInfo->GetName().c_str(),
+									pChildInfo->GetName().c_str(),
+									pChildInfo->image.path.c_str());
+							}
+							else{
+								if(sw==0){
+									sw=1;
+									lstrcpy(Command+i,"\r\n");
+									i+=2;
+									sprintf(Command+i,"%s\tDim ImageFilePath[MAX_PATH] As Byte\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tDim ModulePath[MAX_PATH] As Byte, i As Long\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tGetModuleFileName(GetModuleHandle(0),ModulePath,MAX_PATH)\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tFor i=lstrlen(ModulePath)-1 To 0 Step -1\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\t\tIf ModulePath[i]=&H5C Then Exit For\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tNext\r\n",spaces);
+									i+=lstrlen(Command+i);
+									sprintf(Command+i,"%s\tModulePath[i+1]=0\r\n",spaces);
+									i+=lstrlen(Command+i);
+									lstrcpy(Command+i,"\r\n");
+									i+=2;
+								}
+								sprintf(Command+i,"%s\twsprintf(ImageFilePath,\"%%s%s\",ModulePath)\r\n",spaces,pChildInfo->image.path.c_str());
+								i+=lstrlen(Command+i);
+								sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,ImageFilePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE)\r\n",
+									spaces,
+									pWindowInfo->GetName().c_str(),
+									pChildInfo->GetName().c_str());
+							}
+							i+=lstrlen(Command+i);
+						}
+						else if(pChildInfo->image.IsResource()){
+							sprintf(Command+i,"%s\thImage_%s_%s=LoadImage(GetWindowLongPtr(hWnd,GWLP_HINSTANCE) As HINSTANCE,%s As *Byte,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE)\r\n",
+								spaces,
+								pWindowInfo->GetName().c_str(),
+								pChildInfo->GetName().c_str(),
+								pChildInfo->image.path.c_str());
+							i+=lstrlen(Command+i);
+						}
+						sprintf(Command+i,"%s\tSendMessage(GetDlgItem(hWnd,%s),STM_SETIMAGE,IMAGE_BITMAP,hImage_%s_%s As LPARAM)\r\n",
+							spaces,
+							pChildInfo->GetName().c_str(),
+							pWindowInfo->GetName().c_str(),
+							pChildInfo->GetName().c_str());
+						i+=lstrlen(Command+i);
+					}
+				}
+			}
+		}
+
+		if(bProcedureCall)
+			sprintf(Command+i,"%s\t%s_%s(ByVal (lParam As VoidPtr))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+		return WM_CREATE;
+	}
+	else if(lstrcmp(MessageName,"Destroy")==0){
+		sprintf(Command,"%sCase WM_DESTROY\r\n",spaces);
+		i=lstrlen(Command);
+		if(bProcedureCall){
+			sprintf(Command+i,"%s\t%s_%s()\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+			i+=lstrlen(Command+i);
+		}
+
+		if( pWindowInfo->HasMenu() )
+		{
+			//メニューを解放
+			for(i2=0;i2<projectInfo.NumberOfMenu;i2++){
+				if(lstrcmpi(projectInfo.pMenuInfo[i2].IdName,pWindowInfo->GetMenuIdName().c_str())==0) break;
+			}
+			if(i2!=projectInfo.NumberOfMenu){
+				sprintf(Command+i,"%s\tSetMenu(hWnd,NULL)\r\n",spaces);
+				i+=lstrlen(Command+i);
+			}
+		}
+
+		//イメージ ボックス用の変数を解放
+		BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+		{
+			if(pChildInfo->Control==CT_IMAGEBOX){
+				if((pChildInfo->GetStyle()&0x000F)==SS_ICON)
+					sprintf(Command+i,"%s\tDestroyIcon(hImage_%s_%s)\r\n",spaces,pWindowInfo->GetName().c_str(),pChildInfo->GetName().c_str());
+				else if((pChildInfo->GetStyle()&0x000F)==SS_BITMAP)
+					sprintf(Command+i,"%s\tDeleteObject(hImage_%s_%s)\r\n",spaces,pWindowInfo->GetName().c_str(),pChildInfo->GetName().c_str());
+				i+=lstrlen(Command+i);
+			}
+		}
+		return WM_DESTROY;
+	}
+	else if(lstrcmp(MessageName,"DropFiles")==0){
+		sprintf(Command,"%sCase WM_DROPFILES\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As HDROP)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"HScroll")==0){
+		sprintf(Command,"%sCase WM_HSCROLL\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(LOWORD(wParam),HIWORD(wParam),lParam As HWND)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"KeyDown")==0){
+		sprintf(Command,"%sCase WM_KEYDOWN\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,lParam As Long)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"KeyPress")==0){
+		sprintf(Command,"%sCase WM_CHAR\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,lParam As Long)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"KeyUp")==0){
+		sprintf(Command,"%sCase WM_KEYUP\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,lParam As Long)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"LButtonDown")==0){
+		sprintf(Command,"%sCase WM_LBUTTONDOWN\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"LButtonDblClick")==0){
+		sprintf(Command,"%sCase WM_LBUTTONDBLCLK\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"LButtonUp")==0){
+		sprintf(Command,"%sCase WM_LBUTTONUP\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"MButtonDown")==0){
+		sprintf(Command,"%sCase WM_MBUTTONDOWN\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"MButtonDblClick")==0){
+		sprintf(Command,"%sCase WM_MBUTTONDBLCLK\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"MButtonUp")==0){
+		sprintf(Command,"%sCase WM_MBUTTONUP\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"MouseMove")==0){
+		sprintf(Command,"%sCase WM_MOUSEMOVE\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"Move")==0){
+		sprintf(Command,"%sCase WM_MOVE\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"Notify")==0){
+		//コモンコントロールメッセージと共に挿入
+		return WM_NOTIFY;
+	}
+	else if(lstrcmp(MessageName,"Paint")==0){
+		sprintf(Command,"%sCase WM_PAINT\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\tDim ps As PAINTSTRUCT\r\n",spaces);
+		i+=lstrlen(Command+i);
+		sprintf(Command+i,"%s\tDim hDC As HDC\r\n",spaces);
+		i+=lstrlen(Command+i);
+		sprintf(Command+i,"%s\thDC=BeginPaint(hWnd,ps)\r\n",spaces);
+		i+=lstrlen(Command+i);
+		sprintf(Command+i,"%s\t%s_%s(hDC)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+		i+=lstrlen(Command+i);
+		sprintf(Command+i,"%s\tEndPaint(hWnd,ps)\r\n",spaces);
+		return WM_PAINT;
+	}
+	else if(lstrcmp(MessageName,"QueryClose")==0){
+		sprintf(Command,"%sCase WM_CLOSE\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\tDim cancel=0 As Integer\r\n",spaces);
+		i+=lstrlen(Command+i);
+		if(bProcedureCall)
+		{
+			sprintf(Command+i,"%s\t%s_%s(cancel)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+			i+=lstrlen(Command+i);
+		}
+
+		if( pWindowInfo->IsModalDlg() )
+		{
+			sprintf(Command+i,"%s\tIf cancel=0 Then EndDialog(hWnd,0)\r\n",spaces);
+		}
+		else
+		{
+			sprintf(Command+i,"%s\tIf cancel=0 Then DestroyWindow(hWnd)\r\n",spaces);
+		}
+		return WM_CLOSE;
+	}
+	else if(lstrcmp(MessageName,"RButtonDblClick")==0){
+		sprintf(Command,"%sCase WM_RBUTTONDBLCLK\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"RButtonDown")==0){
+		sprintf(Command,"%sCase WM_RBUTTONDOWN\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"RButtonUp")==0){
+		sprintf(Command,"%sCase WM_RBUTTONUP\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"Resize")==0){
+		sprintf(Command,"%sCase WM_SIZE\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As Long,LOWORD(lParam),HIWORD(lParam))\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"SetFocus")==0){
+		sprintf(Command,"%sCase WM_SETFOCUS\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s()\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"Timer")==0){
+		sprintf(Command,"%sCase WM_TIMER\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam As DWord)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	else if(lstrcmp(MessageName,"VScroll")==0){
+		sprintf(Command,"%sCase WM_VSCROLL\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(LOWORD(wParam),HIWORD(wParam),lParam As HWND)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+
+
+	///////////////////
+	// MMSYS コマンド
+
+	else if(lstrcmp(MessageName,"MciNotify")==0){
+		sprintf(Command,"%sCase MM_MCINOTIFY\r\n",spaces);
+		i=lstrlen(Command);
+		sprintf(Command+i,"%s\t%s_%s(wParam,lParam)\r\n",spaces,pWindowInfo->GetName().c_str(),MessageName);
+	}
+	return 0;
+}
+
+void GetMenuItemConstData(MENU_INFO *pMenuInfo,int NumberOfMenu,int *ConstNumber,Jenga::Common::Strings &namesForDuplicationCheck,char *buffer,int *base){
+	extern HANDLE hHeap;
+	int i;
+
+	for(i=0;i<NumberOfMenu;i++){
+		if(pMenuInfo[i].pMenuInfo){
+			//ポップアップ
+			GetMenuItemConstData(pMenuInfo[i].pMenuInfo,pMenuInfo[i].NumberOfMenu,ConstNumber,namesForDuplicationCheck,buffer,base);
+		}
+		else if(pMenuInfo[i].type==MFT_STRING){
+			//重複チェック
+			bool isMatch = false;
+			BOOST_FOREACH( const std::string &name, namesForDuplicationCheck )
+			{
+				if(lstrcmpi(name.c_str(),pMenuInfo[i].IdName)==0)
+				{
+					isMatch = true;
+					break;
+				}
+			}
+			if( !isMatch )
+			{
+				namesForDuplicationCheck.push_back( pMenuInfo[i].IdName );
+
+				sprintf(buffer+(*base),"Const %s=%d\r\n",pMenuInfo[i].IdName,*ConstNumber);
+				(*base)+=lstrlen(buffer+(*base));
+				(*ConstNumber)++;
+			}
+		}
+	}
+}
+int GetMakeMenuCommand(MENU_INFO *pMenuInfo,int NumberOfMenu,char *MenuHandle,char *Command,BOOL bMain){
+	int i,i2;
+	char temporary[MAX_PATH];
+
+	i=0;
+	sprintf(Command+i,"Dim %s As HMENU\r\n",MenuHandle);
+	i+=lstrlen(Command+i);
+	if(bMain) sprintf(Command+i,"%s=CreateMenu()\r\n",MenuHandle);
+	else sprintf(Command+i,"%s=CreatePopupMenu()\r\n",MenuHandle);
+	i+=lstrlen(Command+i);
+
+	for(i2=NumberOfMenu-1;i2>=0;i2--){
+		if(pMenuInfo[i2].pMenuInfo){
+			sprintf(temporary,"%s_%d",MenuHandle,i2);
+			i+=GetMakeMenuCommand(pMenuInfo[i2].pMenuInfo,pMenuInfo[i2].NumberOfMenu,temporary,Command+i,0);
+			sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION,Ex\"%s\",0,%s,%d\r\n",
+				MenuHandle,
+				pMenuInfo[i2].caption,
+				temporary,
+				pMenuInfo[i2].state);
+			i+=lstrlen(Command+i);
+		}
+		else{
+			if(pMenuInfo[i2].type==MFT_STRING){
+				sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION,Ex\"%s\",%s,0,%d\r\n",
+					MenuHandle,
+					pMenuInfo[i2].caption,
+					pMenuInfo[i2].IdName,
+					pMenuInfo[i2].state);
+				i+=lstrlen(Command+i);
+			}
+			else if(pMenuInfo[i2].type==MFT_SEPARATOR){
+				sprintf(Command+i,"InsMenu %s,0,MF_BYPOSITION,\"\"\r\n",
+					MenuHandle);
+				i+=lstrlen(Command+i);
+			}
+		}
+	}
+	return i;
+}
+int GetDestroyMenuCommand(MENU_INFO *pMenuInfo,int NumberOfMenu,char *MenuHandle,char *Command){
+	int i,i2;
+	char temporary[MAX_PATH];
+
+	i=0;
+	sprintf(Command+i,"\tDestroyMenu(%s)\r\n",MenuHandle);
+	i+=lstrlen(Command+i);
+
+	for(i2=NumberOfMenu-1;i2>=0;i2--){
+		if(pMenuInfo[i2].pMenuInfo){
+			sprintf(temporary,"%s_%d",MenuHandle,i2);
+			i+=GetDestroyMenuCommand(pMenuInfo[i2].pMenuInfo,pMenuInfo[i2].NumberOfMenu,temporary,Command+i);
+		}
+	}
+	return i;
+}
+void SaveWindowProgram(){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5,sw1,sw2,sw3,sw4,size;
+	char *buffer,temporary[MAX_PATH];
+
+	size=2;
+	buffer=(char *)HeapAlloc(hHeap,0,65535*size);
+	lstrcpy(buffer,"'このファイルはウィンドウ定義ファイル（*.wnd）をもとに生成されています\r\n\r\n");
+	i2=lstrlen(buffer);
+
+	if(projectInfo.dwOption&PJ_OP_COMMCTRL){
+		//コマンコントロールを初期化
+		lstrcpy(buffer+i2,"Dim _RadSys_InitCtrls As INITCOMMONCONTROLSEX\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"_RadSys_InitCtrls.dwSize=Len(_RadSys_InitCtrls)\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"_RadSys_InitCtrls.dwICC=ICC_WIN95_CLASSES\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"InitCommonControlsEx(_RadSys_InitCtrls)\r\n\r\n");
+		i2+=lstrlen(buffer+i2);
+	}
+
+
+	////////////
+	//IDを定義
+
+	Jenga::Common::Strings namesForDuplicationCheck;
+	i4=1000;
+	i5=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+		{
+			//重複チェック
+			bool isMatch = false;
+			BOOST_FOREACH( const std::string &name, namesForDuplicationCheck )
+			{
+				if(lstrcmpi(name.c_str(),pChildInfo->GetName().c_str())==0){
+					isMatch = true;
+					break;
+				}
+			}
+			if( isMatch ) continue;
+
+			namesForDuplicationCheck.push_back( pChildInfo->GetName() );
+
+			sprintf(buffer+i2,"Const %s=%d\r\n",pChildInfo->GetName().c_str(),i4);
+			i2+=lstrlen(buffer+i2);
+			i4++;
+
+			while(i2>65535*(size-1)){
+				size++;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+			}
+		}
+	}
+
+	//メニューのIDを定義
+	GetMenuItemConstData(projectInfo.pMenuInfo,projectInfo.NumberOfMenu,&i4,namesForDuplicationCheck,buffer,&i2);
+
+	lstrcpy(buffer+i2,"\r\n");
+	i2+=lstrlen(buffer+i2);
+
+
+	//ハンドル変数を定義
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		sprintf(buffer+i2,"Dim %s As HWND\r\n",pWindowInfo->GetHandleName().c_str());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"Dim hFont_%s As HFONT\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"hFont_%s=CreateFont(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\"%s\")\r\n",
+			pWindowInfo->GetName().c_str(),
+			pWindowInfo->LogFont.lfHeight,
+			pWindowInfo->LogFont.lfWidth,
+			pWindowInfo->LogFont.lfEscapement,
+			pWindowInfo->LogFont.lfOrientation,
+			pWindowInfo->LogFont.lfWeight,
+			pWindowInfo->LogFont.lfItalic,
+			pWindowInfo->LogFont.lfUnderline,
+			pWindowInfo->LogFont.lfStrikeOut,
+			pWindowInfo->LogFont.lfCharSet,
+			pWindowInfo->LogFont.lfOutPrecision,
+			pWindowInfo->LogFont.lfClipPrecision,
+			pWindowInfo->LogFont.lfQuality,
+			pWindowInfo->LogFont.lfPitchAndFamily,
+			pWindowInfo->LogFont.lfFaceName);
+		i2+=lstrlen(buffer+i2);
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+	}
+
+	//背景に使用するブラシを定義
+	lstrcpy(buffer+i2,"Dim h3DFaceBrush As HBRUSH\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"h3DFaceBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE))\r\n");
+	i2+=lstrlen(buffer+i2);
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if(pWindowInfo->GetBackgroundColor()<=0&&
+			pWindowInfo->GetBackgroundColor()!=-(int)RGB(255,255,255)&&
+			pWindowInfo->GetBackgroundColor()!=-(int)RGB(0,0,0)){
+				sprintf(buffer+i2,"Dim _RadSys_hBackBrush%d As HBRUSH\r\n",i);
+				i2+=lstrlen(buffer+i2);
+				sprintf(buffer+i2,"_RadSys_hBackBrush%d=CreateSolidBrush(%d)\r\n",i,-pWindowInfo->GetBackgroundColor());
+				i2+=lstrlen(buffer+i2);
+		}
+		if(pWindowInfo->GetBackgroundColor()>=0x1000){
+				sprintf(buffer+i2,"Dim _RadSys_hBackBrush%d As HBRUSH\r\n",i);
+				i2+=lstrlen(buffer+i2);
+				sprintf(buffer+i2,"_RadSys_hBackBrush%d=CreatePatternBrush(LoadImage(GetModuleHandle(0),%s,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_SHARED))\r\n",
+					i,
+					projectInfo.resourceManager.bitmapResources[pWindowInfo->GetBackgroundColor()-0x1000].idName.c_str());
+				i2+=lstrlen(buffer+i2);
+		}
+
+		i++;
+	}
+
+	lstrcpy(buffer+i2,"\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//イメージ ボックス用の変数を定義
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+		{
+			if(pChildInfo->Control==CT_IMAGEBOX){
+				if((pChildInfo->GetStyle()&0x000F)==SS_ICON||
+					(pChildInfo->GetStyle()&0x000F)==SS_BITMAP){
+					sprintf(buffer+i2,"Dim hImage_%s_%s As HANDLE\r\n",pWindowInfo->GetName().c_str(),pChildInfo->GetName().c_str());
+					i2+=lstrlen(buffer+i2);
+
+					while(i2>65535*(size-1)){
+						size++;
+						buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+					}
+				}
+			}
+		}
+	}
+
+	lstrcpy(buffer+i2,"\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//メニュー作成
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		sprintf(temporary,"hMenu_%s",projectInfo.pMenuInfo[i].IdName);
+
+		//InsertMenuItem郡
+		i2+=GetMakeMenuCommand(projectInfo.pMenuInfo[i].pMenuInfo,projectInfo.pMenuInfo[i].NumberOfMenu,temporary,buffer+i2,1);
+
+		lstrcpy(buffer+i2,"\r\n");
+		i2+=lstrlen(buffer+i2);
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+	}
+
+
+	//////////////////////////
+	//オブジェクトの解放処理
+	sprintf(buffer+i2,"Sub %s_DestroyObjects()\r\n",projectInfo.GetName().c_str());
+	i2+=lstrlen(buffer+i2);
+
+	//メニュー解放
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		sprintf(temporary,"hMenu_%s",projectInfo.pMenuInfo[i].IdName);
+		i2+=GetDestroyMenuCommand(projectInfo.pMenuInfo[i].pMenuInfo,projectInfo.pMenuInfo[i].NumberOfMenu,temporary,buffer+i2);
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+	}
+
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		//フォントハンドル解放
+		sprintf(buffer+i2,"\tDeleteObject(hFont_%s)\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+	}
+
+	//背景ブラシを解放
+	lstrcpy(buffer+i2,"\tDeleteObject(h3DFaceBrush)\r\n");
+	i2+=lstrlen(buffer+i2);
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if(pWindowInfo->GetBackgroundColor()<=0&&
+			pWindowInfo->GetBackgroundColor()!=-(int)RGB(255,255,255)&&
+			pWindowInfo->GetBackgroundColor()!=-(int)RGB(0,0,0)){
+				sprintf(buffer+i2,"\tDeleteObject(_RadSys_hBackBrush%d)\r\n",i);
+				i2+=lstrlen(buffer+i2);
+		}
+		i++;
+	}
+
+	sprintf(buffer+i2,"End Sub\r\n\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//ユーザー定義のコールバック関数が存在するかどうか
+	BOOL bAvailUserProc[MAX_WNDNUM];
+
+
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if(i!=0){
+			lstrcpy(buffer+i2,"\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+
+		//////////////////////////
+		//コールバック関数を生成
+
+		//処理メッセージを抽出
+		ITEMEVENTINFO *pItemEventInfo;
+		char **ppNames=GetProcedureNamesOfMessageCall(i,&pItemEventInfo,&i3,&bAvailUserProc[i]);
+
+		sprintf(buffer+i2,"Function EventCall_%s(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+
+		lstrcpy(buffer+i2,"\tSelect Case message\r\n");
+		i2+=lstrlen(buffer+i2);
+
+		//通常メッセージ郡
+		for(i4=0,sw1=0,sw2=0,sw3=0,sw4=0;i4<i3;i4++){
+			i5=GetCommandByMessage(i,ppNames[i4],1,buffer+i2,"\t\t");
+			i2+=lstrlen(buffer+i2);
+			if(i5==WM_CREATE) sw1=1;
+			else if(i5==WM_DESTROY) sw2=1;
+			else if(i5==WM_CLOSE) sw3=1;
+			else if(i5==WM_NOTIFY) sw4=1;
+			HeapDefaultFree(ppNames[i4]);
+		}
+		HeapDefaultFree(ppNames);
+
+		//WM_CREATE、WM_DESTROY、WM_PAINTが呼び出されていない場合
+		if(!sw1){
+			GetCommandByMessage(i,"Create",0,buffer+i2,"\t\t");
+			i2+=lstrlen(buffer+i2);
+		}
+		if(!sw2){
+			GetCommandByMessage(i,"Destroy",0,buffer+i2,"\t\t");
+			i2+=lstrlen(buffer+i2);
+		}
+		if(!sw3){
+			GetCommandByMessage(i,"QueryClose",0,buffer+i2,"\t\t");
+			i2+=lstrlen(buffer+i2);
+		}
+
+		//アイテムメッセージ郡（WM_NOTIFY）
+		if(pItemEventInfo[0].IdName){
+			i3=i2;
+			lstrcpy(buffer+i2,"\t\tCase WM_NOTIFY\r\n");
+			i2+=lstrlen(buffer+i2);
+			if(sw4){
+				sprintf(buffer+i2,"\t\t\t%s_Notify(ByVal (lParam As *NMHDR))\r\n",pWindowInfo->GetName().c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			lstrcpy(buffer+i2,"\t\t\tDim pnmHdr As *NMHDR\r\n");
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"\t\t\tpnmHdr=lParam As *NMHDR\r\n");
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"\t\t\tSelect Case LOWORD(wParam)\r\n");
+			i2+=lstrlen(buffer+i2);
+
+			if(GetNotifyCommandByItemMessage(pWindowInfo,pItemEventInfo,buffer+i2,"\t\t\t\t")){
+				i2+=lstrlen(buffer+i2);
+
+				lstrcpy(buffer+i2,"\t\t\tEnd Select\r\n");
+				i2+=lstrlen(buffer+i2);
+			}
+			else{
+				//WM_NOTIFYを削除
+				i2=i3;
+				if(sw4) goto DefaultNotifyEvent;
+			}
+		}
+		else if(sw4){
+DefaultNotifyEvent:
+			lstrcpy(buffer+i2,"\t\tCase WM_NOTIFY\r\n");
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"\t\t\t%s_Notify(ByVal (lParam As *NMHDR))\r\n",pWindowInfo->GetName().c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+
+		//アイテムメッセージ郡（WM_COMMAND）
+		if(pItemEventInfo[0].IdName){
+			lstrcpy(buffer+i2,"\t\tCase WM_COMMAND\r\n");
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"\t\t\tSelect Case LOWORD(wParam)\r\n");
+			i2+=lstrlen(buffer+i2);
+
+			//pItemEventInfoのIdName、EventNameメンバのメモリ解放はこの関数内で行う
+			GetCommandByItemMessage(pWindowInfo,pItemEventInfo,buffer+i2,"\t\t\t\t");
+			i2+=lstrlen(buffer+i2);
+
+			lstrcpy(buffer+i2,"\t\t\tEnd Select\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+		HeapDefaultFree(pItemEventInfo);
+
+		// DefWindowProc関数
+		lstrcpy(buffer+i2,"\t\tCase Else\r\n");
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"\t\t\tEventCall_%s=DefWindowProc(hWnd,message,wParam,lParam)\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\t\tExit Function\r\n");
+		i2+=lstrlen(buffer+i2);
+
+		lstrcpy(buffer+i2,"\tEnd Select\r\n");
+		i2+=lstrlen(buffer+i2);
+
+		sprintf(buffer+i2,"\tEventCall_%s=0\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"End Function\r\n");
+		i2+=lstrlen(buffer+i2);
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+
+		i++;
+	}
+
+
+	//////////////////////////
+	//ダイアログボックス関連
+
+	//クラス登録
+	lstrcpy(buffer+i2,"\r\nFunction DefaultCallProc(hWnd As HWND, message As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\tDefaultCallProc=DefWindowProc(hWnd,message,wParam,lParam)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"End Function\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\r\nDim _RadSys_dlgwcl As WNDCLASSEX\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"FillMemory(VarPtr(_RadSys_dlgwcl),Len(_RadSys_dlgwcl),0)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.cbSize=Len(_RadSys_dlgwcl)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.hInstance=GetModuleHandle(0)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.style=CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION))\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.hIconSm=LoadIcon(NULL,MAKEINTRESOURCE(IDI_WINLOGO))\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW))\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.lpszClassName=\"NORMALDLG\"\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.hbrBackground=h3DFaceBrush\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_dlgwcl.lpfnWndProc=AddressOf(DefaultCallProc)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"RegisterClassEx(_RadSys_dlgwcl)\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//DialogBox関数
+	lstrcpy(buffer+i2,"\r\nFunction DialogBox(hOwnerWnd As HWND, TemplateName As LPSTR) As LONG_PTR\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\tDim hDlg As HWND\r\n");
+	i2+=lstrlen(buffer+i2);
+	sw1=0;
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if( pWindowInfo->IsModalDlg() )
+		{
+			if(sw1==0){
+				sprintf(buffer+i2,"\tIf lstrcmp(TemplateName,\"%s\")=0 Then\r\n",pWindowInfo->GetName().c_str());
+				i2+=lstrlen(buffer+i2);
+				sw1=1;
+			}
+			else{
+				sprintf(buffer+i2,"\tElseIf lstrcmp(TemplateName,\"%s\")=0 Then\r\n",pWindowInfo->GetName().c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			sprintf(buffer+i2,"\t\t%s=CreateWindowEx(&H%08x,\"NORMALDLG\",\"%s\",&H%08x,%d,%d,%d,%d,hOwnerWnd,NULL As HMENU,GetModuleHandle(0),0)\r\n",
+				pWindowInfo->GetHandleName().c_str(),
+				pWindowInfo->GetExStyle(),
+				pWindowInfo->GetCaption().c_str(),
+				pWindowInfo->GetStyle(),
+				pWindowInfo->pos.x,
+				pWindowInfo->pos.y,
+				pWindowInfo->size.cx,
+				pWindowInfo->size.cy);
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"\t\thDlg=%s\r\n",
+				pWindowInfo->GetHandleName().c_str());
+			i2+=lstrlen(buffer+i2);
+			if(bAvailUserProc[i]){
+				sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(%s) As LONG_PTR)\r\n",
+					pWindowInfo->GetHandleName().c_str(),
+					pWindowInfo->GetCallbackName().c_str());
+			}
+			else{
+				sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(EventCall_%s) As LONG_PTR)\r\n",
+					pWindowInfo->GetHandleName().c_str(),
+					pWindowInfo->GetName().c_str());
+			}
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"\t\tSendMessage(%s,WM_INITDIALOG,0,0)\r\n",pWindowInfo->GetHandleName().c_str());
+			i2+=lstrlen(buffer+i2);
+			if( pWindowInfo->HasIcon() )
+			{
+				sprintf(buffer+i2,"\t\tSendMessage(%s,WM_SETICON,ICON_SMALL,LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(%s)) As LPARAM)\r\n",pWindowInfo->GetHandleName().c_str(),pWindowInfo->GetIconResourceName().c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			sprintf(buffer+i2,"\t\tShowWindow(%s,SW_SHOW)\r\n",pWindowInfo->GetHandleName().c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+		i++;
+	}
+	if(sw1){
+		lstrcpy(buffer+i2,"\tElse\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tExit Function\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tEnd If\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tEnableWindow(hOwnerWnd,0)\r\n\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tDim msg As MSG, iResult As Long\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tDo\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tiResult=GetMessage(msg,0,0,0)\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tIf iResult=0 or iResult=-1 Then Exit Do\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tIf IsDialogMessage(hDlg,msg) Then Continue\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tTranslateMessage(msg)\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\t\tDispatchMessage(msg)\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tLoop\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"\tDialogBox=msg.wParam\r\n");
+		i2+=lstrlen(buffer+i2);
+	}
+	lstrcpy(buffer+i2,"End Function\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//EndDialog関数
+	lstrcpy(buffer+i2,"Sub EndDialog(hWnd As HWND, lResult As Long)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\tEnableWindow(GetWindow(hWnd,GW_OWNER),1)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\tDestroyWindow(hWnd)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"\tPostMessage(0,WM_QUIT,lResult,0)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"End Sub\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	//CreateDialog関数
+	lstrcpy(buffer+i2,"\r\nFunction CreateDialog(hOwnerWnd As HWND, TemplateName As LPSTR) As HWND\r\n");
+	i2+=lstrlen(buffer+i2);
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if( pWindowInfo->IsModelessDlg() )
+		{
+			sprintf(buffer+i2,"\tIf lstrcmp(TemplateName,\"%s\")=0 Then\r\n",pWindowInfo->GetName().c_str());
+			i2+=lstrlen(buffer+i2);
+
+			sprintf(buffer+i2,"\t\t%s=CreateWindowEx(&H%08x,\"NORMALDLG\",\"%s\",&H%08x,%d,%d,%d,%d,hOwnerWnd,NULL As HMENU,GetModuleHandle(0),0)\r\n",
+				pWindowInfo->GetHandleName().c_str(),
+				pWindowInfo->GetExStyle(),
+				pWindowInfo->GetCaption().c_str(),
+				pWindowInfo->GetStyle(),
+				pWindowInfo->pos.x,
+				pWindowInfo->pos.y,
+				pWindowInfo->size.cx,
+				pWindowInfo->size.cy);
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"\t\tCreateDialog=%s\r\n",pWindowInfo->GetHandleName().c_str());
+			i2+=lstrlen(buffer+i2);
+			if(bAvailUserProc[i]){
+				sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(%s) As LONG_PTR)\r\n",
+					pWindowInfo->GetHandleName().c_str(),
+					pWindowInfo->GetCallbackName().c_str());
+			}
+			else{
+				sprintf(buffer+i2,"\t\tSetWindowLongPtr(%s,GWLP_WNDPROC,AddressOf(EventCall_%s) As LONG_PTR)\r\n",
+					pWindowInfo->GetHandleName().c_str(),
+					pWindowInfo->GetName().c_str());
+			}
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"\t\tSendMessage(%s,WM_INITDIALOG,0,0)\r\n",pWindowInfo->GetHandleName().c_str());
+			i2+=lstrlen(buffer+i2);
+			if( pWindowInfo->HasIcon() )
+			{
+				sprintf(buffer+i2,"\t\tSendMessage(%s,WM_SETICON,ICON_SMALL,LoadIcon(GetModuleHandle(0),MAKEINTRESOURCE(%s)) As LPARAM)\r\n",pWindowInfo->GetHandleName().c_str(),pWindowInfo->GetIconResourceName().c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			sprintf(buffer+i2,"\tEnd If\r\n",pWindowInfo->GetName().c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+		i++;
+	}
+	lstrcpy(buffer+i2,"End Function\r\n");
+	i2+=lstrlen(buffer+i2);
+
+
+	///////////////////////
+	// 保存（Callback.wbp）
+	sprintf(temporary,"%sCallback.wbp",projectInfo.GetWorkDir().GetPath().c_str() );
+	WriteBuffer(temporary,buffer,i2);
+
+
+
+	lstrcpy(buffer,"'このファイルはウィンドウ定義ファイル（*.wnd）をもとに生成されています\r\n\r\n");
+	i2=lstrlen(buffer);
+
+	lstrcpy(buffer+i2,"Dim _RadSys_wcl As WNDCLASSEX\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"FillMemory(VarPtr(_RadSys_wcl),Len(_RadSys_wcl),0)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_wcl.cbSize=Len(_RadSys_wcl)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_wcl.hInstance=GetModuleHandle(0)\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_wcl.style=CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"_RadSys_wcl.hCursor=LoadCursor(NULL,MAKEINTRESOURCE(IDC_ARROW))\r\n");
+	i2+=lstrlen(buffer+i2);
+
+	i=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if( pWindowInfo->IsDefaultWindow() )
+		{
+			//////////////////////
+			//通常ウィンドウ作成
+
+			lstrcpy(buffer+i2,"\r\n");
+			i2+=2;
+
+			if( pWindowInfo->HasIcon() )
+			{
+				sprintf(buffer+i2,"_RadSys_wcl.hIcon=LoadIcon(_RadSys_wcl.hInstance,MAKEINTRESOURCE(%s))\r\n",pWindowInfo->GetIconResourceName().c_str());
+				i2+=lstrlen(buffer+i2);
+				sprintf(buffer+i2,"_RadSys_wcl.hIconSm=LoadIcon(_RadSys_wcl.hInstance,MAKEINTRESOURCE(%s))\r\n",pWindowInfo->GetIconResourceName().c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			else{
+				lstrcpy(buffer+i2,"_RadSys_wcl.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION))\r\n");
+				i2+=lstrlen(buffer+i2);
+				lstrcpy(buffer+i2,"_RadSys_wcl.hIconSm=LoadIcon(NULL,MAKEINTRESOURCE(IDI_WINLOGO))\r\n");
+				i2+=lstrlen(buffer+i2);
+			}
+
+			sprintf(buffer+i2,"_RadSys_wcl.lpszClassName=\"NORMAL%d\"\r\n",i);
+			i2+=lstrlen(buffer+i2);
+			if(bAvailUserProc[i])
+				sprintf(buffer+i2,"_RadSys_wcl.lpfnWndProc=AddressOf(%s)\r\n",pWindowInfo->GetCallbackName().c_str());
+			else sprintf(buffer+i2,"_RadSys_wcl.lpfnWndProc=AddressOf(EventCall_%s)\r\n",pWindowInfo->GetName().c_str());
+			i2+=lstrlen(buffer+i2);
+			if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE)
+				lstrcpy(buffer+i2,"_RadSys_wcl.hbrBackground=h3DFaceBrush\r\n");
+			else if(pWindowInfo->GetBackgroundColor()==-(int)RGB(255,255,255))
+				lstrcpy(buffer+i2,"_RadSys_wcl.hbrBackground=GetStockObject(WHITE_BRUSH)\r\n");
+			else if(pWindowInfo->GetBackgroundColor()==-(int)RGB(0,0,0))
+				lstrcpy(buffer+i2,"_RadSys_wcl.hbrBackground=GetStockObject(BLACK_BRUSH)\r\n");
+			else if(pWindowInfo->GetBackgroundColor()<=0||
+				pWindowInfo->GetBackgroundColor()>=0x1000){
+				//色指定またはビットマップ
+				sprintf(buffer+i2,"_RadSys_wcl.hbrBackground=_RadSys_hBackBrush%d\r\n",i);
+			}
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"RegisterClassEx(_RadSys_wcl)\r\n");
+			i2+=lstrlen(buffer+i2);
+			sprintf(buffer+i2,"CreateWindowEx(&H%08x,\"%s%d\",\"%s\",&H%08x,%d,%d,%d,%d,0,0,GetModuleHandle(0),0)\r\n",
+				pWindowInfo->GetExStyle(),
+				pWindowInfo->GetClassName().c_str(), i,
+				pWindowInfo->GetCaption().c_str(),
+				pWindowInfo->GetStyle(),
+				pWindowInfo->pos.x,
+				pWindowInfo->pos.y,
+				pWindowInfo->size.cx,
+				pWindowInfo->size.cy);
+			i2+=lstrlen(buffer+i2);
+		}
+
+		while(i2>65535*(size-1)){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,65535*size);
+		}
+
+		i++;
+	}
+
+
+	/////////////////////////
+	// 保存（MakeWindow.wbp）
+	sprintf(temporary,"%sMakeWindow.wbp",projectInfo.GetWorkDir().GetPath().c_str());
+	WriteBuffer(temporary,buffer,i2);
+	HeapDefaultFree(buffer);
+}
+int GetSaveMenuData(char *buffer,int SpaceNum,MENU_INFO *pMenuInfo,int ItemNum){
+	int i,i2;
+	char spaces[MAX_PATH];
+
+	memset(spaces,' ',SpaceNum*4);
+	spaces[SpaceNum*4]=0;
+
+	for(i=0,i2=0;i<ItemNum;i++){
+		if(pMenuInfo[i].pMenuInfo){
+			sprintf(buffer+i2,"%sPOPUP     = \"%s\",%d\r\n",spaces,pMenuInfo[i].caption,pMenuInfo[i].state);
+			i2+=lstrlen(buffer+i2);
+			i2+=GetSaveMenuData(buffer+i2,SpaceNum+1,pMenuInfo[i].pMenuInfo,pMenuInfo[i].NumberOfMenu);
+			sprintf(buffer+i2,"%sEND\r\n",spaces);
+			i2+=lstrlen(buffer+i2);
+		}
+		else if(pMenuInfo[i].type==MFT_STRING){
+			sprintf(buffer+i2,"%sITEM      = %s,\"%s\",%d\r\n",spaces,pMenuInfo[i].IdName,pMenuInfo[i].caption,pMenuInfo[i].state);
+			i2+=lstrlen(buffer+i2);
+		}
+		else if(pMenuInfo[i].type==MFT_SEPARATOR){
+			sprintf(buffer+i2,"%sSEPARATOR\r\n",spaces);
+			i2+=lstrlen(buffer+i2);
+		}
+	}
+	return i2;
+}
+void SaveWindowFile( char const *path, const ActiveBasic::PM::WindowInfos &windowInfos )
+{
+	extern HANDLE hHeap;
+	int i,i2,size;
+	char *buffer,*temporary;
+
+	size=2;
+	buffer=(char *)HeapAlloc(hHeap,0,GENERAL_SIZE*size);
+	i2=0;
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, windowInfos )
+	{
+		sprintf(buffer+i2,"WINDOW:%s\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    POINT     = %d,%d\r\n",pWindowInfo->pos.x,pWindowInfo->pos.y);
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    SIZE      = %d,%d\r\n",pWindowInfo->size.cx,pWindowInfo->size.cy);
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    CAPTION   = \"%s\"\r\n",pWindowInfo->GetCaption().c_str());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    STYLE     = &H%08x\r\n",pWindowInfo->GetStyle());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    EXSTYLE   = &H%08x\r\n",pWindowInfo->GetExStyle());
+		i2+=lstrlen(buffer+i2);
+		if( pWindowInfo->HasMenu() )
+		{
+			sprintf(buffer+i2,"    MENUID    = %s\r\n",pWindowInfo->GetMenuIdName().c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		sprintf(buffer+i2,"    BGCOLOR   = %d\r\n",pWindowInfo->GetBackgroundColor());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    FONT      = %d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,\"%s\"\r\n",
+			pWindowInfo->LogFont.lfHeight,
+			pWindowInfo->LogFont.lfWidth,
+			pWindowInfo->LogFont.lfEscapement,
+			pWindowInfo->LogFont.lfOrientation,
+			pWindowInfo->LogFont.lfWeight,
+			pWindowInfo->LogFont.lfItalic,
+			pWindowInfo->LogFont.lfUnderline,
+			pWindowInfo->LogFont.lfStrikeOut,
+			pWindowInfo->LogFont.lfCharSet,
+			pWindowInfo->LogFont.lfOutPrecision,
+			pWindowInfo->LogFont.lfClipPrecision,
+			pWindowInfo->LogFont.lfQuality,
+			pWindowInfo->LogFont.lfPitchAndFamily,
+			pWindowInfo->LogFont.lfFaceName);
+		i2+=lstrlen(buffer+i2);
+		if( pWindowInfo->HasIcon() )
+		{
+			sprintf(buffer+i2,"    ICONID    = %s\r\n",pWindowInfo->GetIconResourceName().c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		sprintf(buffer+i2,"    CLASS     = \"%s\"\r\n",pWindowInfo->GetClassName().c_str());
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"    TYPE      = %d\r\n",(DWORD)pWindowInfo->GetType());
+		i2+=lstrlen(buffer+i2);
+		BOOST_FOREACH( const ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
+		{
+			temporary=SetCaptionSequence(pChildInfo->GetCaption().c_str());
+			sprintf(buffer+i2,"    ITEM      = %s,%d,%d,%d,%d,\"%s\",&H%08x,&H%08x,%d",
+				pChildInfo->GetName().c_str(),
+				pChildInfo->pos.x,pChildInfo->pos.y,
+				pChildInfo->size.cx,pChildInfo->size.cy,
+				temporary,
+				pChildInfo->GetStyle(),
+				pChildInfo->GetExStyle(),
+				pChildInfo->Control
+			);
+			i2+=lstrlen(buffer+i2);
+			HeapDefaultFree(temporary);
+			if(pChildInfo->Control==CT_IMAGEBOX){
+				sprintf(buffer+i2,",%d,\"%s\"",pChildInfo->image.type,pChildInfo->image.path.c_str());
+				i2+=lstrlen(buffer+i2);
+			}
+			lstrcpy(buffer+i2,"\r\n");
+			i2+=lstrlen(buffer+i2);
+			if(i2-GENERAL_SIZE<GENERAL_SIZE){
+				size++;
+				buffer=(char *)HeapReAlloc(hHeap,0,buffer,GENERAL_SIZE*size);
+			}
+		}
+		sprintf(buffer+i2,"END\r\n",pWindowInfo->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		if(i2-GENERAL_SIZE<GENERAL_SIZE){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,GENERAL_SIZE*size);
+		}
+	}
+	for(i=0;i<projectInfo.NumberOfMenu;i++){
+		sprintf(buffer+i2,"MENU:%s\r\n",projectInfo.pMenuInfo[i].IdName);
+		i2+=lstrlen(buffer+i2);
+		i2+=GetSaveMenuData(buffer+i2,1,projectInfo.pMenuInfo[i].pMenuInfo,projectInfo.pMenuInfo[i].NumberOfMenu);
+		sprintf(buffer+i2,"END\r\n",windowInfos[i]->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+		if(i2-GENERAL_SIZE<GENERAL_SIZE){
+			size++;
+			buffer=(char *)HeapReAlloc(hHeap,0,buffer,GENERAL_SIZE*size);
+		}
+	}
+	WriteBuffer(path,buffer,i2);
+	HeapDefaultFree(buffer);
+
+	projectInfo.ModifyOfMaterial=0;
+}
+
+MENU_INFO *GetMenuData(char *buffer,int *pPos,int *pMenuNum){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH],*temp2,temp3[MAX_PATH];
+	MENU_INFO *pMenuInfo;
+
+	temp2=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)+1);
+
+	*pMenuNum=0;
+	pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+
+	for(i=*pPos;;i++){
+		if(buffer[i]=='\0') return 0;
+		if((buffer[i]=='\r'&&buffer[i+1]=='\n')||i==0){
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n')  i+=2;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(i2==0){
+				i--;
+				continue;
+			}
+			if(buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temp2[i2]=0;
+						break;
+					}
+					temp2[i2]=buffer[i];
+				}
+			}
+			else{
+				temp2[0]=0;
+				i2=0;
+			}
+
+
+			if(lstrcmpi(temporary,"POPUP")==0){
+				(*pMenuNum)++;
+				pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pMenuInfo,(*pMenuNum)*sizeof(MENU_INFO));
+				i3=*pMenuNum-1;
+
+				i4=GetOneParameter(temp2,0,temp3);
+				RemoveStringQuotes(temp3);
+				pMenuInfo[i3].caption=(char *)HeapAlloc(hHeap,0,lstrlen(temp3)+1);
+				lstrcpy(pMenuInfo[i3].caption,temp3);
+
+				i4=GetOneParameter(temp2,i4,temp3);
+				pMenuInfo[i3].state=GetValue(temp3);
+
+				pMenuInfo[i3].pMenuInfo=GetMenuData(buffer,&i,&pMenuInfo[i3].NumberOfMenu);
+			}
+			else if(lstrcmpi(temporary,"ITEM")==0){
+				(*pMenuNum)++;
+				pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pMenuInfo,(*pMenuNum)*sizeof(MENU_INFO));
+				i3=*pMenuNum-1;
+
+				i4=GetOneParameter(temp2,0,temp3);
+				pMenuInfo[i3].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temp3)+1);
+				lstrcpy(pMenuInfo[i3].IdName,temp3);
+
+				i4=GetOneParameter(temp2,i4,temp3);
+				RemoveStringQuotes(temp3);
+				pMenuInfo[i3].caption=(char *)HeapAlloc(hHeap,0,lstrlen(temp3)+1);
+				lstrcpy(pMenuInfo[i3].caption,temp3);
+
+				i4=GetOneParameter(temp2,i4,temp3);
+				pMenuInfo[i3].state=GetValue(temp3);
+
+				pMenuInfo[i3].type=0;
+			}
+			else if(lstrcmpi(temporary,"SEPARATOR")==0){
+				(*pMenuNum)++;
+				pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,pMenuInfo,(*pMenuNum)*sizeof(MENU_INFO));
+				i3=*pMenuNum-1;
+
+				pMenuInfo[i3].type=MFT_SEPARATOR;
+			}
+			else if(lstrcmpi(temporary,"END")==0) break;
+			i--;
+		}
+	}
+	*pPos=i;
+
+	HeapDefaultFree(temp2);
+
+	return pMenuInfo;
+}
+_int8 OpenWindowFile(char *path){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4,i5;
+	char *buffer,temporary[MAX_PATH],*temp2,temp3[MAX_PATH];
+
+	buffer=ReadBuffer(path);
+	if(!buffer) return 0;
+	temp2=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)+1);
+	ChangeOrSignToDivision(temp2,buffer);
+	KillSpaces(temp2,buffer);
+	//temp2はこの後の処理の一時保存バッファにも利用するので解放しない
+
+	projectInfo.NumberOfMenu=0;
+	projectInfo.pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+
+	projectInfo.windowInfos.Clear();
+
+	for(i=0,i3=0;;i++){
+		if(buffer[i]=='\0') break;
+		if((buffer[i]=='\r'&&buffer[i+1]=='\n')||i==0){
+			if(buffer[i]=='\r'&&buffer[i+1]=='\n')  i+=2;
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(i2==0){
+				i--;
+				continue;
+			}
+			if(buffer[i]==':'||buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temp2[i2]=0;
+						break;
+					}
+					temp2[i2]=buffer[i];
+				}
+			}
+			else{
+				temp2[0]=0;
+				i2=0;
+			}
+
+
+			//////////////
+			//ウィンドウ
+			if(lstrcmpi(temporary,"WINDOW")==0&&i3==0){
+				projectInfo.windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
+				i3=1;
+
+				projectInfo.windowInfos.back()->SetName( temp2 );
+			}
+			else if(lstrcmpi(temporary,"HANDLE")==0&&i3==1){
+				//無視
+			}
+			else if(lstrcmpi(temporary,"POINT")==0&&i3==1){
+				sscanf(temp2,"%d,%d",
+					&projectInfo.windowInfos.back()->pos.x,
+					&projectInfo.windowInfos.back()->pos.y);
+				if(projectInfo.windowInfos.back()->pos.x==-1) projectInfo.windowInfos.back()->pos.x=CW_USEDEFAULT;
+				if(projectInfo.windowInfos.back()->pos.y==-1) projectInfo.windowInfos.back()->pos.y=CW_USEDEFAULT;
+			}
+			else if(lstrcmpi(temporary,"SIZE")==0&&i3==1){
+				sscanf(temp2,"%d,%d",
+					&projectInfo.windowInfos.back()->size.cx,
+					&projectInfo.windowInfos.back()->size.cy);
+			}
+			else if(lstrcmpi(temporary,"CAPTION")==0&&i3==1){
+				if(temp2[0]=='\"'&&temp2[lstrlen(temp2)-1]=='\"'){
+					temp2[lstrlen(temp2)-1]=0;
+					projectInfo.windowInfos.back()->SetCaption( temp2+1 );
+				}
+			}
+			else if(lstrcmpi(temporary,"STYLE")==0&&i3==1) projectInfo.windowInfos.back()->SetStyle( GetValue(temp2) );
+			else if(lstrcmpi(temporary,"EXSTYLE")==0&&i3==1) projectInfo.windowInfos.back()->SetExStyle( GetValue(temp2) );
+			else if(lstrcmpi(temporary,"MENUID")==0&&i3==1){
+				projectInfo.windowInfos.back()->SetMenuIdName( temp2 );
+			}
+			else if(lstrcmpi(temporary,"ID")==0&&i3==1)
+			{
+				// 無視
+			}
+			else if(lstrcmpi(temporary,"BGCOLOR")==0&&i3==1){
+				projectInfo.windowInfos.back()->SetBackgroundColor( GetValue(temp2) );
+				if(projectInfo.dwVersion<=3){
+					//プロジェクトバージョンが3以前のときは新値に変換する
+					if(projectInfo.windowInfos.back()->GetBackgroundColor()==-1)
+						projectInfo.windowInfos.back()->SetBackgroundColor( -(int)RGB(255,255,255) );
+				}
+			}
+			else if(lstrcmpi(temporary,"FONT")==0&&i3==1){
+				i5=GetOneParameter(temp2,0,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfHeight=GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfWidth=GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfEscapement=GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfOrientation=GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfWeight=GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfItalic=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfUnderline=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfStrikeOut=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfCharSet=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfOutPrecision=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfClipPrecision=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfQuality=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				projectInfo.windowInfos.back()->LogFont.lfPitchAndFamily=(BYTE)GetValue(temp3);
+
+				i5=GetOneParameter(temp2,i5,temp3);
+				RemoveStringQuotes(temp3);
+				lstrcpy(projectInfo.windowInfos.back()->LogFont.lfFaceName,temp3);
+			}
+			else if(lstrcmpi(temporary,"ICONID")==0&&i3==1){
+				projectInfo.windowInfos.back()->SetIconResourceName( temp2 );
+			}
+			else if(lstrcmpi(temporary,"CLASS")==0&&i3==1){
+				if(temp2[0]=='\"'&&temp2[lstrlen(temp2)-1]=='\"'){
+					temp2[lstrlen(temp2)-1]=0;
+					projectInfo.windowInfos.back()->SetClassName( temp2+1 );
+				}
+			}
+			else if(lstrcmpi(temporary,"CALLBACK")==0&&i3==1)
+			{
+				// 無視
+			}
+
+			//以前のバージョンとの互換用
+			else if(lstrcmpi(temporary,"DLGTMP")==0&&i3==1) projectInfo.windowInfos.back()->SetType( (ActiveBasic::PM::WindowType::EnumType)GetValue(temp2) );
+
+			else if(lstrcmpi(temporary,"TYPE")==0&&i3==1) projectInfo.windowInfos.back()->SetType( (ActiveBasic::PM::WindowType::EnumType)GetValue(temp2) );
+			else if(lstrcmpi(temporary,"FILEPATH")==0&&i3==1)
+			{
+				// 無視
+			}
+			else if(lstrcmpi(temporary,"ITEM")==0&&i3==1){
+				ActiveBasic::PM::ChildWindowInfo *pChildInfo = new ActiveBasic::PM::ChildWindowInfo();
+
+				//ID
+				i5=GetOneParameter(temp2,0,temp3);
+				pChildInfo->SetName( temp3 );
+
+				//位置
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->pos.x=GetValue(temp3);
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->pos.y=GetValue(temp3);
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->size.cx=GetValue(temp3);
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->size.cy=GetValue(temp3);
+
+				//テキスト
+				i5=GetOneParameter(temp2,i5,temp3);
+				RemoveStringQuotes(temp3);
+				RestoreCaptionSequence(temp3);
+				pChildInfo->SetCaption( temp3 );
+
+				//スタイル
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->SetStyle( GetValue(temp3) );
+
+				//拡張スタイル
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->SetExStyle( GetValue(temp3) );
+
+				//クラス
+				i5=GetOneParameter(temp2,i5,temp3);
+				pChildInfo->Control=GetValue(temp3);
+
+				if(pChildInfo->Control==CT_IMAGEBOX){
+					//イメージ ボックスの場合
+					i5=GetOneParameter(temp2,i5,temp3);
+					pChildInfo->image.type = (ActiveBasic::PM::ImageReferenceType::EnumType)GetValue(temp3);
+					i5=GetOneParameter(temp2,i5,temp3);
+					RemoveStringQuotes(temp3);
+					pChildInfo->image.path = temp3;
+				}
+
+				projectInfo.windowInfos.back()->childWindowInfos.push_back( pChildInfo );
+			}
+
+
+			////////////
+			//メニュー
+			else if(lstrcmpi(temporary,"MENU")==0&&i3==0){
+				projectInfo.NumberOfMenu++;
+				projectInfo.pMenuInfo=(MENU_INFO *)HeapReAlloc(hHeap,HEAP_ZERO_MEMORY,projectInfo.pMenuInfo,projectInfo.NumberOfMenu*sizeof(MENU_INFO));
+				i4=projectInfo.NumberOfMenu-1;
+
+				//ID名
+				projectInfo.pMenuInfo[i4].IdName=(char *)HeapAlloc(hHeap,0,lstrlen(temp2)+1);
+				lstrcpy(projectInfo.pMenuInfo[i4].IdName,temp2);
+				projectInfo.pMenuInfo[i4].pMenuInfo=GetMenuData(buffer,&i,&projectInfo.pMenuInfo[i4].NumberOfMenu);
+				if(!projectInfo.pMenuInfo[i4].pMenuInfo){
+					//"ウィンドウ定義ファイルが壊れています。\n\n%s"
+					sprintf(temporary,STRING_ERROR_BROKEN_WNDFILE,path);
+					MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+
+					HeapDefaultFree(temp2);
+					HeapDefaultFree(buffer);
+					return 0;
+				}
+			}
+
+
+			else if(lstrcmpi(temporary,"END")==0&&i3) i3=0;
+			else{
+				//"ウィンドウ定義ファイルが壊れています。\n\n%s"
+				sprintf(temporary,STRING_ERROR_BROKEN_WNDFILE,path);
+				MessageBox(hOwner,temporary,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+
+				HeapDefaultFree(temp2);
+				HeapDefaultFree(buffer);
+				return 0;
+			}
+			i--;
+		}
+	}
+
+	HeapDefaultFree(temp2);
+	HeapDefaultFree(buffer);
+	return 1;
+}
+
+struct NEW_WINDOW{
+	char name[MAX_PATH];
+	ActiveBasic::PM::WindowType::EnumType type;
+};
+NEW_WINDOW NewWindow;
+BOOL CALLBACK DlgProject_NewWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	char temporary[MAX_PATH],temp2[MAX_PATH];
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+			SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_SETCHECK,BST_CHECKED,0);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					GetDlgItemText(hwnd,IDC_WINDOWNAME,NewWindow.name,MAX_PATH);
+					if(SendDlgItemMessage(hwnd,IDC_DEFWINDOW,BM_GETCHECK,0,0))
+					{
+						NewWindow.type = ActiveBasic::PM::WindowType::Default;
+					}
+					else if(SendDlgItemMessage(hwnd,IDC_MODALDLG,BM_GETCHECK,0,0))
+					{
+						NewWindow.type = ActiveBasic::PM::WindowType::ModalDlg;
+					}
+					else if(SendDlgItemMessage(hwnd,IDC_MODELESSDLG,BM_GETCHECK,0,0))
+					{
+						NewWindow.type = ActiveBasic::PM::WindowType::ModelessDlg;
+					}
+					EndDialog(hwnd,1);
+					return 1;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					return 1;
+				case IDC_WINDOWNAME:
+					if(HIWORD(wParam)==EN_CHANGE)
+					{
+						GetDlgItemText(hwnd,IDC_WINDOWNAME,temporary,MAX_PATH);
+						if(temporary[0]){
+							sprintf(temp2,"h%s",temporary);
+							SetDlgItemText(hwnd,IDC_WINDOWHANDLE,temp2);
+							sprintf(temp2,"%sProc",temporary);
+							SetDlgItemText(hwnd,IDC_WINDOWPROC,temp2);
+						}
+						else{
+							SetDlgItemText(hwnd,IDC_WINDOWHANDLE,"");
+							SetDlgItemText(hwnd,IDC_WINDOWPROC,"");
+						}
+					}
+					return 1;
+			}
+			break;
+	}
+	return 0;
+}
+void GetDefaultWindowFont(LOGFONT *LogFont){
+	LogFont->lfHeight=-12;
+	LogFont->lfWidth=0;
+	LogFont->lfEscapement=0;
+	LogFont->lfOrientation=0;
+	LogFont->lfWeight=FW_REGULAR;
+	LogFont->lfItalic=0;
+	LogFont->lfUnderline=0;
+	LogFont->lfStrikeOut=0;
+	LogFont->lfCharSet=SHIFTJIS_CHARSET;
+	LogFont->lfOutPrecision=OUT_STROKE_PRECIS;
+	LogFont->lfClipPrecision=CLIP_STROKE_PRECIS;
+	LogFont->lfQuality=DRAFT_QUALITY;
+	LogFont->lfPitchAndFamily=FF_SWISS;
+	lstrcpy(LogFont->lfFaceName,"ＭＳ Ｐゴシック");
+}
+void Project_Window_Insert(void){
+	extern HANDLE hHeap;
+	char temporary[MAX_PATH],temp2[1024];
+
+	if(!DialogBox(hResInst,MAKEINTRESOURCE(IDD_PROJECT_NEWWINDOW),hOwner,(DLGPROC)DlgProject_NewWindow)) return;
+
+	//重複チェック
+	sprintf(temporary,"%s.sbp",NewWindow.name);
+	if(projectInfo.fileSystem.root.IsExistFile(temporary)){
+		sprintf(temp2,"\"%s\" ファイルは既にプロジェクト内に存在します。",temporary);
+		MessageBox(hOwner,temp2,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+		return;
+	}
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, projectInfo.windowInfos )
+	{
+		if(lstrcmpi(NewWindow.name,pWindowInfo->GetName().c_str())==0){
+			//"\"%s\" ウィンドウは既にプロジェクト内に存在します。"
+			sprintf(temporary,STRING_DUPLICATIONERROR_WINDOW_IN_PROJECT,pWindowInfo->GetName().c_str());
+			MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return;
+		}
+	}
+
+	//projectInfo.windowInfos構造体コレクションに追加
+	projectInfo.windowInfos.push_back( new ActiveBasic::PM::WindowInfo() );
+
+
+	///////////////////////////////////////
+	//projectInfo.windowInfos構造体を設定
+
+	//ウィンドウ名
+	projectInfo.windowInfos.back()->SetName( NewWindow.name );
+
+	//位置情報
+	projectInfo.windowInfos.back()->pos.x=-1;
+	projectInfo.windowInfos.back()->pos.y=-1;
+	projectInfo.windowInfos.back()->size.cx=480;
+	projectInfo.windowInfos.back()->size.cy=360;
+
+	//ウィンドウテキスト
+	projectInfo.windowInfos.back()->SetCaption( NewWindow.name );
+
+	//スタイル
+	switch(NewWindow.type){
+		case ActiveBasic::PM::WindowType::Default:
+			//通常ウィンドウ
+			projectInfo.windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX );
+			break;
+		case ActiveBasic::PM::WindowType::ModalDlg:
+		case ActiveBasic::PM::WindowType::ModelessDlg:
+			//ダイアログ テンプレート（最大化、最小化ボタンをなくして、細枠にする）
+			projectInfo.windowInfos.back()->SetStyle( WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU );
+			break;
+	}
+
+	//拡張スタイル
+	projectInfo.windowInfos.back()->SetExStyle( 0 );
+
+	//メニュー
+	projectInfo.windowInfos.back()->SetMenuIdName( "" );
+
+	//背景色
+	projectInfo.windowInfos.back()->SetBackgroundColor( COLOR_3DFACE );
+
+	//フォント
+	GetDefaultWindowFont(&projectInfo.windowInfos.back()->LogFont);
+
+	//アイコン
+	projectInfo.windowInfos.back()->SetIconResourceName( "" );
+
+	//クラス名
+	lstrcpy(temporary,"NORMAL");
+	projectInfo.windowInfos.back()->SetClassName( temporary );
+
+	//タイプ識別
+	projectInfo.windowInfos.back()->SetType( NewWindow.type );
+
+
+
+	//////////////////////////
+	// メッセージ処理ファイル
+	//////////////////////////
+
+	// テンプレートを使ってMainWnd.abを生成する
+	const std::string resultStr = PermutationWndPgmTemplate(
+		ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\new_window_template.sbp",
+		projectInfo.GetName(),
+		(std::string)NewWindow.name,
+		(std::string)"h" + NewWindow.name,
+		(std::string)NewWindow.name + "Proc"
+	);
+
+	sprintf(temporary,"%s%s.ab",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.windowInfos.back()->GetName().c_str());
+
+	//書き込み
+	WriteBuffer(temporary,resultStr.c_str(),resultStr.size());
+	Project_File_Insert(temporary);
+
+
+
+	//////////////////////
+	//ツリービューに追加
+
+	extern HWND hMaterialTreeView;
+	TV_INSERTSTRUCT tv;
+	tv.hInsertAfter=TVI_SORT;
+	tv.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
+	tv.item.iImage=2;
+	tv.item.iSelectedImage=2;
+	tv.hParent=projectInfo.hWindowTreeItem;
+	lstrcpy( temp2, projectInfo.windowInfos.back()->GetName().c_str() );
+	tv.item.pszText = temp2;
+
+	projectInfo.windowInfos.back()->hTreeItem=TreeView_InsertItem(hMaterialTreeView,&tv);
+
+	TreeView_SelectItem(hMaterialTreeView,projectInfo.windowInfos.back()->hTreeItem);
+
+
+	projectInfo.ModifyOfMaterial=1;
+
+	NewRadWindow( *projectInfo.windowInfos.back() );
+}
+void Project_Window_Delete(int WndInfoNum){
+	extern HANDLE hHeap;
+	int i;
+
+	ActiveBasic::PM::WindowInfo *pWindowInfo = projectInfo.windowInfos[WndInfoNum];
+
+	//ウィンドウが開かれている場合は閉じる
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd&&lstrcmpi(pWindowInfo->GetName().c_str(),MdiInfo[i]->path.c_str())==0){
+			SendMessage(MdiInfo[i]->hwnd,WM_CLOSE,0,0);
+			break;
+		}
+	}
+
+	//子ウィンドウのメモリを解放
+	BOOST_FOREACH( ActiveBasic::PM::ChildWindowInfo *pChildWindowInfo, pWindowInfo->childWindowInfos )
+	{
+		delete pChildWindowInfo;
+	}
+	pWindowInfo->childWindowInfos.clear();
+
+	//ツリービューから削除
+	extern HWND hMaterialTreeView;
+	TreeView_DeleteItem(hMaterialTreeView,pWindowInfo->hTreeItem);
+
+	//projectInfo.windowInfos構造体から削除
+	projectInfo.windowInfos.Erase( WndInfoNum );
+
+	projectInfo.ModifyOfMaterial=1;
+}
Index: branches/egtra/ab5.0/abdev/abdev/abdev.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/abdev.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/abdev.cpp	(revision 774)
@@ -0,0 +1,1645 @@
+#include "stdafx.h"
+
+#include "abdev.h"
+
+#ifdef _DEBUG
+#include <crtdbg.h>
+#endif
+
+#if defined HeapAlloc
+#define MEM_MAX 65536
+LPVOID pCheckMem[MEM_MAX];
+int now;
+#undef HeapAlloc
+#undef HeapReAlloc
+LPVOID CheckHeapAlloc(HANDLE hf,DWORD dwFlags,DWORD dwBytes){
+	LPVOID ret;
+	ret=HeapAlloc(hf,dwFlags,dwBytes);
+	pCheckMem[now]=ret;
+
+	//この部分にnowのチェックを挿入
+
+
+	now++;
+	if(now>=MEM_MAX){
+		MessageBox(0,"pCheckMemの最大値を超えました","Check",0);
+	}
+	return ret;
+}
+LPVOID CheckHeapReAlloc(HANDLE hf,DWORD dwFlags,LPVOID lpMem,DWORD dwBytes){
+	int i;
+	LPVOID ret;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX){
+			MessageBox(0,"エラー","CheckHeapReAlloc",0);
+			break;
+		}
+	}
+	ret=HeapReAlloc(hf,dwFlags,lpMem,dwBytes);
+	pCheckMem[i]=ret;
+	return ret;
+}
+void HeapDefaultFree(LPVOID lpMem){
+	int i;
+	for(i=0;;i++){
+		if(lpMem==pCheckMem[i]) break;
+		if(i>=MEM_MAX){
+			MessageBox(0,"エラー","HeapDefaultFree",0);
+			break;
+		}
+	}
+	pCheckMem[i]=0;
+	HeapFree(hHeap,0,lpMem);
+}
+void CheckHeapCheck(){
+	int i,i2;
+	char temp[100];
+	temp[0]=0;
+	for(i=0,i2=0;i<MEM_MAX;i++){
+		if(pCheckMem[i]){
+			sprintf(temp+lstrlen(temp),"%d\r\n",i);
+			i2++;
+			if(i2==10){
+				lstrcat(temp,"これ以上の未解放が確認されています");
+				break;
+			}
+		}
+	}
+	if(temp[0]) MessageBox(0,temp,"Check - BasicCompiler.exe",0);
+}
+#define HeapAlloc CheckHeapAlloc
+#define HeapReAlloc CheckHeapReAlloc
+#else
+void HeapDefaultFree(LPVOID lpMem){
+	HeapFree(hHeap,0,lpMem);
+}
+#endif
+
+#ifdef DeleteObject
+#undef DeleteObject
+BOOL CheckDeleteObject(HGDIOBJ hObject){
+	BOOL bRet;
+	bRet=DeleteObject(hObject);
+
+	if(bRet==0){
+		MessageBox(0,"DeleteObject Error","Check",0);
+	}
+	return bRet;
+}
+#define DeleteObject CheckDeleteObject
+#endif
+
+
+void ToBigChar(char str[]){
+	int i;
+	for(i=0;TRUE;i++){
+		str[i]=(char)toupper((int)str[i]);
+		if(str[i]=='\0') break;
+	}
+}
+int GetWndNum(HWND hChild){
+	int i;
+	if(!IsWindow(hChild)) return -1;
+	for(i=0;i<MdiInfo.size();i++){
+		if(hChild==MdiInfo[i]->hwnd) break;
+	}
+	if(i==MdiInfo.size()) i=-1;
+	return i;
+}
+int GetNowWndNum(void){
+	return GetWndNum(GetWindow(hClient,GW_CHILD));
+}
+int GetFileNum(int WndNum){
+	if( !projectInfo.IsOpened() ){
+		return -1;
+	}
+
+	for(int i=0;i<projectInfo.fileSystem.root.files.size();i++)
+	{
+		if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),projectInfo.fileSystem.root.files[i].GetFullPath().c_str())==0) return i;
+	}
+	return -1;
+}
+
+void SendTextEditResizeEvent(HWND hwnd){
+	RECT rect;
+	GetClientRect(hwnd,&rect);
+	ResizeTextEditWnd(hwnd,rect.right,rect.bottom);
+}
+
+void RedrawAllWindow(void){
+	HWND hChild;
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(hChild) ResetTextEditFont(GetWindow(hChild,GW_CHILD));
+	while(hChild){
+		int WndNum;
+		WndNum=GetWndNum(hChild);
+		if(WndNum==-1) break;
+
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			//コントロールタブスペースの幅と行番号の文字数を更新
+			MdiInfo[WndNum]->pMdiTextEdit->iWidth_ControlTabSpace=
+				GetControlTabSpace(WndNum,&MdiInfo[WndNum]->pMdiTextEdit->iLineNumberTextCount);
+
+			InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->hEdit,NULL,0);
+			InvalidateRect(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,NULL,0);
+
+			SendTextEditResizeEvent(MdiInfo[WndNum]->hwnd);
+		}
+		else{
+			HWND hEdit;
+			hEdit=GetWindow(hChild,GW_CHILD);
+			InvalidateRect(hEdit,NULL,0);
+		}
+
+		hChild=GetWindow(hChild,GW_HWNDNEXT);
+	}
+}
+
+int DocumentModifyCheck(HWND hChild){	//終了保存確認
+	int BoxID,WndNum,sw;
+	char str[MAX_PATH],temporary[MAX_PATH];
+
+	WndNum=GetWndNum(hChild);
+	sw=0;
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ) sw=1;
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		if(MdiInfo[WndNum]->MdiIconEditInfo->bModify) sw=1;
+	}
+
+	if(sw){
+		GetWindowText(hChild,temporary,MAX_PATH);
+
+		//"\"%s\" ファイルは変更されています。保存しますか？"
+		sprintf(str,STRING_MODIFYCHECK_FILE,temporary);
+		BoxID=MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNOCANCEL|MB_ICONINFORMATION);
+
+		if(BoxID==IDYES){
+			if(!SaveDocument(hChild,NULL)) return 0;
+		}
+		else if(BoxID==IDCANCEL) return 0;
+	}
+	return 1;
+}
+void SetStatusText(char *MenuText){
+	//////////////////////////
+	// ステータスバーの更新
+	//////////////////////////
+
+	int WndNum;
+	double BufSize;
+	char temporary[255];
+	HWND hChild;
+
+	if(MenuText){
+		SendMessage(hStatusBar,SB_SETTEXT,0,(LPARAM)MenuText);
+		if((char *)MenuText!=(char *)CmdMsg) CmdMsg[0]=0;
+	}
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	WndNum=GetWndNum(hChild);
+	if(WndNum==-1) return;
+	hChild=GetWindow(hChild,GW_CHILD);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		//////////////////////
+		// テキストエディタ
+		//////////////////////
+
+		//サイズ
+		BufSize=(double)lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer);
+		if(IsWindow(hChild)){
+			if(BufSize<1024) sprintf(temporary,"%s: %.0fByte",STRING_SIZE,BufSize);
+			else if(BufSize<1024*1024){
+				BufSize/=1024;
+				sprintf(temporary,"%s: %.2fKB",STRING_SIZE,BufSize);
+			}
+			else{
+				BufSize/=1024*1024;
+				sprintf(temporary,"%s: %.2fMB",STRING_SIZE,BufSize);
+			}
+		}
+		else temporary[0]=0;
+		SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
+
+		//行と桁
+		if(IsWindow(hChild)){
+#if defined(JPN)
+			//日本語
+			sprintf(temporary,"%d 行、%d 列",
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y+1,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+1);
+#else
+			//英語
+			sprintf(temporary,"%d : %d",
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y+1,
+				MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x+1);
+#endif
+		}
+		else temporary[0]=0;
+		SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
+
+		//文字コード
+		nkf.GetCharCodeName(MdiInfo[WndNum]->pMdiTextEdit->iCharCode,temporary);
+		SendMessage(hStatusBar,SB_SETTEXT,3,(LPARAM)temporary);
+
+		//文字コード
+		nkf.GetLfCodeName(MdiInfo[WndNum]->pMdiTextEdit->iLfCode,temporary);
+		SendMessage(hStatusBar,SB_SETTEXT,4,(LPARAM)temporary);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		////////////////
+		// RADツール
+		////////////////
+
+		ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+		if(RadInfo.NowDragging>=FRAME_CHANGEPOS_START&&RadInfo.NowDragging<=FRAME_CHANGEPOS_END){
+			sprintf(temporary,"pos %d, %d",
+				RadInfo.DraggingRect[0].left-MdiInfo[WndNum]->MdiRadInfo->ClientPos.x,
+				RadInfo.DraggingRect[0].top-MdiInfo[WndNum]->MdiRadInfo->ClientPos.y);
+			SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
+			sprintf(temporary,"size %d * %d",
+				RadInfo.DraggingRect[0].right-RadInfo.DraggingRect[0].left,
+				RadInfo.DraggingRect[0].bottom-RadInfo.DraggingRect[0].top);
+			SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
+		}
+		else if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+			SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"pos 0, 0");
+			sprintf(temporary,"size %d * %d",pWindowInfo->size.cx,pWindowInfo->size.cy);
+			SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
+		}
+		else{
+			sprintf(temporary,"pos %d, %d",
+				pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.x,
+				pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.y);
+			SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)temporary);
+			sprintf(temporary,"size %d * %d",
+				pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cx,
+				pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->size.cy);
+			SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)temporary);
+		}
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+		//////////////////
+		// MENU エディタ
+		//////////////////
+
+		SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
+		SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		//////////////////
+		// ICON エディタ
+		//////////////////
+
+		SendMessage(hStatusBar,SB_SETTEXT,1,(LPARAM)"");
+		SendMessage(hStatusBar,SB_SETTEXT,2,(LPARAM)"");
+	}
+}
+void ResetState_UndoMenu(void){				//「元に戻す、やり直し」のメニュー表示制御
+	int i,i2;
+	HWND hChild;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	i=GetWndNum(hChild);
+	if(i==-1){
+		pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
+		pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_REDO,0);
+	}
+	else if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
+		i2=MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->NowPos-1;
+		if(i2==-1) i2=MAX_UNDONUM-1;
+		if(!MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->Command[i2]){
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
+		}
+		if(!MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->Command[MdiInfo[i]->pMdiTextEdit->pTextEditUndoState->NowPos]){
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,1);
+		}
+	}
+	else if(MdiInfo[i]->DocType==WNDTYPE_RAD){
+		i2=MdiInfo[i]->MdiRadInfo->undo.NowPos-1;
+		if(i2==-1) i2=MAX_UNDONUM-1;
+		if(!MdiInfo[i]->MdiRadInfo->undo.Command[i2]){
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
+		}
+		if(!MdiInfo[i]->MdiRadInfo->undo.Command[MdiInfo[i]->MdiRadInfo->undo.NowPos]){
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,1);
+		}
+	}
+	else if(MdiInfo[i]->DocType==WNDTYPE_MENU){
+		pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
+
+		pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_REDO,0);
+	}
+	else if(MdiInfo[i]->DocType==WNDTYPE_ICONEDIT){
+		i2=MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].NowPos-1;
+		if(i2==-1) i2=MAX_ICONEDIT_UNDONUM-1;
+		if(!MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].lpData[i2]){
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_UNDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_UNDO,1);
+		}
+		if(!MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].lpData[MdiInfo[i]->MdiIconEditInfo->undo[MdiInfo[i]->MdiIconEditInfo->SelectIconNum].NowPos]){
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,0);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_REDO,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_REDO,1);
+		}
+	}
+}
+void ResetState_ConvMenu(BOOL bEnable){
+	int MenuMsg;
+	if(bEnable)
+		MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+	else MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+
+	pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_SMALL,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_ALPHA_BIG,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_HALF,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_MULTI,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_KATAKANA,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_HIRAGANA,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_SPACE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_TAB,MenuMsg);
+#ifdef THETEXT
+	pobj_MainMenu->EnableItem(IDM_CONV_HASRETURN,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CONV_QUOTE,MenuMsg);
+#else
+	pobj_MainMenu->EnableItem(IDM_CODEFORMAT,MenuMsg);
+#endif
+}
+void ResetState_PrintMenu(void);
+void ResetState_EditMenu(void){				//編集メニューの表示制御
+	HWND hChild;
+	int WndNum;
+	long MenuMsg,ToolbarMsg;
+
+	//印刷メニューの状態を設定
+	ResetState_PrintMenu();
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(!IsWindow(hChild)){
+		pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
+#ifdef THETEXT
+		pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
+#endif
+		pobj_StandardToolbar->EnableItem(IDM_FIND,0);
+
+		pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_CUT,0);
+		pobj_StandardToolbar->EnableItem(IDM_COPY,0);
+		pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
+
+		ResetState_ConvMenu(0);
+
+		ResetState_UndoMenu();
+		return;
+	}
+	WndNum=GetWndNum(hChild);
+	if(WndNum==-1) return;
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
+		pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_ENABLED);
+		pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_ENABLED);
+#ifdef THETEXT
+		pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_ENABLED);
+#endif
+		pobj_StandardToolbar->EnableItem(IDM_FIND,1);
+
+		BOOL bConvEnable;
+		hChild=GetWindow(hChild,GW_CHILD);
+		if(!(
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.x&&
+			MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y==MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos.y
+			)){
+			MenuMsg=MF_BYCOMMAND|MF_ENABLED;
+			ToolbarMsg=1;
+
+			bConvEnable=1;
+		}
+		else{
+			MenuMsg=MF_BYCOMMAND|MF_GRAYED;
+			ToolbarMsg=0;
+
+			bConvEnable=0;
+		}
+		pobj_MainMenu->EnableItem(IDM_CUT,MenuMsg);
+		pobj_MainMenu->EnableItem(IDM_COPY,MenuMsg);
+		pobj_MainMenu->EnableItem(IDM_DELETE,MenuMsg);
+		EnableMenuItem(hEditMenu,IDM_CUT,MenuMsg);
+		EnableMenuItem(hEditMenu,IDM_COPY,MenuMsg);
+		EnableMenuItem(hEditMenu,IDM_DELETE,MenuMsg);
+		pobj_StandardToolbar->EnableItem(IDM_CUT,ToolbarMsg);
+		pobj_StandardToolbar->EnableItem(IDM_COPY,ToolbarMsg);
+
+		if(IsClipboardFormatAvailable(CF_TEXT)){
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
+		}
+
+
+		//変換コマンド
+		ResetState_ConvMenu(bConvEnable);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		//検索、置換、文字カウントを無効化
+		pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
+#ifdef THETEXT
+		pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
+#endif
+		pobj_StandardToolbar->EnableItem(IDM_FIND,0);
+
+		if(MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]==SELECT_WINDOW){
+			//切り取り、コピー、削除を有効化
+			pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+			pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+			pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_CUT,0);
+			pobj_StandardToolbar->EnableItem(IDM_COPY,0);
+		}
+		else{
+			//切り取り、コピー、削除を無効化
+			pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
+			pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
+			pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_CUT,1);
+			pobj_StandardToolbar->EnableItem(IDM_COPY,1);
+		}
+
+		//すべて選択を有効化
+		pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
+
+		if(IsClipboardFormatAvailable(dwRadClipboardID)){
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
+		}
+
+		ResetState_ConvMenu(0);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+		//検索、置換、文字カウントを無効化
+		pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
+#ifdef THETEXT
+		pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
+#endif
+		pobj_StandardToolbar->EnableItem(IDM_FIND,0);
+
+		pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+		EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_GRAYED);
+		pobj_StandardToolbar->EnableItem(IDM_CUT,0);
+		pobj_StandardToolbar->EnableItem(IDM_COPY,0);
+		pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
+
+		ResetState_ConvMenu(0);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		//検索、置換、文字カウントを無効化
+		pobj_MainMenu->EnableItem(IDM_FIND,MF_BYCOMMAND|MF_GRAYED);
+		pobj_MainMenu->EnableItem(IDM_PERMUTATION,MF_BYCOMMAND|MF_GRAYED);
+#ifdef THETEXT
+		pobj_MainMenu->EnableItem(IDM_STRING_COUNT,MF_BYCOMMAND|MF_GRAYED);
+#endif
+		pobj_StandardToolbar->EnableItem(IDM_FIND,0);
+
+		if(MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel==0){
+			//切り取り、コピー、削除を無効化
+			pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+			pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+			pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_GRAYED);
+			EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_CUT,0);
+			pobj_StandardToolbar->EnableItem(IDM_COPY,0);
+		}
+		else{
+			//切り取り、コピー、削除を有効化
+			pobj_MainMenu->EnableItem(IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
+			pobj_MainMenu->EnableItem(IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
+			pobj_MainMenu->EnableItem(IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_CUT,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_COPY,MF_BYCOMMAND|MF_ENABLED);
+			EnableMenuItem(hEditMenu,IDM_DELETE,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_CUT,1);
+			pobj_StandardToolbar->EnableItem(IDM_COPY,1);
+		}
+
+		//すべて選択を有効化
+		pobj_MainMenu->EnableItem(IDM_ALLSELECT,MF_BYCOMMAND|MF_ENABLED);
+
+		if(IsClipboardFormatAvailable(CF_BITMAP)){
+			//貼り付けを有効化
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_ENABLED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,1);
+		}
+		else{
+			//貼り付けを無効化
+			pobj_MainMenu->EnableItem(IDM_PASTE,MF_BYCOMMAND|MF_GRAYED);
+			pobj_StandardToolbar->EnableItem(IDM_PASTE,0);
+		}
+
+		ResetState_ConvMenu(0);
+	}
+
+	ResetState_UndoMenu();
+}
+void ResetState_ViewMenu(void){
+	// 表示 メニューの状態を設定
+
+
+#ifdef THETEXT
+	pobj_MainMenu->CheckMenu(IDM_RIGHT_TURN,pobj_nv->bRightTurn);
+#endif
+}
+void ResetState_PrintMenu(void){				//編集メニューの表示制御
+	HWND hChild;
+	int WndNum;
+	hChild=GetWindow(hClient,GW_CHILD);
+	if(!IsWindow(hChild)){
+		pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
+
+		pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
+
+		pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
+		return;
+	}
+	WndNum=GetWndNum(hChild);
+	if( WndNum != -1 )
+	{
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_ENABLED);
+
+			pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_ENABLED);
+
+			pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_ENABLED);
+		}
+		else{
+			pobj_MainMenu->EnableItem(IDM_PAGESET,MF_BYCOMMAND|MF_GRAYED);
+
+			pobj_MainMenu->EnableItem(IDM_PREVIEW,MF_BYCOMMAND|MF_GRAYED);
+
+			pobj_MainMenu->EnableItem(IDM_PRINTOUT,MF_BYCOMMAND|MF_GRAYED);
+		}
+	}
+}
+void ResetState_DocMenu(void){
+	long MenuMsg,ToolbarMsg;
+	HWND hChild;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+
+
+	/////////////////////////////////////////
+	// 共通ドキュメント メニューの状態を設定
+	/////////////////////////////////////////
+
+	if(!IsWindow(hChild)){
+		MenuMsg=MF_GRAYED;
+		ToolbarMsg=0;
+	}
+	else{
+		MenuMsg=MF_ENABLED;
+		ToolbarMsg=1;
+	}
+	pobj_MainMenu->EnableItem(IDM_CLOSE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_SAVE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_NEWSAVE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_CODE_SAVE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_ALLSAVE,MenuMsg);
+
+	pobj_StandardToolbar->EnableItem(IDM_CLOSE,ToolbarMsg);
+	pobj_StandardToolbar->EnableItem(IDM_SAVE,ToolbarMsg);
+	pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,ToolbarMsg);
+
+
+#ifndef THETEXT
+	/////////////////////////////////////////////////
+	// プロジェクトドキュメント メニューの状態を設定
+	/////////////////////////////////////////////////
+
+	if( projectInfo.IsOpened() ){
+		pobj_MainMenu->EnableItem(IDM_ALLSAVE,MF_ENABLED);
+		pobj_StandardToolbar->EnableItem(IDM_ALLSAVE,1);
+
+		MenuMsg=MF_ENABLED;
+		ToolbarMsg=TBSTATE_ENABLED;
+	}
+	else{
+		MenuMsg=MF_GRAYED;
+		ToolbarMsg=TBSTATE_INDETERMINATE;
+	}
+	pobj_MainMenu->EnableItem(IDM_PROJECT_SAVE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_PROJECT_CLOSE,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_PROJECT_FOLDER_OPEN,MenuMsg);
+	pobj_MainMenu->EnableItem(IDM_PROJECT_OPTION,MenuMsg);
+
+	//デバッガ メニューの状態を設定
+	pobj_Debugger->ResetCommandEnabled();
+#endif
+
+
+	//編集メニューの状態を設定
+	ResetState_EditMenu();
+
+	//表示メニューの状態を設定
+	ResetState_ViewMenu();
+}
+void DuplicateTitleCheck(char *lpszTitle){
+	int i;
+	for(i=0;i<MdiInfo.size();i++){
+		if(MdiInfo[i]->hwnd){
+			if(lstrcmpi(MdiInfo[i]->title.c_str(),lpszTitle)==0){
+				lstrcat(lpszTitle,"_");
+				DuplicateTitleCheck(lpszTitle);
+				return;
+			}
+		}
+	}
+}
+
+//たぶんこれでは全然足りない
+inline void PathNormalize(char *buf, size_t bufSize, const char *path)
+{
+	DWORD shortFilepathLen = GetShortPathName(path, buf, bufSize);
+	CharUpper(buf);
+	std::replace(buf, buf + shortFilepathLen, '/', '\\');
+}
+
+BOOL GetFileInformationByHandleWrap(HANDLE hFile, BY_HANDLE_FILE_INFORMATION& fi);
+void SetFileIdentity(FILEIDENTITY &mi, BY_HANDLE_FILE_INFORMATION const &bhfi);
+
+HWND NewTextEditWindow(const char *filepath,_int8 DocumentType,COLORREF TabColor)
+{
+	int i;
+	char str[MAX_PATH],str2[32],*buffer;
+	HWND hChild,hEdit;
+	RECT rect;
+	int iCharCode=NKF_SHIFT_JIS;
+	int iLfCode=LFCODE_CRLF;
+	FILEIDENTITY fileIdentity = {0};
+
+	if(filepath){
+		ATL::CHandle hFile(CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		if(hFile==INVALID_HANDLE_VALUE){
+			hFile.Detach();
+			sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
+			::MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
+			return 0;
+		}
+		DWORD length;
+
+		BY_HANDLE_FILE_INFORMATION fi;
+		if(GetFileInformationByHandleWrap(hFile, fi)){
+			SetFileIdentity(fileIdentity, fi);
+			length=fi.nFileSizeLow;
+		}
+		else{
+			length=GetFileSize(hFile,NULL);
+		}
+
+		//すでに指定されたファイルが開かれている場合
+		hChild=::GetWindow(hClient,GW_CHILD);
+		char shortFilepath[MAX_PATH];
+		PathNormalize(shortFilepath, MAX_PATH, filepath);
+		while(hChild){
+			i=GetWndNum(hChild);
+			if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
+				if(IsFileIdentityValid(fileIdentity)&&IsFileIdentityValid(MdiInfo[i]->FileIdentity)
+					&& fileIdentity==MdiInfo[i]->FileIdentity)
+				{
+					break;
+				}
+				else{
+					char shortPathnameDoc[MAX_PATH];
+					PathNormalize(shortPathnameDoc, MAX_PATH, MdiInfo[i]->path.c_str());
+					if(_strcmpi(shortFilepath,shortPathnameDoc)==0)
+						break;
+				}
+			}
+			hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
+		}
+		if(hChild){
+			//前面に表示して終了
+			::BringWindowToTop(hChild);
+			return hChild;
+		}
+
+
+		//////////////////////////////////////////////////////
+		//ファイル読み込み（正常に読み込めるかの確認も含む）
+		//////////////////////////////////////////////////////
+
+		char *temp=(char *)HeapAlloc(hHeap,0,length+1);
+		DWORD dw;
+		ReadFile(hFile,temp,length,&dw,NULL);
+		for(i=0;i<length;i++){
+			if(temp[i]=='\0') temp[i]=' ';
+		}
+		temp[length]=0;
+
+
+		///////////////////////
+		// 改行コードを判別
+		///////////////////////
+
+		char *temp2;
+		for(i=0;i<length;i++){
+			if(temp[i]=='\r'){
+				if(temp[i+1]=='\n')
+					iLfCode=LFCODE_CRLF;
+				else
+					iLfCode=LFCODE_CR;
+				break;
+			}
+			if(temp[i]=='\n'){
+				iLfCode=LFCODE_LF;
+				break;
+			}
+		}
+
+		//改行コードを変換
+		if(iLfCode==LFCODE_CR||iLfCode==LFCODE_LF){
+			temp2=nkf.ToCRLF(iLfCode,temp);
+			HeapDefaultFree(temp);
+			temp=temp2;
+
+			length=lstrlen(temp);
+		}
+
+
+		/////////////////////
+		// Shift-JISに変換
+		/////////////////////
+
+		buffer=(char *)HeapAlloc(hHeap,0,length*2+1);
+		nkf.pSetNkfOption("-sx");	//Shift-JISに変換（xは半角カタカナを全角に変換しないオプション）
+		nkf.pNkfConvert(buffer,temp);
+		buffer=(char *)HeapReAlloc(hHeap,0,buffer,lstrlen(buffer)+1);
+		HeapDefaultFree(temp);
+
+		//変換前の文字コードを判別
+		iCharCode=nkf.pNkfGetKanjiCode();
+		if(iCharCode<NKF_CODE_MIN||NKF_CODE_MAX<iCharCode){
+			//判別不能な場合は、Shift-JISにする
+			iCharCode=NKF_SHIFT_JIS;
+		}
+		else if(iCharCode==NKF_EUC||iCharCode==NKF_ISO_2022_JP){
+			//EUC、JISの場合で、判別不能な場合は、Shift-JISを優先
+			for(i=0;;i++){
+				if(buffer[i]=='\0'){
+					//半角コードのみ
+					iCharCode=NKF_SHIFT_JIS;
+					break;
+				}
+				if(IsDBCSLeadByte(buffer[i])) break;
+			}
+		}
+
+
+		//////////////////////////
+		// ファイルパスをセット
+		//////////////////////////
+
+		_splitpath(filepath,NULL,NULL,str,str2);
+		lstrcat(str,str2);
+	}
+	else{
+		buffer=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+		extern int DocumentCounter;
+		DocumentCounter++;
+		sprintf(str,"Document[%d]",DocumentCounter);
+	}
+
+	MDICREATESTRUCT mdic;
+	mdic.szClass="MDIClientWindow_TextEdit";
+	mdic.hOwner=hInst;
+	mdic.x=CW_USEDEFAULT;
+	mdic.y=CW_USEDEFAULT;
+	mdic.cx=CW_USEDEFAULT;
+	mdic.cy=CW_USEDEFAULT;
+	mdic.szTitle=str;
+
+	hChild=::GetWindow(hClient,GW_CHILD);
+	if(::IsWindow(hChild)){
+		if(::IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+	else{
+		if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
+		else mdic.style=0;
+	}
+
+	//ファイルアイコンをセット
+	SHFILEINFO shfi;
+	if(filepath)
+		SHGetFileInfo(filepath, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON );
+	else shfi.hIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);;
+	mdic.lParam=(LPARAM)shfi.hIcon;
+
+	mdic.style |= WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
+	hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,reinterpret_cast<LPARAM>(&mdic));	//ウィンドウ作成
+
+	//TextEditorコントロールを設置
+	::GetClientRect(hChild,&rect);
+	hEdit=CreateWindow("TextEditor",NULL,
+		WS_CHILD|WS_HSCROLL|WS_VSCROLL|WS_VISIBLE,
+		0,0,0,0,
+		hChild,NULL,hInst,NULL);
+
+
+	//ウィンドウのID登録
+	MDIINFO *pmi = new MDIINFO();
+	MdiInfo.push_back( pmi );
+	i = MdiInfo.size()-1;
+	pmi->hwnd=hChild;
+	pmi->DocType=DocumentType;
+	DuplicateTitleCheck(str);
+	pmi->title = str;
+	pmi->FileIdentity = fileIdentity;
+	if(filepath)
+	{
+		pmi->path = filepath;
+	}
+	else
+	{
+		pmi->path = "";
+	}
+
+	pmi->pMdiTextEdit = new CMdiTextEdit( MdiInfo[i] );
+
+	pmi->pMdiTextEdit->hEdit=hEdit;
+	pmi->pMdiTextEdit->pobj_WebResult=new CWebResult(hChild);
+	pmi->pMdiTextEdit->pobj_Ruler=new CRuler(hChild,pmi);
+	pmi->pMdiTextEdit->hIcon=shfi.hIcon;
+	pmi->pMdiTextEdit->buffer=buffer;
+	pmi->pMdiTextEdit->pColorRef=(COLORREF *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(COLORREF)*lstrlen(buffer));
+	pmi->pMdiTextEdit->iUnderStart=-1;
+	pmi->pMdiTextEdit->iUnderEnd=-1;
+	pmi->pMdiTextEdit->StartCaretPos.x=0;
+	pmi->pMdiTextEdit->StartCaretPos.y=0;
+	pmi->pMdiTextEdit->EndCaretPos.x=0;
+	pmi->pMdiTextEdit->EndCaretPos.y=0;
+	pmi->pMdiTextEdit->Temp_UpDown_CaretXPos=-1;
+	pmi->pMdiTextEdit->bAutoScroll=0;
+	pmi->pMdiTextEdit->iWidth_ControlTabSpace=
+		GetControlTabSpace(i,&pmi->pMdiTextEdit->iLineNumberTextCount);
+	pmi->pMdiTextEdit->iCharCode=iCharCode;
+	pmi->pMdiTextEdit->iLfCode=iLfCode;
+	pmi->IndentStr=0;
+
+
+	int flag;
+	if(mdic.style&WS_MAXIMIZE) flag=SIZE_MAXIMIZED;
+	else flag=0;
+	SendTextEditResizeEvent(hChild);
+
+
+	//ワードカラーをセット
+	if(IS_DOCUMENT_TEXT(DocumentType)) SetTextEditWordColor(MdiInfo.size()-1);
+
+	//Docコンボボックスに追加
+	extern HWND hDocCombo;
+	if( hDocCombo )
+	{
+		i=SendMessage(hDocCombo,CB_ADDSTRING,0,(LPARAM)str);
+		SendMessage(hDocCombo,CB_SETCURSEL,i,0);
+	}
+
+	//タブに追加
+	pobj_MainTab->InsertItem( hChild, str, true, TabColor );
+
+	::SetFocus(hEdit);
+	SetStatusText(NULL);
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+
+	if( DocumentType == WNDTYPE_BASIC && !projectInfo.IsOpened() ){
+		// 単体ソースコードを開いたとき
+		extern HWND hProjectView;
+		if( !::IsWindowVisible( hProjectView ) ){
+			// クラスビューを表示する
+			SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
+			ShowClassView();
+
+			// クラスビューを更新
+			ResetClassTree((HTREEITEM)-1);
+		}
+	}
+	UpdateWindow(hChild);
+	return hChild;
+}
+void CloseDocWindow(int WndNum){
+	int i2,i3;
+
+	MdiInfo[WndNum]->hwnd=0;
+
+	//ドキュメントコンボボックスから文字列を消去
+	extern HWND hDocCombo;
+	i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[WndNum]->title.c_str());
+	SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
+
+	//タブコントロールからアイテムを消去
+	if(pobj_MainTab) pobj_MainTab->DeleteItem( MdiInfo[WndNum]->title.c_str(), true );
+
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		////////////////////////////
+		// テキストエディタを閉じる
+		////////////////////////////
+
+		extern COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+		if(ComplementWndInfo.hWnd){
+			//コード補完リストを破棄する
+			DestroyWindow(ComplementWndInfo.hWnd);
+			ComplementWndInfo.hWnd=0;
+		}
+
+		HeapDefaultFree(MdiInfo[WndNum]->pMdiTextEdit->buffer);
+		HeapDefaultFree(MdiInfo[WndNum]->pMdiTextEdit->pColorRef);
+
+		if(MdiInfo[WndNum]->IndentStr) HeapDefaultFree(MdiInfo[WndNum]->IndentStr);
+
+		//エディットコントロールを破棄
+		DestroyWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit);
+
+		//Web検索ウィンドウを破棄
+		delete MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult;
+		MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult=0;
+
+		//ルーラーウィンドウを破棄
+		delete MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler;
+		MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler=0;
+
+		//アイコンを破棄
+		if(MdiInfo[WndNum]->pMdiTextEdit->hIcon) DestroyIcon(MdiInfo[WndNum]->pMdiTextEdit->hIcon);
+
+		delete MdiInfo[WndNum]->pMdiTextEdit;
+		MdiInfo[WndNum]->pMdiTextEdit=0;
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		/////////////////////
+		// RADツールを閉じる
+		/////////////////////
+
+		for(i2=0;i2<MAX_UNDONUM;i2++){
+			if(MdiInfo[WndNum]->MdiRadInfo->undo.Command[i2])
+				Rad_DeleteUndoData(WndNum,i2);
+		}
+		DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hTools);
+		DestroyWindow(MdiInfo[WndNum]->MdiRadInfo->hRad);
+		SelectObject(MdiInfo[WndNum]->MdiRadInfo->hMemDC,MdiInfo[WndNum]->MdiRadInfo->hOldBitmap);
+		DeleteDC(MdiInfo[WndNum]->MdiRadInfo->hMemDC);
+		DeleteObject(MdiInfo[WndNum]->MdiRadInfo->hBitmap);
+		GlobalFree(MdiInfo[WndNum]->MdiRadInfo);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+		////////////////////////////
+		// メニューエディタを閉じる
+		////////////////////////////
+
+		DestroyWindow(MdiInfo[WndNum]->MdiMenuInfo->hList);
+		GlobalFree(MdiInfo[WndNum]->MdiMenuInfo);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		////////////////////////////
+		// アイコンエディタを閉じる
+		////////////////////////////
+
+		for(i2=0;i2<MdiInfo[WndNum]->MdiIconEditInfo->num;i2++){
+			for(i3=0;i3<MAX_ICONEDIT_UNDONUM;i3++){
+				if(MdiInfo[WndNum]->MdiIconEditInfo->undo[i2].lpData[i3])
+					HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->undo[i2].lpData[i3]);
+			}
+		}
+
+		DeleteDC(MdiInfo[WndNum]->MdiIconEditInfo->memdc);
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hMemBmp);
+		DestroyWindow(MdiInfo[WndNum]->MdiIconEditInfo->hMain);
+		for(i2=0;i2<MdiInfo[WndNum]->MdiIconEditInfo->num;i2++){
+			HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo->pIconImage[i2]);
+		}
+		HeapDefaultFree(MdiInfo[WndNum]->MdiIconEditInfo);
+	}
+	else
+	{
+		throw;
+	}
+
+	delete MdiInfo[WndNum];
+	Jenga::Common::EraseVectorItem<std::vector<MDIINFO *>>( MdiInfo, WndNum );
+}
+void ResizeTextEditWnd(HWND hwnd,int cx,int cy){
+	int WndNum;
+	WndNum=GetWndNum(hwnd);
+	if(WndNum==-1) return;
+
+	int WebResultWndHeight;
+	WebResultWndHeight=LINK_ITEM_HEIGHT;
+	//未完成
+	WebResultWndHeight=0;
+
+	int iHeightRuler;
+	if(pobj_nv->bEditor_Ruler){
+		//ルーラー
+		MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->resize(
+			0,
+			0,
+			cx,
+			HEIGHT_RULER);
+
+		iHeightRuler=HEIGHT_RULER;
+
+		ShowWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_SHOW);
+	}
+	else{
+		iHeightRuler=0;
+
+		ShowWindow(MdiInfo[WndNum]->pMdiTextEdit->pobj_Ruler->hRulerWnd,SW_HIDE);
+	}
+
+	//エディットウィンドウ
+	MoveWindow(MdiInfo[WndNum]->pMdiTextEdit->hEdit,
+		0,
+		iHeightRuler,
+		cx,
+		cy-WebResultWndHeight-iHeightRuler,
+		1);
+
+	//Web検索ウィンドウ
+	MdiInfo[WndNum]->pMdiTextEdit->pobj_WebResult->resize(
+		0,
+		cy-WebResultWndHeight,
+		cx,
+		WebResultWndHeight);
+}
+
+LRESULT CALLBACK MDIClientWindow_TextEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	int i,i2;
+	HWND hEdit;
+
+	switch(message){
+		case WM_CREATE:
+			{
+				CREATESTRUCT *lpcs = (CREATESTRUCT *)lParam;
+				MDICREATESTRUCT *lpmcs = (MDICREATESTRUCT *)lpcs->lpCreateParams;
+				SendMessage(hwnd,WM_SETICON,ICON_SMALL,lpmcs->lParam);
+
+				break;
+			}
+		case WM_MDIACTIVATE:
+			{
+				//以前のMDIウィンドウのパラメータ ヒントを破棄する
+				if(MethodCheckInfo.hWnd){
+					DestroyWindow(MethodCheckInfo.hWnd);
+					MethodCheckInfo.hWnd=0;
+				}
+
+				//以前のコード補完リストを破棄する
+				if(ComplementWndInfo.hWnd){
+					DestroyWindow(ComplementWndInfo.hWnd);
+					ComplementWndInfo.hWnd=0;
+				}
+
+				if(!lParam) return 0;
+				i=GetWndNum((HWND)lParam);
+				if(i==-1) return 0;	//ウィンドウが初期状態の場合
+
+#ifndef THETEXT
+				//デバッガ メニューの状態を設定
+				pobj_Debugger->ResetCommandEnabled();
+#endif
+
+				//ドキュメント セレクト コンボボックス
+				extern HWND hDocCombo;
+				i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LPARAM)MdiInfo[i]->title.c_str());
+				SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
+
+				//タブコントロール
+				pobj_MainTab->MdiActiveEvent(MdiInfo[i]->title.c_str());
+
+				if( !projectInfo.IsOpened() ){
+					ResetClassTree((HTREEITEM)-1);
+				}
+				return 0;
+			}
+		case WM_SETFOCUS:
+			hEdit=GetWindow(hwnd,GW_CHILD);
+			SetFocus(hEdit);
+			SetStatusText(CmdMsg);
+			ResetState_EditMenu();
+			ResetState_ViewMenu();
+			break;
+		case WM_SIZE:
+			ResizeTextEditWnd(hwnd,LOWORD(lParam),HIWORD(lParam));
+			break;
+		case WM_CLOSE:
+			if(!DocumentModifyCheck(hwnd)) return 0;
+			CloseDocWindow(GetWndNum(hwnd));
+			pobj_nv->bMDIZoomed=IsZoomed(hwnd);
+			i=DefMDIChildProc(hwnd,message,wParam,lParam);
+
+			//メニュー状態を設定
+			ResetState_DocMenu();
+
+			return i;
+	}
+	return DefMDIChildProc(hwnd,message,wParam,lParam);
+}
+
+WNDPROC oldMainFrameWndProc;
+LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	char str[MAX_PATH];
+	RECT rect;
+	POINT pos;
+
+	if(message==WM_COMMAND&&IS_FILEHISTORY_COMMAND(LOWORD(wParam))){
+		//「最近使ったファイル」メニューコマンド
+		lstrcpy(str,pobj_nv->pobj_History->lpszPath[LOWORD(wParam)-100]);
+		OpenFileWithExtension(str);
+		return 0;
+	}
+
+	if(message==WM_COMMAND&&200<=LOWORD(wParam)&&LOWORD(wParam)<=299){
+		//「最近使ったプロジェクト」メニューコマンド
+		lstrcpy(str,pobj_nv->pobj_ProjectHistory->lpszPath[LOWORD(wParam)-200]);
+		OpenFileWithExtension(str);
+		return 0;
+	}
+
+	switch(message)
+	{
+#ifndef THETEXT
+		case WM_SETCOMPILEVIEW:
+			//コンパイラウィンドウ（埋め込み型）が表示されたとき
+			hCompileView=(HWND)lParam;
+			ActiveBasic::IDE::Program::mainFrame.Resized();
+			return 0;
+		case WM_DESTROYCOMPILEVIEW:
+			//コンパイラウィンドウ（埋め込み型）が破棄されたとき
+			if((LONG_PTR)hCompileView==-1){
+				//すぐに次のコンパイラウィンドウが起動するとき
+				hCompileView=0;
+			}
+			else{
+				//完全にコンパイラウィンドウを閉じたときはリサイズ
+				hCompileView=0;
+
+				ActiveBasic::IDE::Program::mainFrame.Resized();
+			}
+			return 0;
+
+		case WM_SETDEBUGGERBASE:
+			//デバッガベースウィンドウ（埋め込み型）が表示されたとき
+			pobj_Debugger->begin();
+
+			//BasicCompiler.exeの強制終了を考慮
+			SetTimer(hOwner,ID_DEBUGSAFTY,1000,NULL);
+
+			return 0;
+		case WM_DESTROYDEBUGGERBASE:
+			//BasicCompiler.exeの強制終了を考慮
+			KillTimer(hOwner,ID_DEBUGSAFTY);
+
+			//デバッガベースウィンドウ（埋め込み型）が破棄されたとき
+			pobj_Debugger->end();
+
+			return 0;
+
+		case WM_SETDEBUGGERVIEW:
+			//デバッガウィンドウ（埋め込み型）が表示されたとき
+			pobj_Debugger->watch_start((HWND)lParam);
+			ActiveBasic::IDE::Program::mainFrame.Resized();
+			return 0;
+		case WM_DESTROYDEBUGGERVIEW:
+			//デバッガウィンドウ（埋め込み型）が破棄されたとき
+			pobj_Debugger->watch_quit();
+			ActiveBasic::IDE::Program::mainFrame.Resized();
+			return 0;
+#endif
+
+
+		case WM_MOUSEMOVE:
+			static DWORD dwDragLever;
+			static POINT PrevMousePos;
+			static int start;
+
+			pos.x=GET_X_LPARAM(lParam);
+			pos.y=GET_Y_LPARAM(lParam);
+			ClientToScreen(hwnd,&pos);
+
+			if(dwDragLever){
+				GetClientRect(hwnd,&rect);
+
+				if(dwDragLever==1){
+					//プロジェクトビューをリサイズ中
+					pobj_nv->width_ClipProjectView=start+pos.x-PrevMousePos.x;
+					if(pobj_nv->width_ClipProjectView<100) pobj_nv->width_ClipProjectView=100;
+					if(rect.right-100<pobj_nv->width_ClipProjectView) pobj_nv->width_ClipProjectView=rect.right-100;
+				}
+				else if(dwDragLever==2){
+					//デバッガビューをリサイズ中
+					pobj_nv->height_ClipDebuggerView=start+PrevMousePos.y-pos.y;
+					if(pobj_nv->height_ClipDebuggerView<60) pobj_nv->height_ClipDebuggerView=60;
+					if(rect.bottom-100<pobj_nv->height_ClipCompileView+pobj_nv->height_ClipDebuggerView)
+						pobj_nv->height_ClipDebuggerView=rect.bottom-100-pobj_nv->height_ClipCompileView;
+				}
+				else if(dwDragLever==3){
+					//コンパイラビューをリサイズ中
+					pobj_nv->height_ClipCompileView=start+PrevMousePos.y-pos.y;
+					if(pobj_nv->height_ClipCompileView<60) pobj_nv->height_ClipCompileView=60;
+					if(rect.bottom-100<pobj_nv->height_ClipCompileView)
+						pobj_nv->height_ClipCompileView=rect.bottom-100;
+				}
+				else if(dwDragLever==4){
+					//SideWebをリサイズ中
+					pobj_nv->width_WebSearchView=start+PrevMousePos.x-pos.x;
+					if(pobj_nv->width_WebSearchView<100) pobj_nv->width_WebSearchView=100;
+					if(rect.right-100<pobj_nv->width_WebSearchView) pobj_nv->width_WebSearchView=rect.right-100;
+				}
+
+				ActiveBasic::IDE::Program::mainFrame.Resized();
+				UpdateWindow(hwnd);
+			}
+			if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
+				//プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(hProjectView,&rect);
+				if(rect.top<=pos.y&&pos.y<=rect.bottom&&
+					rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
+					SetCursor(LoadCursor(0,IDC_SIZEWE));
+				}
+			}
+#ifndef THETEXT
+			if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
+				//デバッガビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(pobj_Debugger->hwnd,&rect);
+				if(rect.left<=pos.x&&pos.x<=rect.right&&
+					rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
+					SetCursor(LoadCursor(0,IDC_SIZENS));
+				}
+			}
+			if(bClipCompileView&&IsWindowVisible(hCompileView)){
+				//コンパイラビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(hCompileView,&rect);
+				if(rect.left<=pos.x&&pos.x<=rect.right&&
+					rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
+					SetCursor(LoadCursor(0,IDC_SIZENS));
+				}
+			}
+#endif
+			if( pobj_SideWeb )
+			{
+				if(pobj_SideWeb->bShow){
+					//SideWebとMDIクライアントの境目のサイズ変更ライン
+					pobj_SideWeb->GetRect(&rect);
+					ClientToScreen(hwnd,&rect);
+					if(rect.top<=pos.y&&pos.y<=rect.bottom&&
+						rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
+						SetCursor(LoadCursor(0,IDC_SIZEWE));
+					}
+				}
+			}
+			return 0;
+		case WM_LBUTTONDOWN:
+			pos.x=GET_X_LPARAM(lParam);
+			pos.y=GET_Y_LPARAM(lParam);
+			ClientToScreen(hwnd,&pos);
+
+			if(pobj_nv->bClipProjectView&&IsWindowVisible(hProjectView)){
+				//プロジェクトビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(hProjectView,&rect);
+				if(rect.top<=pos.y&&pos.y<=rect.bottom&&
+					rect.right<=pos.x&&pos.x<=rect.right+LEVER_THICK){
+					SetCursor(LoadCursor(0,IDC_SIZEWE));
+
+					dwDragLever=1;
+					SetCapture(hwnd);
+
+					PrevMousePos=pos;
+					start=pobj_nv->width_ClipProjectView;
+				}
+			}
+#ifndef THETEXT
+			if(bClipCompileView&&pobj_Debugger->IsDebuggerView()){
+				//デバッガビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(pobj_Debugger->hwnd,&rect);
+				if(rect.left<=pos.x&&pos.x<=rect.right&&
+					rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
+					SetCursor(LoadCursor(0,IDC_SIZENS));
+
+					dwDragLever=2;
+					SetCapture(hwnd);
+
+					PrevMousePos=pos;
+					start=pobj_nv->height_ClipDebuggerView;
+				}
+			}
+			if(bClipCompileView&&IsWindowVisible(hCompileView)){
+				//コンパイラビューとMDIクライアントの境目のサイズ変更ライン
+				GetWindowRect(hCompileView,&rect);
+				if(rect.left<=pos.x&&pos.x<=rect.right&&
+					rect.top-LEVER_THICK<=pos.y&&pos.y<=rect.top){
+					SetCursor(LoadCursor(0,IDC_SIZENS));
+
+					dwDragLever=3;
+					SetCapture(hwnd);
+
+					PrevMousePos=pos;
+					start=pobj_nv->height_ClipCompileView;
+				}
+			}
+#endif
+			if( pobj_SideWeb && pobj_SideWeb->bShow){
+				//SideWebとMDIクライアントの境目のサイズ変更ライン
+				pobj_SideWeb->GetRect(&rect);
+				ClientToScreen(hwnd,&rect);
+				if(rect.top<=pos.y&&pos.y<=rect.bottom&&
+					rect.left-LEVER_THICK<=pos.x&&pos.x<=rect.left){
+					SetCursor(LoadCursor(0,IDC_SIZENS));
+
+					dwDragLever=4;
+					SetCapture(hwnd);
+
+					PrevMousePos=pos;
+					start=pobj_nv->width_WebSearchView;
+				}
+			}
+			return 0;
+		case WM_LBUTTONUP:
+			if(dwDragLever){
+				dwDragLever=0;
+				ReleaseCapture();
+			}
+			return 0;
+
+
+		case WM_SYSCOMMAND:
+			//ウィンドウの最小化前にウィンドウ位置を保存
+			if(wParam==SC_MINIMIZE){
+				if(IsZoomed(hwnd)) pobj_nv->bWindowMax=1;
+				else if(!IsIconic(hwnd)){
+					pobj_nv->bWindowMax=0;
+					GetWindowRect(hwnd,&pobj_nv->StartupWindowRect);
+				}
+			}
+			break;	//処理をDefFrameProcへ
+	}
+
+	return CallWindowProc( oldMainFrameWndProc, hwnd, message, wParam, lParam );
+}
+
+int RegWndClass(WNDPROC WndProc,char *lpClassName,HBRUSH hBackBrush,DWORD dwFlag){
+	WNDCLASSEX wcl;
+
+	wcl.cbSize=sizeof(WNDCLASSEX);
+	wcl.hInstance=hInst;
+	wcl.lpszClassName=lpClassName;
+	wcl.lpfnWndProc=WndProc;
+
+	if(dwFlag&FLAG_DBLCLK) wcl.style=CS_DBLCLKS;
+	else wcl.style=0;
+
+	wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
+	wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO);
+
+	if(dwFlag&FLAG_BEAMCURSOR) wcl.hCursor=LoadCursor(NULL,IDC_IBEAM);
+	else wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
+
+	wcl.lpszMenuName=NULL;
+	wcl.cbClsExtra=0;
+	wcl.cbWndExtra=0;
+	wcl.hbrBackground=hBackBrush;
+
+	return RegisterClassEx(&wcl);
+}
+int PASCAL WinMain(HINSTANCE hThisInst,HINSTANCE,LPSTR lpCmdLine,int ShowCmd){
+#ifdef _DEBUG
+	_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+#endif
+	int i,i2,IsStr;
+	char str[MAX_PATH],str2[MAX_PATH],dummy[1024];
+	MSG msg;
+	HACCEL hAccel;
+
+	ActiveBasic::Common::EnableNX();
+	ActiveBasic::Common::SetHeapOptions();
+
+	hInst=hThisInst;
+	if(!SetupProjectEditor()) return 0;
+
+	HBRUSH hGrayBrush_LineNumber;
+	hGrayBrush_LineNumber=CreateSolidBrush(RGB(220,220,220));
+
+	//if(!RegWndClass(WindowFunc,"ProjectEditorClass",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MDIClientWindow_TextEdit,"MDIClientWindow_TextEdit",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MethodCheckWindow,"MethodCheckWindow",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MDIClientWindow_Rad,"MDIClientWindow_Rad",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(RadToolsWindow,"RadToolsWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(RadPropertyWindow,"RadPropertyWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(RadWindow,"RadWindow",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(TestWindowProc,"TestWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MDIClientWindow_Menu,"MDIClientWindow_Menu",(HBRUSH)GetStockObject(WHITE_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MenuEditWindow,"MenuEditWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(MDIClientWindow_IconEdit,"MDIClientWindow_IconEdit",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(IconEditWindowProc,"IconEditWindowProc",(HBRUSH)GetStockObject(WHITE_BRUSH),0)) return 0;
+	if(!RegWndClass(ProjectViewProc,"ProjectView",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(ProjectView_ToolWindowProc,"ProjectView_ToolWindow",h3DFaceBackBrush,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(TextEditProc,"TextEditor",(HBRUSH)GetStockObject(NULL_BRUSH),FLAG_DBLCLK|FLAG_BEAMCURSOR)) return 0;
+	if(!RegWndClass(ComplementWindow,"ComplementWindow",(HBRUSH)GetStockObject(BLACK_BRUSH),FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(PreviewWndProc,"PreviewWindow",(HBRUSH)GetStockObject(GRAY_BRUSH),FLAG_DBLCLK)) return 0;
+
+	//Web検索用のウィンドウクラス
+	if(!RegWndClass(WebResultWndProc,"WebResult",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(OneTabProc,"OneTab",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+	if(!RegWndClass(ResultListProc,"ResultList",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+
+	//ルーラーのウィンドウクラス
+	if(!RegWndClass(RulerProc,"Ruler",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+
+	//SideWebのウィンドウクラス
+	if(!RegWndClass(SideWebProc,"SideWeb",(HBRUSH)COLOR_APPWORKSPACE+1,FLAG_DBLCLK)) return 0;
+
+	ActiveBasic::IDE::Program::Main(hThisInst);
+
+	//return 0;
+
+
+	hAccel=LoadAccelerators(hResInst,MAKEINTRESOURCE(IDR_ACCELERATOR1));
+
+	//メインウィンドウ
+	RECT *prc;
+	prc=&pobj_nv->StartupWindowRect;
+	/*
+	hOwner=CreateWindowEx(WS_EX_ACCEPTFILES,"ProjectEditorClass",APPLICATION_NAME,
+		WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
+		prc->left, prc->top,
+		prc->right-prc->left, prc->bottom-prc->top,
+		HWND_DESKTOP,pobj_MainMenu->hMenu,hInst,NULL);
+		*/
+
+	//バックアップ用タイマーを設定（10秒に一回）
+	SetTimer(hOwner,ID_TIMER_BACKUP,10000,NULL);
+
+	SendMessage(hOwner,WM_SETICON,ICON_SMALL,(LPARAM)hOwnerIcon);
+	SetClipboardViewer(hOwner);
+
+	if(pobj_nv->bWindowMax) ShowWindow(hOwner,SW_MAXIMIZE);
+	else ShowWindow(hOwner,ShowCmd);
+	UpdateWindow(hOwner);
+
+	int open_sw=0;
+	if(lstrlen(lpCmdLine)>0){
+		lstrcpy(dummy,lpCmdLine);
+		for(i=0,i2=0,IsStr=0;;i++,i2++){
+			if(dummy[i]=='\"'){
+				if(IsStr==0) IsStr=1;
+				else IsStr=0;
+				i++;
+			}
+			if((dummy[i]==' '&&IsStr==0)||dummy[i]=='\0'){
+				str[i2]=0;
+				if(!(strstr(str,":")||strstr(str,"\\\\"))){
+					lstrcpy(str2,str);
+					GetCurrentDirectory(MAX_PATH,str);
+					lstrcat(str,"\\");
+					lstrcat(str,str2);
+				}
+				ShortPathToLongPath(str,str2);
+				OpenFileWithExtension(str2);
+				open_sw=1;
+				if(dummy[i]=='\0') break;
+				i2=-1;
+				continue;
+			}
+			str[i2]=dummy[i];
+		}
+	}
+
+	BOOL bRestore=0;
+
+
+	{
+		//自動バックアップ及び復元機能
+
+		//必要であれば復元
+		bRestore=restore();
+	}
+
+
+#ifdef THETEXT
+	if(open_sw==0&&bRestore==0){
+		//ファイルが開かれなかったとき
+		NewTextEditWindow(NULL,WNDTYPE_TEXT);
+	}
+#endif
+
+
+	while(GetMessage(&msg,NULL,0,0)){
+
+		if(!TranslateAccelerator(hOwner,hAccel,&msg)){
+			if( projectInfo.IsOpened() ){
+				for(i=0,i2=0;i<MdiInfo.size();i++){
+					if(MdiInfo[i]->hwnd&&MdiInfo[i]->DocType==WNDTYPE_RAD){
+						if(IsDialogMessage(MdiInfo[i]->MdiRadInfo->hProp_Dlg,&msg)) i2=1;
+					}
+				}
+				if(i2==0){
+					if(!TranslateMDISysAccel(hClient,&msg)){
+						TranslateMessage(&msg);
+						DispatchMessage(&msg);
+					}
+				}
+			}
+			else{
+				if(!TranslateMDISysAccel(hClient,&msg)){
+					TranslateMessage(&msg);
+					DispatchMessage(&msg);
+				}
+			}
+		}
+	}
+
+	DeleteObject(hGrayBrush_LineNumber);
+
+#if defined HeapAlloc
+	CheckHeapCheck();
+#endif
+
+	return static_cast<int>(msg.wParam);
+}
Index: branches/egtra/ab5.0/abdev/abdev/abdev.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/abdev.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/abdev.h	(revision 774)
@@ -0,0 +1,109 @@
+#include "Common.h"
+
+#ifdef JPN
+//日本語
+
+#ifdef THETEXT
+LPSTR DefFileFilter="テキスト ファイル(*.txt)\0*.txt\0HTMLファイル(*.htm;*html)\0*.htm;*html\0CGIファイル(*.cgi;*.pl)\0*.cgi;*.pl\0PHPファイル(*.php)\0*.php\0テンプレート ファイル(*.tpl)\0*.tpl\0すべてのファイル(*.*)\0*\0\0";
+#else
+LPSTR DefFileFilter="プログラム ファイル(*.ab;*.abp;*.bas;*.sbp)\0*.ab;*.abp;*.bas;*sbp\0プロジェクト(*.pj)\0*.pj\0テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+#endif
+
+LPSTR HtmlFileFilter="HTMLファイル(*.html;*.htm)\0*.html;*.htm\0すべてのファイル(*.*)\0*\0\0";
+LPSTR TextFileFilter="テキスト ファイル(*.txt)\0*.txt\0すべてのファイル(*.*)\0*\0\0";
+
+LPSTR ProjectFileFilter="プロジェクト(*.pj)\0*.pj\0\0";
+LPSTR BitmapFileFilter="ビットマップ(*.bmp)\0*.bmp\0\0";
+LPSTR IconFileFilter="アイコン(*.ico)\0*.ico\0\0";
+LPSTR CursorFileFilter="カーソル(*.cur)\0*.cur\0\0";
+
+LPSTR ExeFileFilter="実行可能ファイル(*.exe)\0*.exe\0\0";
+
+#else
+//英語
+LPSTR DefFileFilter="Program files (*.ab;*.abp;*.bas;*.sbp)\0*.ab;*.abp;*.bas;*sbp\0Project templates (*.pj)\0*.pj\0Text files (*.txt)\0*.txt\0All files(*.*)\0*\0\0";
+LPSTR ProjectFileFilter="Project templates (*.pj)\0*.pj\0\0";
+LPSTR BitmapFileFilter="Bitmap files (*.bmp)\0*.bmp\0\0";
+LPSTR IconFileFilter="Icon files (*.ico)\0*.ico\0\0";
+LPSTR CursorFileFilter="Cursor files (*.cur)\0*.cur\0\0";
+#endif
+
+HINSTANCE hInst,hResInst,hIconResInst;
+HANDLE hHeap;
+HFONT hStatusFont;
+HFONT hHyperLinkFont;
+HFONT hFont_LineNumber;
+HFONT hRulerFont;
+SIZE sizeLineNumberFont;
+HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
+HBRUSH h3DFaceBackBrush;
+DWORD dwRadClipboardID;
+ActiveBasic::Common::Platform::EnumType selectingPlatform = ActiveBasic::Common::Platform::X86;
+
+FWINLAYER pSetLayeredWindowAttributes;
+HINSTANCE hUser32Lib;
+
+/* 各ウィンドウ */
+HWND hOwner;					//オーナーウィンドウ
+HWND hClient;					//MDIクライアントウィンドウ
+HWND hStatusBar;				//ステータスバー
+std::vector<MDIINFO *> MdiInfo;	//MDIドキュメントウィンドウ情報
+
+/* メニュー */
+HMENU hFirstMainMenu;
+HMENU hEditMenuBase,hEditMenu;
+HMENU hRebarMenuBase,hRebarMenu;
+HMENU hTabMenuBase,hTabMenu,hTabColorMenu;
+HMENU hFileTreeMenuBase;
+HMENU hProcedureTreeMenuBase;
+HMENU hMaterialTreeMenuBase;
+HMENU hRadMenuBase;
+CSubMenuEx *pobj_FileHistoryMenu;
+#ifndef THETEXT
+CSubMenuEx *pobj_ProjectHistoryMenu;
+#endif
+
+
+//エディタ文字情報
+METHODCHECKINFO MethodCheckInfo;
+COMPLEMENT_WINDOW_INFO ComplementWndInfo;
+
+//プロジェクト情報
+NEWPROJECTINFO NewProjectInfo;
+ActiveBasic::PM::Project projectInfo;
+HWND hProjectView;		//プロジェクト ビュー
+HWND hProjectView_ToolWindow;
+
+// リソース関連
+HTREEITEM hCursorTreeItemForProjectView;
+HTREEITEM hBitmapTreeItemForProjectView;
+HTREEITEM hIconTreeItemForProjectView;
+
+//コンパイラビュー情報
+HWND hCompileView;
+BOOL bClipCompileView=1;
+
+//RADツール情報
+RADINFO RadInfo;
+HWND hTools;			//コントロール挿入用のツールウィンドウ
+
+//不揮発性データ（レジストリに保存される）
+CNonVolatile *pobj_nv;
+
+TEXTEDIT_COLOR_INFO tci;
+
+int ScreenX,ScreenY;
+int DocumentCounter;
+_int8 IsCheckLineColor;
+
+char pj_editor_Dir[MAX_PATH];
+char CmdMsg[255];
+char NewIdName[MAX_PATH];
+char NewFileName[MAX_PATH];	//新規作成ダイアログのプロジェクト追加用
+char *pHeaderBuf;
+char *pUserSource=0;
+
+
+
+//Break point
+CDBBreakPoint *pobj_DBBreakPoint;
Index: branches/egtra/ab5.0/abdev/abdev/abdev.rc
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/abdev.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/abdev.rc	(revision 774)
@@ -0,0 +1,143 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+#if defined(APSTUDIO_INVOKED) || defined(PROJECTEDITOR)
+#if defined(APSTUDIO_INVOKED)
+IDI_MAIN$(PROJECTEDITOR) ICON    DISCARDABLE     "icon1.ico"
+#else
+IDI_MAIN                ICON    DISCARDABLE     "icon1.ico"
+#endif
+#endif
+IDI_BASICPROGRAM        ICON    DISCARDABLE     "BasicProgram.ico"
+IDI_TEXTDOCUMENT        ICON    DISCARDABLE     "TextDocument.ico"
+IDI_FOLDER_CLOSE        ICON    DISCARDABLE     "folder_close.ico"
+IDI_FOLDER_OPEN         ICON    DISCARDABLE     "folder_open.ico"
+IDI_WINDOW              ICON    DISCARDABLE     "Window.ico"
+IDI_PROCEDURE           ICON    DISCARDABLE     "Procedure.ico"
+IDI_FILE_PJ             ICON    DISCARDABLE     "file_pj.ico"
+IDI_FILE_BAS            ICON    DISCARDABLE     "file_bas.ico"
+IDI_FILE_SBP            ICON    DISCARDABLE     "file_sbp.ico"
+IDI_FILE_ICON           ICON    DISCARDABLE     "file_icon.ico"
+IDI_FILE_BMP            ICON    DISCARDABLE     "file_bmp.ico"
+IDI_FILE_CURSOR         ICON    DISCARDABLE     "ico00001.ico"
+#if defined(APSTUDIO_INVOKED) || defined(THETEXT)
+#if defined(APSTUDIO_INVOKED)
+IDI_MAIN$(THETEXT)      ICON    DISCARDABLE     "main.ico"
+#else
+IDI_MAIN                ICON    DISCARDABLE     "main.ico"
+#endif
+#endif
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 5,0,0,5
+ PRODUCTVERSION 5,0,0,5
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "041104b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "activebasic.com\0"
+            VALUE "FileDescription", "ActiveBasic\0"
+            VALUE "FileVersion", "5, 0, 0, 5\0"
+            VALUE "InternalName", "abdev\0"
+            VALUE "LegalCopyright", "Copyright (C) 2008 activebasic.com\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "abdev.exe\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "ActiveBasic\0"
+            VALUE "ProductVersion", "5, 0, 0, 5\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x411, 1200
+    END
+END
+
+#endif    // !_MAC
+
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/abdev/abdev.vcproj
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/abdev.vcproj	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/abdev.vcproj	(revision 774)
@@ -0,0 +1,2891 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="abdev"
+	ProjectGUID="{DC1B787E-510F-4F7D-8F9A-182600904D83}"
+	RootNamespace="ProjectEditor"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="TheText_Release|Win32"
+			OutputDirectory=".\Release(TheText)"
+			IntermediateDirectory=".\Release(TheText)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\ProjectEditor___Win32_TheText_Release/ProjectEditor.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs;..\..\cpplibs\boost;..\..\cpplibs\WTL80\include;.\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN;THETEXT;WINVER=0x0501;_WIN32_WINNT=0x0501;TIXML_USE_STL"
+				StringPooling="false"
+				RuntimeLibrary="0"
+				EnableFunctionLevelLinking="false"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile="$(IntDir)\$(ProjectName).pch"
+				AssemblerListingLocation="$(IntDir)\"
+				ObjectFile="$(IntDir)\"
+				ProgramDataBaseFileName="$(IntDir)\"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="JPN,THETEXT"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib imagehlp.lib tinyxml_STL.lib"
+				OutputFile="../TheText/TheText.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				DelayLoadDLLs="DWMAPI.DLL"
+				ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(IntDir)\$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)"
+			IntermediateDirectory=".\Debug(abdev)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\ProjectEditor___Win32_AB_Debug/ProjectEditor.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs;..\..\cpplibs\boost;..\..\cpplibs\WTL80\include;.\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;WINVER=0x0501;_WIN32_WINNT=0x0501;TIXML_USE_STL"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile="$(IntDir)\$(ProjectName).pch"
+				AssemblerListingLocation="$(IntDir)\"
+				ObjectFile="$(IntDir)\"
+				ProgramDataBaseFileName="$(IntDir)\"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="JPN,PROJECTEDITOR"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NXCOMPAT /DYNAMICBASE"
+				AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib imagehlp.lib tinyxmld_STL.lib"
+				OutputFile="$(OutDir)\abdev.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				DelayLoadDLLs="DWMAPI.DLL"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(IntDir)\$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)"
+			IntermediateDirectory=".\Release(abdev)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\ProjectEditor___Win32_AB_Release/ProjectEditor.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs;..\..\cpplibs\boost;..\..\cpplibs\WTL80\include;.\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN;WINVER=0x0501;_WIN32_WINNT=0x0501;TIXML_USE_STL"
+				StringPooling="true"
+				RuntimeLibrary="0"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile="$(IntDir)\$(ProjectName).pch"
+				AssemblerListingLocation="$(IntDir)\"
+				ObjectFile="$(IntDir)\"
+				ProgramDataBaseFileName="$(IntDir)\"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="JPN,PROJECTEDITOR"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NXCOMPAT /DYNAMICBASE /SAFESEH"
+				AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib imagehlp.lib tinyxml_STL.lib"
+				OutputFile="$(OutDir)\abdev.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				DelayLoadDLLs="DWMAPI.DLL"
+				ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(IntDir)\$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="TheText_Debug|Win32"
+			OutputDirectory=".\Debug(TheText)"
+			IntermediateDirectory=".\Debug(TheText)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\ProjectEditor___Win32_TheText_Debug/ProjectEditor.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs;..\..\cpplibs\boost;..\..\cpplibs\WTL80\include;.\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;THETEXT;WINVER=0x0501;_WIN32_WINNT=0x0501;TIXML_USE_STL"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile="$(IntDir)\$(ProjectName).pch"
+				AssemblerListingLocation="$(IntDir)\"
+				ObjectFile="$(IntDir)\"
+				ProgramDataBaseFileName="$(IntDir)\"
+				BrowseInformation="1"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="JPN,THETEXT"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="odbc32.lib odbccp32.lib comctl32.lib imm32.lib htmlhelp.lib rpcrt4.lib imagehlp.lib tinyxmld_STL.lib"
+				OutputFile="../TheText/TheText.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				DelayLoadDLLs="DWMAPI.DLL"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile="$(IntDir)\$(ProjectName).pdb"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(IntDir)\$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{87835C33-64C9-4BA5-9B39-608BA5394387}"
+			RelativePathToProject=".\ab_common\ab_common.vcproj"
+		/>
+		<ProjectReference
+			ReferencedProjectIdentifier="{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+			RelativePathToProject="..\jenga\projects\jenga\jenga.vcproj"
+		/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<Filter
+				Name="Window Components"
+				>
+				<Filter
+					Name="PartialManager"
+					>
+					<File
+						RelativePath=".\src\WindowComponents\PartialManager\TextEditPartialManager.cpp"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="CodeEditor"
+					>
+					<File
+						RelativePath=".\src\WindowComponents\CodeEditor\Syntax.cpp"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="old"
+				>
+				<File
+					RelativePath=".\abdev.cpp"
+					>
+				</File>
+				<File
+					RelativePath="Backup.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="DialogBoxes.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="DocumentAdvice.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="FileOperation.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="History.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath=".\stdafx.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="1"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="SubOperation.cpp"
+					>
+					<FileConfiguration
+						Name="TheText_Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="TheText_Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<Filter
+					Name="RADエディタ"
+					>
+					<File
+						RelativePath="DrawWindow.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="MessageCallOperation.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Rad_UndoRedo.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="RadProc.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="RadSupport.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="RadToolsAndPropertyProc.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="アイコンエディタ"
+					>
+					<File
+						RelativePath="IconEditor.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="IconEditor_Color.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="IconEditor_Main.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="IconEditor_Tool.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="IconEditor_UndoRedo.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="コンパイラ・デバッガ通信"
+					>
+					<File
+						RelativePath="Attach.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Attach.h"
+						>
+					</File>
+					<File
+						RelativePath="Debugger.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Debugger.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="テキストエディタ"
+					>
+					<File
+						RelativePath="Caret.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="DrawBuffer.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Print.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Replace.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Search.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="TextEditor.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="TextEditor_UndoRedo.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<Filter
+						Name="イベントプロシージャ"
+						>
+						<File
+							RelativePath="TextEditor_EventProc.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="TextEditor_ImeEvent.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="TextEditor_KeyEvent.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="TextEditor_MouseEvent.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="コード解析(Basic)"
+						>
+						<File
+							RelativePath="analysis.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath=".\CodeFormatter.cpp"
+							>
+						</File>
+						<File
+							RelativePath="Complement.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="EndPairCommandComplement.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="ParameterHint.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="コード解析(HTML)"
+						>
+						<File
+							RelativePath="HtmlAnalysis.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="HtmlAnalysis.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="文字コード変換"
+						>
+						<File
+							RelativePath="nkf_class.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="nkf_class.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="Web検索"
+						>
+						<File
+							RelativePath="CIEsink.h"
+							>
+						</File>
+						<File
+							RelativePath="WebSearch.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="WebSearch.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="文字カウント"
+						>
+						<File
+							RelativePath="StringCount.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="ルーラー"
+						>
+						<File
+							RelativePath="Ruler.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="Ruler.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="正規表現"
+						>
+						<File
+							RelativePath="BREGEXP.H"
+							>
+						</File>
+						<File
+							RelativePath="reg_exp.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="MDIクライアント管理クラス"
+						>
+						<File
+							RelativePath=".\MdiTextEdit.cpp"
+							>
+						</File>
+						<File
+							RelativePath=".\MdiTextEdit.h"
+							>
+						</File>
+					</Filter>
+				</Filter>
+				<Filter
+					Name="プロジェクト解析"
+					>
+					<File
+						RelativePath="ProjectControl.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Resource.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="WindowControl.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<Filter
+						Name="クラスビュー"
+						>
+						<File
+							RelativePath="CClassInfo.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="ClassTree.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="ファイルビュー"
+						>
+						<File
+							RelativePath="FileTree.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="FileTree.h"
+							>
+						</File>
+					</Filter>
+				</Filter>
+				<Filter
+					Name="メニューエディタ"
+					>
+					<File
+						RelativePath="MenuProc.cpp"
+						>
+						<FileConfiguration
+							Name="TheText_Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="TheText_Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="全般"
+					>
+					<Filter
+						Name="デザイン テーマ"
+						>
+						<File
+							RelativePath="DesignTheme.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="DesignTheme.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="関連付け"
+						>
+						<File
+							RelativePath="ExtensionLink.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="ExtensionLink.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="タブコントロール"
+						>
+						<File
+							RelativePath="TabCtrl.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="TabCtrl.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="レバーコントロール"
+						>
+						<File
+							RelativePath="ChildWndOnRebar.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="rebar.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+					</Filter>
+					<Filter
+						Name="メニューコントロール"
+						>
+						<File
+							RelativePath="menu.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="menu.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="LuxCtrl"
+						>
+						<File
+							RelativePath="LuxCtrl.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="LuxCtrl.h"
+							>
+						</File>
+					</Filter>
+					<Filter
+						Name="ユーザーデータ"
+						>
+						<File
+							RelativePath="NonVolatile.cpp"
+							>
+							<FileConfiguration
+								Name="TheText_Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="Release|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+							<FileConfiguration
+								Name="TheText_Debug|Win32"
+								>
+								<Tool
+									Name="VCCLCompilerTool"
+									PreprocessorDefinitions=""
+								/>
+							</FileConfiguration>
+						</File>
+						<File
+							RelativePath="NonVolatile.h"
+							>
+						</File>
+					</Filter>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath=".\src\MainFrame.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\Program.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\WindowAreaManager.cpp"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="ProjectManager"
+				>
+				<File
+					RelativePath=".\src\ProjectManager\FileManager.cpp"
+					>
+				</File>
+				<File
+					RelativePath=".\src\ProjectManager\ProjectManager.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath=".\abdev.h"
+				>
+			</File>
+			<File
+				RelativePath="Common.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<Filter
+				Name="言語対応文字列"
+				>
+				<Filter
+					Name="RAD"
+					>
+					<File
+						RelativePath="rad_msg_eng.h"
+						>
+					</File>
+					<File
+						RelativePath="rad_msg_jpn.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="一般"
+					>
+					<File
+						RelativePath="common_msg_eng.h"
+						>
+					</File>
+					<File
+						RelativePath="common_msg_jpn.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="プロジェクト管理"
+					>
+					<File
+						RelativePath="pj_msg_eng.h"
+						>
+					</File>
+					<File
+						RelativePath="pj_msg_jpn.h"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath=".\include\MainFrame.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\Program.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowAreaManager.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowCollection.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="WindowComponents"
+				>
+				<File
+					RelativePath=".\include\WindowComponents\BaseWindow.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowComponents\DockingWindow.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowComponents\MdiChild.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowComponents\MdiWindow.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\WindowComponents\TextView.h"
+					>
+				</File>
+				<Filter
+					Name="PartialManager"
+					>
+					<File
+						RelativePath=".\include\WindowComponents\PartialManager\PartialManager.h"
+						>
+					</File>
+					<File
+						RelativePath=".\include\WindowComponents\PartialManager\TextEditPartialManager.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="MdiChildFrame"
+					>
+				</Filter>
+				<Filter
+					Name="CodeEditor"
+					>
+					<File
+						RelativePath=".\include\WindowComponents\CodeEditor\Syntax.h"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="ProjectManager"
+				>
+				<File
+					RelativePath=".\include\ProjectManager\FileManager.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\ProjectManager\ProjectManager.h"
+					>
+				</File>
+				<File
+					RelativePath=".\include\ProjectManager\WindowManager.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="リソースファイル"
+			>
+			<File
+				RelativePath=".\abdev.rc"
+				>
+			</File>
+			<File
+				RelativePath="BasicProgram.ico"
+				>
+			</File>
+			<File
+				RelativePath="file_bas.ico"
+				>
+			</File>
+			<File
+				RelativePath="file_bmp.ico"
+				>
+			</File>
+			<File
+				RelativePath="file_icon.ico"
+				>
+			</File>
+			<File
+				RelativePath="file_pj.ico"
+				>
+			</File>
+			<File
+				RelativePath="file_sbp.ico"
+				>
+			</File>
+			<File
+				RelativePath="folder_close.ico"
+				>
+			</File>
+			<File
+				RelativePath="folder_open.ico"
+				>
+			</File>
+			<File
+				RelativePath="ico00001.ico"
+				>
+			</File>
+			<File
+				RelativePath="icon1.ico"
+				>
+			</File>
+			<File
+				RelativePath="Procedure.ico"
+				>
+			</File>
+			<File
+				RelativePath="TextDocument.ico"
+				>
+			</File>
+			<File
+				RelativePath="Window.ico"
+				>
+			</File>
+		</Filter>
+		<File
+			RelativePath="main.ico"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: branches/egtra/ab5.0/abdev/abdev/analysis.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/analysis.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/analysis.cpp	(revision 774)
@@ -0,0 +1,768 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType){
+	extern int cp;
+	int i,i2,i3;
+	char cPare_Open,cPare_Close;
+
+	array[0]=0;
+	array2[0]=0;
+	NestMember[0]=0;
+	*pRefType=0;
+	for(i=0;;i++){
+		if(buffer[i]=='\"'){
+			for(i++;;i++){
+				if(IsDBCSLeadByte(buffer[i])){
+					i++;
+					continue;
+				}
+				if(buffer[i]=='\"') break;
+			}
+		}
+		if(buffer[i]=='['||buffer[i]=='('){
+			if(buffer[i]=='['){
+				cPare_Open='[';
+				cPare_Close=']';
+			}
+			else{
+				cPare_Open='(';
+				cPare_Close=')';
+			}
+			buffer[i]=0;
+			for(i++,i2=0;;i++,i2++){
+				if(buffer[i]==cPare_Open){
+					if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buffer+i);
+					else i3=GetStringInPare(array+i2,buffer+i);
+					i+=i3-1;
+					i2+=i3-1;
+					continue;
+				}
+				if(buffer[i]==cPare_Close){
+					array[i2]=0;
+					break;
+				}
+				array[i2]=buffer[i];
+			}
+			if(buffer[i+1]==cPare_Open){
+				for(i+=2,i2=0;;i++,i2++){
+					if(buffer[i]==cPare_Open){
+						if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i);
+						else i3=GetStringInPare(array2+i2,buffer+i);
+						i+=i3-1;
+						i2+=i3-1;
+						continue;
+					}
+					if(buffer[i]==cPare_Close){
+						array2[i2]=0;
+						break;
+					}
+					array2[i2]=buffer[i];
+				}
+				if(buffer[i+1]==cPare_Open){
+					return 0;
+				}
+			}
+			continue;
+		}
+		if(buffer[i]=='.'){
+			lstrcpy(NestMember,buffer+i+1);
+			*pRefType=DEF_OBJECT;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]=='-'&&buffer[i+1]=='>'){
+			lstrcpy(NestMember,buffer+i+2);
+			*pRefType=DEF_PTR_OBJECT;
+			buffer[i]=0;
+			break;
+		}
+		if(buffer[i]=='\0') break;
+	}
+	return 1;
+}
+
+int GetTypeFixed(char *TypeName){
+	if(lstrcmpi(TypeName,"Double")==0)			return DEF_DOUBLE;
+	else if(lstrcmpi(TypeName,"Single")==0)		return DEF_SINGLE;
+	else if(lstrcmpi(TypeName,"DWORD")==0)		return DEF_DWORD;
+	else if(lstrcmpi(TypeName,"Long")==0)		return DEF_LONG;
+	else if(lstrcmpi(TypeName,"WORD")==0)		return DEF_WORD;
+	else if(lstrcmpi(TypeName,"Integer")==0)	return DEF_INTEGER;
+	else if(lstrcmpi(TypeName,"Byte")==0)		return DEF_BYTE;
+	else if(lstrcmpi(TypeName,"String")==0)		return DEF_STRING;
+	else if(lstrcmpi(TypeName,"Any")==0)		return DEF_ANY;
+	else if(lstrcmpi(TypeName,"VoidPtr")==0)	return DEF_PTR_VOID;
+	else if(TypeName[0]=='*'){
+		if(TypeName[1]=='*') return DEF_LONG;
+		else return DEF_PTR_OBJECT;
+	}
+	return DEF_OBJECT;
+}
+
+
+
+//////////////////////////////////////////////////////////////
+// ここから、クラス、構造体の即席構文解析を行うための関数郡
+//////////////////////////////////////////////////////////////
+
+BOOL CheckReferType(char *ClassName,BOOL bArray,char *VarArray,int VarRefType){
+	int type;
+
+	type=GetTypeFixed(ClassName);
+	if(!(type==DEF_OBJECT||type==DEF_PTR_OBJECT)) return 0;
+
+
+	//文字"*"を取り除く
+	if(type==DEF_PTR_OBJECT) SlideString(ClassName+1,-1);
+
+	if(type==DEF_OBJECT){
+		//実体オブジェクトを参照するとき
+
+		//配列のチェック
+		if(bArray){
+			if(VarArray[0]=='\0') return 0;
+		}
+		if(VarArray[0]){
+			if(!bArray) return 0;
+		}
+
+		if(type!=VarRefType) return 0;
+	}
+	else if(type==DEF_PTR_OBJECT){
+		//ポインタが示すオブジェクトを参照するとき
+
+		if(bArray){
+			if(VarArray[0]=='\0'||VarRefType==DEF_OBJECT) return 0;
+		}
+		else{
+			if(VarRefType==DEF_OBJECT){
+				//"."参照
+				if(VarArray[0]=='\0') return 0;
+			}
+			else{
+				//"->"参照
+				if(VarArray[0]) return 0;
+			}
+		}
+	}
+
+	return 1;
+}
+
+BOOL GetOriginalClassNameFromBuf(char *pBuf,char *ClassName){
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		if(memicmp(pBuf+i,"TypeDef",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')){
+			i+=8;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=pBuf[i];
+			}
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			if(pBuf[i]=='='){
+				if(lstrcmp(temporary,ClassName)==0){
+					//TypeDef宣言の型名が一致したとき
+					i++;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+					for(i2=0;;i++,i2++){
+						if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){
+							temporary[i2]=0;
+							break;
+						}
+						temporary[i2]=pBuf[i];
+					}
+
+					lstrcpy(ClassName,temporary);
+					return 1;
+				}
+			}
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				if(i2==2) i++;
+				break;
+			}
+		}
+
+		if(pBuf[i]=='\0') break;
+	}
+	return 0;
+}
+void GetOriginalClassName(char *ClassName){
+	extern char *pHeaderBuf;
+	extern char *pUserSource;
+	BOOL bRet;
+	int i;
+
+	do{
+		for(i=0;;i++){
+			if(ClassName[i]!='*') break;
+		}
+
+		//ユーザーソースコードからTypeDef宣言をサーチ
+		bRet=GetOriginalClassNameFromBuf(pUserSource,ClassName+i);
+		if(!bRet){
+			//basic.sbpからTypeDef宣言をサーチ
+			bRet=GetOriginalClassNameFromBuf(pHeaderBuf,ClassName+i);
+		}
+	}while(bRet);
+}
+
+int GetClassPos(char *pBuf,char *ClassName,DWORD *pdwClassType){
+	////////////////////////////////////////////////////////
+	// pBuf内からClassNameと一致するクラスの定義位置を取得
+	////////////////////////////////////////////////////////
+
+	int i,i2;
+	char temporary[VN_SIZE];
+
+	for(i=0;;i++){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')||
+			memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')||
+			memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){
+
+			if(pBuf[i]=='c'||pBuf[i]=='C'){
+				//Class
+				i+=6;
+				*pdwClassType=ESC_CLASS;
+			}
+			else if(pBuf[i]=='i'||pBuf[i]=='I'){
+				//Interface
+				i+=10;
+				*pdwClassType=ESC_INTERFACE;
+			}
+			else{
+				//Type
+				i+=5;
+				*pdwClassType=ESC_TYPE;
+			}
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=pBuf[i];
+			}
+			if(lstrcmp(temporary,ClassName)==0){
+				//クラス名が一致したとき
+
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+				break;
+			}
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				if(i2==2) i++;
+				break;
+			}
+		}
+
+		if(pBuf[i]=='\0') break;
+	}
+
+	return i;
+}
+BOOL GetClassNameFromClassMember(char *pBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray){
+	//////////////////////////////////////////////////////
+	// クラス内のメンバ変数のタイプ型であるクラス名の取得
+	//////////////////////////////////////////////////////
+
+	int i,i2;
+	char temporary[8192];
+	DWORD dwProc;
+
+	i=iPos;
+
+	while(1){
+		temporary[0]=0;
+		if(pBuf[i]=='\0') break;
+		if(memicmp(pBuf+i,"End",3)==0){
+			/*	End Class
+				End Interface
+				End Type
+				の検出 */
+			i2=i+3;
+			while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
+
+			if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
+				memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
+				memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break;
+		}
+
+		if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
+			memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
+			memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
+			//メンバ関数のとき
+
+			if(pBuf[i]=='a'||pBuf[i]=='A'){
+				i+=9;
+				dwProc=ESC_ABSTRACT;
+			}
+			else{
+
+				if(pBuf[i]=='v'||pBuf[i]=='V'){
+					i+=8;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				}
+				else if(pBuf[i]=='o'||pBuf[i]=='O'){
+					i+=9;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+				}
+
+				if(pBuf[i]=='f'||pBuf[i]=='F'){
+					i+=9;
+					dwProc=ESC_FUNCTION;
+				}
+				else if(pBuf[i]=='s'||pBuf[i]=='S'){
+					i+=4;
+					dwProc=ESC_SUB;
+				}
+			}
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+		else{
+			//メンバ変数のとき
+			dwProc=0;
+		}
+
+		//変数名または関数名を取得
+		for(i2=0;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		if(dwProc==0){
+			if(lstrcmp(temporary,VarName)==0) break;
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			if(pBuf[i]=='\0') break;
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				i+=i2;
+				break;
+			}
+		}
+		JumpBlank(pBuf,&i);
+
+		if(dwProc){
+			//Abstract定義以外はEnd Sub、End Functionをサーチする
+			if(dwProc==ESC_ABSTRACT) continue;
+
+			while(1){
+				if(pBuf[i]=='\0') break;
+
+				if(memicmp(pBuf+i,"End",3)==0){
+					/*	End Sub
+						End Function
+						の検出 */
+					i+=3;
+					while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+					if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
+						memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))) break;
+				}
+
+				//次の行をサーチ
+				for(;;i++){
+					if(pBuf[i]=='\0') break;
+					i2=IsCommandDelimitation(pBuf,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pBuf,&i);
+			}
+
+			//次の行をサーチ
+			for(;;i++){
+				if(pBuf[i]=='\0') break;
+				i2=IsCommandDelimitation(pBuf,i);
+				if(i2){
+					i+=i2;
+					break;
+				}
+			}
+			JumpBlank(pBuf,&i);
+		}
+	}
+
+	*pbArray=0;
+	if(temporary[0]){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		if(pBuf[i]=='['){
+			*pbArray=1;
+			for(i2=1,i++;;i++){
+				if(pBuf[i]=='\0') break;
+				if(pBuf[i]=='[') i2++;
+				if(pBuf[i]==']'){
+					i2--;
+					if(i2==0){
+						i++;
+						break;
+					}
+				}
+			}
+		}
+		if(pBuf[i]=='('){
+			*pbArray=1;
+			for(i2=1,i++;;i++){
+				if(pBuf[i]=='\0') break;
+				if(pBuf[i]=='(') i2++;
+				if(pBuf[i]==')'){
+					i2--;
+					if(i2==0){
+						i++;
+						break;
+					}
+				}
+			}
+		}
+
+		//"As ～" を解析
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		if(memicmp(pBuf+i,"As",2)==0&&(pBuf[i+2]==' '||pBuf[i+2]=='\t')){
+			i+=3;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){
+					ClassName[i2]=0;
+					break;
+				}
+				ClassName[i2]=pBuf[i];
+			}
+		}
+		else ClassName[0]=0;
+
+		return 1;
+	}
+	return 0;
+}
+
+void GetCodeAreaType(char *pBuf,int iPos,int *piProcPos,char *NowClass){
+	///////////////////////////////////////////////
+	// コード領域（グローバル/ローカル）を判定する
+	//    ローカル領域のときはpiProcPosに関数の位置を格納する
+	//    クラス定義内のときはNowClassにクラス名を格納する
+	///////////////////////////////////////////////
+	int i,i2;
+
+	*piProcPos=-1;
+	for(i=0;;i++){
+		if(i>=iPos) break;
+
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')||
+			memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')||
+			memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){
+			//Class、Interface、Type
+			if(pBuf[i]=='c'||pBuf[i]=='C') i+=6;
+			else if(pBuf[i]=='i'||pBuf[i]=='I') i+=10;
+			else i+=5;
+
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			for(i2=0;;i++,i2++){
+				if(!IsVariableChar(pBuf[i])){
+					NowClass[i2]=0;
+					break;
+				}
+				NowClass[i2]=pBuf[i];
+			}
+		}
+		else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')||
+			memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
+			//Sub、Function
+
+			*piProcPos=i;
+		}
+		else if(memicmp(pBuf+i,"End",3)==0){
+			i+=3;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+			if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
+				memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
+				//End Sub、End Function
+				*piProcPos=-1;
+			}
+			else if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
+				memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
+				memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
+				//End Class、End Interface、End Type
+				NowClass[0]=0;
+			}
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			i2=IsCommandDelimitation(pBuf,i);
+			if(i2){
+				if(i2==2) i++;
+				break;
+			}
+		}
+
+		if(pBuf[i]=='\0') break;
+	}
+}
+BOOL GetClassNameFromDim(char *pBuf,int *piPos,char *VarName,char *ClassName,BOOL *pbArray){
+	int i,i2;
+	char temporary[8192];
+
+	i=*piPos;
+
+	while(1){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+
+		if((memicmp(pBuf+i,"ByRef",5)==0||memicmp(pBuf+i,"ByVal",5)==0)&&
+			(pBuf[i+5]==' '||pBuf[i+5]=='\t')){
+			//ByRef/ByVal表記を飛び越す
+			i+=6;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		}
+
+		for(i2=0;;i++,i2++){
+			if(!IsVariableChar(pBuf[i])){
+				temporary[i2]=0;
+				break;
+			}
+			temporary[i2]=pBuf[i];
+		}
+
+		if(lstrcmp(temporary,VarName)==0) break;
+
+		for(;;i++){
+			if(IsCommandDelimitation(pBuf,i)) break;
+			if(pBuf[i]==','){
+				i++;
+				break;
+			}
+		}
+
+		if(IsCommandDelimitation(pBuf,i)){
+			temporary[0]=0;
+			break;
+		}
+	}
+
+	*pbArray=0;
+	if(temporary[0]){
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		if(pBuf[i]=='['){
+			*pbArray=1;
+			for(i2=1,i++;;i++){
+				if(pBuf[i]=='\0') break;
+				if(pBuf[i]=='[') i2++;
+				if(pBuf[i]==']'){
+					i2--;
+					if(i2==0){
+						i++;
+						break;
+					}
+				}
+			}
+		}
+
+		//"As ～" を解析
+		while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+		if(memicmp(pBuf+i,"As",2)==0&&(pBuf[i+2]==' '||pBuf[i+2]=='\t')){
+			i+=3;
+			while(pBuf[i]==' '||pBuf[i]=='\t') i++;
+			for(i2=0;;i++,i2++){
+				if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){
+					ClassName[i2]=0;
+					break;
+				}
+				ClassName[i2]=pBuf[i];
+			}
+		}
+		else ClassName[0]=0;
+
+		*piPos=i;
+		return 1;
+	}
+
+	*piPos=i;
+	return 0;
+}
+BOOL GetVariableClassName(char *pEditBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray){
+	//////////////////////////////////////////
+	// 変数宣言コードをもとに、クラス名を取得
+	//////////////////////////////////////////
+
+	extern char *pHeaderBuf;
+	extern char *pUserSource;
+	int i,i2;
+	char NowClass[VN_SIZE];
+
+
+	// キャレット位置のコード領域を判定（クラス/ローカル/グローバル）
+	int iProcPos;
+	GetCodeAreaType(pEditBuf,iPos,&iProcPos,NowClass);
+
+
+	//////////////////////////////////////////
+	// 変数宣言コードをもとに、クラス名を取得
+	//////////////////////////////////////////
+
+	if(iProcPos!=-1){
+		//ローカル領域
+		i=iProcPos;
+
+		//関数パラメータをサーチ
+		for(;;i++){
+			if(pEditBuf[i]=='('){
+				i++;
+				if(GetClassNameFromDim(pEditBuf,&i,VarName,ClassName,pbArray)) return 1;
+			}
+
+			i2=IsCommandDelimitation(pEditBuf,i);
+			if(i2){
+				if(pEditBuf[i]=='\0') break;
+				i+=i2;
+				break;
+			}
+		}
+
+		//関数内ソースコードをサーチ
+		for(;;i++){
+			while(pEditBuf[i]==' '||pEditBuf[i]=='\t') i++;
+
+			if(memicmp(pEditBuf+i,"End",3)==0){
+				i+=3;
+				while(pEditBuf[i]==' '||pEditBuf[i]=='\t') i++;
+
+				if(memicmp(pEditBuf+i,"Sub",3)==0&&(!IsVariableChar(pEditBuf[i+3]))||
+					memicmp(pEditBuf+i,"Function",8)==0&&(!IsVariableChar(pEditBuf[i+3]))){
+					break;
+				}
+			}
+			else if(memicmp(pEditBuf+i,"Dim",3)==0&&(pEditBuf[i+3]==' '||pEditBuf[i+3]=='\t')){
+				i+=3;
+
+				if(GetClassNameFromDim(pEditBuf,&i,VarName,ClassName,pbArray)) return 1;
+			}
+			for(;;i++){
+				i2=IsCommandDelimitation(pEditBuf,i);
+				if(i2){
+					if(i2==2) i++;
+					break;
+				}
+			}
+
+			if(pEditBuf[i]=='\0') break;
+		}
+	}
+
+	if(NowClass[0]&&iProcPos!=-1){
+		//クラスメンバ関数領域
+		DWORD dwClassType;
+		char *pBuf;
+		i=GetClassPos(pUserSource,NowClass,&dwClassType);
+		if(pUserSource[i]=='\0'){
+			i=GetClassPos(pHeaderBuf,NowClass,&dwClassType);
+			if(pHeaderBuf[i]=='\0') pBuf=0;
+			else pBuf=pHeaderBuf;
+		}
+		else pBuf=pUserSource;
+
+		if(pBuf){
+			i=GetClassNameFromClassMember(pBuf,i,VarName,ClassName,pbArray);
+			if(i) return 1;
+		}
+	}
+
+	//グローバル領域
+	for(i=0;;i++){
+		while(pUserSource[i]==' '||pUserSource[i]=='\t') i++;
+
+		if(memicmp(pUserSource+i,"Dim",3)==0&&(pUserSource[i+3]==' '||pUserSource[i+3]=='\t')){
+			i+=3;
+
+			if(GetClassNameFromDim(pUserSource,&i,VarName,ClassName,pbArray)) return 1;
+		}
+
+		else if(memicmp(pUserSource+i,"Sub",3)==0&&(pUserSource[i+3]==' '||pUserSource[i+3]=='\t')||
+			memicmp(pUserSource+i,"Function",8)==0&&(pUserSource[i+8]==' '||pUserSource[i+8]=='\t')){
+			//Sub ～ End Sub、Function ～ End Function間を飛び越す
+			while(1){
+				//次の行をサーチ
+				for(;;i++){
+					if(pUserSource[i]=='\0') break;
+					i2=IsCommandDelimitation(pUserSource,i);
+					if(i2){
+						i+=i2;
+						break;
+					}
+				}
+				JumpBlank(pUserSource,&i);
+
+				if(pUserSource[i]=='\0') break;
+
+				if(memicmp(pUserSource+i,"End",3)==0){
+					/*	End Sub
+						End Function
+						の検出 */
+					i+=3;
+					while(pUserSource[i]==' '||pUserSource[i]=='\t') i++;
+
+					if(memicmp(pUserSource+i,"Sub",3)==0&&(!IsVariableChar(pUserSource[i+3]))||
+						memicmp(pUserSource+i,"Function",8)==0&&(!IsVariableChar(pUserSource[i+8]))) break;
+				}
+			}
+		}
+
+		//次の行をサーチ
+		for(;;i++){
+			i2=IsCommandDelimitation(pUserSource,i);
+			if(i2){
+				if(i2==2) i++;
+				break;
+			}
+		}
+
+		if(pUserSource[i]=='\0') break;
+	}
+
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/common_msg_eng.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/common_msg_eng.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/common_msg_eng.h	(revision 774)
@@ -0,0 +1,88 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 英語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_NONE_				"None"
+#define STRING_DEFAULT			"Default"
+#define STRING_ERROR			"Error"
+#define STRING_PROJECT			"Project"
+#define STRING_RESOURCE			"Resource"
+#define STRING_SIZE				"Size"
+#define STRING_OPTION			"Options"
+#define STRING_PROJECTOPTION	"Project Options"
+
+
+////////
+// 単位
+////////
+#define STRING_UNIT_COLORS	"colors"
+#define STRING_MORNING		"A.M."
+#define STRING_AFTERNOON	"P.M."
+
+
+//////////////////
+// ファイルタイプ
+//////////////////
+#define STRING_FILETYPE_BASICPROGRAM	"Basic Program"
+#define STRING_FILETYPE_SUBPROGRAM		"Sub Program"
+#define STRING_FILETYPE_TEXT			"Text Document"
+#define STRING_FILETYPE_UNKNOWN			"Unknown"
+
+#define STRING_NEWFILE_BASICPROGRAM		"Basic source file (*.abp / *.bas)"
+#define STRING_NEWFILE_TEXT				"Text file (*.txt)"
+#define STRING_NEWFILE_ICON				"Icon file (*.ico)"
+#define STRING_NEWFILE_PROJECT			"Project (*.pj)"
+
+
+////////////////////////////////////////////////
+// ファイルオープンダイアログボックスのタイトル
+////////////////////////////////////////////////
+#define STRING_FILEOPENTITLE_DEFAULT			"Open the file"
+#define STRING_FILEOPENTITLE_INSERTEDPROJECT	"Open the file inserted in the project"
+#define STRING_FILEOPENTITLE_PROJECT			"Open the project file"
+#define STRING_FILEOPENTITLE_CURSOR				"Open the cursor file"
+#define STRING_FILEOPENTITLE_ICON				"Open the icon file"
+#define STRING_FILEOPENTITLE_BITMAP				"Open the bitmap file"
+
+#define STRING_FILESAVETITLE_DEFAULT			"Save As"
+
+#define STRING_DIRECTORY_SELECT					"Select the Directory."
+
+
+//////////////////////////
+// 保存チェックメッセージ
+//////////////////////////
+#define STRING_MODIFYCHECK_FILE		"\"%s\" file was modified. Save it?"
+
+
+///////////////////
+// 検索メッセージ
+///////////////////
+#define STRING_SEARCH_AGAIN		"Search again from head of the file?"
+#define STRING_SEARCH_NOTFOUND	"\"%s\" was not found."
+
+
+////////////////////////
+// 汎用エラーメッセージ
+////////////////////////
+#define STRING_ERROR_MUST_IDNAME		"You must enter the id name."
+#define STRING_ERROR_MUST_CAPTION		"You must enter the caption."
+#define STRING_ERROR_CANT_FILEOPEN		"I cannot read the file \"%s\"."
+#define STRING_ERROR_CANT_FILESAVE		"I cannot write to file \"%s\"."
+#define STRING_FILE_OVERWRIDE			"\"%s\" file already exists. Overwrite it?"
+#define STRING_ERROR_MAXLENGTH			"The length of text is max. You cannot input more text."
+#define STRING_ERROR_NOBASICCOMPILER	"BasicCompiler was not found."
+#define STRING_ERROR_PROJECTTOPCHAR		"The head character of a project name must be the alphabet(A-Z,a-Z) or the underbar(_)."
+#define STRING_ERROR_PROJECTNAME		 "Illegal character found from the project name"
+
+
+/////////////////////
+// その他メッセージ
+/////////////////////
+#define STRING_TOOLBAR_RESET		"Reset the state of the toolbar.\nReally?"
Index: branches/egtra/ab5.0/abdev/abdev/common_msg_jpn.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/common_msg_jpn.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/common_msg_jpn.h	(revision 774)
@@ -0,0 +1,88 @@
+///////////////////////////////////////////////////////////////
+// アプリケーションで使用する汎用テキストを定義しています
+//
+// 日本語
+///////////////////////////////////////////////////////////////
+
+
+////////
+// 汎用
+////////
+#define STRING_NONE_				"なし"
+#define STRING_DEFAULT			"デフォルト"
+#define STRING_ERROR			"エラー"
+#define STRING_PROJECT			"プロジェクト"
+#define STRING_RESOURCE			"リソース"
+#define STRING_SIZE				"サイズ"
+#define STRING_OPTION			"オプション"
+#define STRING_PROJECTOPTION	"プロジェクト オプション"
+
+
+////////
+// 単位
+////////
+#define STRING_UNIT_COLORS	"色"	
+#define STRING_MORNING		"午前"
+#define STRING_AFTERNOON	"午後"
+
+
+//////////////////
+// ファイルタイプ
+//////////////////
+#define STRING_FILETYPE_BASICPROGRAM	"Basic プログラム"
+#define STRING_FILETYPE_SUBPROGRAM		"サブ プログラム"
+#define STRING_FILETYPE_TEXT			"テキスト ドキュメント"
+#define STRING_FILETYPE_UNKNOWN			"不明"
+
+#define STRING_NEWFILE_BASICPROGRAM		"Basicプログラム (*.abp *.bas)"
+#define STRING_NEWFILE_TEXT				"標準テキスト（*.txt)"
+#define STRING_NEWFILE_ICON				"アイコン（*.ico)"
+#define STRING_NEWFILE_PROJECT			"プロジェクト（*.pj)"
+
+
+////////////////////////////////////////////////
+// ファイルオープンダイアログボックスのタイトル
+////////////////////////////////////////////////
+#define STRING_FILEOPENTITLE_DEFAULT			"ファイルを指定してください"
+#define STRING_FILEOPENTITLE_INSERTEDPROJECT	"プロジェクトへ挿入するファイルを指定してください"
+#define STRING_FILEOPENTITLE_PROJECT			"プロジェクト ファイルを指定してください"
+#define STRING_FILEOPENTITLE_CURSOR				"カーソル ファイルを指定してください"
+#define STRING_FILEOPENTITLE_ICON				"アイコン ファイルを指定してください"
+#define STRING_FILEOPENTITLE_BITMAP				"ビットマップ ファイルを指定してください"
+
+#define STRING_FILESAVETITLE_DEFAULT			"保存先のファイルを指定してください"
+
+#define STRING_DIRECTORY_SELECT					"ディレクトリを選択して下さい"
+
+
+//////////////////////////
+// 保存チェックメッセージ
+//////////////////////////
+#define STRING_MODIFYCHECK_FILE		"\"%s\" ファイルは変更されています。保存しますか？"
+
+
+///////////////////
+// 検索メッセージ
+///////////////////
+#define STRING_SEARCH_AGAIN		"ファイルの最初から検索しますか？"
+#define STRING_SEARCH_NOTFOUND	"文字列 \"%s\" が見つかりません"
+
+
+////////////////////////
+// 汎用エラーメッセージ
+////////////////////////
+#define STRING_ERROR_MUST_IDNAME		"ID名を入力して下さい。"
+#define STRING_ERROR_MUST_CAPTION		"キャプションを入力して下さい。"
+#define STRING_ERROR_CANT_FILEOPEN		"\"%s\" ファイルの読み込みに失敗しました。"
+#define STRING_ERROR_CANT_FILESAVE		"\"%s\" ファイルへの書き込みに失敗しました。"
+#define STRING_FILE_OVERWRIDE			"\"%s\" ファイルは既に存在しています。上書きしますか？"
+#define STRING_ERROR_MAXLENGTH			"これ以上、テキストを入力することができません"
+#define STRING_ERROR_NOBASICCOMPILER	"対象プラットフォームのビルドモジュールが見つかりません"
+#define STRING_ERROR_PROJECTTOPCHAR		"プロジェクト名の先頭文字はアルファベット（A～Z、a～z）またはアンダーバー（_）でなければなりません。"
+#define STRING_ERROR_PROJECTNAME		"プロジェクト名に不正な文字コードが含まれています。"
+
+
+/////////////////////
+// その他メッセージ
+/////////////////////
+#define STRING_TOOLBAR_RESET		"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか？"
Index: branches/egtra/ab5.0/abdev/abdev/htmlhelp.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/htmlhelp.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/htmlhelp.h	(revision 774)
@@ -0,0 +1,426 @@
+/****************************************************************************
+*                                                                           *
+* HtmlHelp.h                                                                *
+*                                                                           *
+* Copyright (c) 1996-1997, Microsoft Corp. All rights reserved.             *
+*                                                                           *
+****************************************************************************/
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifndef __HTMLHELP_H__
+#define __HTMLHELP_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif  // __cplusplus
+
+// Defines for Win64
+#ifndef _WIN64
+#define DWORD_PTR DWORD
+#endif
+
+// Commands to pass to HtmlHelp()
+
+#define HH_DISPLAY_TOPIC        0x0000
+#define HH_HELP_FINDER          0x0000  // WinHelp equivalent
+#define HH_DISPLAY_TOC          0x0001  
+#define HH_DISPLAY_INDEX        0x0002  
+#define HH_DISPLAY_SEARCH       0x0003  
+#define HH_SET_WIN_TYPE         0x0004
+#define HH_GET_WIN_TYPE         0x0005
+#define HH_GET_WIN_HANDLE       0x0006
+#define HH_ENUM_INFO_TYPE       0x0007  // Get Info type name, call repeatedly to enumerate, -1 at end
+#define HH_SET_INFO_TYPE        0x0008  // Add Info type to filter.
+#define HH_SYNC                 0x0009
+#define HH_RESERVED1            0x000A
+#define HH_RESERVED2            0x000B
+#define HH_RESERVED3            0x000C
+#define HH_KEYWORD_LOOKUP       0x000D
+#define HH_DISPLAY_TEXT_POPUP   0x000E  // display string resource id or text in a popup window
+#define HH_HELP_CONTEXT         0x000F  // display mapped numeric value in dwData
+#define HH_TP_HELP_CONTEXTMENU  0x0010  // text popup help, same as WinHelp HELP_CONTEXTMENU
+#define HH_TP_HELP_WM_HELP      0x0011  // text popup help, same as WinHelp HELP_WM_HELP
+#define HH_CLOSE_ALL            0x0012  // close all windows opened directly or indirectly by the caller
+#define HH_ALINK_LOOKUP         0x0013  // ALink version of HH_KEYWORD_LOOKUP
+#define HH_GET_LAST_ERROR       0x0014  // not currently implemented // See HHERROR.h
+#define HH_ENUM_CATEGORY        0x0015	// Get category name, call repeatedly to enumerate, -1 at end
+#define HH_ENUM_CATEGORY_IT     0x0016  // Get category info type members, call repeatedly to enumerate, -1 at end
+#define HH_RESET_IT_FILTER      0x0017  // Clear the info type filter of all info types.
+#define HH_SET_INCLUSIVE_FILTER 0x0018  // set inclusive filtering method for untyped topics to be included in display
+#define HH_SET_EXCLUSIVE_FILTER 0x0019  // set exclusive filtering method for untyped topics to be excluded from display
+#define HH_INITIALIZE            0x001C  // Initializes the help system.
+#define HH_UNINITIALIZE          0x001D  // Uninitializes the help system.
+#define HH_PRETRANSLATEMESSAGE  0x00fd  // Pumps messages. (NULL, NULL, MSG*). 
+#define HH_SET_GLOBAL_PROPERTY  0x00fc  // Set a global property. (NULL, NULL, HH_GPROP)
+
+#define HHWIN_PROP_TAB_AUTOHIDESHOW (1 << 0)    // Automatically hide/show tri-pane window
+#define HHWIN_PROP_ONTOP            (1 << 1)    // Top-most window
+#define HHWIN_PROP_NOTITLEBAR       (1 << 2)    // no title bar
+#define HHWIN_PROP_NODEF_STYLES     (1 << 3)    // no default window styles (only HH_WINTYPE.dwStyles)
+#define HHWIN_PROP_NODEF_EXSTYLES   (1 << 4)    // no default extended window styles (only HH_WINTYPE.dwExStyles)
+#define HHWIN_PROP_TRI_PANE         (1 << 5)    // use a tri-pane window
+#define HHWIN_PROP_NOTB_TEXT        (1 << 6)    // no text on toolbar buttons
+#define HHWIN_PROP_POST_QUIT        (1 << 7)    // post WM_QUIT message when window closes
+#define HHWIN_PROP_AUTO_SYNC        (1 << 8)    // automatically ssync contents and index
+#define HHWIN_PROP_TRACKING         (1 << 9)    // send tracking notification messages
+#define HHWIN_PROP_TAB_SEARCH       (1 << 10)   // include search tab in navigation pane
+#define HHWIN_PROP_TAB_HISTORY      (1 << 11)   // include history tab in navigation pane
+#define HHWIN_PROP_TAB_FAVORITES    (1 << 12)   // include favorites tab in navigation pane
+#define HHWIN_PROP_CHANGE_TITLE     (1 << 13)   // Put current HTML title in title bar
+#define HHWIN_PROP_NAV_ONLY_WIN     (1 << 14)   // Only display the navigation window
+#define HHWIN_PROP_NO_TOOLBAR       (1 << 15)   // Don't display a toolbar
+#define HHWIN_PROP_MENU             (1 << 16)   // Menu
+#define HHWIN_PROP_TAB_ADVSEARCH    (1 << 17)   // Advanced FTS UI.
+#define HHWIN_PROP_USER_POS         (1 << 18)   // After initial creation, user controls window size/position
+#define HHWIN_PROP_TAB_CUSTOM1      (1 << 19)   // Use custom tab #1
+#define HHWIN_PROP_TAB_CUSTOM2      (1 << 20)   // Use custom tab #2
+#define HHWIN_PROP_TAB_CUSTOM3      (1 << 21)   // Use custom tab #3
+#define HHWIN_PROP_TAB_CUSTOM4      (1 << 22)   // Use custom tab #4
+#define HHWIN_PROP_TAB_CUSTOM5      (1 << 23)   // Use custom tab #5
+#define HHWIN_PROP_TAB_CUSTOM6      (1 << 24)   // Use custom tab #6
+#define HHWIN_PROP_TAB_CUSTOM7      (1 << 25)   // Use custom tab #7
+#define HHWIN_PROP_TAB_CUSTOM8      (1 << 26)   // Use custom tab #8
+#define HHWIN_PROP_TAB_CUSTOM9      (1 << 27)   // Use custom tab #9
+#define HHWIN_TB_MARGIN             (1 << 28)   // the window type has a margin
+
+#define HHWIN_PARAM_PROPERTIES      (1 << 1)    // valid fsWinProperties
+#define HHWIN_PARAM_STYLES          (1 << 2)    // valid dwStyles
+#define HHWIN_PARAM_EXSTYLES        (1 << 3)    // valid dwExStyles
+#define HHWIN_PARAM_RECT            (1 << 4)    // valid rcWindowPos
+#define HHWIN_PARAM_NAV_WIDTH       (1 << 5)    // valid iNavWidth
+#define HHWIN_PARAM_SHOWSTATE       (1 << 6)    // valid nShowState
+#define HHWIN_PARAM_INFOTYPES       (1 << 7)    // valid apInfoTypes
+#define HHWIN_PARAM_TB_FLAGS        (1 << 8)    // valid fsToolBarFlags
+#define HHWIN_PARAM_EXPANSION       (1 << 9)    // valid fNotExpanded
+#define HHWIN_PARAM_TABPOS          (1 << 10)   // valid tabpos
+#define HHWIN_PARAM_TABORDER        (1 << 11)   // valid taborder
+#define HHWIN_PARAM_HISTORY_COUNT   (1 << 12)   // valid cHistory
+#define HHWIN_PARAM_CUR_TAB         (1 << 13)   // valid curNavType
+
+#define HHWIN_BUTTON_EXPAND         (1 << 1)    // Expand/contract button
+#define HHWIN_BUTTON_BACK           (1 << 2)    // Back button
+#define HHWIN_BUTTON_FORWARD        (1 << 3)    // Forward button
+#define HHWIN_BUTTON_STOP           (1 << 4)    // Stop button
+#define HHWIN_BUTTON_REFRESH        (1 << 5)    // Refresh button
+#define HHWIN_BUTTON_HOME           (1 << 6)    // Home button
+#define HHWIN_BUTTON_BROWSE_FWD     (1 << 7)    // not implemented
+#define HHWIN_BUTTON_BROWSE_BCK     (1 << 8)    // not implemented
+#define HHWIN_BUTTON_NOTES          (1 << 9)    // not implemented
+#define HHWIN_BUTTON_CONTENTS       (1 << 10)   // not implemented
+#define HHWIN_BUTTON_SYNC           (1 << 11)   // Sync button
+#define HHWIN_BUTTON_OPTIONS        (1 << 12)   // Options button
+#define HHWIN_BUTTON_PRINT          (1 << 13)   // Print button
+#define HHWIN_BUTTON_INDEX          (1 << 14)   // not implemented
+#define HHWIN_BUTTON_SEARCH         (1 << 15)   // not implemented
+#define HHWIN_BUTTON_HISTORY        (1 << 16)   // not implemented
+#define HHWIN_BUTTON_FAVORITES      (1 << 17)   // not implemented
+#define HHWIN_BUTTON_JUMP1          (1 << 18)
+#define HHWIN_BUTTON_JUMP2          (1 << 19)
+#define HHWIN_BUTTON_ZOOM           (1 << 20)
+#define HHWIN_BUTTON_TOC_NEXT       (1 << 21)
+#define HHWIN_BUTTON_TOC_PREV       (1 << 22)
+
+#define HHWIN_DEF_BUTTONS           \
+            (HHWIN_BUTTON_EXPAND |  \
+             HHWIN_BUTTON_BACK |    \
+             HHWIN_BUTTON_OPTIONS | \
+             HHWIN_BUTTON_PRINT)
+
+// Button IDs
+
+#define IDTB_EXPAND             200
+#define IDTB_CONTRACT           201
+#define IDTB_STOP               202
+#define IDTB_REFRESH            203
+#define IDTB_BACK               204
+#define IDTB_HOME               205
+#define IDTB_SYNC               206
+#define IDTB_PRINT              207
+#define IDTB_OPTIONS            208
+#define IDTB_FORWARD            209
+#define IDTB_NOTES              210 // not implemented
+#define IDTB_BROWSE_FWD         211
+#define IDTB_BROWSE_BACK        212
+#define IDTB_CONTENTS           213 // not implemented
+#define IDTB_INDEX              214 // not implemented
+#define IDTB_SEARCH             215 // not implemented
+#define IDTB_HISTORY            216 // not implemented
+#define IDTB_FAVORITES          217 // not implemented
+#define IDTB_JUMP1              218
+#define IDTB_JUMP2              219
+#define IDTB_CUSTOMIZE          221
+#define IDTB_ZOOM               222
+#define IDTB_TOC_NEXT           223
+#define IDTB_TOC_PREV           224
+
+// Notification codes
+
+#define HHN_FIRST       (0U-860U)
+#define HHN_LAST        (0U-879U)
+
+#define HHN_NAVCOMPLETE   (HHN_FIRST-0)
+#define HHN_TRACK         (HHN_FIRST-1)
+#define HHN_WINDOW_CREATE (HHN_FIRST-2)
+
+typedef struct tagHHN_NOTIFY
+{
+    NMHDR   hdr;
+    PCSTR   pszUrl; // Multi-byte, null-terminated string
+} HHN_NOTIFY;
+
+typedef struct tagHH_POPUP
+{
+    int       cbStruct;      // sizeof this structure
+    HINSTANCE hinst;         // instance handle for string resource
+    UINT      idString;      // string resource id, or text id if pszFile is specified in HtmlHelp call
+    LPCTSTR   pszText;       // used if idString is zero
+    POINT     pt;            // top center of popup window
+    COLORREF  clrForeground; // use -1 for default
+    COLORREF  clrBackground; // use -1 for default
+    RECT      rcMargins;     // amount of space between edges of window and text, -1 for each member to ignore
+    LPCTSTR   pszFont;       // facename, point size, char set, BOLD ITALIC UNDERLINE
+} HH_POPUP;
+
+typedef struct tagHH_AKLINK
+{
+    int       cbStruct;     // sizeof this structure
+    BOOL      fReserved;    // must be FALSE (really!)
+    LPCTSTR   pszKeywords;  // semi-colon separated keywords
+    LPCTSTR   pszUrl;       // URL to jump to if no keywords found (may be NULL)
+    LPCTSTR   pszMsgText;   // Message text to display in MessageBox if pszUrl is NULL and no keyword match
+    LPCTSTR   pszMsgTitle;  // Message text to display in MessageBox if pszUrl is NULL and no keyword match
+    LPCTSTR   pszWindow;    // Window to display URL in
+    BOOL      fIndexOnFail; // Displays index if keyword lookup fails.
+} HH_AKLINK;
+
+enum {
+    HHWIN_NAVTYPE_TOC,
+    HHWIN_NAVTYPE_INDEX,
+    HHWIN_NAVTYPE_SEARCH,
+    HHWIN_NAVTYPE_FAVORITES,
+    HHWIN_NAVTYPE_HISTORY,   // not implemented
+    HHWIN_NAVTYPE_AUTHOR,
+    HHWIN_NAVTYPE_CUSTOM_FIRST = 11
+};
+
+enum {
+    IT_INCLUSIVE,
+    IT_EXCLUSIVE,
+    IT_HIDDEN,
+};
+
+typedef struct tagHH_ENUM_IT
+{
+    int       cbStruct;          // size of this structure
+    int       iType;             // the type of the information type ie. Inclusive, Exclusive, or Hidden
+    LPCSTR    pszCatName;        // Set to the name of the Category to enumerate the info types in a category; else NULL
+    LPCSTR    pszITName;         // volitile pointer to the name of the infotype. Allocated by call. Caller responsible for freeing
+    LPCSTR    pszITDescription;  // volitile pointer to the description of the infotype.
+} HH_ENUM_IT, *PHH_ENUM_IT;
+
+typedef struct tagHH_ENUM_CAT
+{
+    int       cbStruct;          // size of this structure
+    LPCSTR    pszCatName;        // volitile pointer to the category name
+    LPCSTR    pszCatDescription; // volitile pointer to the category description
+} HH_ENUM_CAT, *PHH_ENUM_CAT;
+
+typedef struct tagHH_SET_INFOTYPE
+{
+    int       cbStruct;          // the size of this structure
+    LPCSTR    pszCatName;        // the name of the category, if any, the InfoType is a member of.
+    LPCSTR    pszInfoTypeName;   // the name of the info type to add to the filter
+} HH_SET_INFOTYPE, *PHH_SET_INFOTYPE;
+
+typedef DWORD HH_INFOTYPE;
+typedef HH_INFOTYPE* PHH_INFOTYPE;
+
+enum {
+    HHWIN_NAVTAB_TOP,
+    HHWIN_NAVTAB_LEFT,
+    HHWIN_NAVTAB_BOTTOM,
+};
+
+#define HH_MAX_TABS 19  // maximum number of tabs
+
+enum {
+    HH_TAB_CONTENTS,
+    HH_TAB_INDEX,
+    HH_TAB_SEARCH,
+    HH_TAB_FAVORITES,
+    HH_TAB_HISTORY,
+    HH_TAB_AUTHOR,
+
+    HH_TAB_CUSTOM_FIRST = 11,
+    HH_TAB_CUSTOM_LAST = HH_MAX_TABS
+};
+
+#define HH_MAX_TABS_CUSTOM (HH_TAB_CUSTOM_LAST - HH_TAB_CUSTOM_FIRST + 1)
+
+// HH_DISPLAY_SEARCH Command Related Structures and Constants
+
+#define HH_FTS_DEFAULT_PROXIMITY (-1)
+
+typedef struct tagHH_FTS_QUERY
+{
+    int cbStruct;            // Sizeof structure in bytes.
+    BOOL fUniCodeStrings;    // TRUE if all strings are unicode.
+    LPCTSTR pszSearchQuery;  // String containing the search query.
+    LONG iProximity;         // Word proximity.
+    BOOL fStemmedSearch;     // TRUE for StemmedSearch only.
+    BOOL fTitleOnly;         // TRUE for Title search only.
+    BOOL fExecute;           // TRUE to initiate the search.
+    LPCTSTR pszWindow;       // Window to display in
+} HH_FTS_QUERY;
+
+// HH_WINTYPE Structure
+
+typedef struct tagHH_WINTYPE {
+    int     cbStruct;        // IN: size of this structure including all Information Types
+    BOOL    fUniCodeStrings; // IN/OUT: TRUE if all strings are in UNICODE
+    LPCTSTR pszType;         // IN/OUT: Name of a type of window
+    DWORD   fsValidMembers;  // IN: Bit flag of valid members (HHWIN_PARAM_)
+    DWORD   fsWinProperties; // IN/OUT: Properties/attributes of the window (HHWIN_)
+
+    LPCTSTR pszCaption;      // IN/OUT: Window title
+    DWORD   dwStyles;        // IN/OUT: Window styles
+    DWORD   dwExStyles;      // IN/OUT: Extended Window styles
+    RECT    rcWindowPos;     // IN: Starting position, OUT: current position
+    int     nShowState;      // IN: show state (e.g., SW_SHOW)
+
+    HWND  hwndHelp;          // OUT: window handle
+    HWND  hwndCaller;        // OUT: who called this window
+
+    HH_INFOTYPE* paInfoTypes;  // IN: Pointer to an array of Information Types
+
+    // The following members are only valid if HHWIN_PROP_TRI_PANE is set
+
+    HWND  hwndToolBar;      // OUT: toolbar window in tri-pane window
+    HWND  hwndNavigation;   // OUT: navigation window in tri-pane window
+    HWND  hwndHTML;         // OUT: window displaying HTML in tri-pane window
+    int   iNavWidth;        // IN/OUT: width of navigation window
+    RECT  rcHTML;           // OUT: HTML window coordinates
+
+    LPCTSTR pszToc;         // IN: Location of the table of contents file
+    LPCTSTR pszIndex;       // IN: Location of the index file
+    LPCTSTR pszFile;        // IN: Default location of the html file
+    LPCTSTR pszHome;        // IN/OUT: html file to display when Home button is clicked
+    DWORD   fsToolBarFlags; // IN: flags controling the appearance of the toolbar
+    BOOL    fNotExpanded;   // IN: TRUE/FALSE to contract or expand, OUT: current state
+    int     curNavType;     // IN/OUT: UI to display in the navigational pane
+    int     tabpos;         // IN/OUT: HHWIN_NAVTAB_TOP, HHWIN_NAVTAB_LEFT, or HHWIN_NAVTAB_BOTTOM
+    int     idNotify;       // IN: ID to use for WM_NOTIFY messages
+    BYTE    tabOrder[HH_MAX_TABS + 1];    // IN/OUT: tab order: Contents, Index, Search, History, Favorites, Reserved 1-5, Custom tabs
+    int     cHistory;       // IN/OUT: number of history items to keep (default is 30)
+    LPCTSTR pszJump1;       // Text for HHWIN_BUTTON_JUMP1
+    LPCTSTR pszJump2;       // Text for HHWIN_BUTTON_JUMP2
+    LPCTSTR pszUrlJump1;    // URL for HHWIN_BUTTON_JUMP1
+    LPCTSTR pszUrlJump2;    // URL for HHWIN_BUTTON_JUMP2
+    RECT    rcMinSize;      // Minimum size for window (ignored in version 1)
+    int     cbInfoTypes;    // size of paInfoTypes;
+    LPCTSTR pszCustomTabs;  // multiple zero-terminated strings
+} HH_WINTYPE, *PHH_WINTYPE;
+
+enum {
+    HHACT_TAB_CONTENTS,
+    HHACT_TAB_INDEX,
+    HHACT_TAB_SEARCH,
+    HHACT_TAB_HISTORY,
+    HHACT_TAB_FAVORITES,
+
+    HHACT_EXPAND,
+    HHACT_CONTRACT,
+    HHACT_BACK,
+    HHACT_FORWARD,
+    HHACT_STOP,
+    HHACT_REFRESH,
+    HHACT_HOME,
+    HHACT_SYNC,
+    HHACT_OPTIONS,
+    HHACT_PRINT,
+    HHACT_HIGHLIGHT,
+    HHACT_CUSTOMIZE,
+    HHACT_JUMP1,
+    HHACT_JUMP2,
+    HHACT_ZOOM,
+    HHACT_TOC_NEXT,
+    HHACT_TOC_PREV,
+    HHACT_NOTES,
+
+    HHACT_LAST_ENUM,
+};
+
+typedef struct tagHHNTRACK
+{
+    NMHDR   hdr;
+    PCSTR   pszCurUrl;      // Multi-byte, null-terminated string
+    int     idAction;       // HHACT_ value
+    HH_WINTYPE* phhWinType; // Current window type structure
+} HHNTRACK;
+
+HWND
+WINAPI
+HtmlHelpA(
+    HWND hwndCaller,
+    LPCSTR pszFile,
+    UINT uCommand,
+    DWORD_PTR dwData
+    );
+
+HWND
+WINAPI
+HtmlHelpW(
+    HWND hwndCaller,
+    LPCWSTR pszFile,
+    UINT uCommand,
+    DWORD_PTR dwData
+    );
+#ifdef UNICODE
+#define HtmlHelp  HtmlHelpW
+#else
+#define HtmlHelp  HtmlHelpA
+#endif // !UNICODE
+
+// Use the following for GetProcAddress to load from hhctrl.ocx
+
+#define ATOM_HTMLHELP_API_ANSI    (LPTSTR)((DWORD)((WORD)(14)))
+#define ATOM_HTMLHELP_API_UNICODE (LPTSTR)((DWORD)((WORD)(15)))
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Global Control Properties. 
+//
+typedef enum tagHH_GPROPID
+{
+    HH_GPROPID_SINGLETHREAD=1,      // VARIANT_BOOL: True for single thread
+    HH_GPROPID_TOOLBAR_MARGIN=2,    // long: Provides a left/right margin around the toolbar.
+    HH_GPROPID_UI_LANGUAGE=3,       // long: LangId of the UI.
+    HH_GPROPID_CURRENT_SUBSET=4,    // BSTR: Current subset.
+    HH_GPROPID_CONTENT_LANGUAGE=5   // long: LandId for desired content.
+} HH_GPROPID;
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Global Property structure
+//
+#ifdef __oaidl_h__
+
+#pragma pack(push, 8)
+
+typedef struct tagHH_GLOBAL_PROPERTY
+{
+    HH_GPROPID  id;
+    VARIANT     var;
+} HH_GLOBAL_PROPERTY ;
+
+#pragma pack(pop)
+#endif
+
+#ifdef __cplusplus
+}
+#endif // __cplusplus
+
+#endif // __HTMLHELP_H__
Index: branches/egtra/ab5.0/abdev/abdev/include/MainFrame.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/MainFrame.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/MainFrame.h	(revision 774)
@@ -0,0 +1,415 @@
+#pragma once
+
+#include <boost/shared_ptr.hpp>
+
+//サイズ変更枠の太さ
+#define LEVER_THICK 5
+
+#define WM_SHOWERROR			WM_USER+70	//エラー表示メッセージ
+
+#define WM_SETCOMPILEVIEW		WM_USER+71	//コンパイラウィンドウが表示されたとき
+#define WM_DESTROYCOMPILEVIEW	WM_USER+72	//コンパイラウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERBASE		WM_USER+73	//デバッガベースウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERBASE	WM_USER+74	//デバッガベースウィンドウが破棄されたとき
+
+#define WM_SETDEBUGGERVIEW		WM_USER+75	//デバッガウィンドウが表示されたとき
+#define WM_DESTROYDEBUGGERVIEW	WM_USER+76	//デバッガウィンドウが表示されたとき
+
+#ifdef HAVE_WINDOWS_7_SDK
+class TaskbarList;
+#endif
+
+namespace ActiveBasic{ namespace IDE{
+
+
+class MainFrame
+	: public WindowComponents::MdiWindow
+{
+	WindowAreaManager wam;
+	UINT TaskbarButtonCreated;
+#ifdef HAVE_WINDOWS_7_SDK
+	boost::shared_ptr<TaskbarList> taskbarList;
+#endif
+
+public:
+	MainFrame();
+
+	// リサイズ時のリフレッシュ
+	void Resized();
+
+	// WebブラウザでURLを開く
+	void OpenWebBrowser( const std::string &url );
+
+	// Explorerでパスを開く
+	void OpenExplorer( const std::string &filepath );
+
+	// 生成された
+	::LRESULT OnCreate( ::CREATESTRUCT const* );
+
+	// OSが終了する
+	BOOL OnQueryEndSession(UINT nSource, UINT uLogOff);
+
+	// 「閉じる」ボタンがクリックされた
+	void OnClose();
+
+	// リサイズされた
+	void OnSize(UINT nType, CSize size);
+
+	// 破棄された
+	void OnDestroy();
+
+	// タイマーイベント
+	void OnTimer( UINT_PTR id );
+
+	// クリップボード内のデータが変更した
+	void OnDrawClipboard();
+
+	// メニューが選択された
+	void OnMenuSelect( UINT nItemID, UINT nFlags, HMENU menu );
+
+	// メニューがアクティブになる直前に送られる
+	void OnInitMenu( HMENU menu );
+
+	// メニューアイテムのサイズが要求された
+	void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct );
+
+	// メニューアイテムの描画が要求された
+	void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );
+
+	// 拡張コントロールからメッセージが通知された
+	LRESULT OnNotify( int idCtrl, LPNMHDR pnmh );
+
+	// ファイルがドロップされた
+	void OnDropFiles( HDROP hDropInfo );
+
+	// 再描画
+	void OnPaint( HDC dummy );
+
+	// ソースコード表示メッセージ
+	::LRESULT OnShowSourceLine( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled );
+
+#ifdef HAVE_WINDOWS_7_SDK
+	// タスクバーボタンが生成された
+	::LRESULT OnTaskbarButtonCreated(::UINT msg, ::WPARAM wParam, ::LPARAM lParam);
+
+	// 子ウィンドウが生成された
+	void AddChildWindow( HWND hwndChild );
+
+	// 子ウィンドウが破棄された
+	void DeleteChildWindow( HWND hwndChild );
+
+	// 子ウィンドウがアクティブになった
+	void ActivateChildWindow( HWND hwndChild );
+
+	// タブの順序が変更になった
+	void SetTabOrder( HWND hwndChild, HWND hwndInsertBefore );
+
+	// サムネイル画像が古くなった（ので更新したい）
+	void InvalidateBitmap( HWND hwndChild );
+#endif
+
+	// 「新規作成」メニューがクリックされた
+	void OnCmdNew( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「開く」メニューがクリックされた
+	void OnCmdOpen( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「閉じる」メニューがクリックされた
+	void OnCmdClose( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクトを開く」メニューがクリックされた
+	void OnCmdProjectOpen( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクトを保存」メニューがクリックされた
+	void OnCmdProjectSave( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクトを閉じる」メニューがクリックされた
+	void OnCmdProjectClose( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクト フォルダを開く」メニューがクリックされた
+	void OnCmdProjectFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「保存」メニューがクリックされた
+	void OnCmdSave( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「名前を付けて保存」メニューがクリックされた
+	void OnCmdNewSave( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「文字コードを指定して保存」メニューがクリックされた
+	void OnCmdCodeSave( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「すべて保存」メニューがクリックされた
+	void OnCmdAllSave( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「ページ設定」メニューがクリックされた
+	void OnCmdPageSet( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「印刷プレビュー」メニューがクリックされた
+	void OnCmdPreview( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「印刷」メニューがクリックされた
+	void OnCmdPrintOut( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「終了」メニューがクリックされた
+	void OnCmdExit( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「元に戻す」メニューがクリックされた
+	void OnCmdUndo( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「やり直し」メニューがクリックされた
+	void OnCmdRedo( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「切り取り」メニューがクリックされた
+	void OnCmdCut( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「コピー」メニューがクリックされた
+	void OnCmdCopy( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「貼り付け」メニューがクリックされた
+	void OnCmdPaste( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「削除」メニューがクリックされた
+	void OnCmdDelete( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「すべて選択」メニューがクリックされた
+	void OnCmdAllSelect( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「検索」メニューがクリックされた
+	void OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「置換」メニューがクリックされた
+	void OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 変換メニューのいずれかがクリックされた
+	void OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「文字カウント」メニューがクリックされた
+	void OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「選択範囲の文字カウント」メニューがクリックされた
+	void OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクトビュー」メニューがクリックされた
+	void OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「プロジェクトオプション」メニューがクリックされた
+	void OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「最前面表示」メニューがクリックされた
+	void OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「右端で折り返す」メニューがクリックされた
+	void OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「オプション」メニューがクリックされた
+	void OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「デバッグ実行」メニューがクリックされた
+	void OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「デバッグビルド」メニューがクリックされた
+	void OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「アタッチ」メニューがクリックされた
+	void OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「リリースビルド」メニューがクリックされた
+	void OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「リリース実行」メニューがクリックされた
+	void OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「ステップイン」メニューがクリックされた
+	void OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「ステップオーバー」メニューがクリックされた
+	void OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「カーソル行まで実行」メニューがクリックされた
+	void OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「ブレークポイント」メニューがクリックされた
+	void OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「デバッグの停止」メニューがクリックされた
+	void OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「デバッグの一時停止」メニューがクリックされた
+	void OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// Webリンクメニューがクリックされた
+	void OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「トピックス」メニューがクリックされた
+	void OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// 「バージョン情報」メニューがクリックされた
+	void OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「ドキュメントセレクト」メニューがクリックされた
+	void OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「標準」メニューがクリックされた
+	void OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「リリース」メニューがクリックされた
+	void OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「デバッグ」メニューがクリックされた
+	void OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「プラットフォーム選択」メニューがクリックされた
+	void OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「レバーを固定」メニューがクリックされた
+	void OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// レバーの「レバーをリセット」メニューがクリックされた
+	void OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// タブの「自分以外のウィンドウを閉じる」メニューがクリックされた
+	void OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// タブの「絶対パスをコピー」メニューがクリックされた
+	void OnCmdPathCopy( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// タブの「フォルダを開く」メニューがクリックされた
+	void OnCmdFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// タブの「ファイルを削除」メニューがクリックされた
+	void OnCmdDeleteFile( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+	// タブの「タブの色」メニューがクリックされた
+	void OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl );
+
+private:
+	// メッセージマップ
+	BEGIN_MSG_MAP( MainFrame )
+		MSG_WM_CREATE( OnCreate )
+		MSG_WM_SIZE( OnSize )
+		MSG_WM_QUERYENDSESSION( OnQueryEndSession )
+		MSG_WM_CLOSE( OnClose )
+		MSG_WM_DESTROY( OnDestroy )
+		MSG_WM_TIMER( OnTimer )
+		MSG_WM_DRAWCLIPBOARD( OnDrawClipboard )
+		MSG_WM_MENUSELECT( OnMenuSelect )
+		MSG_WM_INITMENU( OnInitMenu )
+		MSG_WM_MEASUREITEM( OnMeasureItem )
+		MSG_WM_DRAWITEM( OnDrawItem )
+		MSG_WM_NOTIFY( OnNotify );
+		MSG_WM_DROPFILES( OnDropFiles )
+		MSG_WM_PAINT( OnPaint )
+		MESSAGE_HANDLER( WM_SHOWERROR, OnShowSourceLine )	
+#ifdef HAVE_WINDOWS_7_SDK
+		MESSAGE_HANDLER_EX( TaskbarButtonCreated, OnTaskbarButtonCreated )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_NEW, OnCmdNew )
+		COMMAND_ID_HANDLER_EX( IDM_OPEN, OnCmdOpen )
+		COMMAND_ID_HANDLER_EX( IDM_CLOSE, OnCmdClose )
+#ifndef THETEXT
+		COMMAND_ID_HANDLER_EX( IDM_PROJECT_OPEN, OnCmdProjectOpen )
+		COMMAND_ID_HANDLER_EX( IDM_PROJECT_SAVE, OnCmdProjectSave )
+		COMMAND_ID_HANDLER_EX( IDM_PROJECT_CLOSE, OnCmdProjectClose )
+		COMMAND_ID_HANDLER_EX( IDM_PROJECT_FOLDER_OPEN, OnCmdProjectFolderOpen )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_SAVE, OnCmdSave )
+		COMMAND_ID_HANDLER_EX( IDM_NEWSAVE, OnCmdNewSave )
+		COMMAND_ID_HANDLER_EX( IDM_CODE_SAVE, OnCmdCodeSave )
+		COMMAND_ID_HANDLER_EX( IDM_ALLSAVE, OnCmdAllSave )
+		COMMAND_ID_HANDLER_EX( IDM_PAGESET, OnCmdPageSet )
+		COMMAND_ID_HANDLER_EX( IDM_PREVIEW, OnCmdPreview )
+		COMMAND_ID_HANDLER_EX( IDM_PRINTOUT, OnCmdPrintOut )
+		COMMAND_ID_HANDLER_EX( IDM_EXIT, OnCmdExit )
+		COMMAND_ID_HANDLER_EX( IDM_UNDO, OnCmdUndo )
+		COMMAND_ID_HANDLER_EX( (WORD)IDM_ACCEL_UNDO, OnCmdUndo )
+		COMMAND_ID_HANDLER_EX( IDM_REDO, OnCmdRedo )
+		COMMAND_ID_HANDLER_EX( (WORD)IDM_ACCEL_REDO, OnCmdRedo )
+		COMMAND_ID_HANDLER_EX( IDM_CUT, OnCmdCut )
+		COMMAND_ID_HANDLER_EX( IDM_COPY, OnCmdCopy )
+		COMMAND_ID_HANDLER_EX( IDM_PASTE, OnCmdPaste )
+		COMMAND_ID_HANDLER_EX( IDM_DELETE, OnCmdDelete )
+		COMMAND_ID_HANDLER_EX( IDM_ALLSELECT, OnCmdAllSelect )
+		COMMAND_ID_HANDLER_EX( IDM_FIND, OnCmdFind )
+		COMMAND_ID_HANDLER_EX( IDM_PERMUTATION, OnCmdPermutation )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_ALPHA_SMALL, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_ALPHA_BIG, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_HALF, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_MULTI, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_KATAKANA, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_HIRAGANA, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_SPACE, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_TAB, OnCmdConvertX )
+#ifdef THETEXT
+		COMMAND_ID_HANDLER_EX( IDM_CONV_HASRETURN, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_CONV_QUOTE, OnCmdConvertX )
+		COMMAND_ID_HANDLER_EX( IDM_STRING_COUNT, OnCmdStringCount )
+		COMMAND_ID_HANDLER_EX( IDM_SEL_STRING_COUNT, OnCmdSelStringCount )
+#else
+		COMMAND_ID_HANDLER_EX( IDM_CODEFORMAT, OnCmdConvertX )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_PROJECTVIEW, OnCmdProjectView )
+		COMMAND_ID_HANDLER_EX( IDM_PROJECT_OPTION, OnCmdProjectOption )
+		COMMAND_ID_HANDLER_EX( IDM_TOPMOST, OnCmdTopMost )
+#ifdef THETEXT
+		COMMAND_ID_HANDLER_EX( IDM_RIGHT_TURN, OnCmdRightTurn )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_SET, OnCmdSet )
+#ifndef THETEXT
+		COMMAND_ID_HANDLER_EX( IDM_DEBUG, OnCmdDebug )
+		COMMAND_ID_HANDLER_EX( IDM_DEBUGCOMPILE, OnCmdDebugCompile )
+		COMMAND_ID_HANDLER_EX( IDM_ATTACH, OnCmdAttach )
+		COMMAND_ID_HANDLER_EX( IDM_RELEASECOMPILE, OnCmdReleaseCompile )
+		COMMAND_ID_HANDLER_EX( IDM_RELEASERUN, OnCmdReleaseRun )
+		COMMAND_ID_HANDLER_EX( IDM_STEP_IN, OnCmdStepIn )
+		COMMAND_ID_HANDLER_EX( IDM_STEP_OVER, OnCmdStepOver )
+		COMMAND_ID_HANDLER_EX( IDM_STEP_CURSOR, OnCmdStepCursor )
+		COMMAND_ID_HANDLER_EX( IDM_BREAKPOINT, OnCmdBreakPoint )
+		COMMAND_ID_HANDLER_EX( IDM_DEBUG_STOP, OnCmdDebugStop )
+		COMMAND_ID_HANDLER_EX( IDM_DEBUG_PAUSE, OnCmdDebugPause )
+		COMMAND_ID_HANDLER_EX( IDM_COMMUNITY, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( IDM_COMMU_SEARCH, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( IDM_COMMU_PM, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM1, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM2, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM3, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM4, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM5, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM6, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM7, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( ID_COMMU_FORUM8, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( IDM_AB_WEBSITE, OnCmdWebLink )
+		COMMAND_ID_HANDLER_EX( IDM_ACTBDL, OnCmdWebLink )
+#else
+		COMMAND_ID_HANDLER_EX( IDM_DSHOMEPAGE, OnCmdWebLink )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_TOPIC, OnCmdTopics )
+		COMMAND_ID_HANDLER_EX( IDM_ABOUT, OnCmdAbout )
+		COMMAND_ID_HANDLER_EX( IDM_DOCSELECTBAND, OnCmdDocSelectBand )
+		COMMAND_ID_HANDLER_EX( IDM_STANDARDBAND, OnCmdStandardBand )
+#ifndef THETEXT
+		COMMAND_ID_HANDLER_EX( IDM_RELEASEBAND, OnCmdReleaseBand )
+		COMMAND_ID_HANDLER_EX( IDM_DEBUGBAND, OnCmdDebugBand )
+		COMMAND_ID_HANDLER_EX( IDM_SELECTCOMPILERBAND, OnCmdSelectCompilerBand )
+#endif
+		COMMAND_ID_HANDLER_EX( IDM_NOGRIPPER, OnCmdNoGripper )
+		COMMAND_ID_HANDLER_EX( IDM_RESET_REBAR, OnCmdResetRebar )
+		COMMAND_ID_HANDLER_EX( IDM_ALLCLOSE_OMIT_MYSELF, OnCmdAllCloseOmitMyself )
+		COMMAND_ID_HANDLER_EX( IDM_PATH_COPY, OnCmdPathCopy )
+		COMMAND_ID_HANDLER_EX( IDM_FOLDER_OPEN, OnCmdFolderOpen )
+		COMMAND_ID_HANDLER_EX( IDM_DELETE_FILE, OnCmdDeleteFile )
+		COMMAND_ID_HANDLER_EX( IDM_USER_COLOR, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_GRAY, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_WHITE, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_RED, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_GREEN, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_BLUE, OnCmdColor )
+		COMMAND_ID_HANDLER_EX( IDM_YELLOW, OnCmdColor )
+
+		CHAIN_MSG_MAP(CUpdateUI<WindowComponents::MdiWindow>)
+        CHAIN_MSG_MAP(CMDIFrameWindowImpl<WindowComponents::MdiWindow>)
+	END_MSG_MAP()
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/abdev/include/Program.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/Program.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/Program.h	(revision 774)
@@ -0,0 +1,32 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{
+
+
+class Program
+{
+
+	static void InitializeWindow();
+public:
+	static CAppModule _Module;
+	static MainFrame mainFrame;
+	static WindowComponents::CodeEditor::Languages languages;
+
+	// 一時的な対処
+	static const WindowComponents::CodeEditor::Language *ablang;
+
+	// ユーザデータ格納用のディレクトリを取得
+	static const std::string GetIdeUserAppDir();
+
+	static void Main(HINSTANCE hinst);
+
+
+
+	static HWND GetMainFrameWndHandle()
+	{
+		return mainFrame.m_hWnd;
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/FileManager.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/FileManager.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/FileManager.h	(revision 774)
@@ -0,0 +1,86 @@
+#pragma once
+
+namespace ActiveBasic{ namespace PM{ namespace FM{
+
+
+class ItemBase
+{
+	HTREEITEM hTreeItem;
+
+public:
+	ItemBase( HTREEITEM hTreeItem )
+		: hTreeItem( hTreeItem )
+	{
+	}
+
+	HTREEITEM GetTreeItemHandle() const
+	{
+		return hTreeItem;
+	}
+	void SetTreeViewHandle( HTREEITEM hTreeItem )
+	{
+		this->hTreeItem = hTreeItem;
+	}
+};
+
+class File
+	: public ItemBase
+{
+	std::string relationalPath;
+
+public:
+	File( const std::string &relationalPath, HTREEITEM hTreeItem );
+
+	const std::string &GetRelationalPath() const
+	{
+		return relationalPath;
+	}
+	const std::string GetFullPath() const;
+};
+typedef std::vector<File> Files;
+
+class Folder;
+typedef std::vector<Folder> Folders;
+
+class Folder
+	: public ItemBase
+{
+	std::string name;
+public:
+	Files files;
+	Folders folders;
+
+	Folder( const std::string &name, HTREEITEM hTreeItem )
+		: ItemBase( hTreeItem )
+		, name( name )
+	{
+	}
+
+	const std::string &GetName() const
+	{
+		return name;
+	}
+
+	bool IsEmpty() const;
+	void Clear();
+	File &FindFile( HTREEITEM hTreeItem );
+	File &FindFile( const std::string &path );
+	bool IsExistFile( HTREEITEM hTreeItem ) const;
+	bool IsExistFile( const std::string &path ) const;
+	void Remove( HTREEITEM hTreeItem );
+};
+
+class FileSystem
+{
+public:
+	Folder root;
+	boost::mutex mutex;
+
+	FileSystem( const std::string &rootFolderName )
+		: root( rootFolderName, NULL )
+	{
+	}
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/ProjectManager.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/ProjectManager.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/ProjectManager.h	(revision 774)
@@ -0,0 +1,86 @@
+#pragma once
+
+
+namespace ActiveBasic{ namespace PM{
+
+class Project
+{
+public:
+
+	Project()
+		: workDir( "" )
+		, fileSystem( "Source Files" )
+	{
+	}
+
+	void Load( char const *path );
+	void Save();
+	bool Close();
+
+	const std::string &GetName() const
+	{
+		return name;
+	}
+
+	const Jenga::Common::Directory &GetWorkDir() const
+	{
+		return workDir;
+	}
+
+	const std::string GetResourceFileFullPath() const
+	{
+		return this->GetWorkDir().GetFullPath( this->GetName() + ".rc" );
+	}
+
+	bool IsOpened() const
+	{
+		return !name.empty();
+	}
+
+	ActiveBasic::Common::TargetModuleType::EnumType GetModuleType() const
+	{
+		return moduleType;
+	}
+
+	DWORD dwVersion;
+
+	FM::FileSystem fileSystem;
+
+	int NumberOfMenu;
+	MENU_INFO *pMenuInfo;
+	HTREEITEM hMenuTreeItem;
+
+	WindowInfos windowInfos;
+	HTREEITEM hWindowTreeItem;
+
+	DWORD dwOption;
+	char lpszOutput_Release[MAX_PATH];
+	char lpszOutput_Debug[MAX_PATH];
+
+	//マニフェスト
+	char szManifestPath[MAX_PATH];
+
+	//デバッグ情報
+	char szCmdLine[8192];
+	char szExePath[MAX_PATH];
+
+	//ブレークポイント情報
+	CDBBreakPoint *pobj_DBBreakPoint;
+
+	_int8 ModifyOfMaterial;
+	_int8 ModifuOfResource;
+	_int8 modify;
+
+private:
+	std::string name;
+	Jenga::Common::Directory workDir;
+	ActiveBasic::Common::TargetModuleType::EnumType moduleType;
+
+public:
+	ActiveBasic::Common::ResourceManager resourceManager;
+};
+
+
+}}
+
+extern ActiveBasic::PM::Project projectInfo;
Index: branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/WindowManager.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/WindowManager.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/ProjectManager/WindowManager.h	(revision 774)
@@ -0,0 +1,272 @@
+#pragma once
+
+
+namespace ActiveBasic{ namespace PM{
+
+
+struct ImageReferenceType
+{
+	enum EnumType
+	{
+		File = 0,
+		Resource,
+	};
+};
+
+class ImageControlInfo
+{
+public:
+	ImageReferenceType::EnumType type;
+	std::string path;
+
+	bool IsFile() const
+	{
+		return ( type == ImageReferenceType::File );
+	}
+	bool IsResource() const
+	{
+		return ( type == ImageReferenceType::Resource );
+	}
+};
+
+class WindowInfoBase
+{
+public:
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	void SetName( const std::string &name )
+	{
+		this->name = name;
+	}
+
+	const std::string &GetCaption() const
+	{
+		return caption;
+	}
+	void SetCaption( const std::string &caption )
+	{
+		this->caption = caption;
+	}
+
+	DWORD GetStyle() const
+	{
+		return style;
+	}
+	void SetStyle( DWORD style )
+	{
+		this->style = style;
+	}
+	void AddStyle( DWORD style )
+	{
+		this->style |= style;
+	}
+	void AndStyle( DWORD style )
+	{
+		this->style &= style;
+	}
+	void DeleteStyle( DWORD style )
+	{
+		this->style &= ~style;
+	}
+
+	DWORD GetExStyle() const
+	{
+		return exstyle;
+	}
+	void SetExStyle( DWORD exstyle )
+	{
+		this->exstyle = exstyle;
+	}
+	void AddExStyle( DWORD exstyle )
+	{
+		this->exstyle |= exstyle;
+	}
+
+private:
+	std::string name;
+	std::string caption;
+	DWORD style;
+	DWORD exstyle;
+
+public:
+	POINT pos;
+	SIZE size;
+};
+
+class ChildWindowInfo
+	: public WindowInfoBase
+{
+public:
+	int Control;
+
+	ImageControlInfo image;
+};
+typedef std::vector<ChildWindowInfo *> ChildWindowInfos;
+
+struct WindowType
+{
+	enum EnumType
+	{
+		Default = 0,
+		ModalDlg = 1,
+		ModelessDlg = 3,
+	};
+};
+
+class WindowInfo
+	: public WindowInfoBase
+{
+public:
+
+	const std::string GetSourceFileName() const
+	{
+		return this->GetName() + ".ab";
+	}
+
+	const std::string GetSourceFileNameForOldVer( const std::string &baseDir ) const
+	{
+		if( Jenga::Common::Path( baseDir + this->GetName() + ".ab" ).IsExistFile() )
+		{
+			return this->GetName() + ".ab";
+		}
+		if( Jenga::Common::Path( baseDir + this->GetName() + ".abp" ).IsExistFile() )
+		{
+			return this->GetName() + ".abp";
+		}
+		if( Jenga::Common::Path( baseDir + this->GetName() + ".sbp" ).IsExistFile() )
+		{
+			return this->GetName() + ".sbp";
+		}
+		return this->GetName() + ".ab";
+	}
+
+	const std::string &GetClassName() const
+	{
+		return className;
+	}
+	void SetClassName( const std::string &className )
+	{
+		this->className = className;
+	}
+
+	const std::string GetHandleName() const
+	{
+		return "h" + this->GetName();
+	}
+
+	const std::string GetCallbackName() const
+	{
+		return this->GetName() + "Proc";
+	}
+
+	const std::string &GetMenuIdName() const
+	{
+		return menuIdName;
+	}
+	void SetMenuIdName( const std::string &menuIdName )
+	{
+		this->menuIdName = menuIdName;
+	}
+	bool HasMenu() const
+	{
+		return !menuIdName.empty();
+	}
+
+	int GetBackgroundColor() const
+	{
+		return backgroundColor;
+	}
+	void SetBackgroundColor( int backgroundColor )
+	{
+		this->backgroundColor = backgroundColor;
+	}
+
+	const std::string &GetIconResourceName() const
+	{
+		return iconResourceName;
+	}
+	void SetIconResourceName( const std::string &iconResourceName )
+	{
+		this->iconResourceName = iconResourceName;
+	}
+	bool HasIcon() const
+	{
+		return !iconResourceName.empty();
+	}
+
+	WindowType::EnumType GetType() const
+	{
+		return type;
+	}
+	void SetType( WindowType::EnumType type )
+	{
+		this->type = type;
+	}
+	bool IsDefaultWindow() const
+	{
+		return ( type == WindowType::Default );
+	}
+	bool IsModalDlg() const
+	{
+		return ( type == WindowType::ModalDlg );
+	}
+	bool IsModelessDlg() const
+	{
+		return ( type == WindowType::ModelessDlg );
+	}
+
+	//ウィンドウデータ
+	LOGFONT LogFont;
+
+	//子ウィンドウ管理
+	ChildWindowInfos childWindowInfos;
+
+	//ツリー項目
+	HTREEITEM hTreeItem;
+
+private:
+	std::string className;
+	std::string handleName;
+	std::string menuIdName;
+	int backgroundColor;
+	std::string iconResourceName;
+	WindowType::EnumType type;
+};
+
+class WindowInfos
+	: public std::vector<WindowInfo *>
+{
+public:
+	WindowInfos()
+	{
+	}
+	~WindowInfos()
+	{
+	}
+
+	void Clear()
+	{
+		WindowInfos &windowInfos = *this;
+		BOOST_FOREACH( WindowInfo *pWindowInfo, windowInfos )
+		{
+			delete pWindowInfo;
+		}
+		this->clear();
+	}
+	void Erase( int index )
+	{
+		WindowInfos::iterator it = this->begin();
+		int i = 0;
+		while( i < index )
+		{
+			i ++;
+			it ++;
+		}
+		this->erase( it );
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowAreaManager.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowAreaManager.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowAreaManager.h	(revision 774)
@@ -0,0 +1,21 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{
+
+
+class WindowAreaManager
+{
+	HWND hParentWnd;
+	std::vector<WindowCollection> windowCollections;
+public:
+	void SetParentWnd( HWND hParentWnd )
+	{
+		this->hParentWnd = hParentWnd;
+	}
+
+	void Add();
+	void AddMdiClientWindow( HWND hMdiClientWnd );
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowCollection.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowCollection.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowCollection.h	(revision 774)
@@ -0,0 +1,23 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{
+
+
+class WindowCollection
+{
+	HWND hMdiClientWnd;
+	WindowComponents::BaseWindowPtrs windows;
+public:
+
+	WindowCollection()
+		: hMdiClientWnd( NULL )
+	{
+	}
+	WindowCollection( HWND hMdiClientWnd )
+		: hMdiClientWnd( hMdiClientWnd )
+	{
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/BaseWindow.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/BaseWindow.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/BaseWindow.h	(revision 774)
@@ -0,0 +1,20 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{
+
+
+class BaseWindow
+	: public CWindowImpl<BaseWindow, CAxWindow>
+{
+public:
+	BaseWindow()
+	{
+	}
+	~BaseWindow()
+	{
+	}
+};
+typedef std::vector<BaseWindow *> BaseWindowPtrs;
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/CodeEditor/Syntax.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/CodeEditor/Syntax.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/CodeEditor/Syntax.h	(revision 774)
@@ -0,0 +1,50 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{ namespace CodeEditor{
+
+
+struct ReservedKeywordWithQuickHelp
+{
+	std::string keyword;
+	std::string quickHelp;
+};
+typedef std::vector<ReservedKeywordWithQuickHelp> ReservedKeywordsWithQuickHelp;
+struct Syntax
+{
+	std::string commentSingle;
+	std::string commentMultiBegin;
+	std::string commentMultiEnd;
+	Jenga::Common::Strings quoteMarks;
+	Jenga::Common::Strings reservedSimpleKeywords;
+	ReservedKeywordsWithQuickHelp reservedKeywordsWithQuickHelp;
+};
+class Language
+{
+	std::string name;
+	Syntax syntax;
+public:
+	const std::string &GetName() const
+	{
+		return name;
+	}
+	const Syntax &GetSyntax() const
+	{
+		return syntax;
+	}
+
+	void Load( const TiXmlDocument &doc );
+	bool IsExistKeyword( const std::string &keyword ) const;
+	bool IsExistReservedKeywordWithQuickHelp( const std::string &keyword ) const;
+	const std::string &GetReservedKeywordWithQuickHelp( const std::string &keyword ) const;
+	bool IsQuoteMark( char c ) const;
+};
+class Languages
+	: public std::map<std::string, Language>
+{
+	void Add( const std::string &xmlPath );
+public:
+	void LoadFiles( const std::string &dirPath );
+};
+
+
+}}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/DockingWindow.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/DockingWindow.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/DockingWindow.h	(revision 774)
@@ -0,0 +1,19 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{
+
+
+class DockingWindow
+	: public BaseWindow
+{
+public:
+	DockingWindow()
+	{
+	}
+	~DockingWindow()
+	{
+	}
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiChild.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiChild.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiChild.h	(revision 774)
@@ -0,0 +1,37 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{
+
+
+class MdiChild
+	: public CMDIChildWindowImpl<MdiChild>
+{
+public:
+    virtual void OnFinalMessage(HWND /*hWnd*/){
+        delete this;
+    }
+
+private:
+    // メッセージマップ
+    BEGIN_MSG_MAP_EX(MdiChild)
+        MSG_WM_CREATE(OnCreate)
+        //MSG_WM_FORWARDMSG(OnForwardMsg)
+        CHAIN_MSG_MAP(CMDIChildWindowImpl<MdiChild>)
+    END_MSG_MAP()
+
+    LRESULT OnCreate(LPCREATESTRUCT){
+        SetMsgHandled(false);
+        return 1;
+    }
+/*
+    LRESULT OnForwardMsg(LPMSG pMsg, DWORD dwUserData){
+        // メッセージフィルタ処理
+        if(CMDIChildWindowImpl<MdiChild>::PreTranslateMessage(pMsg))
+            return TRUE;
+
+        return m_view.PreTranslateMessage(pMsg);
+    }*/
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiWindow.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiWindow.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/MdiWindow.h	(revision 774)
@@ -0,0 +1,37 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{
+
+
+class MdiWindow
+	: public CMDIFrameWindowImpl<MdiWindow>
+	, public CUpdateUI<MdiWindow>
+	, public CMessageFilter
+	, public CIdleHandler
+{
+public:
+    virtual BOOL PreTranslateMessage(MSG* pMsg){
+        if(CMDIFrameWindowImpl<MdiWindow>::PreTranslateMessage(pMsg))
+            return TRUE;
+
+        // アクティブな子ウィンドウにメッセージフィルタの機会を与える
+        HWND hWnd = MDIGetActive();
+        if(hWnd != NULL)
+            return (BOOL)::SendMessage(hWnd, WM_FORWARDMSG, 0, (LPARAM)pMsg);
+
+        return FALSE;
+    }
+
+    virtual BOOL OnIdle(){
+        UIUpdateToolBar();
+        UIUpdateStatusBar();
+        return FALSE;
+    }
+
+    BEGIN_UPDATE_UI_MAP( MdiWindow )
+        // エントリなし
+    END_UPDATE_UI_MAP()
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/TextView.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/TextView.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/include/WindowComponents/TextView.h	(revision 774)
@@ -0,0 +1,27 @@
+#pragma once
+
+namespace ActiveBasic{ namespace IDE{ namespace WindowComponents{
+
+
+class TextView
+	: DockingWindow
+{
+public:
+	TextView()
+	{
+	}
+	~TextView()
+	{
+	}
+
+	virtual ::LRESULT OnCreate ( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled );
+
+private:
+	// メッセージマップ
+	BEGIN_MSG_MAP( TextView )
+		MESSAGE_HANDLER( WM_CREATE, OnCreate )
+	END_MSG_MAP()
+};
+
+
+}}}
Index: branches/egtra/ab5.0/abdev/abdev/manifest.xml
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/manifest.xml	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/manifest.xml	(revision 774)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+	<description>Description</description>
+	<dependency>
+		<dependentAssembly>
+			<assemblyIdentity
+				type="win32"
+				name="Microsoft.Windows.Common-Controls"
+				version="6.0.0.0"
+				processorArchitecture="x86"
+				publicKeyToken="6595b64144ccf1df"
+				language="*" />
+		</dependentAssembly>
+	</dependency>
+</assembly>
Index: branches/egtra/ab5.0/abdev/abdev/menu.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/menu.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/menu.cpp	(revision 774)
@@ -0,0 +1,593 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+HFONT hMenuFont;
+
+
+
+CMenuItemData::CMenuItemData(int item_index,int itemID,char *str,CMenuEx *pobj_ThisMenu,CSubMenuEx *pobj_SubMenu){
+	this->item_index=item_index;
+	this->itemID=itemID;
+	if(str){
+		this->str=(char *)HeapAlloc(hHeap,0,lstrlen(str)+1);
+		lstrcpy(this->str,str);
+	}
+	else this->str=0;
+	this->pobj_ThisMenu=pobj_ThisMenu;
+	this->pobj_SubMenu=pobj_SubMenu;
+
+
+	hIcon=0;
+	hGrayIcon=0;
+}
+CMenuItemData::~CMenuItemData(){
+	//メニュー文字列
+	if(str)
+		HeapDefaultFree(str);
+
+	//サブメニュー オブジェクトを破棄
+	if(pobj_SubMenu)
+		delete pobj_SubMenu;
+
+	//アイコン
+	if(hIcon) DestroyIcon(hIcon);
+
+	//淡色アイコン
+	if(hGrayIcon) DestroyIcon(hGrayIcon);
+}
+
+
+
+CMenuEx *pobj_MainMenu;
+
+CMenuEx::CMenuEx(HMENU hmenu){
+	hMenu=hmenu;
+
+	ppobj_MenuItemData=(CMenuItemData **)HeapAlloc(hHeap,0,1);
+	iMenuItemNum=0;
+}
+CMenuEx::~CMenuEx(){
+	int i;
+
+	//itemDataを解放
+	for(i=0;i<iMenuItemNum;i++){
+		delete ppobj_MenuItemData[i];
+	}
+	HeapDefaultFree(ppobj_MenuItemData);
+
+	DestroyMenu(hMenu);
+}
+
+void CMenuEx::EnableItem(UINT uIDEnableItem,UINT uEnable){
+	//メニューアイテムの有効化/無効化
+	EnableMenuItem(hMenu,uIDEnableItem,uEnable);
+}
+void CMenuEx::CheckMenu(UINT idItem,BOOL bChecked){
+	//メニューアイテムのチェックマークON/OFF
+	MENUITEMINFO MenuItemInfo;
+	MenuItemInfo.cbSize=sizeof(MENUITEMINFO);
+	MenuItemInfo.fMask=MIIM_STATE;
+	if(bChecked) MenuItemInfo.fState=MFS_CHECKED;
+	else MenuItemInfo.fState=MFS_UNCHECKED;
+
+	SetMenuItemInfo(hMenu,idItem,0,&MenuItemInfo);
+}
+BOOL CMenuEx::IsCheck(UINT idItem){
+	MENUITEMINFO MenuItemInfo;
+	MenuItemInfo.cbSize=sizeof(MENUITEMINFO);
+	MenuItemInfo.fMask=MIIM_STATE;
+	GetMenuItemInfo(hMenu,idItem,0,&MenuItemInfo);
+	if(MenuItemInfo.fState&MFS_CHECKED) return 1;
+	return 0;
+}
+void CMenuEx::RenameMenuItem(int item_index,char *str){
+	ppobj_MenuItemData[item_index]->str=(char *)HeapReAlloc(hHeap,0,ppobj_MenuItemData[item_index]->str,lstrlen(str)+1);
+	lstrcpy(ppobj_MenuItemData[item_index]->str,str);
+}
+void CMenuEx::RenameMenuItemByID(int itemID,char *str){
+	int i;
+	for(i=0;i<iMenuItemNum;i++){
+		if(ppobj_MenuItemData[i]->itemID==itemID){
+			RenameMenuItem(i,str);
+			return;
+		}
+	}
+}
+void CMenuEx::RemoveItem(int item_index){
+	//メニューアイテムの消去
+	//※ポップアップメニューの消去には対応していない
+
+	::RemoveMenu(hMenu,item_index,MF_BYPOSITION);
+
+	//メニューアイテム拡張データオブジェクトを破棄
+	delete ppobj_MenuItemData[item_index];
+
+
+	iMenuItemNum--;
+
+	int i;
+	for(i=item_index;i<iMenuItemNum;i++){
+		ppobj_MenuItemData[i]=ppobj_MenuItemData[i+1];
+	}
+}
+void CMenuEx::InsertItem(int item_index,int itemID,char *str){
+	//メニューアイテムの挿入
+
+	CMenuItemData *pobj_MenuItemData;
+	pobj_MenuItemData=AddMenuExItemData(item_index,itemID,str,this,0);
+
+	MENUITEMINFO mii;
+	memset(&mii,0,sizeof(MENUITEMINFO));
+	mii.cbSize=sizeof(MENUITEMINFO);
+	mii.fMask=MIIM_TYPE|MIIM_ID|MIIM_DATA;
+	mii.fType=MFT_OWNERDRAW;
+	mii.wID=itemID;
+	mii.dwTypeData=str;
+	mii.dwItemData=(ULONG_PTR)pobj_MenuItemData;
+	InsertMenuItem(hMenu,item_index,1,&mii);
+}
+
+BOOL CMenuEx::SetIcon(int itemID,HICON hIcon){
+	//アイコンをセット
+	
+	for( int i=0; i<iMenuItemNum; i++ )
+	{
+		if(ppobj_MenuItemData[i]->itemID==itemID){
+			ppobj_MenuItemData[i]->hIcon=hIcon;
+
+
+			/////////////////////////
+			// 淡色アイコンを作成
+			/////////////////////////
+
+			ppobj_MenuItemData[i]->hGrayIcon=CreateGrayIcon(hIcon);
+			return 1;
+		}
+		if(ppobj_MenuItemData[i]->pobj_SubMenu){
+			BOOL bResult;
+			bResult=ppobj_MenuItemData[i]->pobj_SubMenu->SetIcon(itemID,hIcon);
+			if(bResult) return 1;
+		}
+	}
+	return 0;
+}
+
+int CMenuEx::FindSubMenuIndex( const std::string &itemStr )
+{
+	for( int i=0; i<iMenuItemNum; i++ )
+	{
+		if( itemStr == ppobj_MenuItemData[i]->str )
+		{
+			return i;
+		}
+	}
+	return -1;
+}
+
+CMenuItemData *CMenuEx::AddMenuExItemData(int item_index,int itemID,char *str,CMenuEx *pobj_ThisMenu,CSubMenuEx *pobj_SubMenu){
+	CMenuItemData *pobj_MenuItemData;
+	pobj_MenuItemData=new CMenuItemData(item_index,itemID,str,pobj_ThisMenu,pobj_SubMenu);
+
+
+	ppobj_MenuItemData=(CMenuItemData **)HeapReAlloc(hHeap,0,ppobj_MenuItemData,(iMenuItemNum+1)*sizeof(CMenuItemData *));
+
+	int i;
+	for(i=iMenuItemNum;i>item_index;i--){
+		ppobj_MenuItemData[i]=ppobj_MenuItemData[i-1];
+	}
+
+	ppobj_MenuItemData[item_index]=pobj_MenuItemData;
+
+	iMenuItemNum++;
+
+	return pobj_MenuItemData;
+}
+void CMenuEx::InitOwnerDraw(BOOL bParent){
+	char temporary[MAX_PATH];
+	MENUITEMINFO mii;
+	memset(&mii,0,sizeof(MENUITEMINFO));
+	mii.cbSize=sizeof(MENUITEMINFO);
+	mii.fMask=MIIM_TYPE|MIIM_ID|MIIM_SUBMENU|MIIM_DATA;
+
+	int nCount;
+	nCount=GetMenuItemCount(hMenu);
+
+	int i;
+	for(i=0;i<nCount;i++){
+		mii.dwTypeData=temporary;
+		mii.cch=MAX_PATH;
+		GetMenuItemInfo(hMenu,i,1,&mii);
+
+		char *temp2=0;
+		if(mii.fType==MFT_STRING) temp2=temporary;
+
+		int fType_Separator;
+		if(mii.fType==MFT_SEPARATOR) fType_Separator=MFT_SEPARATOR;
+		else fType_Separator=0;
+
+		CSubMenuEx *pobj_SubMenu;
+		if(mii.hSubMenu){
+			pobj_SubMenu=new CSubMenuEx(mii.hSubMenu);
+			pobj_SubMenu->InitOwnerDraw(0);
+		}
+		else pobj_SubMenu=0;
+
+		//拡張データをメモリに退避
+		CMenuItemData *pobj_MenuItemData;
+		pobj_MenuItemData=AddMenuExItemData(i,mii.wID,temp2,this,pobj_SubMenu);
+
+		mii.fType=MFT_OWNERDRAW | fType_Separator;
+		mii.dwItemData=(ULONG_PTR)pobj_MenuItemData;
+		SetMenuItemInfo(hMenu,i,1,&mii);
+	}
+}
+void CMenuEx::GetItemSize(int item_index,SIZE *pSize){
+	if(ppobj_MenuItemData[item_index]->str){
+		HDC hdc;
+		hdc = GetDC(GetDesktopWindow());
+		HFONT hOldFont;
+		hOldFont = (HFONT)SelectObject(hdc, hMenuFont);
+
+		GetTextExtentPoint32(hdc,
+			ppobj_MenuItemData[item_index]->str,
+			lstrlen(ppobj_MenuItemData[item_index]->str),
+			pSize);
+
+		SelectObject(hdc,hOldFont);
+		ReleaseDC(GetDesktopWindow(),hdc);
+	}
+	else{
+		//セパレータのとき
+		pSize->cx=50;
+		pSize->cy=10;
+	}
+}
+
+BOOL CMenuEx::OwnerDrawSubMenu(HMENU hSubMenu,HDC hdc,RECT *pRect,BOOL bSelect,int item_index){
+	int i;
+	for(i=0;i<iMenuItemNum;i++){
+		if(ppobj_MenuItemData[i]->pobj_SubMenu){
+			if(hSubMenu==ppobj_MenuItemData[i]->pobj_SubMenu->hMenu){
+				ppobj_MenuItemData[i]->pobj_SubMenu->OwnerDrawMenu(hdc,pRect,bSelect,item_index);
+				return 1;
+			}
+			else{
+				BOOL bResult;
+				bResult=ppobj_MenuItemData[i]->pobj_SubMenu->OwnerDrawSubMenu(hSubMenu,hdc,pRect,bSelect,item_index);
+				if(bResult) return 1;
+			}
+		}
+	}
+	return 0;
+}
+void CMenuEx::OwnerDrawMenu(HDC hdc,RECT *pRect,BOOL bSelect,int item_index){
+	/////////////////////////////////
+	// 親メニューのオーナー描画
+	/////////////////////////////////
+
+
+	COLORREF BackColor,TextColor;
+
+	RECT rc;
+
+	if(bSelect){
+		//選択状態にある場合
+		HPEN hPen,hOldPen;
+		hPen=CreatePen(PS_SOLID,0,MENUCOLOR_SELECT_LINE);
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+		HBRUSH hBrush,hOldBrush;
+		hBrush=CreateSolidBrush(MENUCOLOR_SELECT_BACK);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+		pRect->left++;
+		pRect->top++;
+		Rectangle(hdc,pRect);
+		pRect->left--;
+
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+
+		TextColor=MENUCOLOR_TEXT;
+	}
+	else{
+		POINT pos;
+		GetCursorPos(&pos);
+		GetWindowRect(hOwner,&rc);
+		pos.x-=rc.left;
+		pos.y-=rc.top;
+		if(HitTest(pRect,&pos)){
+			//ホットイメージで表示
+			HPEN hPen,hOldPen;
+			hPen=CreatePen(PS_SOLID,0,MENUCOLOR_HOT_LINE);
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+			HBRUSH hBrush,hOldBrush;
+			hBrush=CreateSolidBrush(MENUCOLOR_HOT_BACK);
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+			pRect->left++;
+			pRect->top++;
+			Rectangle(hdc,pRect);
+			pRect->left--;
+			pRect->top--;
+
+			SelectObject(hdc,hOldPen);
+			SelectObject(hdc,hOldBrush);
+
+			DeleteObject(hPen);
+			DeleteObject(hBrush);
+
+			TextColor=MENUCOLOR_TEXT;
+		}
+		else{
+			BackColor=MENUCOLOR_DEFAULT_BACK;
+			TextColor=MENUCOLOR_TEXT;
+
+			//背景を塗りつぶす
+			HBRUSH hBrush;
+			hBrush=CreateSolidBrush(BackColor);
+			FillRect(hdc,pRect,hBrush);
+			DeleteObject(hBrush);
+		}
+	}
+
+
+	if(ppobj_MenuItemData[item_index]->str){
+		rc=*pRect;
+		rc.top+=1;
+
+		SetBkMode(hdc, TRANSPARENT);
+		SetTextColor(hdc, TextColor);
+
+		HFONT hOldFont;
+		hOldFont=(HFONT)SelectObject(hdc,hMenuFont);
+
+		DrawText(hdc,ppobj_MenuItemData[item_index]->str,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
+
+		SelectObject(hdc,hOldFont);
+	}
+	else{
+		//セパレータのとき
+	}
+}
+
+
+CSubMenuEx::CSubMenuEx(HMENU hMenu):CMenuEx(hMenu){
+}
+void CSubMenuEx::GetItemSize(int item_index,SIZE *pSize){
+	if(ppobj_MenuItemData[item_index]->str){
+		HDC hdc;
+		hdc = GetDC(GetDesktopWindow());
+		HFONT hOldFont;
+		hOldFont = (HFONT)SelectObject(hdc, hMenuFont);
+
+		GetTextExtentPoint32(hdc,
+			ppobj_MenuItemData[item_index]->str,
+			lstrlen(ppobj_MenuItemData[item_index]->str),
+			pSize);
+
+		SelectObject(hdc,hOldFont);
+		ReleaseDC(GetDesktopWindow(),hdc);
+
+		pSize->cx+=50;
+		if(pSize->cy<22) pSize->cy=22;
+	}
+	else{
+		//セパレータのとき
+		pSize->cx=50;
+		pSize->cy=10;
+	}
+}
+
+void CSubMenuEx::OwnerDrawMenu(HDC hdc,RECT *pRect,BOOL bSelect,int item_index){
+	//////////////////////////////////
+	// サブメニューのオーナー描画
+	//////////////////////////////////
+
+	RECT rc;
+	COLORREF BackColor,TextColor;
+	int i;
+
+	///////////////////////////////
+	// 左側のグラデーションを描画
+	///////////////////////////////
+
+	SIZE size;
+	size.cx=22;
+	size.cy=pRect->bottom-pRect->top;
+	HBITMAP hBmp;
+	hBmp=CreateHorzGradationBitmap(&size,RGB(254,254,251),RGB(196,196,173));
+
+	HDC memdc;
+	memdc=CreateCompatibleDC(hdc);
+	SelectObject(memdc,hBmp);
+	BitBlt(hdc,pRect->left,pRect->top,size.cx,size.cy,memdc,0,0,SRCCOPY);
+	DeleteDC(memdc);
+	DeleteObject(hBmp);
+
+
+	if(ppobj_MenuItemData[item_index]->str==0){
+		//セパレータのとき
+		HPEN hPen,hOldPen;
+		hPen=CreatePen(PS_SOLID,0,MENUCOLOR_DEFAULT_LINE);
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+		MoveToEx(hdc,pRect->left+24,pRect->top+(pRect->bottom-pRect->top)/2,NULL);
+		LineTo(hdc,pRect->right,pRect->top+(pRect->bottom-pRect->top)/2);
+
+		SelectObject(hdc,hOldPen);
+		DeleteObject(hPen);
+		return;
+	}
+
+
+	//アイテムの状態を取得
+	MENUITEMINFO mii;
+	mii.cbSize=sizeof(MENUITEMINFO);
+	mii.fMask=MIIM_STATE;
+	GetMenuItemInfo(hMenu,item_index,1,&mii);
+
+
+	if(bSelect&&(mii.fState&MFS_DISABLED)==0){
+		//ホットイメージで表示
+		BackColor=MENUCOLOR_HOT_BACK;
+
+		HPEN hPen,hOldPen;
+		hPen=CreatePen(PS_SOLID,0,MENUCOLOR_HOT_LINE);
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+		HBRUSH hBrush,hOldBrush;
+		hBrush=CreateSolidBrush(BackColor);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+		Rectangle(hdc,pRect);
+
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+	}
+	else{
+		//マウスカーソルの座標を取得
+		POINT pos;
+		GetCursorPos(&pos);
+
+		//親ウィンドウのウィンドウ左上からの相対座標に変換
+		//（クライアント座標ではないところに注意）
+		GetWindowRect(WindowFromDC(hdc),&rc);
+		ScreenToClient(WindowFromDC(hdc),&pos);
+
+		if(bSelect&&HitTest(pRect,&pos)==0){
+			//淡色状態
+			BackColor=MENUCOLOR_SELECT_BACK;
+
+			HPEN hPen,hOldPen;
+			hPen=CreatePen(PS_SOLID,0,MENUCOLOR_SELECT_LINE);
+			hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+			HBRUSH hBrush,hOldBrush;
+			hBrush=CreateSolidBrush(BackColor);
+			hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+			Rectangle(hdc,pRect);
+
+			SelectObject(hdc,hOldPen);
+			SelectObject(hdc,hOldBrush);
+
+			DeleteObject(hPen);
+			DeleteObject(hBrush);
+		}
+		else{
+			BackColor=GetSysColor(COLOR_MENU);
+
+			rc=*pRect;
+			rc.left=pRect->left+22;
+			rc.right=pRect->right;
+
+			//背景を塗りつぶす
+			HBRUSH hBrush;
+			hBrush=CreateSolidBrush(BackColor);
+			FillRect(hdc,&rc,hBrush);
+			DeleteObject(hBrush);
+		}
+	}
+
+
+	if(mii.fState&MFS_CHECKED){
+		//チェックマークの外枠を描画
+		rc=*pRect;
+		rc.top++;
+		rc.right=rc.left+20;
+		rc.bottom--;
+
+		HPEN hPen,hOldPen;
+		hPen=CreatePen(PS_SOLID,0,MENUCOLOR_HOT_LINE);
+		hOldPen=(HPEN)SelectObject(hdc,hPen);
+
+		HBRUSH hBrush,hOldBrush;
+		hBrush=CreateSolidBrush(BackColor);
+		hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
+
+		Rectangle(hdc,&rc);
+
+		SelectObject(hdc,hOldPen);
+		SelectObject(hdc,hOldBrush);
+
+		DeleteObject(hPen);
+		DeleteObject(hBrush);
+
+
+		//チェックマークを描画
+		int BaseX=rc.left,BaseY=rc.top;
+		for(i=0;i<3;i++){
+			SetPixel(hdc,BaseX+6+i,BaseY+9+i,MENUCOLOR_TEXT);
+			SetPixel(hdc,BaseX+6+i,BaseY+10+i,MENUCOLOR_TEXT);
+		}
+		for(i=0;i<4;i++){
+			SetPixel(hdc,BaseX+9+i,BaseY+10-i,MENUCOLOR_TEXT);
+			SetPixel(hdc,BaseX+9+i,BaseY+11-i,MENUCOLOR_TEXT);
+		}
+	}
+	else{
+		if(ppobj_MenuItemData[item_index]->hIcon){
+			//アイコンを描画
+			HICON hIcon;
+			if(mii.fState&MFS_DISABLED) hIcon=ppobj_MenuItemData[item_index]->hGrayIcon;
+			else hIcon=ppobj_MenuItemData[item_index]->hIcon;
+
+			DrawIconEx(hdc,pRect->left+1,pRect->top+3,hIcon,16,16,0,NULL,DI_NORMAL);
+		}
+	}
+
+
+
+	//メイン文字列とショートカットキー文字列を分別
+	char szMain[255],szShortcut[255];
+	for(i=0;;i++){
+		if(ppobj_MenuItemData[item_index]->str[i]=='\t'){
+			szMain[i]=0;
+
+			lstrcpy(szShortcut,ppobj_MenuItemData[item_index]->str+i+1);
+			break;
+		}
+		szMain[i]=ppobj_MenuItemData[item_index]->str[i];
+		if(ppobj_MenuItemData[item_index]->str[i]=='\0'){
+			szShortcut[0]=0;
+			break;
+		}
+	}
+
+	rc=*pRect;
+	rc.left=pRect->left+26;
+	rc.right=pRect->right;
+
+	HFONT hOldFont;
+	hOldFont=(HFONT)SelectObject(hdc,hMenuFont);
+
+	if(mii.fState&MFS_DISABLED){
+		//淡色カラー
+		TextColor=MENUCOLOR_GRAY_TEXT;
+	}
+	else{
+		//通常カラー
+		TextColor=MENUCOLOR_TEXT;
+	}
+
+	SetBkMode(hdc, TRANSPARENT);
+	SetTextColor(hdc, TextColor);
+
+	DrawText(hdc,szMain,-1,&rc,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
+
+	if(szShortcut[0]){
+		rc.left=rc.right-45;
+		DrawText(hdc,szShortcut,-1,&rc,DT_VCENTER|DT_LEFT|DT_SINGLELINE);
+	}
+
+	SelectObject(hdc,hOldFont);
+}
Index: branches/egtra/ab5.0/abdev/abdev/menu.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/menu.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/menu.h	(revision 774)
@@ -0,0 +1,91 @@
+
+
+#define LIGHT_RGB(rgb,ratio) RGB(\
+	LOBYTE(LOWORD(rgb))+(BYTE)((double)(255-LOBYTE(LOWORD(rgb)))*ratio),\
+	HIBYTE(LOWORD(rgb))+(BYTE)((double)(255-HIBYTE(LOWORD(rgb)))*ratio),\
+	LOBYTE(HIWORD(rgb))+(BYTE)((double)(255-LOBYTE(HIWORD(rgb)))*ratio))
+
+
+#define MENUCOLOR_TEXT			GetSysColor(COLOR_WINDOWTEXT)				//テキストの色
+#define MENUCOLOR_GRAY_TEXT		GetSysColor(COLOR_GRAYTEXT)		//淡色テキストの色
+#define MENUCOLOR_DEFAULT_LINE	GetSysColor(COLOR_3DDKSHADOW)	//通常時の線の色
+#define MENUCOLOR_DEFAULT_BACK	GetSysColor(COLOR_3DFACE)		//通常時の背景色
+#define MENUCOLOR_HOT_LINE		GetSysColor(COLOR_ACTIVECAPTION)			//ホット状態の線の色
+#define MENUCOLOR_HOT_BACK		LIGHT_RGB(MENUCOLOR_HOT_LINE,0.7)		//ホット状態の背景色
+#define MENUCOLOR_SELECT_LINE	MENUCOLOR_DEFAULT_LINE	//選択状態の線の色
+#define MENUCOLOR_SELECT_BACK	GetSysColor(COLOR_MENU)	//選択状態の背景色
+
+
+extern HFONT hMenuFont;
+
+
+class CSubMenuEx;
+class CMenuEx;
+
+class CMenuItemData{
+public:
+	int item_index;
+	int itemID;
+	LPSTR str;
+
+	CMenuEx *pobj_ThisMenu;
+	CSubMenuEx *pobj_SubMenu;
+
+	HICON hIcon;
+	HICON hGrayIcon;
+
+	CMenuItemData(int item_index,int itemID,char *str,CMenuEx *pobj_ThisMenu,CSubMenuEx *pobj_SubMenu);
+	~CMenuItemData();
+};
+
+class CMenuEx{
+public:
+	HMENU hMenu;
+
+	CMenuEx(HMENU hmenu);
+	~CMenuEx();
+
+
+	//拡張メニューデータ
+	CMenuItemData **ppobj_MenuItemData;
+	int iMenuItemNum;
+	CMenuItemData *AddMenuExItemData(int item_index,int itemID,char *str,CMenuEx *pobj_ThisMenu,CSubMenuEx *pobj_SubMenu);
+
+
+
+	void EnableItem(UINT uIDEnableItem,UINT uEnable);
+
+	void CheckMenu(UINT idItem,BOOL bChecked);
+	BOOL IsCheck(UINT idItem);
+
+	void RenameMenuItem(int item_index,char *str);
+	void RenameMenuItemByID(int itemID,char *str);
+
+	void RemoveItem(int item_index);
+	void InsertItem(int item_index,int itemID,char *str);
+
+
+	//アイコン表示拡張
+	BOOL SetIcon(int itemID,HICON hIcon);
+
+	int FindSubMenuIndex( const std::string &itemStr );
+
+
+private:
+	CSubMenuEx *AddSubMenu(HMENU hSubMenu);
+public:
+	// オーナー描画関連
+	void InitOwnerDraw(BOOL bParent);
+	virtual void GetItemSize(int item_index,SIZE *pSize);
+	BOOL OwnerDrawSubMenu(HMENU hSubMenu,HDC hdc,RECT *pRect,BOOL bSelect,int item_index);
+	virtual void OwnerDrawMenu(HDC hdc,RECT *pRect,BOOL bSelect,int item_index);
+};
+
+class CSubMenuEx:public CMenuEx{
+public:
+	CSubMenuEx(HMENU hMenu);
+	virtual void GetItemSize(int item_index,SIZE *pSize);
+	virtual void OwnerDrawMenu(HDC hdc,RECT *pRect,BOOL bSelect,int item_index);
+};
+
+extern CMenuEx *pobj_MainMenu;
Index: branches/egtra/ab5.0/abdev/abdev/nkf_class.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/nkf_class.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/nkf_class.cpp	(revision 774)
@@ -0,0 +1,216 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+using namespace ActiveBasic::IDE;
+
+HRESULT ApplyDialogTexture( HWND );
+
+//文字コード変換用クラスライブラリ
+CNkf nkf;
+
+CNkf::CNkf()
+{
+	const std::string nkf32DllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\nkf32.dll";
+	hLib = LoadLibrary( nkf32DllPath.c_str() );
+	if( !hLib )
+	{
+		MessageBox( NULL, "nkf32.dll が見つかりません。", "エラー", MB_OK | MB_ICONEXCLAMATION );
+	}
+
+	pGetNkfVersion=(GetNkfVersion)GetProcAddress(hLib,"GetNkfVersion");
+	pSetNkfOption=(SetNkfOption)GetProcAddress(hLib,"SetNkfOption");
+	pNkfConvert=(NkfConvert)GetProcAddress(hLib,"NkfConvert");
+	pNkfGetKanjiCode=(NkfGetKanjiCode)GetProcAddress(hLib,"NkfGetKanjiCode");
+}
+
+CNkf::~CNkf(){
+	FreeLibrary(hLib);
+}
+
+
+char *CNkf::RestoreBuffer(char *buffer,int iCharCode){
+	/////////////////////
+	// 文字コードを復元
+	// ※内部表現はShift-JIS
+	/////////////////////
+	extern HANDLE hHeap;
+	char *pBuf;
+
+	pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)*2+1);
+
+	switch(iCharCode){
+		case NKF_SHIFT_JIS:
+			lstrcpy(pBuf,buffer);
+			break;
+		case NKF_EUC:
+			pSetNkfOption("-ex");
+			pNkfConvert(pBuf,buffer);
+			break;
+		case NKF_ISO_2022_JP:
+			pSetNkfOption("-jx");
+			pNkfConvert(pBuf,buffer);
+			break;
+		case NKF_UTF_8:
+			pSetNkfOption("-wx");
+			pNkfConvert(pBuf,buffer);
+			break;
+	}
+
+	return pBuf;
+}
+
+void CNkf::GetCharCodeName(int iCharCode,char *name){
+	switch(iCharCode){
+		case NKF_SHIFT_JIS:
+			lstrcpy(name,"Shift-JIS");
+			break;
+		case NKF_EUC:
+			lstrcpy(name,"EUC");
+			break;
+		case NKF_ISO_2022_JP:
+			lstrcpy(name,"JIS");
+			break;
+		case NKF_UTF_8:
+			lstrcpy(name,"UTF-8");
+			break;
+	}
+}
+
+char *CNkf::ToCRLF(int iLfCode,char *buffer){
+	extern HANDLE hHeap;
+	int i,i2;
+
+	char *temp;
+	temp=(char *)HeapAlloc(hHeap,0,lstrlen(buffer)*2+1);
+
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\0'){
+			temp[i2]=0;
+			break;
+		}
+		if(iLfCode==LFCODE_LF){
+			if(buffer[i]=='\n'){
+				temp[i2++]='\r';
+				temp[i2]='\n';
+				continue;
+			}
+		}
+		else if(iLfCode==LFCODE_CR){
+			if(buffer[i]=='\r'){
+				temp[i2++]='\r';
+				temp[i2]='\n';
+				continue;
+			}
+		}
+
+		temp[i2]=buffer[i];
+	}
+
+	return temp;
+}
+void CNkf::ToLF(char *buffer){
+	extern HANDLE hHeap;
+	int i,i2;
+
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			buffer[i2]='\n';
+			i++;
+			continue;
+		}
+
+		buffer[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+}
+void CNkf::ToCR(char *buffer){
+	extern HANDLE hHeap;
+	int i,i2;
+
+	for(i=0,i2=0;;i++,i2++){
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n'){
+			buffer[i2]='\r';
+			i++;
+			continue;
+		}
+
+		buffer[i2]=buffer[i];
+		if(buffer[i]=='\0') break;
+	}
+}
+
+void CNkf::GetLfCodeName(int iLfCode,char *name){
+	switch(iLfCode){
+		case LFCODE_CRLF:
+			lstrcpy(name,"CRLF");
+			break;
+		case LFCODE_LF:
+			lstrcpy(name,"LF");
+			break;
+		case LFCODE_CR:
+			lstrcpy(name,"CR");
+			break;
+	}
+}
+
+
+
+INT_PTR CALLBACK nkfDlgCodeSave(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
+	static int WndNum;
+	HWND hList;
+
+	switch(message){
+		case WM_INITDIALOG:
+			SetPosCenter(hwnd);
+
+			WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
+			if(WndNum==-1){
+				//ウィンドウの取得に失敗
+				EndDialog(hwnd,0);
+				break;
+			}
+			if(!IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+				//テキストドキュメントでないとき
+				EndDialog(hwnd,0);
+				break;
+			}
+
+			hList=GetDlgItem(hwnd,IDC_LIST_CHARCODE);
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"Shift-JIS");
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"EUC");
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"JIS");
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"UTF-8");
+			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum]->pMdiTextEdit->iCharCode,0);
+
+			hList=GetDlgItem(hwnd,IDC_LIST_LFCODE);
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"CRLF(Windows)");
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"LF(Unix)");
+			SendMessage(hList,LB_ADDSTRING,0,(LPARAM)"CR(Macintosh)");
+			SendMessage(hList,LB_SETCURSEL,MdiInfo[WndNum]->pMdiTextEdit->iLfCode,0);
+			ApplyDialogTexture(hwnd);
+			break;
+		case WM_COMMAND:
+			switch(LOWORD(wParam)){
+				case IDOK:
+					//文字コードを取得
+					MdiInfo[WndNum]->pMdiTextEdit->iCharCode=
+						(int)SendDlgItemMessage(hwnd,IDC_LIST_CHARCODE,LB_GETCURSEL,0,0);
+
+					//改行コードを取得
+					MdiInfo[WndNum]->pMdiTextEdit->iLfCode=
+						(int)SendDlgItemMessage(hwnd,IDC_LIST_LFCODE,LB_GETCURSEL,0,0);
+
+					//保存
+					if(!SaveDocument(GetWindow(hClient,GW_CHILD),NULL)) return 0;
+
+					EndDialog(hwnd,1);
+					break;
+				case IDCANCEL:
+					EndDialog(hwnd,0);
+					break;
+			}
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/abdev/nkf_class.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/nkf_class.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/nkf_class.h	(revision 774)
@@ -0,0 +1,45 @@
+
+typedef void (CALLBACK *GetNkfVersion)(LPSTR verStr);
+typedef int (CALLBACK *SetNkfOption)(LPCSTR optStr);
+typedef void (CALLBACK *NkfConvert)(LPSTR outStr, LPCSTR inStr);
+typedef int (CALLBACK *NkfGetKanjiCode)(VOID);
+
+class CNkf{
+	HINSTANCE hLib;
+public:
+	CNkf();
+	~CNkf();
+	GetNkfVersion pGetNkfVersion;
+	SetNkfOption pSetNkfOption;
+	NkfConvert pNkfConvert;
+	NkfGetKanjiCode pNkfGetKanjiCode;
+
+	char *RestoreBuffer(char *buffer,int iCharCode);
+	void GetCharCodeName(int iCharCode,char *name);
+
+	char *ToCRLF(int iLfCode,char *buffer);
+	void ToLF(char *buffer);
+	void ToCR(char *buffer);
+	void GetLfCodeName(int iLfCode,char *name);
+};
+extern CNkf nkf;
+
+
+//文字コード
+#define NKF_SHIFT_JIS		0
+#define NKF_EUC				1
+#define NKF_ISO_2022_JP		2
+#define NKF_UTF_8			3
+
+#define NKF_CODE_MIN		NKF_SHIFT_JIS
+#define NKF_CODE_MAX		NKF_UTF_8
+
+
+//改行コード
+#define LFCODE_CRLF	0	//Windows
+#define LFCODE_LF	1	//Unix
+#define LFCODE_CR	2	//Macintosh
+
+
+//関数郡
+INT_PTR CALLBACK nkfDlgCodeSave(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
Index: branches/egtra/ab5.0/abdev/abdev/pj_msg_eng.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/pj_msg_eng.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/pj_msg_eng.h	(revision 774)
@@ -0,0 +1,49 @@
+///////////////////////////////////////////////////////////////
+// プロジェクト管理で使用する汎用テキストを定義しています
+//
+// 英語
+///////////////////////////////////////////////////////////////
+
+
+//////////////////
+// 削除メッセージ
+//////////////////
+#define STRING_PJ_CHECK_DELETECURSOR	"Delete the Cursor(%s) from the Project?"
+#define STRING_PJ_CHECK_DELETEBITMAP	"Delete the Bitmap(%s) from the Project?"
+#define STRING_PJ_CHECK_DELETEICON		"Delete the Icon(%s) from the Project?"
+#define STRING_PJ_CHECK_DELETEMENU		"Delete the Menu(%s) from the Project?"
+#define STRING_PJ_CHECK_DELETEWINDOW	"Delete the Window(%s) from the Project?"
+
+
+////////////////////////
+// 重複エラーメッセージ
+////////////////////////
+#define STRING_DUPLICATIONERROR_ID_IN_PROJECT		"\"%s\" ID already exists in a project."
+#define STRING_DUPLICATIONERROR_FILE_IN_PROJECT		"\"%s\" file already exists in a project."
+#define STRING_DUPLICATIONERROR_WINDOW_IN_PROJECT	"\"%s\" window already exists in a project."
+#define STRING_DUPLICATIONERROR_HANDLE_IN_PROJECT	"\"%s\" handle already exists in a project."
+#define STRING_DUPLICATIONERROR_PROC_IN_PROJECT		"\"%s\" procedure already exists in a project."
+
+
+//////////////////////////
+// 保存チェックメッセージ
+//////////////////////////
+#define STRING_MODIFYCHECK_PROJECT	"\"%s\" project was modified. Save it?"
+
+
+//////////////////////////
+// その他エラーメッセージ
+//////////////////////////
+#define STRING_ERROR_CANT_MAINFILE		"This is a main source file in the project. You can't delete it from the project."
+#define STRING_ERROR_MAKEDIRECTORY		"Creation of the directory did not succeed."
+#define STRING_ERROR_PROJECT_OVERWRITE	"The project already exists. Overwrite it?"
+#define STRING_ERROR_BROKEN_PROJECT		"The project file was corrupted."
+#define STRING_ERROR_NOFILE				"A file does not exist in a project."
+#define STRING_ERROR_BROKEN_WNDFILE		"The file(*.wnd) was corrupted.\n\n%s"
+
+
+//////////////////
+// その他
+//////////////////
+#define STRING_PROJECT_SAVING	"Writing the project..."
+#define STRING_RENAME_ID		"Rename ID"
Index: branches/egtra/ab5.0/abdev/abdev/pj_msg_jpn.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/pj_msg_jpn.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/pj_msg_jpn.h	(revision 774)
@@ -0,0 +1,49 @@
+///////////////////////////////////////////////////////////////
+// プロジェクト管理で使用する汎用テキストを定義しています
+//
+// 日本語
+///////////////////////////////////////////////////////////////
+
+
+//////////////////
+// 削除メッセージ
+//////////////////
+#define STRING_PJ_CHECK_DELETECURSOR	"%s カーソルをプロジェクトから削除します。よろしいですか？"
+#define STRING_PJ_CHECK_DELETEBITMAP	"%s ビットマップをプロジェクトから削除します。よろしいですか？"
+#define STRING_PJ_CHECK_DELETEICON		"%s アイコンをプロジェクトから削除します。よろしいですか？"
+#define STRING_PJ_CHECK_DELETEMENU		"%s メニューをプロジェクトから削除します。よろしいですか？"
+#define STRING_PJ_CHECK_DELETEWINDOW	"%s ウィンドウをプロジェクトから削除します。よろしいですか？"
+
+
+////////////////////////
+// 重複エラーメッセージ
+////////////////////////
+#define STRING_DUPLICATIONERROR_ID_IN_PROJECT		"ID \"%s\" は既にプロジェクト内に存在します。"
+#define STRING_DUPLICATIONERROR_FILE_IN_PROJECT		"\"%s\" ファイルは既にプロジェクト内に存在します。"
+#define STRING_DUPLICATIONERROR_WINDOW_IN_PROJECT	"\"%s\" ウィンドウは既にプロジェクト内に存在します。"
+#define STRING_DUPLICATIONERROR_HANDLE_IN_PROJECT	"\"%s\" ハンドルは既にプロジェクト内に存在します。"
+#define STRING_DUPLICATIONERROR_PROC_IN_PROJECT		"\"%s\" プロシージャは既にプロジェクト内に存在します。"
+
+
+//////////////////////////
+// 保存チェックメッセージ
+//////////////////////////
+#define STRING_MODIFYCHECK_PROJECT	"\"%s\" プロジェクトは変更されています。保存しますか？"
+
+
+//////////////////////////
+// その他エラーメッセージ
+//////////////////////////
+#define STRING_ERROR_CANT_MAINFILE		"このファイルはプロジェクトのメイン ファイルです。プロジェクト内から削除することはできません。"
+#define STRING_ERROR_MAKEDIRECTORY		"ディレクトリの作成に失敗しました"
+#define STRING_ERROR_PROJECT_OVERWRITE	"指定したディレクトリにはすでにプロジェクトが存在します。上書きしますか？"
+#define STRING_ERROR_BROKEN_PROJECT		"プロジェクト ファイルが壊れています。"
+#define STRING_ERROR_NOFILE				"プログラム ファイルがプロジェクトに存在しません。"
+#define STRING_ERROR_BROKEN_WNDFILE		"ウィンドウ定義ファイルが壊れています。\n\n%s"
+
+
+//////////////////
+// その他
+//////////////////
+#define STRING_PROJECT_SAVING	"プロジェクトを保存中..."
+#define STRING_RENAME_ID		"IDの変更"
Index: branches/egtra/ab5.0/abdev/abdev/rad_msg_eng.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/rad_msg_eng.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/rad_msg_eng.h	(revision 774)
@@ -0,0 +1,104 @@
+///////////////////////////////////////////////////////////////
+// RADツールの各種プロパティで利用するテキストを定義しています
+//
+// 英語
+///////////////////////////////////////////////////////////////
+
+//位置
+#define STRING_LEFT		"Left"
+#define STRING_RIGHT	"Right"
+#define STRING_TOP		"Top"
+#define STRING_BOTTOM	"Bottom"
+#define STRING_CENTER	"Center"
+
+//方向
+#define STRING_DIRECTION_HORIZONTAL	"Horizontal"
+#define STRING_DIRECTION_VERTICAL	"Vertical"
+
+//ソート
+#define STRING_SORT_ASCENDING	"Ascending"
+#define STRING_SORT_DESCENDING	"Descending"
+
+//オーナー描画
+#define STRING_OWNERDRAW_FIXED		"Fixed"
+#define STRING_OWNERDRAW_VARIABLE	"Variable"
+
+//ウィンドウ識別名入力ダイアログの警告メッセージ
+#define STRING_WINDOW_RENAME_MUST_WINDOWNAME	"You must enter identification name of the window."
+#define STRING_WINDOW_RENAME_MUST_HANDLENAME	"You must enter handle name of the window."
+#define STRING_WINDOW_RENAME_MUST_PROCEDURENAME	"You must enter procedure name of the window."
+#define STRING_WINDOW_RENAME_CHECK				"If you change these names, you must change identification names in source code if necessary. Are you ok?"
+
+//ウィンドウプロパティに必要なテキスト
+#define STRING_WINDOWPROP_BGCOLOR1				"3D FACE (Default)"
+#define STRING_WINDOWPROP_BGCOLOR2				"Color Option"
+#define STRING_WINDOWPROP_ICONDEFAULT			"Windows Logo (Default)"
+#define STRING_WINDOWPROP_STYLE_OVERLAPPED		"Overlapped"
+#define STRING_WINDOWPROP_STYLE_POPUP			"Popup"
+#define STRING_WINDOWPROP_STYLE_CHILD			"Child"
+#define STRING_WINDOWPROP_STYLE_FRAME_NONE		"None Frame"
+#define STRING_WINDOWPROP_STYLE_FRAME_THICK		"Thick Frame"
+#define STRING_WINDOWPROP_STYLE_FRAME_BORDER	"Border Frame"
+
+//アイテムID入力ダイアログの警告メッセージ
+#define STRING_ITEM_RENAME_MUST_ID	"Must enter id name of the control item."
+#define STRING_ITEM_RENAME_CHECK	"If you change these names, you must change identification names in source code if necessary. Are you ok?"
+
+//コンボボックスプロパティに必要なテキスト
+#define STRING_COMBOBOXPROP_STYLE_DROPDOWN				"Drop Down"
+#define STRING_COMBOBOXPROP_STYLE_DROPDOWNLIST			"Drop Down List"
+
+//イメージボックスプロパティに必要なテキスト
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_BLACK	"Frame (Black)"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_GRAY	"Frame (Gray)"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_WHITE	"Frame (White)"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_ETCHED	"Frame (Etched)"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_BLACK	"Rectangle (Black)"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_GRAY		"Rectangle (Gray)"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_WHITE	"Rectangle (White)"
+#define STRING_IMAGEBOXPROP_STYLE_ICON			"Icon"
+#define STRING_IMAGEBOXPROP_STYLE_BITMAP		"Bitmap"
+#define STRING_IMAGEBOXPROP_STYLE_FROMFILE		"File path:"
+#define STRING_IMAGEBOXPROP_STYLE_FROMRESOURCE	"Resource ID:"
+#define STRING_IMAGEBOXPROP_GETPATH_ICON		"Open Icon File"
+#define STRING_IMAGEBOXPROP_GETPATH_BITMAP		"Open Bitmap File"
+
+//リストビュープロパティに必要なテキスト
+#define STRING_LISTVIEWPROP_STYLE_ICON		"Icon"
+#define STRING_LISTVIEWPROP_STYLE_SMALLICON	"Small Icon"
+#define STRING_LISTVIEWPROP_STYLE_LIST		"List"
+#define STRING_LISTVIEWPROP_STYLE_REPORT	"Report"
+
+//リストボックスプロパティに必要なテキスト
+#define STRING_LISTBOXPROP_STYLE_SEL_SINGLE		"Single"
+#define STRING_LISTBOXPROP_STYLE_SEL_MULTI		"Multiple"
+#define STRING_LISTBOXPROP_STYLE_SEL_EXTENDED	"Extended"
+
+//スクロールバープロパティに必要なテキスト
+#define STRING_SCROLLBARPROP_STYLE_FREE				"Free"
+#define STRING_SCROLLBARPROP_STYLE_TOPORLEFT		"Top/Left"
+#define STRING_SCROLLBARPROP_STYLE_BOTTOMORRIGHT	"Bottom/Right"
+
+//トラックバープロパティに必要なテキスト
+#define STRING_TRACKBARPROP_STYLE_POSITION_BOTH				"Both"
+#define STRING_TRACKBARPROP_STYLE_POSITION_TOPORLEFT		"Top/Left"
+#define STRING_TRACKBARPROP_STYLE_POSITION_BOTTOMORRIGHT	"Bottom/Right"
+
+
+/////////////////////
+// その他メッセージ
+/////////////////////
+#define STRING_RAD_ERROR_CANT_CHILDTEST	"A test command cannot be used for child window."
+
+
+//////////////////////////////////
+// メニューエディタ用のメッセージ
+//////////////////////////////////
+#define STRING_MENUEDIT_MAKE_NEWMENU			"New Menu"
+#define STRING_MENUEDIT_RENAME_MENUID			"Rename Menu ID"
+#define STRING_MENUEDIT_DUPLICATIONERROR		"Menu \"%s\" already exists in a project."
+#define STRING_MENUEDIT_DELETECHECK				"If this operation is performed, child menu items will be deleted at the same time."
+#define STRING_MENUEDIT_MUSTSELECT_NEW_ITEM	"You must select position to insert the new menu item."
+#define STRING_MENUEDIT_INSERTTYPE_YESNO		"If you push \"yes\" button, the menu item is created in popup. If you push \"no\" button, the menu item is created in the same level with the popup."
+#define STRING_MENUEDIT_MUSTSELECT_DELETE_MENUITEM	"You must select menu item to delete."
+#define STRING_MENUEDIT_MUSTSELECT_MOVE_MENUITEM	"You must select menu item to move."
Index: branches/egtra/ab5.0/abdev/abdev/rad_msg_jpn.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/rad_msg_jpn.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/rad_msg_jpn.h	(revision 774)
@@ -0,0 +1,105 @@
+///////////////////////////////////////////////////////////////
+// RADツールの各種プロパティで利用するテキストを定義しています
+//
+// 日本語
+///////////////////////////////////////////////////////////////
+
+//位置
+#define STRING_LEFT		"左端"
+#define STRING_RIGHT	"右端"
+#define STRING_TOP		"上端"
+#define STRING_BOTTOM	"下端"
+#define STRING_CENTER	"中央"
+
+//方向
+#define STRING_DIRECTION_HORIZONTAL	"水平方向"
+#define STRING_DIRECTION_VERTICAL	"垂直方向"
+
+//ソート
+#define STRING_SORT_ASCENDING	"昇順"
+#define STRING_SORT_DESCENDING	"降順"
+
+//オーナー描画
+#define STRING_OWNERDRAW_FIXED		"固定"
+#define STRING_OWNERDRAW_VARIABLE	"可変"
+
+
+//ウィンドウ識別名入力ダイアログの警告メッセージ
+#define STRING_WINDOW_RENAME_MUST_WINDOWNAME	"ウィンドウ識別名を入力して下さい。"
+#define STRING_WINDOW_RENAME_MUST_HANDLENAME	"ハンドル名を入力して下さい。"
+#define STRING_WINDOW_RENAME_MUST_PROCEDURENAME	"プロシージャ名を入力して下さい。"
+#define STRING_WINDOW_RENAME_CHECK				"これらのウィンドウ識別名を変更すると、ソースコード内の識別子は手動で変換する必要があります。変更しますか？"
+
+//ウィンドウプロパティに必要なテキスト
+#define STRING_WINDOWPROP_BGCOLOR1				"3D FACE（標準）"
+#define STRING_WINDOWPROP_BGCOLOR2				"色指定"
+#define STRING_WINDOWPROP_ICONDEFAULT			"Windowsロゴ（標準）"
+#define STRING_WINDOWPROP_STYLE_OVERLAPPED		"オーバーラップ"
+#define STRING_WINDOWPROP_STYLE_POPUP			"ポップアップ"
+#define STRING_WINDOWPROP_STYLE_CHILD			"チャイルド"
+#define STRING_WINDOWPROP_STYLE_FRAME_NONE		"枠無し"
+#define STRING_WINDOWPROP_STYLE_FRAME_THICK		"細枠"
+#define STRING_WINDOWPROP_STYLE_FRAME_BORDER	"サイズ変更枠"
+
+//アイテムID入力ダイアログの警告メッセージ
+#define STRING_ITEM_RENAME_MUST_ID	"ID名を入力して下さい。"
+#define STRING_ITEM_RENAME_CHECK	"アイテムのID名を変更すると、ソースコード内のID名は手動で変換する必要があります。変更しますか？"
+
+//コンボボックスプロパティに必要なテキスト
+#define STRING_COMBOBOXPROP_STYLE_DROPDOWN				"ドロップ ダウン"
+#define STRING_COMBOBOXPROP_STYLE_DROPDOWNLIST			"ドロップ ダウン リスト"
+
+//イメージボックスプロパティに必要なテキスト
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_BLACK	"フレーム（黒）"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_GRAY	"フレーム（灰色）"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_WHITE	"フレーム（白）"
+#define STRING_IMAGEBOXPROP_STYLE_FRAME_ETCHED	"フレーム（縁取り）"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_BLACK	"四角形（黒）"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_GRAY		"四角形（灰色）"
+#define STRING_IMAGEBOXPROP_STYLE_RECT_WHITE	"四角形（白）"
+#define STRING_IMAGEBOXPROP_STYLE_ICON			"アイコン"
+#define STRING_IMAGEBOXPROP_STYLE_BITMAP		"ビットマップ"
+#define STRING_IMAGEBOXPROP_STYLE_FROMFILE		"ファイル指定:"
+#define STRING_IMAGEBOXPROP_STYLE_FROMRESOURCE	"リソース指定:"
+#define STRING_IMAGEBOXPROP_GETPATH_ICON		"アイコン ファイルを指定してください"
+#define STRING_IMAGEBOXPROP_GETPATH_BITMAP		"ビットマップ ファイルを指定してください"
+
+//リストビュープロパティに必要なテキスト
+#define STRING_LISTVIEWPROP_STYLE_ICON		"アイコン"
+#define STRING_LISTVIEWPROP_STYLE_SMALLICON	"小さいアイコン"
+#define STRING_LISTVIEWPROP_STYLE_LIST		"リスト"
+#define STRING_LISTVIEWPROP_STYLE_REPORT	"レポート"
+
+//リストボックスプロパティに必要なテキスト
+#define STRING_LISTBOXPROP_STYLE_SEL_SINGLE		"シングル"
+#define STRING_LISTBOXPROP_STYLE_SEL_MULTI		"マルチ"
+#define STRING_LISTBOXPROP_STYLE_SEL_EXTENDED	"拡張"
+
+//スクロールバープロパティに必要なテキスト
+#define STRING_SCROLLBARPROP_STYLE_FREE				"指定無し"
+#define STRING_SCROLLBARPROP_STYLE_TOPORLEFT		"上/左"
+#define STRING_SCROLLBARPROP_STYLE_BOTTOMORRIGHT	"下/右"
+
+//トラックバープロパティに必要なテキスト
+#define STRING_TRACKBARPROP_STYLE_POSITION_BOTH				"両方"
+#define STRING_TRACKBARPROP_STYLE_POSITION_TOPORLEFT		"上/左"
+#define STRING_TRACKBARPROP_STYLE_POSITION_BOTTOMORRIGHT	"下/右"
+
+
+/////////////////////////////////
+// その他RADツール用のメッセージ
+/////////////////////////////////
+#define STRING_RAD_ERROR_CANT_CHILDTEST	"チャイルドウィンドウをテスト表示することはできません"
+
+
+//////////////////////////////////
+// メニューエディタ用のメッセージ
+//////////////////////////////////
+#define STRING_MENUEDIT_MAKE_NEWMENU			"新規メニュー"
+#define STRING_MENUEDIT_RENAME_MENUID			"メニューIDの変更"
+#define STRING_MENUEDIT_DUPLICATIONERROR		"\"%s\" メニューは既にプロジェクト内に存在します。"
+#define STRING_MENUEDIT_DELETECHECK				"この操作を行うとポップアップされるメニュー アイテムも削除されます。"
+#define STRING_MENUEDIT_MUSTSELECT_NEW_ITEM		"新しいメニュー アイテムの挿入位置を選択して下さい"
+#define STRING_MENUEDIT_INSERTTYPE_YESNO		"ポップアップ アイテムを作成する場合は \"はい\" を、ポップアップと同じ階層にメニュー アイテムを作成する場合は \"いいえ\" を押して下さい。"
+#define STRING_MENUEDIT_MUSTSELECT_DELETE_MENUITEM	"削除するメニュー アイテムを選択して下さい"
+#define STRING_MENUEDIT_MUSTSELECT_MOVE_MENUITEM	"移動するメニュー アイテムを選択して下さい"
Index: branches/egtra/ab5.0/abdev/abdev/rebar.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/rebar.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/rebar.cpp	(revision 774)
@@ -0,0 +1,337 @@
+#include "stdafx.h"
+
+#include "Common.h"
+
+
+/////////////////////////////////////////////////////////////
+// Note. レバーコントロールを新たに追加する場合は、
+//      "レバー追加" で検索をかけ、適切なコードを埋め込む
+/////////////////////////////////////////////////////////////
+
+
+CDBRebarBand::CDBRebarBand(){
+	iMaxBandNum=0;
+}
+CDBRebarBand::~CDBRebarBand(){}
+
+void CDBRebarBand::add(int band_id,AddBandProc add_proc){
+	BandId[iMaxBandNum]=band_id;
+	pAddProc[iMaxBandNum]=add_proc;
+	iMaxBandNum++;
+}
+
+HWND CDBRebarBand::call_add(int band_id,int num,char *lpszText){
+	int i;
+	for(i=0;i<iMaxBandNum;i++){
+		if(BandId[i]==band_id) break;
+	}
+	if(i==iMaxBandNum) return 0;
+
+	return pAddProc[i](hRebar,num,lpszText);
+}
+
+
+HWND AddDocCombo(HWND hRebar,int num,char *lpszText);
+HWND AddStandardToolbar(HWND hRebar,int num,char *lpszText);
+HWND AddReleaseToolbar(HWND hRebar,int num,char *lpszText);
+HWND AddDebuggerToolbar(HWND hRebar,int num,char *lpszText);
+HWND AddBand_SelectCompiler(HWND hRebar,int num,char *lpszText);
+HWND AddBand_WebSearch(HWND hRebar,int num,char *lpszText);
+
+
+CMainRebar *pobj_Rebar=0;
+
+
+void CMainRebar::SetupRebar(HWND hwnd){
+	int i;
+
+	//レバーコントロールを生成
+	hRebar=CreateWindowEx(WS_EX_TOOLWINDOW,REBARCLASSNAME,NULL,
+		WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_BORDER|WS_VISIBLE|
+		CCS_ADJUSTABLE|RBS_BANDBORDERS|RBS_DBLCLKTOGGLE ,
+		0,0,0,0,hwnd,NULL,hInst,NULL);
+
+	pobj_DBRebarBand->hRebar=hRebar;
+
+	REBARINFO RebarInfo;
+	ZeroMemory(&RebarInfo,sizeof(RebarInfo));
+	RebarInfo.cbSize=sizeof(REBARINFO);
+	SendMessage(hRebar,RB_SETBARINFO,0,(long)&RebarInfo);
+
+	//バンドを挿入
+	REBARBANDINFO RebarBand;
+	ZeroMemory(&RebarBand,sizeof(REBARBANDINFO));
+	RebarBand.cbSize=sizeof(REBARBANDINFO);
+	RebarBand.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
+	RebarBand.cxMinChild=23;
+	RebarBand.cyMinChild=22;
+	if(pobj_nv->bNoGripper) RebarBand.fStyle=RBBS_CHILDEDGE|RBBS_NOGRIPPER;
+	else RebarBand.fStyle=RBBS_CHILDEDGE;
+	for(i=0;i<MAX_REBARBANDS;i++){
+		if(pobj_nv->SaveRebar[i].RebarID==0) break;
+
+		//レバー上にのせる子ウィンドウを生成
+		char szText[255];
+		HWND hChild;
+		hChild=pobj_DBRebarBand->call_add(pobj_nv->SaveRebar[i].RebarID,i,szText);
+
+		//レバーバンドを追加
+		RebarBand.lpText=szText;
+		RebarBand.hwndChild=hChild;
+		RebarBand.cx=pobj_nv->SaveRebar[i].RebarLength;
+		RebarBand.wID=pobj_nv->SaveRebar[i].RebarID;
+		RebarBand.fStyle|=pobj_nv->SaveRebar[i].IsBandBreak;
+		SendMessage(hRebar,RB_INSERTBAND,-1,(LPARAM)&RebarBand);
+		RebarBand.fStyle^=pobj_nv->SaveRebar[i].IsBandBreak;
+	}
+}
+
+CMainRebar::CMainRebar(HWND hwnd_parent){
+	hParent=hwnd_parent;
+
+	pobj_DBRebarBand=new CDBRebarBand();
+
+	pobj_DBRebarBand->add(
+		ID_DOCCOMBO,
+		AddDocCombo);
+
+	pobj_DBRebarBand->add(
+		ID_STANDARDTOOLBAR,
+		AddStandardToolbar);
+
+	pobj_DBRebarBand->add(
+		ID_RELEASETOOLBAR,
+		AddReleaseToolbar);
+
+	pobj_DBRebarBand->add(
+		ID_DEBUGGERTOOLBAR,
+		AddDebuggerToolbar);
+
+	pobj_DBRebarBand->add(
+		ID_SELECTCOMPILERCOMBO,
+		AddBand_SelectCompiler);
+
+	pobj_DBRebarBand->add(
+		ID_WEB_SEARCH,
+		AddBand_WebSearch);
+
+	//
+	//レバーバンドを追加する場合はこの行を編集する（レバー追加）
+	//
+
+
+	SetupRebar(hParent);
+}
+CMainRebar::~CMainRebar(){
+	SaveRebarState();
+	DestroyWindow(hRebar);
+
+	delete pobj_DBRebarBand;
+	pobj_DBRebarBand=0;
+}
+
+void CMainRebar::ResetInitRebar(){
+	DestroyWindow(hRebar);
+	ResetRebarData();
+	SetupRebar(hParent);
+}
+void CMainRebar::ResetRebar(){
+	SaveRebarState();
+	DestroyWindow(hRebar);
+	SetupRebar(hParent);
+}
+
+void CMainRebar::SaveRebarState(void){
+	int i,BandNum;
+	REBARBANDINFO BandInfo;
+
+	ZeroMemory(&BandInfo,sizeof(REBARBANDINFO));
+	BandInfo.cbSize=sizeof(REBARBANDINFO);
+	BandInfo.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
+	BandNum=SendMessage(hRebar,RB_GETBANDCOUNT,0,0);
+	for(i=0;i<BandNum;i++){
+		SendMessage(hRebar,RB_GETBANDINFO,i,(long)&BandInfo);
+		if(BandInfo.fStyle&RBBS_BREAK) pobj_nv->SaveRebar[i].IsBandBreak=RBBS_BREAK;
+		else pobj_nv->SaveRebar[i].IsBandBreak=0;
+		pobj_nv->SaveRebar[i].RebarID=BandInfo.wID;
+		pobj_nv->SaveRebar[i].RebarLength=BandInfo.cx;
+	}
+}
+
+void CMainRebar::ChangeRebarBand(int BandID){
+	int i;
+	REBARBANDINFO RebarBand;
+
+	//ツールバーが固定されている場合は解除する
+	if(pobj_nv->bNoGripper) SendMessage(hOwner,WM_COMMAND,IDM_NOGRIPPER,0);
+
+	SAVEREBAR *psr;
+	psr=pobj_nv->SaveRebar;
+
+	for(i=0;i<MAX_REBARBANDS;i++){
+		if(psr[i].RebarID==0) break;
+		if(psr[i].RebarID==BandID){
+			SendMessage(hRebar,RB_DELETEBAND,SendMessage(hRebar,RB_IDTOINDEX,BandID,0),0);
+			memcpy(&psr[i],&psr[i+1],(MAX_REBARBANDS-i-1)*sizeof(SAVEREBAR));
+			psr[MAX_REBARBANDS-1].RebarID=0;
+			if(psr[0].RebarID==0){
+				DestroyWindow(hRebar);
+				SetupRebar(hOwner);
+
+				//メニュー状態を設定
+				ResetState_DocMenu();
+
+				ActiveBasic::IDE::Program::mainFrame.Resized();
+			}
+			return;
+		}
+	}
+	if(i>=MAX_REBARBANDS) return;
+	psr[i].IsBandBreak=1;
+	psr[i].RebarID=BandID;
+	psr[i].RebarLength=0;
+	ZeroMemory(&RebarBand,sizeof(REBARBANDINFO));
+	RebarBand.cbSize=sizeof(REBARBANDINFO);
+	RebarBand.fMask=RBBIM_TEXT|RBBIM_STYLE|RBBIM_CHILD|RBBIM_CHILDSIZE|RBBIM_SIZE|RBBIM_ID;
+	RebarBand.fStyle=RBBS_CHILDEDGE;
+	RebarBand.cxMinChild=0;
+	RebarBand.cyMinChild=22;
+
+	//レバー上にのせる子ウィンドウを生成
+	char szText[255];
+	HWND hChild;
+	hChild=pobj_DBRebarBand->call_add(pobj_nv->SaveRebar[i].RebarID,i,szText);
+
+	//レバーバンドを追加
+	RebarBand.lpText=szText;
+	RebarBand.hwndChild=hChild;
+	RebarBand.cx=pobj_nv->SaveRebar[i].RebarLength;
+	RebarBand.wID=pobj_nv->SaveRebar[i].RebarID;
+	RebarBand.fStyle|=pobj_nv->SaveRebar[i].IsBandBreak;
+	SendMessage(hRebar,RB_INSERTBAND,-1,(LPARAM)&RebarBand);
+	RebarBand.fStyle^=pobj_nv->SaveRebar[i].IsBandBreak;
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+}
+
+void CMainRebar::menu_popup(HWND hwnd,int PosX,int PosY){
+	//レバーコントロールの表示設定メニューを表示
+	int i;
+	POINT MousePos;
+	MENUITEMINFO MenuItemInfo;
+
+	//メニューのチェック項目をセット
+	extern HMENU hRebarMenu;
+	MenuItemInfo.cbSize=sizeof(MENUITEMINFO);
+	MenuItemInfo.fMask=MIIM_STATE;
+	MenuItemInfo.fState=MFS_UNCHECKED;
+	SetMenuItemInfo(hRebarMenu,IDM_DOCSELECTBAND,0,&MenuItemInfo);
+	SetMenuItemInfo(hRebarMenu,IDM_STANDARDBAND,0,&MenuItemInfo);
+	SetMenuItemInfo(hRebarMenu,IDM_BANDMENU_WEB_SEARCH,0,&MenuItemInfo);
+#ifndef THETEXT
+	//ProjectEditorのみ
+	SetMenuItemInfo(hRebarMenu,IDM_RELEASEBAND,0,&MenuItemInfo);
+	SetMenuItemInfo(hRebarMenu,IDM_DEBUGBAND,0,&MenuItemInfo);
+	SetMenuItemInfo(hRebarMenu,IDM_SELECTCOMPILERBAND,0,&MenuItemInfo);
+#endif
+
+	
+	MenuItemInfo.fState=MFS_CHECKED;
+	for(i=0;i<MAX_REBARBANDS;i++){
+		if(pobj_nv->SaveRebar[i].RebarID==0) break;
+
+		if(pobj_nv->SaveRebar[i].RebarID==ID_DOCCOMBO)
+			SetMenuItemInfo(hRebarMenu,IDM_DOCSELECTBAND,0,&MenuItemInfo);
+
+		if(pobj_nv->SaveRebar[i].RebarID==ID_STANDARDTOOLBAR)
+			SetMenuItemInfo(hRebarMenu,IDM_STANDARDBAND,0,&MenuItemInfo);
+
+		if(pobj_nv->SaveRebar[i].RebarID==ID_WEB_SEARCH)
+			SetMenuItemInfo(hRebarMenu,IDM_BANDMENU_WEB_SEARCH,0,&MenuItemInfo);
+
+#ifndef THETEXT
+	//ProjectEditorのみ
+		if(pobj_nv->SaveRebar[i].RebarID==ID_RELEASETOOLBAR)
+			SetMenuItemInfo(hRebarMenu,IDM_RELEASEBAND,0,&MenuItemInfo);
+
+		if(pobj_nv->SaveRebar[i].RebarID==ID_DEBUGGERTOOLBAR)
+			SetMenuItemInfo(hRebarMenu,IDM_DEBUGBAND,0,&MenuItemInfo);
+
+		if(pobj_nv->SaveRebar[i].RebarID==ID_SELECTCOMPILERCOMBO)
+			SetMenuItemInfo(hRebarMenu,IDM_SELECTCOMPILERBAND,0,&MenuItemInfo);
+#endif
+
+	}
+	if(pobj_nv->bNoGripper) MenuItemInfo.fState=MFS_CHECKED;
+	else MenuItemInfo.fState=MFS_UNCHECKED;
+	SetMenuItemInfo(hRebarMenu,IDM_NOGRIPPER,0,&MenuItemInfo);
+
+	//ポップアップメニューを表示
+	MousePos.x=PosX;
+	MousePos.y=PosY;
+	ClientToScreen(hwnd,&MousePos);
+	TrackPopupMenu(hRebarMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL);
+}
+
+
+
+
+
+
+WNDPROC OldDocComboProc;
+WNDPROC OldStandardToolbarProc;
+WNDPROC OldDebuggerToolbarProc;
+WNDPROC OldSelectCompilerComboProc;
+WNDPROC OldWebSearchProc,OldWebSearchEditProc;
+
+void ResetRebarData(void){
+	SAVEREBAR *psr;
+	psr=pobj_nv->SaveRebar;
+	int num=0;
+
+#ifdef THETEXT
+
+	//スタンダードツールバー
+	psr[num].RebarID=ID_STANDARDTOOLBAR;
+	psr[num].RebarLength=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8+15;
+	psr[num].IsBandBreak=0;
+	num++;
+
+	//WebSearchコンボボックス
+	psr[num].RebarID=ID_WEB_SEARCH;
+	psr[num].RebarLength=100;
+	psr[num].IsBandBreak=0;
+	num++;
+#else
+
+	//スタンダードツールバー
+	psr[num].RebarID=ID_STANDARDTOOLBAR;
+	psr[num].RebarLength=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8+15;
+	psr[num].IsBandBreak=0;
+	num++;
+
+	//プラットフォーム選択ツールバー
+	psr[num].RebarID=ID_SELECTCOMPILERCOMBO;
+	psr[num].RebarLength=100;
+	psr[num].IsBandBreak=0;
+	num++;
+
+	//デバッガツールバー
+	psr[num].RebarID=ID_DEBUGGERTOOLBAR;
+	psr[num].RebarLength=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8+15;
+	psr[num].IsBandBreak=0;
+	num++;
+
+	//リリースビルドツールバー
+	psr[num].RebarID=ID_RELEASETOOLBAR;
+	psr[num].RebarLength=2*23+15;
+	psr[num].IsBandBreak=0;
+	num++;
+#endif
+
+
+	psr[num].RebarID=0;
+
+	pobj_nv->bNoGripper=1;
+}
Index: branches/egtra/ab5.0/abdev/abdev/reg_exp.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/reg_exp.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/reg_exp.cpp	(revision 774)
@@ -0,0 +1,118 @@
+#include "stdafx.h"
+
+#include "common.h"
+
+using namespace ActiveBasic::IDE;
+
+CRegExp obj_RegExp;
+
+CRegExp::CRegExp()
+{
+	const std::string bregexpDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\BREGEXP.dll";
+	hLib = LoadLibrary( bregexpDllPath.c_str() );
+	if( !hLib )
+	{
+		MessageBox( NULL, "BREGEXP.dll が見つかりません。", "エラー", MB_OK | MB_ICONEXCLAMATION );
+	}
+
+	BMatch=(PFUNC_BMatch)GetProcAddress(hLib,"BMatch");
+	BSubst=(PFUNC_BSubst)GetProcAddress(hLib,"BSubst");
+	BTrans=(PFUNC_BTrans)GetProcAddress(hLib,"BTrans");
+	BSplit=(PFUNC_BSplit)GetProcAddress(hLib,"BSplit");
+	BRegfree=(PFUNC_BRegfree)GetProcAddress(hLib,"BRegfree");
+	BRegexpVersion=(PFUNC_BRegexpVersion)GetProcAddress(hLib,"BRegexpVersion");
+}
+CRegExp::~CRegExp(){
+	FreeLibrary(hLib);
+}
+
+char *CRegExp::compare(HWND hFindDlg,char *buffer,char *exp,BOOL IsBigSmall, bool isWordUnit ,int *pLength){
+	BREGEXP *rxp=0;
+	char msg[255];
+
+	char *pTemp;
+	pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(exp)+255);
+	if(strstr(exp,"/")){
+		if(strstr(exp,"#")){
+			sprintf(pTemp,"m@(%s)@",exp);
+		}
+		else sprintf(pTemp,"m#(%s)#",exp);
+	}
+	else sprintf(pTemp,"m/(%s)/",exp);
+
+	//Shift-JIS?
+	lstrcat(pTemp,"k");
+
+	//?E
+	if(!IsBigSmall) lstrcat(pTemp,"i");
+
+	int result;
+	result=BMatch(pTemp,buffer,buffer+lstrlen(buffer),&rxp,msg);
+
+	HeapDefaultFree(pTemp);
+
+	if(!result){
+		if(rxp) BRegfree(rxp);
+		return 0;
+	}
+	else if(result==-1){
+		if(rxp) BRegfree(rxp);
+		MessageBox(hFindDlg,msg,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+		return (char *)-1;
+	}
+
+	*pLength=(rxp->outendp) - (rxp->outp);
+	if((*pLength)==0) return 0;
+
+	pTemp=ComparisonString(buffer,(char *)rxp->outp,false, isWordUnit);
+
+	if(rxp) BRegfree(rxp);
+
+	return pTemp;
+}
+char *CRegExp::GetPermuStr(HWND hFindDlg,char *buffer,char *exp,char *szPermu,BOOL IsBigSmall){
+	BREGEXP *rxp=0;
+	char msg[255];
+
+	char *pTemp;
+	pTemp=(char *)HeapAlloc(hHeap,0,lstrlen(exp)+255);
+	if(strstr(exp,"/")||strstr(szPermu,"/")){
+		if(strstr(exp,"#")||strstr(szPermu,"#")){
+			sprintf(pTemp,"s@%s@%s@",exp,szPermu);
+		}
+		else sprintf(pTemp,"s#%s#%s#",exp,szPermu);
+	}
+	else sprintf(pTemp,"s/%s/%s/",exp,szPermu);
+
+	//Shift-JIS?
+	lstrcat(pTemp,"k");
+
+	//?E
+	if(!IsBigSmall) lstrcat(pTemp,"i");
+
+	int result;
+	result=BSubst(pTemp,buffer,buffer+lstrlen(buffer),&rxp,msg);
+
+	HeapDefaultFree(pTemp);
+
+	if(!result){
+		if(rxp) BRegfree(rxp);
+		return 0;
+	}
+	else if(result==-1){
+		if(rxp) BRegfree(rxp);
+		MessageBox(hFindDlg,msg,APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
+		return (char *)-1;
+	}
+
+	int length;
+	length=(rxp->outendp) - (rxp->outp);
+
+	pTemp=(char *)HeapAlloc(hHeap,0,length+1);
+	memcpy(pTemp,rxp->outp,length);
+	pTemp[length]=0;
+
+	if(rxp) BRegfree(rxp);
+
+	return pTemp;
+}
Index: branches/egtra/ab5.0/abdev/abdev/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/resource.h	(revision 774)
@@ -0,0 +1,466 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by abdev.rc
+//
+#define IDCANCEL5                       13
+#define IDR_MAINMENU                    101
+#define IDR_ACCELERATOR1                105
+#define IDR_STANDARDTOOLBAR             106
+#define IDD_ABOUT                       108
+#define IDR_BASICTOOLBAR                111
+#define IDI_MAIN                        114
+#define IDI_BASICPROGRAM                118
+#define IDD_FIND                        119
+#define IDR_EDITMENU                    122
+#define IDD_MAKELINENUM                 124
+#define IDD_FINDALL                     126
+#define IDR_REBARMENU                   127
+#define IDD_SETWHOLE                    128
+#define IDD_PERMUTATION                 129
+#define IDD_NEWFILE                     130
+#define IDI_TEXTDOCUMENT                131
+#define IDD_SETEDITOR                   132
+#define IDD_SETTOOLBAR                  133
+#define IDD_NEWPROJECT_PAGE1            136
+#define IDB_BASE_NORMAL                 138
+#define IDB_BASE_PROMPT                 139
+#define IDD_NEWPROJECT_PAGE3            140
+#define IDD_PROJECT_VIEW                145
+#define IDR_PROJECTVIEW_FILETREEMENU    146
+#define IDR_PROJECTVIEW_FILETREEROOTMENU 147
+#define IDI_FOLDER_CLOSE                148
+#define IDI_FOLDER_OPEN                 149
+#define IDD_PROJECT_FILEPROPERTY        150
+#define IDI_WINDOW                      151
+#define IDR_PROJECTVIEW_MATERIALTREEMENU 153
+#define IDR_PROJECTVIEW_WINDOWTREEROOTMENU 157
+#define IDD_RAD_CTRLBUTTONS             158
+#define IDD_PROJECT_NEWWINDOW           161
+#define IDR_RADCONTEXTMENU              164
+#define IDD_RAD_PROP_WINDOW             166
+#define IDD_RAD_PROP_BUTTON             167
+#define IDD_RAD_PROP_WINDOW_RENAME      170
+#define IDD_RAD_EVENTCODE               171
+#define IDD_RAD_PROP_ITEM_RENAMEID      172
+#define IDD_RAD_PROP_WINDOW_EXSTYLE     174
+#define IDD_RAD_PROP_ITEM_EXSTYLE       176
+#define IDD_RAD_PROP_EDIT               177
+#define IDD_RAD_PROP_STATIC             178
+#define IDD_RAD_PROP_CHECKBOX           180
+#define IDD_RAD_PROP_RADIOBUTTON        182
+#define IDB_RADIOBUTTON                 183
+#define IDD_RAD_PROP_SCROLLBAR          184
+#define IDB_TITLE_BUTTON_CLOSE          189
+#define IDD_RAD_PROP_ITEM_RENAMECAPTION 190
+#define IDD_RAD_PROP_LISTBOX            192
+#define IDD_RAD_PROP_LISTVIEW           194
+#define IDD_RAD_PROP_TREEVIEW           198
+#define IDD_RAD_PROP_IMAGEBOX           201
+#define IDR_PROJECTVIEW_PROCEDURETREEMENU 202
+#define IDI_PROCEDURE                   203
+#define IDD_RAD_PROP_COMBOBOX           204
+#define IDD_RAD_PROP_GROUPBOX           208
+#define IDD_RAD_PROP_UPDOWN             211
+#define IDD_RAD_PROP_PROGRESSBAR        212
+#define IDD_RAD_PROP_TRACKBAR           214
+#define IDD_PROJECT_MENUEDIT            216
+#define IDD_PROJECT_NEWMENU             217
+#define IDD_INPUTID                     217
+#define IDD_PROJECT_OPTION              218
+#define IDD_PJ_OPTION2                  218
+#define IDD_NEWPROJECT_PAGE             219
+#define IDD_NEWPROJECT_PAGE2            219
+#define IDD_PROJECT_MENURENAME          220
+#define IDR_CONTROL                     221
+#define IDD_RAD_CHOOSECHILD             223
+#define IDD_RAD_PROP_CHILD              224
+#define IDD_SETRAD                      225
+#define IDI_FILE_PJ                     226
+#define IDD_SETFILELINK                 227
+#define IDI_FILE_BAS                    229
+#define IDI_FILE_SBP                    230
+#define IDI_MENU                        231
+#define IDI_FILE_ICON                   233
+#define IDI_FILE_BMP                    234
+#define IDI_FILE_CURSOR                 236
+#define IDB_TITLE                       238
+#define IDD_RAD_SUPPORT                 239
+#define IDD_PJ_OPTION1                  241
+#define IDB_PARAMHINT_QUESTION          243
+#define IDB_PARAMHINT_QUESTION2         244
+#define IDD_ICONEDIT_TOOL               246
+#define IDD_ICONEDIT_COLOR              247
+#define IDD_ICONEDIT_BUTTONS            248
+#define IDR_ICONTOOLBAR                 257
+#define IDD_ICONEDIT_ICONTYPE           259
+#define IDC_CURSOR_PEN                  260
+#define IDC_CURSOR_FILL                 261
+#define IDI_MEMBER_PRIVATE_FUNCTION     262
+#define IDI_MEMBER_PUBLIC_FUNCTION      263
+#define IDI_MEMBER_PRIVATE_VARIABLE     264
+#define IDI_MEMBER_PUBLIC_VARIABLE      265
+#define IDB_BASE_DOSPROMPT              266
+#define IDB_BASE_NON                    267
+#define IDB_BASE_DIRECTX                268
+#define IDC_FINDSTR                     1001
+#define IDC_FINDINWINDOW                1002
+#define IDC_FINDALL                     1003
+#define IDC_ISBIGSMALL                  1004
+#define IDC_SHOWITEM                    1018
+#define IDC_FINDLIST                    1020
+#define IDC_EDITLINE                    1022
+#define IDC_NEWLINE                     1023
+#define IDC_RESETTOOLBAR                1027
+#define IDC_PERMUTATIONSTR              1034
+#define IDC_PERMUTATIONNEXT             1036
+#define IDC_PERMUTATIONALL              1037
+#define IDC_FIND                        1038
+#define IDC_FILETYPELIST                1039
+#define IDC_SETFONT                     1041
+#define IDC_TABSIZE                     1042
+#define IDC_PARAMHINT                   1043
+#define IDC_ISAUTOINDENT                1044
+#define IDC_PROJECTNAME                 1053
+#define IDC_DIRPATH                     1054
+#define IDC_EXE_PROMPTBASE              1055
+#define IDC_EXE_WINDOWBASE              1056
+#define IDC_EXE_NOBASE                  1057
+#define IDC_IMAGE_WINDOW                1058
+#define IDC_IMAGE_PROMPT                1059
+#define IDC_HELPTEXT_OFBASE             1060
+#define IDC_BUTTON1                     1061
+#define IDC_PATHBROWSE                  1061
+#define IDC_RENAMEWINDOW                1061
+#define IDC_HINTFONT                    1061
+#define IDC_LINKFILE                    1061
+#define IDC_TEST                        1061
+#define IDC_ADD_ICONTYPE                1061
+#define IDC_PROJECTINFO                 1062
+#define IDC_DELETE_ICONTYPE             1062
+#define IDC_TAB_PROJECTINFO             1066
+#define IDC_SHOWHELLOWORLD              1068
+#define IDC_USING_FILE                  1069
+#define IDC_DEFINED_FILE                1070
+#define IDC_UPDATE_TIME                 1071
+#define IDC_FILETYPE                    1072
+#define IDC_TOOL_MOUSE                  1075
+#define IDC_TOOL_STATIC                 1076
+#define IDC_TOOL_BUTTON                 1077
+#define IDC_TOOL_EDIT                   1078
+#define IDC_TOOL_CHECKBOX               1079
+#define IDC_WINDOWNAME                  1080
+#define IDC_TOOL_RADIOBUTTON            1080
+#define IDC_WINDOWHANDLE                1081
+#define IDC_TOOL_GROUPBOX               1081
+#define IDC_WINDOWPROC                  1082
+#define IDC_TOOL_HSCROLLBAR             1082
+#define IDC_AUTOSET                     1083
+#define IDC_TOOL_VSCROLLBAR             1083
+#define IDC_TOOL_COMBOBOX               1084
+#define IDC_TOOL_LISTBOX                1085
+#define IDC_TOOL_UPDOWN                 1086
+#define IDC_TOOL_LISTVIEW               1087
+#define IDC_TOOL_TREEVIEW               1088
+#define IDC_CAPTION                     1090
+#define IDC_TOOL_IMAGEBOX               1091
+#define IDC_BGCOLOR                     1091
+#define IDC_TOOL_PROGRESSBAR            1092
+#define IDC_TOOL_TRACKBAR               1093
+#define IDC_IDNAME                      1095
+#define IDC_WINDOWSTYLE                 1097
+#define IDC_STYLE_HSCROLLBAR            1098
+#define IDC_STYLE_VSCROLLBAR            1099
+#define IDC_STYLE_CLIPSIBLINGS          1100
+#define IDC_STYLE_CLIPCHILDREN          1101
+#define IDC_STYLE_SYSMENU               1102
+#define IDC_STYLE_CAPTION               1104
+#define IDC_STYLE_MINIMIZE              1105
+#define IDC_STYLE_MAXIMIZE              1106
+#define IDC_STYLE_VISIBLE               1107
+#define IDC_STYLE_MAXIMIZEBOX           1108
+#define IDC_STYLE_MINIMIZEBOX           1109
+#define IDC_BORDERSTYLE                 1110
+#define IDC_STYLE_DISABLED              1111
+#define IDC_EXSTYLE                     1113
+#define IDC_PROCEDURENAME               1116
+#define IDC_EVENTLIST                   1117
+#define IDC_STYLE_GROUP                 1118
+#define IDC_STYLE_TABSTOP               1119
+#define IDC_BS_DEFPUSHBUTTON            1120
+#define IDC_BS_OWNERDRAW                1121
+#define IDC_BS_ICON                     1122
+#define IDC_BS_BITMAP                   1123
+#define IDC_BS_MULTILINE                1124
+#define IDC_BS_NOTIFY                   1125
+#define IDC_BS_HPOS                     1126
+#define IDC_BS_VPOS                     1127
+#define IDC_RENAMEID                    1128
+#define IDC_RENAMECAPTION               1129
+#define IDC_EXSTYLE_NOPARENTNOTIFY      1129
+#define IDC_EXSTYLE_TOPMOST             1130
+#define IDC_EXSTYLE_ACCEPTFILES         1131
+#define IDC_EXSTYLE_TRANSPARENT         1133
+#define IDC_EXSTYLE_TOOLWINDOW          1134
+#define IDC_EXSTYLE_DLGMODALFRAME       1135
+#define IDC_EXSTYLE_CLIENTEDGE          1136
+#define IDC_EXSTYLE_STATICEDGE          1137
+#define IDC_EXSTYLE_CONTEXTHELP         1138
+#define IDC_EXSTYLE_CONTROLPARENT       1139
+#define IDC_ES_MULTILINE                1161
+#define IDC_ES_NUMBER                   1162
+#define IDC_STYLE_HSCROLL               1163
+#define IDC_ES_AUTOHSCROLL              1164
+#define IDC_STYLE_VSCROLL               1165
+#define IDC_ES_AUTOVSCROLL              1166
+#define IDC_ES_PASSWORD                 1167
+#define IDC_ES_NOHIDESEL                1168
+#define IDC_ES_OEMCONVERT               1169
+#define IDC_ES_WANTRETURN               1170
+#define IDC_ES_UPPERCASE                1171
+#define IDC_ES_LOWERCASE                1172
+#define IDC_ES_READONLY                 1173
+#define IDC_ES_TEXTPOS                  1174
+#define IDC_LBS_SELECT                  1175
+#define IDC_LBS_OWNERDRAW               1176
+#define IDC_LVS_SORT                    1177
+#define IDC_SS_NOPREFIX                 1178
+#define IDC_SS_LEFTNOWORDWRAP           1179
+#define IDC_SS_NOTIFY                   1180
+#define IDC_SS_TEXTPOS                  1182
+#define IDC_BS_AUTO                     1184
+#define IDC_BS_3STATE                   1185
+#define IDC_BS_LEFTTEXT                 1187
+#define IDC_BS_PUSHLIKE                 1188
+#define IDC_SBS_POSITION                1207
+#define IDC_LBS_HASSTRINGS              1221
+#define IDC_LBS_SORT                    1223
+#define IDC_LBS_NOTIFY                  1224
+#define IDC_LBS_MULTICOLUMN             1225
+#define IDC_LBS_DISABLENOSCROLL         1226
+#define IDC_LBS_NOREDRAW                1227
+#define IDC_LBS_USETABSTOPS             1228
+#define IDC_LBS_WANTKEYBOARDINPUT       1229
+#define IDC_LVS_VIEW                    1240
+#define IDC_LVS_POSITION                1241
+#define IDC_LVS_SHOWSELALWAYS           1243
+#define IDC_LVS_SINGLESEL               1244
+#define IDC_LVS_AUTOARRANGE             1245
+#define IDC_LVS_NOLABELWRAP             1246
+#define IDC_LVS_EDITLABELS              1247
+#define IDC_LVS_NOSCROLL                1248
+#define IDC_LVS_NOCOLUMNHEADER          1249
+#define IDC_LVS_NOSORTHEADER            1250
+#define IDC_LVS_OWNERDRAWFIXED          1251
+#define IDC_LVS_SHAREIMAGELISTS         1252
+#define IDC_TVS_HASBUTTONS              1264
+#define IDC_TVS_HASLINES                1266
+#define IDC_TVS_LINESATROOT             1267
+#define IDC_TVS_EDITLABELS              1268
+#define IDC_TVS_DISABLEDRAGDROP         1269
+#define IDC_TVS_SHOWSELALWAYS           1270
+#define IDC_TVS_NOSCROLL                1271
+#define IDC_TVS_NOTOOLTIPS              1272
+#define IDC_TVS_CHECKBOXES              1273
+#define IDC_TVS_FULLROWSELECT           1274
+#define IDC_TVS_TRACKSELECT             1275
+#define IDC_TVS_SINGLEEXPAND            1276
+#define IDC_IMAGE_FILE                  1278
+#define IDC_IMAGE_TYPE                  1281
+#define IDC_SS_CENTERIMAGE              1283
+#define IDC_SS_RIGHTJUST                1284
+#define IDC_CBS_TYPE                    1288
+#define IDC_CBS_HASSTRINGS              1289
+#define IDC_CBS_SORT                    1290
+#define IDC_CBS_NOINTEGRALHEIGHT        1292
+#define IDC_CBS_OEMCONVERT              1293
+#define IDC_CBS_AUTOHSCROLL             1294
+#define IDC_CBS_DISABLENOSCROLL         1295
+#define IDC_CBS_UPPERCASE               1296
+#define IDC_CBS_LOWERCASE               1297
+#define IDC_CBS_OWNERDRAW               1301
+#define IDC_BS_POSITION                 1307
+#define IDC_UDS_AUTOBUDDY               1314
+#define IDC_UDS_SETBUDDYINT             1315
+#define IDC_UDS_NOTHOUSANDS             1316
+#define IDC_UDS_WRAP                    1317
+#define IDC_UDS_ARROWKEYS               1318
+#define IDC_UDS_SITUATION               1319
+#define IDC_UDS_ATTACH                  1320
+#define IDC_PROGRESS3                   1327
+#define IDC_PBS_SMOOTH                  1328
+#define IDC_PBS_VERTICAL                1329
+#define IDC_SLIDER2                     1331
+#define IDC_TBS_SITUATION               1332
+#define IDC_TBS_POINT                   1333
+#define IDC_TBS_NOTICKS                 1334
+#define IDC_TBS_AUTOTICKS               1335
+#define IDC_TBS_ENABLESELRANGE          1336
+#define IDC_SLIDER3                     1337
+#define IDC_HANDLE                      1339
+#define IDC_PATH                        1340
+#define IDC_CHANGEPATH                  1341
+#define IDC_IMAGE_SITUATION             1342
+#define IDC_WINDOWMENU                  1343
+#define IDC_ICONRES                     1344
+#define IDC_UP                          1347
+#define IDC_DOWN                        1348
+#define IDC_CHECKED                     1349
+#define IDC_DISABLED                    1350
+#define IDC_INSERTMENUITEM              1352
+#define IDC_DELETEMENUITEM              1353
+#define IDC_POPUP                       1356
+#define IDC_SEPARATOR                   1357
+#define IDC_DEFWINDOW                   1358
+#define IDC_API_MMSYS                   1362
+#define IDC_DEFAULT                     1363
+#define IDC_API_MMSYS2                  1363
+#define IDC_MMSYS                       1364
+#define IDC_MENU                        1365
+#define IDC_API_COMMCTRL                1368
+#define IDC_RENAME                      1369
+#define IDC_IDSTATIC                    1370
+#define IDC_CAPTIONSTATIC               1371
+#define IDC_STATUSBAR                   1373
+#define IDC_STATIC_HINTFONT             1374
+#define IDC_CHECK3                      1377
+#define IDC_SBP                         1377
+#define IDC_WINDOWLIST                  1380
+#define IDC_STATIC_HANDLE               1383
+#define IDC_SAVECHECK                   1384
+#define IDC_SUPPORT_COMMENT             1386
+#define IDC_LINEADJUST                  1387
+#define IDC_BAS                         1391
+#define IDC_ABP                         1392
+#define IDC_PJ                          1393
+#define IDC_MODALDLG                    1394
+#define IDC_MODELESSDLG                 1395
+#define IDC_DLL                         1397
+#define IDC_EXE_DOSPROMPTBASE           1399
+#define IDC_API_RICHEDIT                1401
+#define IDC_FILE                        1402
+#define IDC_RESOURCE                    1403
+#define IDC_RESCOMBO                    1404
+#define IDC_STATIC_ICON                 1405
+#define IDC_API_WINSOCK                 1406
+#define IDC_XPOS                        1408
+#define IDC_YPOS                        1409
+#define IDC_WIDTH                       1410
+#define IDC_HEIGHT                      1411
+#define IDC_SPIN1                       1414
+#define IDC_SPIN2                       1415
+#define IDC_EDIT_RELEASE                1415
+#define IDC_SPIN3                       1416
+#define IDC_EDIT_DEBUG                  1416
+#define IDC_ADDTOPROJECT                1416
+#define IDC_SPIN4                       1417
+#define IDC_FILENAME                    1417
+#define IDC_STATIC_FILENAME             1418
+#define IDC_CLIP                        1419
+#define IDC_ICONTYPECOMBO               1420
+#define IDC_STATIC_COLOR                1422
+#define IDC_NOWCOLOR                    1423
+#define IDC_TYPELIST                    1425
+#define IDC_COMPLEMENT                  1427
+#define IDC_STATIC_SETFONT              1428
+#define IDC_STATIC_TABSIZE              1429
+#define IDC_EXE_DIRECTX                 1432
+#define IDC_IMAGE_DOSPROMPT             1433
+#define IDC_IMAGE_NON                   1434
+#define IDC_IMAGE_DIRECTX               1435
+#define IDM_EXIT                        40001
+#define IDM_NEW                         40002
+#define IDM_OPEN                        40003
+#define IDM_CLOSE                       40004
+#define IDM_SAVE                        40008
+#define IDM_NEWSAVE                     40009
+#define IDM_UNDO                        40010
+#define IDM_CUT                         40011
+#define IDM_COPY                        40012
+#define IDM_PASTE                       40013
+#define IDM_DELETE                      40014
+#define IDM_ABOUT                       40015
+#define IDM_WINDOWCHARGE                40017
+#define IDM_ALLSAVE                     40020
+#define IDM_ALLSELECT                   40021
+#define IDM_FIND                        40024
+#define IDM_REDO                        40034
+#define IDM_TOPIC                       40037
+#define ID_MENUITEM40038                40038
+#define IDM_DOCSELECTBAND               40039
+#define IDM_STANDARDBAND                40040
+#define IDM_BASICBAND                   40041
+#define IDM_SET                         40042
+#define IDM_PERMUTATION                 40044
+#define IDM_DSHOMEPAGE                  40047
+#define IDM_ACTBDL                      40048
+#define IDM_PROJECT_OPEN                40051
+#define IDM_PROJECT_CLOSE               40052
+#define IDM_PROJECT_SAVE                40053
+#define IDM_PROJECTVIEW                 40054
+#define IDM_FILETREE_PROPERTY           40057
+#define IDM_FILETREE_OPEN               40058
+#define IDM_FILETREE_INSERT             40059
+#define IDM_FILETREE_DELETE             40060
+#define IDM_WINDOWTREE_OPEN             40062
+#define IDM_MATERIALTREE_OPEN           40062
+#define IDM_WINDOWTREE_DELETE           40063
+#define IDM_MATERIALTREE_DELETE         40063
+#define IDM_WINDOWTREE_PROPERTY         40064
+#define IDM_WINDOWTREE_INSERT           40065
+#define IDM_MATERIALTREE_INSERT         40065
+#define IDM_MATERIALTREE_INSERTWINDOW   40065
+#define IDM_RAD_ITEM_DELETE             40067
+#define IDM_RAD_WINDOW_EVENTCODE        40069
+#define IDM_ACCEL_UNDO                  -25466
+#define IDM_ACCEL_REDO                  -25465
+#define IDM_PROCEDURETREE_SHOW          40072
+#define IDM_RAD_WINDOW_MENUEVENTCODE    40074
+#define IDM_MENUTREE_RENAMEID           40075
+#define IDM_PROJECT_OPTION              40076
+#define IDM_TOPMOST                     40077
+#define ID_BUTTON40079                  40079
+#define ID_BUTTON40080                  40080
+#define ID_BUTTON40081                  40081
+#define ID_BUTTON40082                  40082
+#define ID_BUTTON40083                  40083
+#define ID_BUTTON40084                  40084
+#define ID_BUTTON40085                  40085
+#define ID_BUTTON40086                  40086
+#define ID_BUTTON40087                  40087
+#define ID_BUTTON40088                  40088
+#define ID_BUTTON40089                  40089
+#define ID_BUTTON40090                  40090
+#define ID_BUTTON40091                  40091
+#define ID_BUTTON40092                  40092
+#define ID_BUTTON40093                  40093
+#define ID_BUTTON40094                  40094
+#define ID_BUTTON40095                  40095
+#define ID_BUTTON40097                  40097
+#define IDM_DEBUG                       40101
+#define IDM_RELEASECOMPILE              40106
+#define IDM_DEBUGCOMPILE                40108
+#define IDM_MATERIALTREE_INSERTICON     40109
+#define IDM_MATERIALTREE_INSERTMENU     40110
+#define IDM_MATERIALTREE_ICON_SETMAIN   40113
+#define IDM_MATERIALTREE_INSERTBITMAP   40115
+#define IDM_MATERIALTREE_INSERTCURSOR   40116
+#define IDM_NOGRIPPER                   40117
+#define IDC_TOOL_SELECT                 40119
+#define IDC_TOOL_PEN                    40120
+#define IDC_TOOL_LINE                   40121
+#define IDC_TOOL_RECTANGLE              40123
+#define IDC_TOOL_ELLIPSE                40124
+#define IDC_TOOL_FILL                   40126
+#define IDC_TOOL_FILLRECT               40127
+#define IDC_TOOL_FILLRECT2              40128
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        269
+#define _APS_NEXT_COMMAND_VALUE         40129
+#define _APS_NEXT_CONTROL_VALUE         1435
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/abdev/src/MainFrame.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/MainFrame.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/MainFrame.cpp	(revision 774)
@@ -0,0 +1,2080 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::IDE;
+using namespace ActiveBasic::IDE::WindowComponents;
+
+LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
+void SetupWindow(HWND hwnd);
+void ResetTextEditFont(HWND hwnd);
+
+void CreateProcessWithStdHandle( const std::string &appPath, const std::string &cmdLine, bool isShowWindow = true )
+{
+	std::string argsStr = '\"' + appPath + "\" " + cmdLine;
+	STARTUPINFO si;
+	PROCESS_INFORMATION pi;
+	memset(&si,0,sizeof(STARTUPINFO));
+	si.cb=sizeof(STARTUPINFO);
+	si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+	si.wShowWindow = isShowWindow ? SW_SHOW : SW_HIDE;
+	si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+	si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+	si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+	
+	std::vector<char> args( argsStr.c_str(), argsStr.c_str() + argsStr.size() + 1 );
+
+	CreateProcess( NULL, &args[0], NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi );
+	CloseHandle( pi.hProcess );
+	CloseHandle( pi.hThread );
+}
+
+#ifdef HAVE_WINDOWS_7_SDK
+
+#define MSGFLT_ADD 1
+
+#pragma push_macro("_WIN32_WINNT")
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0601
+#include <dwmapi.h>
+#pragma pop_macro("_WIN32_WINNT")
+
+#define WM_DWMSENDICONICTHUMBNAIL 0x0323
+#define WM_DWMSENDICONICLIVEPREVIEWBITMAP 0x0326
+
+// Windows 7タスクバーにボタンとして表示させるためのウィンドウ。
+// 各MDI子ウィンドウ (wndTarget) と1対1に対応する。
+class DummyWindowForTaskbarButton : public ATL::CWindowImpl<DummyWindowForTaskbarButton>, boost::noncopyable
+{
+public:
+	DECLARE_WND_CLASS(TEXT("DummyWindow For Taskbar Button"));
+
+	BEGIN_MSG_MAP(DummyWindowForTaskbarButton)
+		MESSAGE_HANDLER_EX(WM_DWMSENDICONICTHUMBNAIL, OnDwmSendIconicThumnail)
+		MESSAGE_HANDLER_EX(WM_DWMSENDICONICLIVEPREVIEWBITMAP, OnDwmSendIconicLivePreviewBitmap)
+		MSG_WM_ACTIVATE(OnActivate)
+	END_MSG_MAP()
+
+	explicit DummyWindowForTaskbarButton(HWND hwndTarget, const char* title) :
+		wndTarget(hwndTarget)
+	{
+		HWND hwndDummy = Create( hOwner, CRect( -32000, -32000, 1, 1 ), title,
+			WS_BORDER | WS_SYSMENU | WS_CAPTION, WS_EX_NOACTIVATE);
+		SetIcon( wndTarget.GetIcon( FALSE ), FALSE );
+		SetIcon( wndTarget.GetIcon( TRUE ), TRUE );
+
+		BOOL iconicRepresentation = TRUE;
+		HRESULT hr;
+		hr = DwmSetWindowAttribute(
+			*this,
+			DWMWA_FORCE_ICONIC_REPRESENTATION,
+			&iconicRepresentation,
+			sizeof iconicRepresentation);
+		BOOL iconicBitmap = TRUE;
+		hr = DwmSetWindowAttribute(
+			*this,
+			DWMWA_HAS_ICONIC_BITMAP,
+			&iconicBitmap,
+			sizeof iconicBitmap);
+	}
+
+	~DummyWindowForTaskbarButton()
+	{
+	}
+private:
+	void OnActivate(UINT state, BOOL /*minimized*/, HWND /*hwndOther*/)
+	{
+		if (state == WA_ACTIVE)
+		{
+			if (ActiveBasic::IDE::Program::mainFrame.IsIconic())
+			{
+				ActiveBasic::IDE::Program::mainFrame.ShowWindow(SW_RESTORE);
+			}
+			SetForegroundWindow(ActiveBasic::IDE::Program::mainFrame);
+			ActiveBasic::IDE::Program::mainFrame.MDIActivate(wndTarget);
+			wndTarget.Invalidate(FALSE);
+		}
+	}
+
+	class BitmapMemoryDC : public WTL::CDC, boost::noncopyable
+	{
+	public:
+		explicit BitmapMemoryDC(HBITMAP hbmp) :
+			WTL::CDC(::CreateCompatibleDC(0)),
+			bmp(hbmp),
+			hbmpOld(SelectBitmap(bmp))
+		{
+		}
+		BitmapMemoryDC(int width, int height, void*& bits) :
+			WTL::CDC(::CreateCompatibleDC(0)),
+			bmp(CreateDIBSection32(m_hDC, width, height, bits)),
+			hbmpOld(SelectBitmap(bmp))
+		{
+		}
+		~BitmapMemoryDC()
+		{
+			SelectBitmap(hbmpOld); // この後、CDCとbmpのデストラクタでそれぞれDeleteDCとDeleteObjectがなされる。
+		}
+		WTL::CBitmap& GetBitmap()
+		{
+			return bmp;
+		}
+	private:
+		WTL::CBitmap bmp;
+		HBITMAP hbmpOld;
+	};
+
+	LRESULT OnDwmSendIconicThumnail(UINT, WPARAM, LPARAM lp)
+	{
+		HRESULT hr = SetIconicThumbnail(HIWORD(lp), LOWORD(lp));
+		return 0;
+	}
+
+	LRESULT OnDwmSendIconicLivePreviewBitmap(UINT, WPARAM, LPARAM)
+	{
+		HRESULT hr = SetIconicLivePreviewBitmap();
+		return 0;
+	}
+
+	HRESULT SetIconicThumbnail(int maximumWidth, int maximumHeight)
+	{
+		int widthBmp, heightBmp;
+		BitmapMemoryDC dcSrc(CreateBitmap(widthBmp, heightBmp));
+		if (dcSrc)
+		{
+			int width, height;  // dcSrcの縦横比に合わせて縮小する
+			if (widthBmp * maximumHeight > maximumWidth * heightBmp) // (widthBmp / heightBmp > maximumWidth / maximumHeight)
+			{
+				width = maximumWidth;
+				height = heightBmp * maximumWidth / widthBmp;
+			}
+			else
+			{
+				height = maximumHeight;
+				width = widthBmp * maximumHeight / heightBmp;
+			}
+			void* pvBits;
+			BitmapMemoryDC dc(width, height, pvBits);
+			if (dc)
+			{
+				StretchBlt(dc, 0, 0, width, height, dcSrc, 0, 0, widthBmp, heightBmp, SRCCOPY);
+				return DwmSetIconicThumbnail(*this, dc.GetBitmap(), DWM_SIT_DISPLAYFRAME);
+			}
+		}
+		return HRESULT_FROM_WIN32(GetLastError());
+	}
+
+	HRESULT SetIconicLivePreviewBitmap()
+	{
+		int w, h;
+		WTL::CBitmap bmp(CreateBitmap(w, h));
+		if (bmp)
+		{
+			POINT pt = {};
+			wndTarget.MapWindowPoints(hOwner, &pt, 1);
+			pt.y += GetSystemMetrics(SM_CYMENU);
+			return DwmSetIconicLivePreviewBitmap(*this, bmp, &pt, wndTarget.IsZoomed() ? 0 : DWM_SIT_DISPLAYFRAME);
+		}
+		return HRESULT_FROM_WIN32(GetLastError());
+	}
+
+	static void SetAlpha(DWORD& pixel)
+	{
+		pixel |= 0xff000000;
+	}
+
+	HBITMAP CreateBitmap(int& width, int& height)
+	{
+		RECT rcClient;
+		wndTarget.GetClientRect(&rcClient);
+		void* pvBits;
+		BitmapMemoryDC dc(rcClient.right, rcClient.bottom, pvBits);
+		if (dc)
+		{
+			int wndNum = GetWndNum(wndTarget);
+			if (wndNum != -1)
+			{
+				CPoint origin(0, 0);
+				wndTarget.ClientToScreen( &origin );
+				CRect rcWindow;
+				wndTarget.GetWindowRect( rcWindow );
+				origin -= rcWindow.TopLeft();
+				dc.SetWindowOrg( origin ); // クライアント領域の(0, 0)がビットマップの(0, 0)になるよう合わせる
+				wndTarget.Print( dc, PRF_CHECKVISIBLE | PRF_ERASEBKGND | PRF_CHILDREN | PRF_CLIENT );
+				width = rcClient.right;
+				height = rcClient.bottom;
+				DWORD* pdwBits = static_cast<DWORD*>(pvBits);
+				std::for_each(pdwBits, pdwBits + width * height, SetAlpha);
+				return dc.GetBitmap().Detach();
+			}
+		}
+		return 0;
+	}
+	// 32ビットトップダウンのDIBセクションを作る補助
+	static HBITMAP CreateDIBSection32(HDC hdc, int width, int height, void*& pb)
+	{
+		BITMAPINFO bi;
+		ZeroMemory(&bi.bmiHeader, sizeof bi.bmiHeader);
+		bi.bmiHeader.biSize = sizeof bi.bmiHeader;
+		bi.bmiHeader.biWidth = width;
+		bi.bmiHeader.biHeight = -height;  // トップダウンDIBにする必要があるらしい
+		bi.bmiHeader.biPlanes = 1;
+		bi.bmiHeader.biBitCount = 32;
+		return CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &pb, 0, 0);
+	}
+
+	CWindow wndTarget;
+};
+
+class TaskbarList
+{
+	typedef boost::shared_ptr<DummyWindowForTaskbarButton> DummyWindowForTaskbarButtonPtr;
+	typedef std::map<HWND, DummyWindowForTaskbarButtonPtr> WindowMap;
+public:
+	TaskbarList(HWND hwndFrame) :
+		wndFrame(hwndFrame)
+	{
+		HRESULT hr = taskbarList.CoCreateInstance( CLSID_TaskbarList );
+		if ( FAILED( hr ) ) {
+			return;
+		}
+		HRESULT hr2 = taskbarList->HrInit();
+		if ( FAILED( hr2 ) ) {
+			taskbarList.Release();
+			return;
+		}
+	}
+
+	void RegisterTab(HWND hwndChild, const char* title)
+	{
+		assert( hwndChild );
+		if (taskbarList)
+		{
+			assert( windowMap.find(hwndChild) == windowMap.end() );
+			DummyWindowForTaskbarButtonPtr p(new DummyWindowForTaskbarButton(hwndChild, title));
+			windowMap.insert(std::make_pair(hwndChild, p));
+			//タスクバーボタンに追加
+			HRESULT hr = taskbarList->RegisterTab(*p, wndFrame);
+		}
+	}
+
+	void RegisterTab(HWND hwndChild)
+	{
+		ATL::CWindow wnd = hwndChild;
+		ATL::CString title;
+		wnd.GetWindowText(title);
+		RegisterTab(hwndChild, title);
+	}
+
+	void UnregisterTab(HWND hwndChild)
+	{
+		if (taskbarList)
+		{
+			WindowMap::iterator it = windowMap.find(hwndChild);
+			assert( it != windowMap.end() );
+			HRESULT hr = taskbarList->UnregisterTab(*it->second);
+			it->second->DestroyWindow();
+			windowMap.erase( it );
+		}
+	}
+
+	void InvalidateIconicBitmaps(HWND hwndChild)
+	{
+		DwmInvalidateIconicBitmaps(*mapAt(hwndChild));
+	}
+
+	void SetTabActivate(HWND hwndChild)
+	{
+		if (taskbarList)
+		{
+			taskbarList->SetTabActive(*mapAt(hwndChild), wndFrame, 0);
+		}
+	}
+
+	void SetTabOrder( HWND hwndChild, HWND hwndInsertBefore )
+	{
+		if (taskbarList)
+		{
+		taskbarList->SetTabOrder(*mapAt(hwndChild),
+			hwndInsertBefore
+			? static_cast<HWND>(*mapAt(hwndInsertBefore))
+			: 0);
+		}
+	}
+private:
+	DummyWindowForTaskbarButtonPtr mapAt(HWND hwndChild)
+	{
+		DummyWindowForTaskbarButtonPtr p = windowMap[hwndChild];
+		assert(p);
+		return p;
+	}
+	CWindow wndFrame;
+	ATL::CComPtr<ITaskbarList3> taskbarList;
+	WindowMap windowMap;
+};
+#endif HAVE_WINDOWS_7_SDK
+
+#ifdef HAVE_WINDOWS_7_SDK
+MainFrame::MainFrame() :
+	TaskbarButtonCreated( RegisterWindowMessage( TEXT("TaskbarButtonCreated") ) )
+{
+	if ( TaskbarButtonCreated != 0 )
+	{
+		typedef BOOL WINAPI CWMF(UINT, DWORD);
+		HMODULE hmodUser = GetModuleHandle( TEXT("user32.dll") );
+		assert( hmodUser != 0 );
+		if ( CWMF* pcwmf = reinterpret_cast<CWMF*>( GetProcAddress( hmodUser, "ChangeWindowMessageFilter" ) ) )
+		{
+			pcwmf(TaskbarButtonCreated, MSGFLT_ADD);
+			pcwmf(WM_DWMSENDICONICTHUMBNAIL, MSGFLT_ADD);
+			pcwmf(WM_DWMSENDICONICLIVEPREVIEWBITMAP, MSGFLT_ADD);
+		}
+	}
+}
+#else
+MainFrame::MainFrame() {}
+#endif
+
+void MainFrame::Resized()
+{
+	int width_owner,height_owner;
+	int height_Rebar;
+	int height_MdiClient;
+	RECT rect,StatusRect,RebarRect;
+
+	this->GetClientRect( &rect );
+	width_owner=rect.right;
+	height_owner=rect.bottom;
+
+	//Rebar
+	SendMessage(pobj_Rebar->hRebar,WM_SIZE,0,MAKELONG(width_owner,height_owner));
+	::UpdateWindow(pobj_Rebar->hRebar);
+
+	//Status bar
+#define STATUSBAR_PARTS_NUM 5
+	int sb_size[STATUSBAR_PARTS_NUM];
+	sb_size[0]=width_owner-340;
+	sb_size[1]=width_owner-220;
+	sb_size[2]=width_owner-120;
+	sb_size[3]=width_owner-50;
+	sb_size[4]=width_owner;
+	extern HWND hStatusBar;
+	::SendMessage(hStatusBar,SB_SETPARTS,STATUSBAR_PARTS_NUM,(LPARAM)sb_size);
+	::SendMessage(hStatusBar,WM_SIZE,0,MAKELONG(width_owner,height_owner));
+	::UpdateWindow(hStatusBar);
+
+	//Status bar
+	int height_Statusbar;
+	SendMessage(hStatusBar,SB_GETRECT,0,(LPARAM)&StatusRect);
+	height_Statusbar=StatusRect.bottom;
+
+	::GetWindowRect(pobj_Rebar->hRebar,&RebarRect);
+	height_Rebar=RebarRect.bottom-RebarRect.top+2;
+
+	int height_dv;	//Width of Debugger View
+	int height_cv;	//Width of Compiler View
+	height_dv=0;
+	height_cv=0;
+#ifndef THETEXT
+	extern BOOL bClipCompileView;
+	if(bClipCompileView){
+		if(pobj_Debugger->IsDebuggerView()){
+			//デバッガビューが表示されているとき
+			height_dv=pobj_nv->height_ClipDebuggerView+LEVER_THICK;
+		}
+
+		extern HWND hCompileView;
+		if(hCompileView){
+			//コンパイラビューが表示されているとき
+			height_cv=pobj_nv->height_ClipCompileView+LEVER_THICK;
+		}
+	}
+#endif
+
+	int width_pjv=0;	//Width of Project View
+	if(pobj_nv->bClipProjectView){
+		extern HWND hProjectView;
+		if(::IsWindowVisible(hProjectView)){
+			//プロジェクトビューが表示されているとき
+			width_pjv=pobj_nv->width_ClipProjectView+LEVER_THICK;
+		}
+	}
+
+	int width_SideWeb=0;
+	if( pobj_SideWeb )
+	{
+		if(pobj_SideWeb->bShow){
+			width_SideWeb=pobj_nv->width_WebSearchView+LEVER_THICK;
+		}
+	}
+
+	//MDIクライアントの高さ
+	height_MdiClient=height_owner-(
+		height_Rebar+
+		height_dv+
+		height_cv+
+		height_Statusbar
+		);
+
+	//タブコントロール
+	int tab_height;
+	if(TabCtrl_GetItemCount(pobj_MainTab->hTab)==0) tab_height=0;
+	else{
+		RECT rc;
+		TabCtrl_GetItemRect(pobj_MainTab->hTab,0,&rc);
+		tab_height=rc.bottom-rc.top;
+	}
+	::MoveWindow(pobj_MainTab->hTab,
+		width_pjv,
+		height_Rebar,
+		width_owner-width_pjv-width_SideWeb,
+		tab_height,
+		1);
+
+	//MDIクライアント
+	::MoveWindow(
+		hClient,
+		width_pjv,
+		height_Rebar+tab_height,
+		width_owner-width_pjv-width_SideWeb,
+		height_MdiClient-tab_height,
+		1
+	);
+
+	if( pobj_SideWeb )
+	{
+		if(pobj_SideWeb->bShow){
+			//SideWeb
+			pobj_SideWeb->resize(
+				width_owner - pobj_nv->width_WebSearchView,
+				height_Rebar,
+				pobj_nv->width_WebSearchView,
+				height_MdiClient);
+		}
+		else pobj_SideWeb->resize(0,0,0,0);
+	}
+
+	if(width_pjv){
+		//プロジェクトビュー
+		extern HWND hProjectView;
+		::MoveWindow(hProjectView,
+			0,
+			height_Rebar,
+			pobj_nv->width_ClipProjectView,
+			height_MdiClient,
+			1);
+		::InvalidateRect(hProjectView,NULL,0);
+	}
+
+	if(height_dv){
+#ifndef THETEXT
+		//デバッガビュー
+		pobj_Debugger->resize(
+			0,
+			height_Rebar+height_MdiClient+LEVER_THICK,
+			width_owner,
+			pobj_nv->height_ClipDebuggerView);
+#endif
+	}
+	if(height_cv){
+		//コンパイラビュー
+		extern HWND hCompileView;
+		::MoveWindow(hCompileView,
+			0,
+			height_Rebar+height_MdiClient+height_dv+LEVER_THICK,
+			width_owner,
+			pobj_nv->height_ClipCompileView,
+			1);
+	}
+}
+
+void MainFrame::OpenWebBrowser( const std::string &url )
+{
+	ShellExecute(m_hWnd,"open",url.c_str(),"",NULL,SW_SHOWNORMAL);
+}
+
+void MainFrame::OpenExplorer( const std::string &filepath )
+{
+	CreateProcessWithStdHandle( "explorer", "/select,\"" + filepath + "\"" );
+}
+
+::LRESULT MainFrame::OnCreate( ::CREATESTRUCT const* )
+{
+	// ウィンドウエリアマネージャに親ウィンドウを登録
+	wam.SetParentWnd( m_hWnd );
+
+	RECT rect;
+	GetClientRect( &rect );
+
+	// MDIベースを作成
+    // フレームウィンドウのビューウィンドウを作成
+	int indexOfWindowSubMenu = pobj_MainMenu->FindSubMenuIndex( "ウィンドウ(&W)" );
+	HMENU hWindowSubMenu = NULL;
+	if( indexOfWindowSubMenu != -1 )
+	{
+		hWindowSubMenu = GetSubMenu( pobj_MainMenu->hMenu, indexOfWindowSubMenu );
+	}
+	CreateMDIClient( hWindowSubMenu );
+	wam.AddMdiClientWindow( m_hWndClient );
+
+	// TODO: hClientを廃止し、m_hWndClientに統一すること
+	extern HWND hClient;
+	hClient = m_hWndClient;
+
+    // メッセージループにメッセージフィルタとアイドルハンドラを追加
+	CMessageLoop* pLoop = Program::_Module.GetMessageLoop();
+    pLoop->AddMessageFilter(this);
+    pLoop->AddIdleHandler(this);
+
+
+
+
+
+	extern HWND hOwner;
+	hOwner = m_hWnd;
+	extern WNDPROC oldMainFrameWndProc;
+	oldMainFrameWndProc = (WNDPROC)::SetWindowLongPtr( hOwner, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(WindowFunc) );
+
+	SetupWindow(hOwner);
+
+	//テキストエディタフォント設定
+	ResetTextEditFont(hOwner);
+
+	return 0;
+}
+
+void MainFrame::OnSize(UINT nType, CSize size)
+{
+	this->Resized();
+}
+
+BOOL MainFrame::OnQueryEndSession(UINT nSource, UINT uLogOff)
+{
+	OnClose();
+
+	return TRUE;
+}
+
+void MainFrame::OnClose()
+{
+	extern BOOL bSearchingClasses;
+	if(bSearchingClasses){
+		pobj_ClassTreeView->bCloseSwitch=1;
+		return;
+	}
+
+	//コンパイラビューを閉じる
+	extern HWND hCompileView;
+	if( hCompileView && ::IsWindow( hCompileView ) )
+	{
+		SendMessage(hCompileView,WM_COMMAND,IDCANCEL,0);
+	}
+
+	//次回起動時にMDIウィンドウを最大化させるかを判定
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	pobj_nv->bMDIZoomed=::IsZoomed(hChild);
+
+	//プロジェクトを閉じる
+	if( projectInfo.IsOpened() ){
+		if(!projectInfo.Close()) return;
+	}
+
+	//MDIウィンドウの保存確認
+	hChild=::GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		if(!DocumentModifyCheck(hChild)) return;
+		hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+
+
+	KillTimer(ID_TIMER_BACKUP);
+
+
+	//ProjectViewの位置を保存、ProjectViewを破棄
+	extern HWND hProjectView;
+	extern HWND hProjectView_ToolWindow;
+	::GetWindowRect(hProjectView_ToolWindow,&pobj_nv->rectProjectView);
+	::DestroyWindow(hProjectView);
+	::DestroyWindow(hProjectView_ToolWindow);
+
+	//Rebarの位置を保存、Rebarを破棄
+	delete pobj_Rebar;
+	pobj_Rebar=0;
+
+	//タブコントロールを破棄
+	delete pobj_MainTab;
+	pobj_MainTab=0;
+
+	//SideWebを破棄
+	delete pobj_SideWeb;
+	pobj_SideWeb=0;
+
+	//メインウィンドウの最大化有無、座標を保存
+	if(IsZoomed()) pobj_nv->bWindowMax=1;
+	else if(!IsIconic()){
+		pobj_nv->bWindowMax=0;
+		GetWindowRect(&pobj_nv->StartupWindowRect);
+	}
+
+	hChild=::GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		CloseDocWindow(GetWndNum(hChild));
+		::DestroyWindow(hChild);
+		hChild=::GetWindow(hClient,GW_CHILD);
+	}
+
+	EndProjectEditor();		//ProjectEditorの情報を保存
+
+	//エディタ用フォントを破棄
+	extern HFONT hFont_TextEdit,hFont_HyperLink_TextEdit;
+	if(hFont_TextEdit) DeleteObject(hFont_TextEdit);
+	if(hFont_HyperLink_TextEdit) DeleteObject(hFont_HyperLink_TextEdit);
+
+	DestroyWindow();
+}
+void MainFrame::OnDestroy()
+{
+	::PostQuitMessage( 0 );
+}
+
+void backup(void *dummy);
+void MainFrame::OnTimer( UINT_PTR id )
+{
+	switch( id )
+	{
+	case ID_TIMER_BACKUP:
+		_beginthread( backup, 0, 0 );
+		break;
+
+#ifndef THETEXT
+	case ID_DEBUGSAFTY:
+		{
+			//BasicCompiler.exeが強制終了しているかどうかを検証
+			extern CDebugger *pobj_Debugger;
+			pobj_Debugger->SaftyCheck();
+			break;
+		}
+#endif
+	}
+}
+
+void ResetState_EditMenu(void);
+void MainFrame::OnDrawClipboard()
+{
+	ResetState_EditMenu();
+}
+
+void MenuAdvice(WPARAM msg);
+void MainFrame::OnMenuSelect( UINT nItemID, UINT nFlags, HMENU menu )
+{
+	MenuAdvice( nItemID );
+}
+
+void MainFrame::OnInitMenu( HMENU menu )
+{
+	extern CNonVolatile *pobj_nv;
+	extern CSubMenuEx *pobj_FileHistoryMenu;
+	pobj_nv->pobj_History->ResetFileMenu(pobj_FileHistoryMenu,1);
+#ifndef THETEXT
+	extern CSubMenuEx *pobj_ProjectHistoryMenu;
+	pobj_nv->pobj_ProjectHistory->ResetFileMenu(pobj_ProjectHistoryMenu,0);
+#endif
+}
+
+void MainFrame::OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMI )
+{
+	if(lpMI->CtlType==ODT_MENU){
+		SIZE size;
+		CMenuItemData *pobj_MenuItemData;
+		pobj_MenuItemData=(CMenuItemData *)lpMI->itemData;
+		if(pobj_MenuItemData->pobj_ThisMenu->hMenu==pobj_MainMenu->hMenu){
+			//メインメニューの親アイテム
+			pobj_MainMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
+			lpMI->itemWidth = size.cx;
+			lpMI->itemHeight = size.cy;
+		}
+		else{
+			//メインメニューにぶらさがるサブメニュー
+			pobj_MenuItemData->pobj_ThisMenu->GetItemSize(pobj_MenuItemData->item_index,&size);
+			lpMI->itemWidth = size.cx;
+			lpMI->itemHeight = size.cy;
+		}
+	}
+}
+
+void MainFrame::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )
+{
+	if(lpDrawItemStruct->CtlType==ODT_MENU){
+		if(!pobj_MainMenu) return;
+
+		CMenuItemData *pobj_MenuItemData;
+		pobj_MenuItemData=(CMenuItemData *)lpDrawItemStruct->itemData;
+		if(pobj_MainMenu->hMenu==pobj_MenuItemData->pobj_ThisMenu->hMenu){
+			//メインメニューの親アイテム
+			pobj_MainMenu->OwnerDrawMenu(lpDrawItemStruct->hDC,
+				&lpDrawItemStruct->rcItem,
+				(lpDrawItemStruct->itemState&ODS_SELECTED)!=0,
+				pobj_MenuItemData->item_index);
+		}
+		else{
+			//メインメニューにぶらさがるサブメニュー
+			pobj_MainMenu->OwnerDrawSubMenu(pobj_MenuItemData->pobj_ThisMenu->hMenu,
+				lpDrawItemStruct->hDC,
+				&lpDrawItemStruct->rcItem,
+				(lpDrawItemStruct->itemState&ODS_SELECTED)!=0,
+				pobj_MenuItemData->item_index);
+		}
+	}
+}
+
+LRESULT MainFrame::OnNotify( int idCtrl, LPNMHDR pnmh )
+{
+	NMPGCALCSIZE *lpCalcSize;
+	NMPGSCROLL *lpScroll;
+
+	if(!pnmh) return 0;
+	LPTOOLTIPTEXT TipText=(LPTOOLTIPTEXT)pnmh;
+	if(TipText->hdr.code==TTN_NEEDTEXT) ShowToolTipText(TipText);
+
+	extern HWND hStandardToolbarPager;
+	extern HWND hDebuggerToolbarPager;
+	if(pobj_Rebar){
+		//レバーオブジェクトが存在するとき
+		if(pnmh->hwndFrom==pobj_Rebar->hRebar&&pnmh->code==RBN_HEIGHTCHANGE){
+			this->Resized();
+			return 0;
+		}
+	}
+	if(pnmh->hwndFrom==hStandardToolbarPager){
+		if(pnmh->code==PGN_CALCSIZE){
+			lpCalcSize=(LPNMPGCALCSIZE)pnmh;
+			if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
+				lpCalcSize->iWidth=BMPNUM_STANDARDTOOLBAR*23+SEPNUM_STANDARDTOOLBAR*8;
+		}
+		else if(pnmh->code==PGN_SCROLL){
+			lpScroll=(LPNMPGSCROLL)pnmh;
+			lpScroll->iScroll=20;
+		}
+	}
+	else if(pnmh->hwndFrom==hDebuggerToolbarPager){
+		if(pnmh->code==PGN_CALCSIZE){
+			lpCalcSize=(LPNMPGCALCSIZE)pnmh;
+			if(lpCalcSize->dwFlag==PGF_CALCWIDTH)
+				lpCalcSize->iWidth=BMPNUM_DEBUGGERTOOLBAR*23+SEPNUM_DEBUGGERTOOLBAR*8;
+		}
+		else if(pnmh->code==PGN_SCROLL){
+			lpScroll=(LPNMPGSCROLL)pnmh;
+			lpScroll->iScroll=20;
+		}
+	}
+
+	if(pobj_MainTab){
+		if(pnmh->hwndFrom==pobj_MainTab->hTab){
+			if(pnmh->code==TCN_SELCHANGE)
+				pobj_MainTab->SelChangeEvent();
+
+			if(pnmh->code==NM_RCLICK){
+
+				TCHITTESTINFO tcHitTest;
+				GetCursorPos(&tcHitTest.pt);
+				::ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
+				int index = TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
+				if( index == -1 ) return 0;
+
+				TabCtrl_SetCurSel(pobj_MainTab->hTab,index);
+
+				pobj_MainTab->SelChangeEvent();
+
+
+				/////////////////////
+				// メニューを表示
+				/////////////////////
+
+				HWND hChild=::GetWindow(hClient,GW_CHILD);
+				int WndNum=GetWndNum(hChild);
+
+				//保存コマンドの文字列をセット
+				char temporary[1024], temp2[1024];
+				MENUITEMINFO mii;
+				mii.cbSize=sizeof(MENUITEMINFO);
+				mii.fMask=MIIM_TYPE;
+				mii.dwTypeData=temporary;
+				mii.fType=MFT_STRING;
+				if(!MdiInfo[WndNum]->path.empty()){
+					_splitpath(MdiInfo[WndNum]->path.c_str(),NULL,NULL,temporary,temp2);
+					lstrcat(temporary,temp2);
+					lstrcat(temporary," を保存(&S)");
+				}
+				else{
+					lstrcpy(temporary,"保存(&S)");
+				}
+				extern HMENU hTabMenu;
+				SetMenuItemInfo(hTabMenu,IDM_SAVE,FALSE,&mii);
+
+				/*「絶対パスをコピー」「フォルダを開く」「ファイルを削除」
+												コマンドを場合によって無効化にする */
+				if(!MdiInfo[WndNum]->path.empty()){
+					EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_ENABLED);
+					EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_ENABLED);
+					EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_ENABLED);
+				}
+				else{
+					EnableMenuItem(hTabMenu,IDM_PATH_COPY,MF_BYCOMMAND|MF_GRAYED);
+					EnableMenuItem(hTabMenu,IDM_FOLDER_OPEN,MF_BYCOMMAND|MF_GRAYED);
+					EnableMenuItem(hTabMenu,IDM_DELETE_FILE,MF_BYCOMMAND|MF_GRAYED);
+				}
+
+				POINT MousePos;
+				GetCursorPos(&MousePos);
+				TrackPopupMenu(hTabMenu,TPM_LEFTALIGN|TPM_RIGHTBUTTON,MousePos.x,MousePos.y,0,hOwner,NULL);
+			}
+		}
+	}
+	if(pobj_SideWeb){
+		if(pnmh->hwndFrom==pobj_SideWeb->hTab&&pnmh->code==TCN_SELCHANGE){
+			pobj_SideWeb->SelChangeEvent();
+		}
+	}
+
+	return 0;
+}
+
+void MainFrame::OnDropFiles( HDROP hDropInfo )
+{
+	int max = DragQueryFile(hDropInfo,static_cast<DWORD>(-1),0,0);
+	for(int i=0;i<max;i++){
+		char temporary[1024];
+		DragQueryFile(hDropInfo,i,temporary,MAX_PATH);
+		OpenFileWithExtension(temporary);
+	}
+	DragFinish(hDropInfo);
+}
+
+void MainFrame::OnPaint( HDC )
+{
+	WTL::CPaintDC dc( m_hWnd );
+
+	RECT rect;
+	this->GetClientRect( &rect );
+
+	dc.FillRect( &rect, GetSysColorBrush( COLOR_3DFACE ) );
+}
+
+::LRESULT MainFrame::OnShowSourceLine( ::UINT msg, ::WPARAM wParam, ::LPARAM lParam, ::BOOL& handled )
+{
+	char temporary[1024];
+
+	//エラー部分を反転表示
+	DWORD AccBytes;
+	{
+		sprintf(temporary,"%s\\pgm.tmp",ActiveBasic::Common::Environment::GetUserAppDir().c_str());
+		ATL::CHandle fh(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
+		if(fh==INVALID_HANDLE_VALUE){
+			fh.Detach();
+			return 0;
+		}
+		ReadFile(fh,temporary,MAX_PATH,&AccBytes,NULL);
+	}
+	temporary[AccBytes]=0;
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum = -1;
+	while(hChild){
+		WndNum=GetWndNum(hChild);
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0) break;
+		}
+		hChild=::GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+	if(!hChild){
+		hChild=OpenFileWithExtension(temporary);
+		WndNum=GetWndNum(hChild);
+	}
+
+	if(WndNum==-1) return 0;
+
+	//ウィンドウを最前面に表示
+	::BringWindowToTop(hChild);
+	::UpdateWindow(hChild);
+
+	const char *pTemp=MdiInfo[WndNum]->pMdiTextEdit->buffer;
+
+	//行の先頭インデックスを取得（取得する行の番号はwParamで渡される）
+	int i,i2;
+	for(i=0,i2=0;;i++){
+		if(i2>=(int)wParam) break;
+		if(pTemp[i]=='\0') break;
+		if(pTemp[i]=='\r'&&pTemp[i+1]=='\n'){
+			i++;
+			i2++;
+		}
+	}
+	POINT pos;
+	pos.x=i;
+
+	//行の終端インデックスを取得
+	for(;;i++){
+		if(pTemp[i]=='\0') break;
+		if(pTemp[i]=='\r'&&pTemp[i+1]=='\n') break;
+	}
+	pos.y=i;
+
+	//行を選択する
+	TextEdit_SetSel(WndNum,pos.x,pos.y,TRUE);
+
+	return 0;
+}
+
+::LRESULT MainFrame::OnTaskbarButtonCreated( ::UINT msg, ::WPARAM, ::LPARAM )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	if ( msg == 0 ) { // 念のため確認
+		return 0;
+	}
+	taskbarList.reset(new TaskbarList(*this));
+#endif
+	return 0;
+}
+
+void MainFrame::AddChildWindow( HWND hwndChild )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	taskbarList->RegisterTab( hwndChild );
+#endif
+}
+
+void MainFrame::DeleteChildWindow( HWND hwndChild )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	taskbarList->UnregisterTab( hwndChild );
+#endif
+}
+
+void MainFrame::ActivateChildWindow( HWND hwndChild )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	taskbarList->SetTabActivate( hwndChild );
+#endif
+}
+
+void MainFrame::SetTabOrder( HWND hwndChild, HWND hwndInsertBefore )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	taskbarList->SetTabOrder( hwndChild, hwndInsertBefore );
+#endif
+}
+
+void MainFrame::InvalidateBitmap( HWND hwndChild )
+{
+#ifdef HAVE_WINDOWS_7_SDK
+	taskbarList->InvalidateIconicBitmaps( hwndChild );
+#endif
+}
+
+void MainFrame::OnCmdNew( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+
+#ifdef THETEXT
+	NewTextEditWindow(NULL,WNDTYPE_TEXT);
+	return;
+#else
+	int FileType;
+	BOOL bAddToProject;
+	char temporary[MAX_PATH];
+
+	FileType=DialogBox(hResInst,MAKEINTRESOURCE(IDD_NEWFILE),hOwner,DlgNewFile);
+	if(FileType==-1) return;
+
+	if(FileType&0x00008000){
+		bAddToProject=1;
+		FileType&=0x0FFF;
+		extern char NewFileName[MAX_PATH];
+		lstrcpy(temporary,NewFileName);
+		if(!strstr(temporary,".")) lstrcat(temporary,".ab");
+
+		lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+	}
+	else bAddToProject=0;
+
+	switch(FileType){
+		case FT_BASICPROGRAM:		//Basicプログラム
+		case FT_SUBPROGRAM:
+			if(bAddToProject){
+				WriteBuffer(temporary,0,0);
+				NewTextEditWindow(temporary,WNDTYPE_BASIC);
+				Project_File_Insert(temporary);
+			}
+			else NewTextEditWindow(NULL,WNDTYPE_BASIC);
+			break;
+
+		case FT_PROJECT:
+			DlgNewProjectWizard(hOwner);
+			break;
+
+		case FT_TEXT:
+			NewTextEditWindow(NULL,WNDTYPE_TEXT);
+			break;
+
+		case FT_HTML:
+			NewTextEditWindow(NULL,WNDTYPE_HTML);
+			break;
+
+		case FT_ICON:
+			NewIconEditWindow(NULL);
+			break;
+	}
+#endif
+}
+
+void MainFrame::OnCmdOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//"ファイルを指定してください"
+	extern LPSTR DefFileFilter;
+	char temporary[1024];
+	if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILEOPENTITLE_DEFAULT,TRUE)) return;
+
+	OpenFileWithExtension( temporary );
+}
+
+void MainFrame::OnCmdClose( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if(::IsWindow(hChild)) SendMessage(hChild,WM_CLOSE,0,0);
+}
+
+void MainFrame::OnCmdProjectOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//"プロジェクト ファイルを指定して下さい"
+	extern LPSTR ProjectFileFilter;
+	char temporary[1024];
+	if(!GetFilePathDialog(m_hWnd,temporary,ProjectFileFilter,STRING_FILEOPENTITLE_PROJECT,TRUE))
+	{
+		return;
+	}
+
+	projectInfo.Load(temporary);
+}
+
+void MainFrame::OnCmdProjectSave( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	projectInfo.Save();
+}
+
+void MainFrame::OnCmdProjectClose( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	projectInfo.Close();
+}
+
+void MainFrame::OnCmdProjectFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	ShellExecute(m_hWnd,"explore",projectInfo.GetWorkDir().GetPath().c_str(),NULL,NULL,SW_SHOWNORMAL);
+}
+
+void MainFrame::OnCmdSave( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	SaveDocument(::GetWindow(hClient,GW_CHILD),NULL);
+}
+
+void MainFrame::OnCmdNewSave( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//"保存先のファイルを指定してください"
+	extern LPSTR DefFileFilter;
+	char temporary[1024];
+	if(!GetFilePathDialog(m_hWnd,temporary,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,FALSE)) return;
+
+	SaveDocument(::GetWindow(hClient,GW_CHILD),temporary);
+}
+
+void MainFrame::OnCmdCodeSave( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//文字コードを指定して保存
+	DialogBox(hResInst,MAKEINTRESOURCE(IDD_CODE_SAVE),m_hWnd,nkfDlgCodeSave);
+}
+
+void MainFrame::OnCmdAllSave( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	foreach( MDIINFO *mi, MdiInfo ){
+		if(mi->hwnd) SaveDocument(mi->hwnd,NULL);
+	}
+	if( projectInfo.IsOpened() )
+	{
+		projectInfo.Save();
+	}
+}
+
+void MainFrame::OnCmdPageSet( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//ページ設定
+	obj_Page.SetupDlg();
+}
+
+void MainFrame::OnCmdPreview( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//プレビュー（Pro版のみ）
+	Preview();
+}
+
+void MainFrame::OnCmdPrintOut( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//印刷
+	Printout();
+}
+
+void MainFrame::OnCmdExit( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	SendMessage(WM_CLOSE);
+}
+
+void MainFrame::OnCmdUndo( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if(!hChild) return;
+	int WndNum=GetWndNum(hChild);
+	if( IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType) )
+	{
+		TextEdit_UndoCommand(WndNum);
+	}
+	else if( MdiInfo[WndNum]->DocType == WNDTYPE_RAD )
+	{
+		Rad_UndoCommand(WndNum);
+	}
+	else if( MdiInfo[WndNum]->DocType == WNDTYPE_ICONEDIT )
+	{
+		IconEdit_UndoCommand(WndNum);
+	}
+}
+
+void MainFrame::OnCmdRedo( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if(!hChild) return;
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType))
+		TextEdit_RedoCommand(WndNum);
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD)
+		Rad_RedoCommand(WndNum);
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT)
+		IconEdit_RedoCommand(WndNum);
+}
+
+void MainFrame::OnCmdCut( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		HWND hEdit=::GetWindow(hChild,GW_CHILD);
+
+		CHARRANGE CharRange;
+		TextEdit_GetSel(WndNum,&CharRange);
+
+		HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
+		char *pTemp=(char *)GlobalLock(hGlobal);
+		memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
+		pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+		GlobalUnlock(hGlobal);
+
+		//クリップボードに保存
+		OpenClipboard();
+		EmptyClipboard();
+		SetClipboardData(CF_TEXT,hGlobal);
+		CloseClipboard();
+
+		//選択文字列を消去
+		SendMessage(hEdit,WM_KEYDOWN,VK_DELETE,0);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+		int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum]->path);
+
+		//クリップボードに格納するためのデータを用意する
+		pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.x-=17;
+		pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.y-=10;
+		HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
+		pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.x+=17;
+		pWindowInfo->childWindowInfos[MdiInfo[WndNum]->MdiRadInfo->SelectingItem[0]]->pos.y+=10;
+
+		OpenClipboard();
+		EmptyClipboard();
+		extern DWORD dwRadClipboardID;
+		SetClipboardData(dwRadClipboardID,hGlobal);
+		CloseClipboard();
+
+		SendMessage(MdiInfo[WndNum]->MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		//クリップボードに格納するためのデータを用意する
+		HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
+		if(hGlobal==0) return;
+
+		OpenClipboard();
+		EmptyClipboard();
+		SetClipboardData(CF_BITMAP,hGlobal);
+		CloseClipboard();
+
+		DeleteObject(MdiInfo[WndNum]->MdiIconEditInfo->hSelectingBmp);
+		MdiInfo[WndNum]->MdiIconEditInfo->SelectLevel=0;
+
+		IconEdit_EraseRect(WndNum,&MdiInfo[WndNum]->MdiIconEditInfo->DraggingRect);
+	}
+}
+
+void MainFrame::OnCmdCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		HWND hEdit = ::GetWindow(hChild,GW_CHILD);
+
+		CHARRANGE CharRange;
+		TextEdit_GetSel(WndNum,&CharRange);
+
+		HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,CharRange.cpMax-CharRange.cpMin+1);
+		char *pTemp=(char *)GlobalLock(hGlobal);
+		memcpy(pTemp,MdiInfo[WndNum]->pMdiTextEdit->buffer+CharRange.cpMin,CharRange.cpMax-CharRange.cpMin);
+		pTemp[CharRange.cpMax-CharRange.cpMin]=0;
+		GlobalUnlock(hGlobal);
+
+		//クリップボードに保存
+		OpenClipboard();
+		EmptyClipboard();
+		SetClipboardData(CF_TEXT,hGlobal);
+		CloseClipboard();
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		int indexOfWndInfo = GetWndInfoNum(MdiInfo[WndNum]->path);
+
+		//クリップボードに格納するためのデータを用意する
+		HGLOBAL hGlobal=Rad_GetChildInfoClipboardData(WndNum,indexOfWndInfo);
+
+		OpenClipboard();
+		EmptyClipboard();
+		extern DWORD dwRadClipboardID;
+		SetClipboardData(dwRadClipboardID,hGlobal);
+		CloseClipboard();
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		//クリップボードに格納するためのデータを用意する
+		HGLOBAL hGlobal=IconEdit_GetChildInfoClipboardData(WndNum);
+
+		OpenClipboard();
+		EmptyClipboard();
+		SetClipboardData(CF_BITMAP,hGlobal);
+		CloseClipboard();
+	}
+}
+
+void MainFrame::OnCmdPaste( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		HWND hEdit=::GetWindow(hChild,GW_CHILD);
+
+		//クリップボードを開く
+		OpenClipboard();
+		HGLOBAL hGlobal=GetClipboardData(CF_TEXT);
+		if(!hGlobal){
+			CloseClipboard();
+			return;
+		}
+
+
+		char *pTemp;
+		if(pobj_nv->bPasteIndent){
+			//インデント整形
+			pTemp=CodeFormatter((char *)GlobalLock(hGlobal));
+			GlobalUnlock(hGlobal);
+		}
+		else pTemp=(char *)GlobalLock(hGlobal);
+
+
+		//テキストエディタの文字列をリプレイス
+		TextEdit_ReplaceUpdateUndoData(WndNum,
+			pTemp,
+			1,
+			1);
+
+		if(pobj_nv->bPasteIndent)
+			HeapDefaultFree(pTemp);
+		else
+			GlobalUnlock(hGlobal);
+
+		//クリップボードを閉じる
+		CloseClipboard();
+
+
+		//キャレット位置までスクロールする
+		TextEdit_ScrollCaret(WndNum,0);
+		ResetCaretPos(WndNum);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		OpenClipboard();
+		extern DWORD dwRadClipboardID;
+		HGLOBAL hGlobal=GetClipboardData(dwRadClipboardID);
+		if(!hGlobal){
+			CloseClipboard();
+			return;
+		}
+		Rad_PasteChildInfoClipboardData(WndNum,hGlobal);
+		CloseClipboard();
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+		OpenClipboard();
+		HGLOBAL hGlobal=GetClipboardData(CF_BITMAP);
+		if(!hGlobal){
+			CloseClipboard();
+			return;
+		}
+		IconEdit_PasteChildInfoClipboardData(WndNum,(HBITMAP)hGlobal);
+		CloseClipboard();
+	}
+}
+
+void MainFrame::OnCmdDelete( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		HWND hEdit=::GetWindow(hChild,GW_CHILD);
+		TextEdit_ReplaceUpdateUndoData(WndNum,"",0,1);
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD)
+		SendMessage(MdiInfo[WndNum]->MdiRadInfo->hRad,WM_COMMAND,IDM_RAD_ITEM_DELETE,0);
+}
+
+void MainFrame::OnCmdAllSelect( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+	if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+		HWND hEdit=::GetWindow(hChild,GW_CHILD);
+
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.x=0;
+		MdiInfo[WndNum]->pMdiTextEdit->StartCaretPos.y=0;
+
+		GetCaretPosFromBufferIndex(
+			MdiInfo[WndNum]->pMdiTextEdit->buffer,
+			lstrlen(MdiInfo[WndNum]->pMdiTextEdit->buffer),
+			&MdiInfo[WndNum]->pMdiTextEdit->EndCaretPos);
+
+		::InvalidateRect(hEdit,NULL,0);
+
+		ResetState_EditMenu();
+	}
+	else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD){
+		ActiveBasic::PM::WindowInfo *pWindowInfo = GetWndInfo(MdiInfo[WndNum]->path);
+		for( int i3=0; i3<static_cast<int>(pWindowInfo->childWindowInfos.size()); i3++ )
+		{
+			MdiInfo[WndNum]->MdiRadInfo->SelectingItem[i3] = i3;
+		}
+		DrawRadWindow(WndNum,pWindowInfo);
+	}
+}
+
+void MainFrame::OnCmdFind( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DialogBox(hResInst,MAKEINTRESOURCE(IDD_FIND),m_hWnd,DlgFind);
+}
+
+void MainFrame::OnCmdPermutation( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DialogBox(hResInst,MAKEINTRESOURCE(IDD_PERMUTATION),m_hWnd,DlgPermutation);
+}
+
+void MainFrame::OnCmdConvertX( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	TextEdit_Convert( nID );
+}
+
+#ifdef THETEXT
+void MainFrame::OnCmdStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,DlgStringCount,0);
+}
+
+void MainFrame::OnCmdSelStringCount( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_STRING_COUNT),m_hWnd,DlgStringCount,1);
+}
+#endif
+
+void MainFrame::OnCmdProjectView( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	extern HWND hProjectView;
+	bool isCheck = false;
+	if(pobj_nv->bClipProjectView){
+		if(::IsWindowVisible(hProjectView)){
+			::ShowWindow(hProjectView,SW_HIDE);
+		}
+		else{
+			::ShowWindow(hProjectView,SW_SHOW);
+			isCheck = true;
+		}
+	}
+	else{
+		extern HWND hProjectView_ToolWindow;
+		if(::IsWindowVisible(hProjectView_ToolWindow)){
+			::ShowWindow(hProjectView_ToolWindow,SW_HIDE);
+		}
+		else{
+			::ShowWindow(hProjectView_ToolWindow,SW_SHOW);
+			::ShowWindow(hProjectView,SW_SHOW);
+			isCheck = true;
+		}
+	}
+	pobj_MainMenu->CheckMenu(IDM_PROJECTVIEW,isCheck);
+
+	//再配置
+	this->Resized();
+
+	::ShowWindow(hClient,SW_SHOW);
+}
+
+void MainFrame::OnCmdProjectOption( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DlgProjectOptionSetting( m_hWnd );
+}
+
+void MainFrame::OnCmdTopMost( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	if(pobj_MainMenu->IsCheck(IDM_TOPMOST)){
+		SetWindowPos( HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
+		pobj_MainMenu->CheckMenu(IDM_TOPMOST,0);
+	}
+	else{
+		SetWindowPos( HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
+		pobj_MainMenu->CheckMenu(IDM_TOPMOST,1);
+	}
+}
+
+void ResetState_ViewMenu(void);
+void MainFrame::OnCmdRightTurn( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_nv->bRightTurn^=1;
+	ResetState_ViewMenu();
+
+	//トップのウィンドウを再描画
+	RedrawAllWindow();
+}
+
+void MainFrame::OnCmdSet( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DlgOptionSetting( m_hWnd );
+}
+
+#ifndef THETEXT
+void MainFrame::OnCmdDebug( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024], temp2[1024], temp3[1024];
+	if(pobj_Debugger->IsDebugging()){
+		pobj_Debugger->DebugContinue();
+		return;
+	}
+
+	HWND hChild = ::GetWindow(hClient,GW_CHILD);
+	if( projectInfo.IsOpened() ){
+		//プロジェクトが開かれている場合
+		if(!SetProjectToRun()) return;
+
+		//デバッグ用のコマンドライン及び実行可能ファイル（DLLのみ）
+		sprintf(temporary,"%s\r\n%s",projectInfo.szExePath,projectInfo.szCmdLine);
+		sprintf(temp2,"%s\\pgm.tmp",ActiveBasic::Common::Environment::GetUserAppDir().c_str());
+		{
+			ATL::CHandle hFile(CreateFile(temp2,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_TEMPORARY,NULL));
+			if(hFile==INVALID_HANDLE_VALUE){
+				hFile.Detach();
+				MessageBox(TEXT("デバッグ用ファイルを開けませんでした。"));
+				return;
+			}
+			DWORD dwAccessBytes;
+			WriteFile(hFile,temporary,lstrlen(temporary),&dwAccessBytes,NULL);
+		}
+
+		//ソースファイル名をtemp2へ
+		lstrcpy( temp2, projectInfo.fileSystem.root.files[0].GetFullPath().c_str() );
+
+		//出力ファイル名をtemp3へ
+		lstrcpy(temp3,projectInfo.lpszOutput_Debug);
+		lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
+
+		if(IsNeedCompileForProject(1))
+			sprintf(temporary,"\"%s\" \"%s\" /debug /run /wnd:%p",temp2,temp3,m_hWnd);
+		else
+			sprintf(temporary,"\"%s\" \"%s\" /run /wnd:%p",temp2,temp3,m_hWnd);
+
+		// DLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			lstrcat(temporary," /dll");
+		}
+
+		// SLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
+		{
+			lstrcat(temporary," /static_library");
+		}
+
+		//Unicodeオプション
+		if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
+
+		//ブレークポイントをセーブ
+		projectInfo.pobj_DBBreakPoint->SaveToTempFile();
+	}
+	else{
+		//単独ソースコード
+		if(!SetRunning(hChild)) return;
+		if(IsNeedCompile(MdiInfo[GetWndNum(hChild)]->path,1))
+			sprintf(temporary,"\"%s\" /debug /run /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
+		else
+			sprintf(temporary,"\"%s\" /run /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
+
+		//ブレークポイントをセーブ
+		extern CDBBreakPoint *pobj_DBBreakPoint;
+		pobj_DBBreakPoint->SaveToTempFile();
+	}
+
+	//コンパイルビューをクリップするかどうか
+	extern BOOL bClipCompileView;
+	if(bClipCompileView){
+		lstrcat(temporary," /clip_compile_view");
+
+		//コンパイラビューを閉じる
+		extern HWND hCompileView;
+		if(hCompileView==(HWND)-1) return;
+		if(hCompileView){
+			hChild=hCompileView;
+			hCompileView=(HWND)-1;
+			SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
+		}
+
+		//重複起動防止のため
+		hCompileView=(HWND)-1;
+	}
+
+	//インクルードディレクトリ
+	sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
+	lstrcat(temporary,temp2);
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary, false );
+}
+
+void MainFrame::OnCmdDebugCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024], temp2[1024], temp3[1024];
+
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if( projectInfo.IsOpened() ){
+		//プロジェクトが開かれている場合
+		if(!SetProjectToRun()) return;
+
+		//ソースファイル名をtemp2へ
+		lstrcpy( temp2, projectInfo.fileSystem.root.files[0].GetFullPath().c_str() );
+
+		//出力ファイル名をtemp3へ
+		lstrcpy(temp3,projectInfo.lpszOutput_Debug);
+		lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
+
+		sprintf(temporary,"\"%s\" \"%s\" /debug /wnd:%p",temp2,temp3,m_hWnd);
+
+		//DLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			lstrcat(temporary," /dll");
+		}
+
+		// SLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
+		{
+			lstrcat(temporary," /static_library");
+		}
+
+		//Unicodeオプション
+		if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
+	}
+	else{
+		//単独ソースコード
+		if(!SetRunning(hChild)) return;
+		sprintf(temporary,"\"%s\" /debug /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
+	}
+
+	//コンパイルビューをクリップするかどうか
+	extern BOOL bClipCompileView;
+	if(bClipCompileView){
+		lstrcat(temporary," /clip_compile_view");
+
+		//コンパイラビューを閉じる
+		extern HWND hCompileView;
+		if(hCompileView==(HWND)-1) return;
+		if(hCompileView){
+			hChild=hCompileView;
+			hCompileView=(HWND)-1;
+			if( ::IsWindow( hChild ) )
+			{
+				SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
+			}
+		}
+
+		//重複起動防止のため
+		hCompileView=(HWND)-1;	
+	}
+
+	//インクルードディレクトリ
+	sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
+	lstrcat(temporary,temp2);
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary, false );
+}
+
+void MainFrame::OnCmdAttach( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024], temp2[1024];
+
+	int idProcess;
+	DWORD dwPlatform;
+	idProcess=DialogBoxParam(hResInst,MAKEINTRESOURCE(IDD_ATTACH),m_hWnd,DlgAttach,(LPARAM)&dwPlatform);
+	if(idProcess==0) return;
+
+	sprintf(temporary,"/attach:%08x /wnd:%p",idProcess,m_hWnd);
+
+	//コンパイルビューをクリップするかどうか
+	extern BOOL bClipCompileView;
+	if(bClipCompileView){
+		lstrcat(temporary," /clip_compile_view");
+
+		//コンパイラビューを閉じる
+		extern HWND hCompileView;
+		if(hCompileView==(HWND)-1) return;
+		if(hCompileView){
+			HWND hChild=hCompileView;
+			hCompileView=(HWND)-1;
+			SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
+		}
+
+		//重複起動防止のため
+		hCompileView=(HWND)-1;
+	}
+
+	//インクルードディレクトリ
+	sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
+	lstrcat(temporary,temp2);
+
+	ActiveBasic::Common::Platform::EnumType platform;
+	if(dwPlatform==IMAGE_FILE_MACHINE_I386)
+	{
+		platform = ActiveBasic::Common::Platform::X86;
+	}
+	else if(dwPlatform==IMAGE_FILE_MACHINE_AMD64)
+	{
+		platform = ActiveBasic::Common::Platform::X64;
+	}
+	else
+	{
+		throw;
+	}
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( platform ), temporary, false );
+}
+
+void MainFrame::OnCmdReleaseCompile( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024], temp2[1024], temp3[1024];
+
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if( projectInfo.IsOpened() ){
+		//プロジェクトが開かれている場合
+		if(!SetProjectToRun()) return;
+
+		//ソースファイル名をtemp2へ
+		lstrcpy( temp2, projectInfo.fileSystem.root.files[0].GetFullPath().c_str() );
+
+		//出力ファイル名をtemp3へ
+		lstrcpy(temp3,projectInfo.lpszOutput_Release);
+		lstrcpy( temp3, projectInfo.GetWorkDir().GetFullPath( temp3 ).c_str() );
+
+		sprintf(temporary,"\"%s\" \"%s\" /wnd:%p",temp2,temp3,m_hWnd);
+
+		//DLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			lstrcat(temporary," /dll");
+		}
+
+		// SLLオプション
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Sll )
+		{
+			lstrcat(temporary," /static_library");
+		}
+
+		//Unicodeオプション
+		if(projectInfo.dwOption & PJ_OP_UNICODE) lstrcat(temporary," /unicode");
+	}
+	else{
+		//単独ソースコード
+		if(!SetRunning(hChild)) return;
+		sprintf(temporary,"\"%s\" /wnd:%p",MdiInfo[GetWndNum(hChild)]->path.c_str(),m_hWnd);
+	}
+
+	//コンパイルビューをクリップするかどうか
+	extern BOOL bClipCompileView;
+	if(bClipCompileView){
+		lstrcat(temporary," /clip_compile_view");
+
+		//コンパイラビューを閉じる
+		extern HWND hCompileView;
+		if(hCompileView==(HWND)-1) return;
+		if(hCompileView){
+			hChild=hCompileView;
+			hCompileView=(HWND)-1;
+			if( ::IsWindow( hChild ) )
+			{
+				SendMessage(hChild,WM_COMMAND,IDCANCEL,0);
+			}
+		}
+
+		//重複起動防止のため
+		hCompileView=(HWND)-1;
+	}
+
+	//インクルードディレクトリ
+	sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
+	lstrcat(temporary,temp2);
+
+	extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
+	CreateProcessWithStdHandle( ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ), temporary, false );
+}
+
+void MainFrame::OnCmdReleaseRun( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024], temp2[1024], temp3[1024];
+
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	if( projectInfo.IsOpened() ){
+/*						//プロジェクトが開かれている場合
+		if(!SetProjectToRun()) return;
+
+		//必要であればリリースコンパイル
+		if(IsNeedCompileForProject(0))
+			SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
+
+		if( projectInfo.GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			lstrcpy(temporary,projectInfo.szExePath);
+		}
+		else{
+			lstrcpy(temporary,projectInfo.lpszOutput_Debug);
+			lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
+		}
+	}
+	else{
+/*						//必要であればリリースコンパイル
+		if(!SetRunning(hChild)) return;
+
+		if(IsNeedCompile(MdiInfo[GetWndNum(hChild)]->path,0))
+			SendMessage(WM_COMMAND,IDM_RELEASECOMPILE,0);*/
+
+		//単独ソースコード
+		_splitpath(MdiInfo[GetWndNum(hChild)]->path.c_str(),temporary,temp2,temp3,NULL);
+		lstrcat(temporary,temp2);
+		lstrcat(temporary,temp3);
+		lstrcat(temporary,".exe");
+	}
+
+	//インクルードディレクトリ
+	sprintf(temp2," /include_dir:\"%s\"",pobj_nv->GetIncludeDirFullPath().c_str());
+	lstrcat(temporary,temp2);
+
+	ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
+}
+
+void MainFrame::OnCmdStepIn( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Debugger->StepIn();
+}
+
+void MainFrame::OnCmdStepOver( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Debugger->StepOver();
+}
+
+void MainFrame::OnCmdStepCursor( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Debugger->StepToCursor();
+}
+
+void MainFrame::OnCmdBreakPoint( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	if( projectInfo.IsOpened() ){
+		projectInfo.pobj_DBBreakPoint->Event_BreakPoint();
+	}
+	else{
+		extern CDBBreakPoint *pobj_DBBreakPoint;
+		pobj_DBBreakPoint->Event_BreakPoint();
+	}
+}
+
+void MainFrame::OnCmdDebugStop( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Debugger->DebugStop();
+}
+
+void MainFrame::OnCmdDebugPause( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Debugger->DebugPause();
+}
+
+#endif	// not THETEXT
+
+void MainFrame::OnCmdWebLink( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	switch( nID )
+	{
+#ifndef THETEXT
+	case IDM_COMMUNITY:
+		OpenWebBrowser( "http://www.activebasic.com/forum/" );
+		break;
+	case IDM_COMMU_SEARCH:
+		OpenWebBrowser( "http://www.activebasic.com/forum/search.php" );
+		break;
+	case IDM_COMMU_PM:
+		OpenWebBrowser( "http://www.activebasic.com/forum/privmsg.php?folder=inbox" );
+		break;
+	case ID_COMMU_FORUM1:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=1" );
+		break;
+	case ID_COMMU_FORUM2:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=2" );
+		break;
+	case ID_COMMU_FORUM3:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=5" );
+		break;
+	case ID_COMMU_FORUM4:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=3" );
+		break;
+	case ID_COMMU_FORUM5:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=6" );
+		break;
+	case ID_COMMU_FORUM6:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=8" );
+		break;
+	case ID_COMMU_FORUM7:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=4" );
+		break;
+	case ID_COMMU_FORUM8:
+		OpenWebBrowser( "http://www.activebasic.com/forum/viewforum.php?f=7" );
+		break;
+	case IDM_AB_WEBSITE:
+		OpenWebBrowser( "http://www.activebasic.com/" );
+		break;
+	case IDM_ACTBDL:
+		OpenWebBrowser( "http://www.activebasic.com/activebasic5/download.htm" );
+		break;
+#else
+	case IDM_DSHOMEPAGE:
+		OpenWebBrowser( "http://www.discoversoft.net/" );
+		break;
+#endif // not THETEXT
+	default:
+		throw;
+	}
+}
+
+void MainFrame::OnCmdTopics( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	char temporary[1024];
+#ifdef THETEXT
+	sprintf(temporary,"%sTopics\\index.html",pj_editor_Dir);
+	ShellExecute(m_hWnd,"open",temporary,NULL,NULL,SW_SHOWNORMAL);
+#else
+	sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
+	HtmlHelp(NULL,temporary,HH_DISPLAY_TOPIC,0);
+#endif
+}
+
+void MainFrame::OnCmdAbout( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	DialogBox(hResInst,MAKEINTRESOURCE(IDD_ABOUT),m_hWnd,DialogAbout);
+}
+
+void MainFrame::OnCmdDocSelectBand( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Rebar->ChangeRebarBand(ID_DOCCOMBO);
+}
+
+void MainFrame::OnCmdStandardBand( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Rebar->ChangeRebarBand(ID_STANDARDTOOLBAR);
+}
+
+void MainFrame::OnCmdReleaseBand( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Rebar->ChangeRebarBand(ID_RELEASETOOLBAR);
+}
+
+void MainFrame::OnCmdDebugBand( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Rebar->ChangeRebarBand(ID_DEBUGGERTOOLBAR);
+}
+
+void MainFrame::OnCmdSelectCompilerBand( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	pobj_Rebar->ChangeRebarBand(ID_SELECTCOMPILERCOMBO);
+}
+
+void MainFrame::OnCmdNoGripper( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	if(pobj_nv->bNoGripper) pobj_nv->bNoGripper=0;
+	else pobj_nv->bNoGripper=1;
+
+	//レバーコントロールを再生成
+	pobj_Rebar->ResetRebar();
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+}
+
+void MainFrame::OnCmdResetRebar( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//"ツールバーの配置をすべて初期状態に戻します。\nよろしいですか？"
+	if( MessageBox(STRING_TOOLBAR_RESET,APPLICATION_NAME,MB_OKCANCEL|MB_ICONEXCLAMATION) == IDCANCEL )
+	{
+		return;
+	}
+
+	//レバーコントロールを再生成
+	pobj_Rebar->ResetInitRebar();
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+}
+
+void MainFrame::OnCmdAllCloseOmitMyself( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	//このウィンドウ以外をすべて閉じる(&A)
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	foreach ( MDIINFO *mi, MdiInfo ){
+		if ( mi->hwnd == hChild ){
+			continue;
+		}
+		if(mi->hwnd){
+			::PostMessage( mi->hwnd, WM_CLOSE, 0, 0 );
+			//foreachの最中に削除されるとイテレータが回らないのでSendを使っていない。
+		}
+	}
+}
+
+void MainFrame::OnCmdPathCopy( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+
+	//絶対パスをコピー
+	HGLOBAL hGlobal=(char *)GlobalAlloc(GMEM_MOVEABLE,MdiInfo[WndNum]->path.size()+1);
+	char *pTemp=(char *)GlobalLock(hGlobal);
+	lstrcpy(pTemp,MdiInfo[WndNum]->path.c_str());
+	GlobalUnlock(hGlobal);
+
+	//クリップボードに保存
+	OpenClipboard();
+	EmptyClipboard();
+	SetClipboardData(CF_TEXT,hGlobal);
+	CloseClipboard();
+}
+
+void MainFrame::OnCmdFolderOpen( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+
+	OpenExplorer( MdiInfo[WndNum]->path );
+}
+
+void MainFrame::OnCmdDeleteFile( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	HWND hChild=::GetWindow(hClient,GW_CHILD);
+	int WndNum=GetWndNum(hChild);
+
+	char temporary[1024], temp2[1024];
+	_splitpath(MdiInfo[WndNum]->path.c_str(),NULL,NULL,temporary,temp2);
+	lstrcat(temporary,temp2);
+
+	lstrcat(temporary," をごみ箱に移動して閉じます。よろしいですか？");
+	if(MessageBox(temporary,APPLICATION_NAME,MB_OKCANCEL|MB_ICONQUESTION)==IDCANCEL) return;
+
+	//ゴミ箱へ
+	SHFILEOPSTRUCT fo;
+	fo.hwnd=m_hWnd;
+	fo.wFunc=FO_DELETE;
+	fo.pFrom =MdiInfo[WndNum]->path.c_str();
+	fo.pTo="\0";
+	fo.fFlags =FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
+	SHFileOperation(&fo);
+
+	//閉じる
+	MdiInfo[WndNum]->pMdiTextEdit->UnModify();
+	SendMessage(MdiInfo[WndNum]->hwnd,WM_CLOSE,0,0);
+}
+
+void MainFrame::OnCmdColor( UINT uNotifyCode, int nID, CWindow wndCtl )
+{
+	static COLORREF colorUser=RGB(255,255,255);
+
+	switch( nID )
+	{
+	case IDM_USER_COLOR:
+		{
+			CHOOSECOLOR cc;
+			COLORREF CusColors[16]={
+				RGB(255,255,255),
+				RGB(0,0,0),
+				RGB(128,128,128),
+				RGB(192,192,192),
+				RGB(128,0,0),
+				RGB(255,0,0),
+				RGB(128,128,0),
+				RGB(255,255,0),
+				RGB(0,128,0),
+				RGB(0,255,0),
+				RGB(0,128,128),
+				RGB(0,255,255),
+				RGB(0,0,128),
+				RGB(0,0,255),
+				RGB(128,0,128),
+				RGB(255,0,255)};
+			cc.lStructSize=sizeof(CHOOSECOLOR);
+			cc.hwndOwner=m_hWnd;
+			cc.rgbResult=colorUser;
+			cc.lpCustColors=CusColors;
+			cc.Flags=CC_RGBINIT|CC_FULLOPEN;
+			if(!ChooseColor(&cc)){
+				return;
+			}
+			colorUser=cc.rgbResult;
+		}
+	case IDM_GRAY:
+	case IDM_WHITE:
+	case IDM_RED:
+	case IDM_GREEN:
+	case IDM_BLUE:
+	case IDM_YELLOW:
+		{
+			HWND hChild=::GetWindow(hClient,GW_CHILD);
+
+			TC_ITEM tcItem;
+			tcItem.mask=TCIF_PARAM;
+			if(nID==IDM_GRAY)	tcItem.lParam=TABCOLOR_GRAY;
+			if(nID==IDM_WHITE)	tcItem.lParam=TABCOLOR_WHITE;
+			if(nID==IDM_RED)		tcItem.lParam=TABCOLOR_RED;
+			if(nID==IDM_GREEN)	tcItem.lParam=TABCOLOR_GREEN;
+			if(nID==IDM_BLUE)	tcItem.lParam=TABCOLOR_BLUE;
+			if(nID==IDM_YELLOW)	tcItem.lParam=TABCOLOR_YELLOW;
+			if(nID==IDM_USER_COLOR) tcItem.lParam=colorUser;
+			TabCtrl_SetItem(pobj_MainTab->hTab,
+				TabCtrl_GetCurSel(pobj_MainTab->hTab),
+				&tcItem);
+			::InvalidateRect(pobj_MainTab->hTab,NULL,0);
+			break;
+		}
+	default:
+		throw;
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/Program.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/Program.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/Program.cpp	(revision 774)
@@ -0,0 +1,52 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::IDE;
+using namespace ActiveBasic::IDE::WindowComponents;
+
+CAppModule Program::_Module;
+
+MainFrame ActiveBasic::IDE::Program::mainFrame;
+WindowComponents::CodeEditor::Languages ActiveBasic::IDE::Program::languages;
+const WindowComponents::CodeEditor::Language *ActiveBasic::IDE::Program::ablang;
+
+#include "../Common.h"
+extern CNonVolatile *pobj_nv;
+
+void Program::InitializeWindow()
+{
+	// メインフレームを作成
+	mainFrame.Create(
+		0,
+		pobj_nv->StartupWindowRect,
+		APPLICATION_NAME,
+		WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE | (pobj_nv->bWindowMax?WS_MAXIMIZE:NULL),
+		WS_EX_ACCEPTFILES
+	);
+
+	mainFrame.SetMenu( pobj_MainMenu->hMenu );
+}
+
+const std::string Program::GetIdeUserAppDir()
+{
+	return ActiveBasic::Common::Environment::GetUserAppDir() + "\\ide";
+}
+
+void Program::Main(HINSTANCE hinst)
+{
+	_Module.Init( NULL, hinst );
+
+    CMessageLoop loop;
+    _Module.AddMessageLoop( &loop );
+
+	// syntaxを読み込む
+	languages.LoadFiles( ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\ide\\syntax" );
+	ablang = &languages["ab"];
+
+	// ウィンドウを初期化
+	InitializeWindow();
+
+	// メッセージループ
+	//loop.Run();
+
+	//_Module.RemoveMessageLoop();
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/FileManager.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/FileManager.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/FileManager.cpp	(revision 774)
@@ -0,0 +1,135 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::PM::FM;
+
+File::File( const std::string &relationalPath, HTREEITEM hTreeItem )
+	: ItemBase( hTreeItem )
+	, relationalPath( relationalPath )
+{
+}
+
+const std::string File::GetFullPath() const
+{
+	return projectInfo.GetWorkDir().GetFullPath( relationalPath );
+}
+
+bool ActiveBasic::PM::FM::Folder::IsEmpty() const
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( !folder.IsEmpty() )
+		{
+			return false;
+		}
+	}
+
+	return files.empty();
+}
+
+void ActiveBasic::PM::FM::Folder::Clear()
+{
+	files.clear();
+	folders.clear();
+}
+
+File &ActiveBasic::PM::FM::Folder::FindFile( HTREEITEM hTreeItem )
+{
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( folder.IsExistFile( hTreeItem ) )
+		{
+			return folder.FindFile( hTreeItem );
+		}
+	}
+
+	BOOST_FOREACH( File &file, files )
+	{
+		if( file.GetTreeItemHandle() == hTreeItem )
+		{
+			return file;
+		}
+	}
+	throw;
+}
+
+File &ActiveBasic::PM::FM::Folder::FindFile( const std::string &path )
+{
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( folder.IsExistFile( path ) )
+		{
+			return folder.FindFile( path );
+		}
+	}
+
+	BOOST_FOREACH( File &file, files )
+	{
+		if( file.GetRelationalPath() == path || file.GetFullPath() == path )
+		{
+			return file;
+		}
+	}
+	throw;
+}
+
+bool ActiveBasic::PM::FM::Folder::IsExistFile( const std::string &path ) const
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( folder.IsExistFile( path ) )
+		{
+			return true;
+		}
+	}
+
+	BOOST_FOREACH( const File &file, files )
+	{
+		if( file.GetRelationalPath() == path || file.GetFullPath() == path )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+bool ActiveBasic::PM::FM::Folder::IsExistFile( HTREEITEM hTreeItem ) const
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( folder.IsExistFile( hTreeItem ) )
+		{
+			return true;
+		}
+	}
+
+	BOOST_FOREACH( const File &file, files )
+	{
+		if( file.GetTreeItemHandle() == hTreeItem )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void ActiveBasic::PM::FM::Folder::Remove( HTREEITEM hTreeItem )
+{
+	BOOST_FOREACH( ActiveBasic::PM::FM::Folder &folder, folders )
+	{
+		if( folder.IsExistFile( hTreeItem ) )
+		{
+			folder.Remove( hTreeItem );
+			return;
+		}
+	}
+
+	for( int i=0; i<static_cast<int>(files.size()); i++ )
+	{
+		if( files[i].GetTreeItemHandle() == hTreeItem )
+		{
+			Jenga::Common::EraseVectorItem<Files>( files, i );
+			return;
+		}
+	}
+	throw;
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/ProjectManager.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/ProjectManager.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/ProjectManager/ProjectManager.cpp	(revision 774)
@@ -0,0 +1,662 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::PM;
+
+void OpenWorkfile( const std::string &path );
+
+void Project::Load( char const *path )
+{
+	extern HANDLE hHeap;
+	int i,i2;
+	char *buffer,temporary[MAX_PATH],temp2[MAX_PATH];
+
+	//既にプロジェクトが開かれている場合は閉じる
+	if( this->IsOpened() ){
+		if(!this->Close()) return;
+	}
+	//memset(&projectInfo,0,sizeof(PROJECTINFO));
+
+	//プロジェクトの作業ディレクトリを取得
+	_splitpath(path,temporary,temp2,0,0);
+	lstrcat( temporary, temp2 );
+	this->workDir = Jenga::Common::Directory( temporary );
+
+	//ファイルを開く、保存の初期ディレクトリをセット
+	lstrcpy(pobj_nv->DefSaveDir,this->GetWorkDir().GetPath().c_str());
+
+
+
+	//////////////////////////////////////////
+	//プロジェクトファイル（*.pj）をオープン
+	buffer=ReadBuffer(path);
+	if(!buffer) return;
+
+	//解析
+	this->fileSystem.root.Clear();
+	bool isUseWindow = false;
+	for(i=0;;i++){
+		if(buffer[i]=='\0') break;
+		if(buffer[i]=='\r'&&buffer[i+1]=='\n'&&buffer[i+2]=='#'){
+			for(i+=3,i2=0;;i++,i2++){
+				if(!IsVariableChar(buffer[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=buffer[i];
+			}
+			if(lstrcmpi(temporary,"VERSION")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				this->dwVersion=GetValue(temporary);
+			}
+			else if(lstrcmpi(temporary,"MODULETYPE")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				this->moduleType = (ActiveBasic::Common::TargetModuleType::EnumType)atoi(temporary);
+			}
+			else if(lstrcmpi(temporary,"NAME")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				this->name = temporary;
+			}
+			else if(lstrcmpi(temporary,"PLATFORM")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				i2=atoi(temporary);
+				extern HWND hSelectCompilerCombo;
+				if(i2==32){
+					//プラットフォームにWin32を選択
+					SendMessage(hSelectCompilerCombo,CB_SETCURSEL,0,0);
+				}
+				else if(i2==64){
+					//プラットフォームにWin64を選択
+					SendMessage(hSelectCompilerCombo,CB_SETCURSEL,1,0);
+				}
+				SendMessage(hSelectCompilerCombo,WM_COMMAND,MAKELONG(0,CBN_SELCHANGE),0);
+			}
+			else if(lstrcmpi(temporary,"USEWINDOW")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				if( atoi(temporary) > 0 )
+				{
+					isUseWindow = true;
+				}
+			}
+			else if(lstrcmpi(temporary,"OPTION")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				this->dwOption=GetValue(temporary);
+			}
+			else if(lstrcmpi(temporary,"OUTPUT_RELEASE")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				lstrcpy(this->lpszOutput_Release,temporary);
+			}
+			else if(lstrcmpi(temporary,"OUTPUT_DEBUG")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				lstrcpy(this->lpszOutput_Debug,temporary);
+			}
+			else if(lstrcmpi(temporary,"MANIFEST")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				lstrcpy(this->szManifestPath,temporary);
+			}
+			else if(lstrcmpi(temporary,"DEBUG_CMD_LINE")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				lstrcpy(this->szCmdLine,temporary);
+			}
+			else if(lstrcmpi(temporary,"DEBUG_EXE_PATH")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+				lstrcpy(this->szExePath,temporary);
+			}
+			else if(lstrcmpi(temporary,"RESOURCE")==0&&buffer[i]=='='){
+				for(i++,i2=0;;i++,i2++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						temporary[i2]=0;
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+					temporary[i2]=buffer[i];
+				}
+
+				// このパラメータは使用しなくなった
+			}
+			else if(lstrcmpi(temporary,"SOURCE")==0&&buffer[i]=='\r'&&buffer[i+1]=='\n'){
+				while(1){
+					for(i+=2,i2=0;;i++,i2++){
+						if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+							temporary[i2]=0;
+							break;
+						}
+						temporary[i2]=buffer[i];
+					}
+					if(temporary[0]=='\0') break;
+					this->fileSystem.root.files.push_back( ActiveBasic::PM::FM::File( temporary, 0 ) );
+
+					if(buffer[i]=='\0') break;
+				}
+			}
+			else{
+				//不明なパラメータは無視
+				for(i++;;i++){
+					if((buffer[i]=='\r'&&buffer[i+1]=='\n')||buffer[i]=='\0'){
+						if(buffer[i]=='\r'&&buffer[i+1]=='\n') i-=2;
+						break;
+					}
+				}
+			}
+			if(buffer[i]=='\0') break;
+		}
+	}
+	HeapDefaultFree(buffer);
+
+	//古いバージョンファイルを考慮
+	if(this->dwVersion<=4){
+		if( this->GetModuleType() == ActiveBasic::Common::TargetModuleType::Dll )
+		{
+			sprintf(this->lpszOutput_Release,".\\%s.dll",this->GetName().c_str());
+		}
+		else
+		{
+			sprintf(this->lpszOutput_Release,".\\%s.exe",this->GetName().c_str());
+		}
+		sprintf(this->lpszOutput_Debug,".\\%s_debug.exe",this->GetName().c_str());
+	}
+
+	// リソースを読み込む
+	Jenga::Common::Path resourcePath( this->GetResourceFileFullPath() );
+	if( resourcePath.IsExistFile() )
+	{
+		this->resourceManager.Load( this->GetResourceFileFullPath() );
+	}
+
+	//ブレークポイントを初期化
+	this->pobj_DBBreakPoint=new CDBBreakPoint();
+
+
+	if( isUseWindow )
+	{
+		/////////////////////////////////////////////
+		//ウィンドウ定義ファイル（*.wnd）をオープン
+		sprintf(temp2,"%s%s.wnd",this->GetWorkDir().GetPath().c_str(),this->GetName().c_str());
+		if(!OpenWindowFile(temp2)) return;
+	}
+	else{
+		this->windowInfos.Clear();
+
+		this->NumberOfMenu=0;
+		this->pMenuInfo=(MENU_INFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
+	}
+
+	OpenWorkfile( this->GetWorkDir().GetPath() + this->GetName() + ".wrk" );
+
+	this->modify=0;
+	this->ModifyOfMaterial=0;
+	this->ModifuOfResource=0;
+}
+
+void SetStatusText(char *MenuText);
+void MakeSourceListToProjectFile( const ActiveBasic::PM::FM::Folder &folder, char *buffer )
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		MakeSourceListToProjectFile( childFolder, buffer );
+	}
+
+	BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		lstrcat( buffer, file.GetRelationalPath().c_str() );
+		lstrcat( buffer, "\r\n" );
+	}
+}
+void MakeIncludeListToProjectFile( const ActiveBasic::PM::FM::Folder &folder, char *buffer, bool isRoot )
+{
+	BOOST_FOREACH( const ActiveBasic::PM::FM::Folder &childFolder, folder.folders )
+	{
+		MakeIncludeListToProjectFile( childFolder, buffer, false );
+	}
+
+	bool isFirst = true;
+	BOOST_FOREACH( const ActiveBasic::PM::FM::File &file, folder.files )
+	{
+		if( isRoot && isFirst )
+		{
+			// メインファイルは除く
+			isFirst = false;
+			continue;
+		}
+
+		sprintf(buffer+lstrlen(buffer),"#include \"%s\"\r\n",file.GetRelationalPath().c_str());
+		lstrcpy(buffer+lstrlen(buffer),"_ClearNamespaceImported\r\n");
+	}
+}
+void Project::Save()
+{
+	int i2,i3,WndNum;
+	char temporary[MAX_PATH],buffer[32767];
+	HWND hChild;
+
+	SetStatusText( "プロジェクトを保存中..." );
+
+	//プロジェクトファイルのバージョンを設定
+	this->dwVersion=PROJECT_VERSION;
+
+	hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		WndNum=GetWndNum(hChild);
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
+			if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() )
+			{
+				if( this->fileSystem.root.IsExistFile( MdiInfo[WndNum]->path ) )
+				{
+					SaveDocument(hChild,NULL);
+				}
+			}
+		}
+		if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+			if(MdiInfo[WndNum]->MdiIconEditInfo->bModify){
+				BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.iconResources )
+				{
+					lstrcpy(temporary,resourceItem.filepath.c_str());
+					lstrcpy( temporary, this->GetWorkDir().GetFullPath( temporary ).c_str() );
+					if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
+						SaveDocument(hChild,NULL);
+						break;
+					}
+				}
+			}
+		}
+		hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+	}
+
+
+	//////////////////////////////////////
+	//プロジェクトファイル（*.pj）を作成
+	lstrcpy(buffer,"\' ActiveBasic Project file.\r\n\r\n");
+	i2=lstrlen(buffer);
+	sprintf(buffer+i2,"#VERSION=%d\r\n\r\n",this->dwVersion);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#MODULETYPE=%d\r\n\r\n",(int)this->GetModuleType());
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#NAME=%s\r\n\r\n",this->GetName().c_str());
+	i2+=lstrlen(buffer+i2);
+	extern HWND hSelectCompilerCombo;
+	if(SendMessage(hSelectCompilerCombo,CB_GETCURSEL,0,0)==0){
+		sprintf(buffer+i2,"#PLATFORM=32\r\n\r\n",this->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+	}
+	else{
+		sprintf(buffer+i2,"#PLATFORM=64\r\n\r\n",this->GetName().c_str());
+		i2+=lstrlen(buffer+i2);
+	}
+	sprintf(buffer+i2,"#USEWINDOW=%d\r\n\r\n",this->windowInfos.size());
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#OPTION=&H%08x\r\n\r\n",this->dwOption);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#OUTPUT_RELEASE=%s\r\n\r\n",this->lpszOutput_Release);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#OUTPUT_DEBUG=%s\r\n\r\n",this->lpszOutput_Debug);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#MANIFEST=%s\r\n\r\n",this->szManifestPath);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#DEBUG_CMD_LINE=%s\r\n\r\n",this->szCmdLine);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#DEBUG_EXE_PATH=%s\r\n\r\n",this->szExePath);
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#SOURCE\r\n");
+	i2+=lstrlen(buffer+i2);
+	MakeSourceListToProjectFile( this->fileSystem.root, buffer );
+	i2 = lstrlen( buffer );
+
+	//保存
+	sprintf(temporary,"%s%s.pj",this->GetWorkDir().GetPath().c_str(),this->GetName().c_str());
+	WriteBuffer(temporary,buffer,i2);
+
+
+	//////////////////////////////////
+	// リソースファイル（*.rc、resource.ab）を作成
+	{
+		i2=0;
+		i3=101;
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.cursorResources )
+		{
+			sprintf(buffer+i2,"Const %s=%d\r\n",
+				resourceItem.idName.c_str(),
+				i3);
+			i2+=lstrlen(buffer+i2);
+
+			i3++;
+		}
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.bitmapResources )
+		{
+			sprintf(buffer+i2,"Const %s=%d\r\n",
+				resourceItem.idName.c_str(),
+				i3);
+			i2+=lstrlen(buffer+i2);
+
+			i3++;
+		}
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.iconResources )
+		{
+			sprintf(buffer+i2,"Const %s=%d\r\n",
+				resourceItem.idName.c_str(),
+				i3);
+			i2+=lstrlen(buffer+i2);
+
+			i3++;
+		}
+
+		//保存（resource.ab）
+		WriteBuffer(this->GetWorkDir().GetFullPath( "resource.ab" ),buffer,i2);
+
+		i2=0;
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.cursorResources )
+		{
+			sprintf(buffer+i2,"%s CURSOR \"%s\"\r\n",
+				resourceItem.idName.c_str(),
+				resourceItem.filepath.c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.bitmapResources )
+		{
+			sprintf(buffer+i2,"%s BITMAP \"%s\"\r\n",
+				resourceItem.idName.c_str(),
+				resourceItem.filepath.c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+		BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, resourceManager.iconResources )
+		{
+			sprintf(buffer+i2,"%s ICON \"%s\"\r\n",
+				resourceItem.idName.c_str(),
+				resourceItem.filepath.c_str());
+			i2+=lstrlen(buffer+i2);
+		}
+
+		//マニフェスト
+		if(this->dwOption&PJ_OP_RC_MANIFEST){
+			sprintf(buffer+i2,"CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST \"%s\"\r\n",
+				this->szManifestPath);
+			i2+=lstrlen(buffer+i2);
+		}
+
+		//保存
+		WriteBuffer(this->GetResourceFileFullPath(),buffer,i2);
+	}
+
+
+	///////////////////////////////////////
+	//インデックスファイル（*.idx）を作成
+	buffer[0]=0;
+	lstrcpy(buffer,"' インデックス プログラム\r\n");
+	i2=lstrlen(buffer);
+	if(this->dwOption&PJ_OP_SOURCE_MASK){
+		if(this->dwOption&PJ_OP_STRICT){
+			/* #strictディレクティブは今は使われていない
+			lstrcpy(buffer+i2,"\r\n");
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"#strict");
+			i2+=lstrlen(buffer+i2);
+			lstrcpy(buffer+i2,"\r\n");
+			i2+=lstrlen(buffer+i2);
+			*/
+		}
+		lstrcpy(buffer+i2,"\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"'Win32APIの定義ファイル\r\n");
+		i2+=lstrlen(buffer+i2);
+		if(this->dwOption&PJ_OP_MMSYSTEM){
+			lstrcpy(buffer+i2,"#include <api_mmsys.sbp>\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+		if(this->dwOption&PJ_OP_COMMCTRL){
+			lstrcpy(buffer+i2,"#include <api_commctrl.sbp>\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+		if(this->dwOption&PJ_OP_RICHEDIT){
+			lstrcpy(buffer+i2,"#include <api_richedit.sbp>\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+		if(this->dwOption&PJ_OP_WINSOCK){
+			lstrcpy(buffer+i2,"#include <api_winsock2.sbp>\r\n");
+			i2+=lstrlen(buffer+i2);
+		}
+	}
+	if( !this->windowInfos.empty() )
+	{
+		lstrcpy(buffer+i2,"\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ制御プログラム\r\n");
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"#include \"Callback.wbp\"\r\n");
+		i2+=lstrlen(buffer+i2);
+	}
+
+	{
+		lstrcpy(buffer+i2,"\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"'プロジェクト内のプログラム ファイル\r\n");
+		i2+=lstrlen(buffer+i2);
+		MakeIncludeListToProjectFile( this->fileSystem.root, buffer, true );
+		i2 = lstrlen(buffer);
+	}
+	if( !this->windowInfos.empty() )
+	{
+		lstrcpy(buffer+i2,"\r\n");
+		i2+=lstrlen(buffer+i2);
+		lstrcpy(buffer+i2,"'RADツールが生成するウィンドウ生成プログラム\r\n");
+		i2+=lstrlen(buffer+i2);
+		sprintf(buffer+i2,"#include \"MakeWindow.wbp\"\r\n");
+		i2+=lstrlen(buffer+i2);
+	}
+
+	//リソースファイル
+	lstrcpy(buffer+i2,"\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"'リソースファイル\r\n");
+	i2+=lstrlen(buffer+i2);
+	lstrcpy(buffer+i2,"#include \"resource.ab\"\r\n");
+	i2+=lstrlen(buffer+i2);
+	sprintf(buffer+i2,"#resource \"%s.rc\"\r\n",this->GetName().c_str());
+	i2+=lstrlen(buffer+i2);
+
+	//保存
+	sprintf(temporary,"%s%s.idx",this->GetWorkDir().GetPath().c_str(),this->GetName().c_str());
+	WriteBuffer(temporary,buffer,i2);
+
+
+	if( !this->windowInfos.empty() )
+	{
+		/////////////////////////////////////////////////////
+		//ウィンドウ関連ファイル（*.wnd）を作成、保存
+		if(this->ModifyOfMaterial){
+			sprintf(temporary,"%s%s.wnd",this->GetWorkDir().GetPath().c_str(),this->GetName().c_str());
+			SaveWindowFile( temporary, this->windowInfos );
+		}
+
+		//.wbpファイルを生成
+		SaveWindowProgram();
+	}
+
+
+	MakeWorkFile();
+
+	SetStatusText("");
+
+	this->modify=0;
+	this->ModifuOfResource=0;
+}
+
+bool Project::Close()
+{
+	extern HANDLE hHeap;
+	int i,WndNum;
+	HWND hChild,hCloseChild;
+	char temporary[MAX_PATH];
+
+
+	//保存確認
+	i=ProjectModifyCheck(0);
+	if(i==0) return false;
+	else if(i==2) MakeWorkFile();
+
+	//プロジェクトに関するMDIウィンドウをすべて閉じる
+	hChild=GetWindow(hClient,GW_CHILD);
+	while(hChild){
+		hCloseChild=hChild;
+		hChild=GetNextWindow(hChild,GW_HWNDNEXT);
+		WndNum=GetWndNum(hCloseChild);
+		if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType))
+		{
+			if( this->fileSystem.root.IsExistFile( MdiInfo[WndNum]->path ) )
+			{
+				//変更フラグをオフにする
+				MdiInfo[WndNum]->pMdiTextEdit->UnModify();
+
+				SendMessage(hCloseChild,WM_CLOSE,0,0);
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD)
+		{
+			BOOST_FOREACH( const WindowInfo *pWindowInfo, windowInfos )
+			{
+				if( pWindowInfo->GetName() == MdiInfo[WndNum]->path ){
+					SendMessage(hCloseChild,WM_CLOSE,0,0);
+					break;
+				}
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
+			for(i=0;i<this->NumberOfMenu;i++){
+				if( MdiInfo[WndNum]->path == this->pMenuInfo[i].IdName )
+				{
+					SendMessage(hCloseChild,WM_CLOSE,0,0);
+					break;
+				}
+			}
+		}
+		else if(MdiInfo[WndNum]->DocType==WNDTYPE_ICONEDIT){
+			for(i=0;this->resourceManager.iconResources.size();i++){
+				lstrcpy(temporary,this->resourceManager.iconResources[i].filepath.c_str());
+				lstrcpy( temporary, this->GetWorkDir().GetFullPath( temporary ).c_str() );
+				if(lstrcmpi(MdiInfo[WndNum]->path.c_str(),temporary)==0){
+					SendMessage(hCloseChild,WM_CLOSE,0,0);
+					break;
+				}
+			}
+		}
+	}
+
+	//ファイル情報のメモリを解放
+	this->fileSystem.root.Clear();
+
+	//ブレークポイントのオブジェクトを解放
+	delete this->pobj_DBBreakPoint;
+
+	//ウィンドウ情報のメモリを解放
+	BOOST_FOREACH( ActiveBasic::PM::WindowInfo *pWindowInfo, windowInfos )
+	{
+		//子ウィンドウのメモリを解放
+		BOOST_FOREACH( ActiveBasic::PM::ChildWindowInfo *pChildWindowInfo, pWindowInfo->childWindowInfos )
+		{
+			delete pChildWindowInfo;
+		}
+		pWindowInfo->childWindowInfos.clear();
+	}
+	this->windowInfos.Clear();
+
+	//メニュー情報のメモリを解放
+	HeapMenuDataFree(this->pMenuInfo,this->NumberOfMenu,0);
+	HeapDefaultFree(this->pMenuInfo);
+
+	//リソースのメモリを解放
+	this->resourceManager.Clear();
+
+	//プロジェクト ビューを非表示にする
+	extern HWND hProjectView;
+	if(IsWindowVisible(hProjectView)) SendMessage(hOwner,WM_COMMAND,IDM_PROJECTVIEW,0);
+	SetWindowText(hProjectView,"Project View");
+
+	extern HWND hProcedureTreeView;
+	extern HWND hMaterialTreeView;
+	pobj_FileTree->DeleteAllItems();
+	TreeView_DeleteAllItems(hProcedureTreeView);
+	TreeView_DeleteAllItems(hMaterialTreeView);
+
+	//ウィンドウ タイトルを変更
+	SetWindowText(hOwner,APPLICATION_NAME);
+
+	this->name = "";
+
+	//メニュー状態を設定
+	ResetState_DocMenu();
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/WindowAreaManager.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/WindowAreaManager.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/WindowAreaManager.cpp	(revision 774)
@@ -0,0 +1,8 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::IDE;
+
+void WindowAreaManager::AddMdiClientWindow( HWND hMdiClientWnd )
+{
+	windowCollections.push_back( WindowCollection( hMdiClientWnd ) );
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/CodeEditor/Syntax.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/CodeEditor/Syntax.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/CodeEditor/Syntax.cpp	(revision 774)
@@ -0,0 +1,121 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::IDE::WindowComponents::CodeEditor;
+
+void Language::Load( const TiXmlDocument &doc )
+{
+	const TiXmlElement* root = doc.FirstChild( "language" )->ToElement();
+
+	// 言語名を取得
+	this->name = root->FirstChild( "name" )->FirstChild()->Value();
+
+	// Syntaxタグを解析
+	const TiXmlElement* syntaxElement = root->FirstChild( "syntax" )->ToElement();
+	this->syntax.commentSingle = syntaxElement->FirstChild( "commentSingle" )->FirstChild()->Value();
+	this->syntax.commentMultiBegin = syntaxElement->FirstChild( "commentMulti" )->FirstChild( "begin" )->FirstChild()->Value();
+	this->syntax.commentMultiEnd = syntaxElement->FirstChild( "commentMulti" )->FirstChild( "end" )->FirstChild()->Value();
+	{
+		const TiXmlElement* element = syntaxElement->FirstChild( "quoteMarks" )->FirstChild( "item" )->ToElement();
+		while( element )
+		{
+			this->syntax.quoteMarks.push_back( element->FirstChild()->Value() );
+			element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
+		}
+	}
+	{
+		const TiXmlElement* element = syntaxElement->FirstChild( "reservedSimpleKeywords" )->FirstChild( "item" )->ToElement();
+		while( element )
+		{
+			this->syntax.reservedSimpleKeywords.push_back( element->FirstChild()->Value() );
+			element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
+		}
+	}
+	{
+		const TiXmlElement* element = syntaxElement->FirstChild( "reservedKeywordsWithQuickHelp" )->FirstChild( "item" )->ToElement();
+		while( element )
+		{
+			ReservedKeywordWithQuickHelp temp;
+			temp.keyword = element->FirstChild( "keyword" )->FirstChild()->Value();
+			temp.quickHelp = element->FirstChild( "quickHelp" )->FirstChild()->Value();
+			this->syntax.reservedKeywordsWithQuickHelp.push_back( temp );
+			element = element->NextSibling() ? element->NextSibling()->ToElement() : NULL;
+		}
+	}
+}
+
+bool Language::IsExistKeyword( const std::string &keyword ) const
+{
+	if( Jenga::Common::IsExistString( this->syntax.reservedSimpleKeywords, keyword )
+		|| this->IsExistReservedKeywordWithQuickHelp( keyword ) )
+	{
+		return true;
+	}
+
+	return false;
+}
+
+bool Language::IsExistReservedKeywordWithQuickHelp( const std::string &keyword ) const
+{
+	BOOST_FOREACH( const ReservedKeywordWithQuickHelp &item, syntax.reservedKeywordsWithQuickHelp )
+	{
+		if( item.keyword == keyword )
+		{
+			return true;
+		}
+	}
+
+	return false;
+}
+
+const std::string &Language::GetReservedKeywordWithQuickHelp( const std::string &keyword ) const
+{
+	BOOST_FOREACH( const ReservedKeywordWithQuickHelp &item, syntax.reservedKeywordsWithQuickHelp )
+	{
+		if( item.keyword == keyword )
+		{
+			return item.quickHelp;
+		}
+	}
+
+	throw;
+}
+
+bool Language::IsQuoteMark( char c ) const
+{
+	BOOST_FOREACH( const std::string &quoteMark, syntax.quoteMarks )
+	{
+		if( quoteMark.size() == 1 && c == quoteMark[0] )
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void Languages::Add( const std::string &xmlPath )
+{
+	Language language;
+	try
+	{
+		TiXmlDocument doc( xmlPath );
+		doc.LoadFile();
+
+		language.Load( doc );
+
+		(*this)[language.GetName()] = language;
+	}
+	catch( ... )
+	{
+	}
+}
+
+void Languages::LoadFiles( const std::string &dirPath )
+{
+	Jenga::Common::Strings results;
+	Jenga::Common::Directory dir( dirPath );
+	dir.SearchFiles( results, "*.xml" );
+	BOOST_FOREACH( const std::string &xmlPath, results )
+	{
+		this->Add( xmlPath );
+	}
+}
Index: branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/PartialManager/TextEditPartialManager.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/PartialManager/TextEditPartialManager.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/src/WindowComponents/PartialManager/TextEditPartialManager.cpp	(revision 774)
@@ -0,0 +1,22 @@
+#include "stdafx.h"
+
+using namespace ActiveBasic::IDE;
+/*
+bool TextEditPartialManager::CanUndo() const
+{
+}
+bool TextEditPartialManager::CanRedo() const
+{
+}
+
+void TextEditPartialManager::Undo()
+{
+}
+void TextEditPartialManager::Redo()
+{
+}
+
+void TextEditPartialManager::NoticeChangeset()
+{
+}
+*/
Index: branches/egtra/ab5.0/abdev/abdev/stdafx.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/stdafx.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/stdafx.cpp	(revision 774)
@@ -0,0 +1,1 @@
+#include "stdafx.h"
Index: branches/egtra/ab5.0/abdev/abdev/stdafx.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/stdafx.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/abdev/stdafx.h	(revision 774)
@@ -0,0 +1,70 @@
+#pragma once
+#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+
+#include <windows.h>
+#include <windowsx.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <process.h>
+#include <fcntl.h>
+#include <io.h>
+#include <assert.h>
+
+#include <atlbase.h>
+#include <atlstr.h>
+#include <atlcom.h>
+#include <atlhost.h>
+#include <atlapp.h>
+#include <atlframe.h>
+#include <atlcrack.h>
+#include <atlmisc.h>
+#include <atlctrls.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+#include <boost/thread/thread.hpp>
+
+// tinyxml
+#include <tinyxml/tinyxml.h>
+
+#include <jenga/include/jenga.h>
+
+#include <abdev/ab_common/include/ab_common.h>
+
+#ifdef THETEXT
+#include "../res_TheText/resource.h"
+#else
+#include "../res/resource.h"
+#endif
+
+#include <WindowComponents/CodeEditor/Syntax.h>
+#include <WindowComponents/BaseWindow.h>
+#include <WindowComponents/MdiChild.h>
+#include <WindowComponents/MdiWindow.h>
+#include <WindowComponents/DockingWindow.h>
+#include <WindowComponents/TextView.h>
+#include <WindowCollection.h>
+#include <WindowAreaManager.h>
+#include <MainFrame.h>
+#include <Program.h>
+#include <ProjectManager/WindowManager.h>
+#include <ProjectManager/FileManager.h>
+
+#include "Common.h"
+
+#include <ProjectManager/ProjectManager.h>
+
Index: branches/egtra/ab5.0/abdev/compiler_x64/CLockParameter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/CLockParameter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/CLockParameter.cpp	(revision 774)
@@ -0,0 +1,17 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+CDBLockParms::CDBLockParms(){
+}
+CDBLockParms::~CDBLockParms(){
+}
+void CDBLockParms::lock(int level){
+	array_LevelCount[level]++;
+}
+void CDBLockParms::unlock(int level){
+	array_LevelCount[level]--;
+}
+
+CDBLockParms obj_DBLockParms;
Index: branches/egtra/ab5.0/abdev/compiler_x64/CParameter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/CParameter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/CParameter.cpp	(revision 774)
@@ -0,0 +1,512 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+int ParamImpl::NewTempParameters( const std::string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	///////////////////////////////////////////////////////
+	// 一時オブジェクトをあらかじめスタックに積んでおく
+	///////////////////////////////////////////////////////
+
+	int stackItemNum = 0;
+
+	useTempObject = false;
+
+	BOOL bEllipse;
+	if(params.size()){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
+		else bEllipse=0;
+	}
+	else bEllipse=0;
+
+	for(int i2=ParmsNum-1;i2>=0;i2--){
+		useTempParameters[i2] = false;
+
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
+				//オブジェクトメンバの第一パラメータのThisポインタ
+				continue;
+			}
+		}
+		if( i2==0||i2==1 ){
+			if( params[i2]->GetVarName() == procName ){
+				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+				continue;
+			}
+		}
+
+		Type dummyType;
+		BOOL bByVal;
+		if(bEllipse){
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
+			bByVal=1;
+		}
+		else{
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
+		}
+
+
+		if( !bByVal ){
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+				continue;
+			}
+
+			if( !GetVarType( Parms[i2], Type(), FALSE ) ){
+				//変数ではないとき
+				int reg = REG_RAX;
+				Type calcType;
+				bool isNeedHeapFreeStructure;
+				NumOpe( &reg, Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure );
+
+				if( !calcType.IsStruct() ){
+					//一時参照を作成
+					pobj_sf->push( reg );
+					pobj_sf->mov_sp( reg );
+
+					stackItemNum++;
+				}
+
+				//スタックフレームへコピー
+				StackOffsetOfTempObject[i2] = pobj_sf->push(reg);
+
+				stackItemNum++;
+
+				bool result = CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i2);
+
+				if( result )
+				{
+					useTempParameters[i2] = true;
+					isNeedFreeStructures[i2] = isNeedHeapFreeStructure;
+					useTempObject = true;
+
+					types[i2] = calcType;
+				}
+			}
+		}
+	}
+
+	return stackItemNum * PTR_SIZE;
+}
+void ParamImpl::DeleteTempParameters(){
+	///////////////////////////////////////////////////////
+	// 一時オブジェクトを破棄
+	///////////////////////////////////////////////////////
+	if( !useTempObject ) return;
+
+	for(int i2=ParmsNum-1;i2>=0;i2--){
+		if( useTempParameters[i2] ){
+			if( types[i2].IsStruct() ){
+				// 構造体の一時メモリ
+
+				if( isNeedFreeStructures[i2] )
+				{
+					//メモリを解放する
+
+					pobj_sf->pop( REG_RCX );
+
+					//call free
+					extern const UserProc *pSub_free;
+					compiler.codeGenerator.op_call(pSub_free);
+				}
+				else
+				{
+					pobj_sf->pop();
+				}
+			}
+			else
+			{
+				pobj_sf->pop();
+				pobj_sf->pop();
+			}
+		}
+	}
+}
+
+void ParamImpl::SetStructParameter( int reg, const Type &baseType, const char *expression ){
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		int object_size = baseType.GetClass().GetSize();
+
+		//mov rcx,object_size
+		compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+		//call calloc
+		extern const UserProc *pSub_calloc;
+		compiler.codeGenerator.op_call(pSub_calloc);
+
+		//mov r11,rax
+		compiler.codeGenerator.op_mov_RR(REG_R11,REG_RAX);
+
+		//mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
+		pobj_sf->push(REG_R11);
+
+
+		Type calcType;
+		bool isNeedHeapFreeStructure;
+		int temp_reg=REG_RAX;
+		NumOpe( &temp_reg,
+			expression,
+			baseType,
+			calcType,
+			&isNeedHeapFreeStructure );
+
+
+		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->ref(REG_R11);
+
+
+		RELATIVE_VAR RelativeVar;
+		RelativeVar.bOffsetOffset=0;
+		RelativeVar.offset=0;
+		RelativeVar.dwKind=VAR_DIRECTMEM;
+
+		SetStructVariableFromRax(
+			baseType,
+			calcType,
+			&RelativeVar,isNeedHeapFreeStructure);
+
+
+		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R11);
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+
+	//mov reg,r11
+	compiler.codeGenerator.op_mov_RR(reg,REG_R11);
+}
+
+void ParamImpl::SetParameter( const std::string &procName, const Parameters &params, int SecondParmNum, const UserProc *pUserProc ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	///////////////////////////////////////////////////////////
+	// パラメータをレジスタ及びスタックフレームにセット
+	///////////////////////////////////////////////////////////
+	int i2,i3;
+
+	BOOL bEllipse;
+	if( params.size() ){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
+		else bEllipse=0;
+	}
+	else bEllipse=0;
+
+	BOOL bHas_System_LocalThis=0;
+	if(ParmsNum>=1){
+		if( params[0]->GetVarName() == "_System_LocalThis" ){
+			bHas_System_LocalThis=1;
+		}
+	}
+
+	//戻り値用の変数名を取得
+	const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str();
+
+	//パラメータをレジスタとスタックに格納
+	int ParmSize=0;
+	int reg,temp_reg;
+	RELATIVE_VAR RelativeVar;
+	for(i2=ParmsNum-1;i2>=0;i2--){
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
+				//オブジェクトメンバの第一パラメータのThisポインタ
+				continue;
+			}
+		}
+		if(i2==0||i2==1){
+			if( params[i2]->GetVarName() == lpszVarNameToReturn ){
+				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+				continue;
+			}
+		}
+
+		Type dummyType;
+		BOOL bByVal;
+		if(bEllipse){
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
+			bByVal=1;
+		}
+		else{
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
+
+			// 型パラメータを解決
+			ResolveFormalGenericTypeParameter( dummyType, leftType, pUserProc );
+		}
+
+		int xmm_temp_sw=0;
+		if(dummyType.IsReal()&&bByVal){
+			//実数型
+			if(i2==0) reg=REG_XMM0;
+			else if(i2==1) reg=REG_XMM1;
+			else if(i2==2) reg=REG_XMM2;
+			else if(i2==3) reg=REG_XMM3;
+			else{
+				reg=REG_XMM0;
+				xmm_temp_sw=1;
+			}
+		}
+		else{
+			//整数型
+			if(i2==0) reg=REG_RCX;
+			else if(i2==1) reg=REG_RDX;
+			else if(i2==2) reg=REG_R8;
+			else if(i2==3) reg=REG_R9;
+			else reg=REG_RAX;
+		}
+
+		if(bByVal==1){
+			//値参照
+
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				char temp2[255];
+				sprintf(temp2,"%s関数の第%dパラメータ",procName,i2+1);
+				compiler.errorMessenger.Output(19,temp2,cp);
+				continue;
+			}
+
+			if( dummyType.IsStruct() ){
+				SetStructParameter( reg, dummyType, Parms[i2] );
+				goto next;
+			}
+
+			temp_reg=reg;
+
+			Type calcType;
+			bool isNeedHeapFreeStructure;
+			if( !NumOpe( &temp_reg, Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure ) ){
+				break;
+			}
+
+			if( calcType.IsObject() ){
+				if( !dummyType.IsObject()
+					||
+					dummyType.IsObject() &&
+					!dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
+						//キャスト演算子のオーバーロードに対応する
+						CallCastOperatorProc( reg, calcType, isNeedHeapFreeStructure,dummyType );
+				}
+			}
+
+
+			if(bEllipse){
+				if( calcType.IsReal() ){
+					//整数レジスタへコピー
+					//※cdeclの拡張パラメータは実数の場合も汎用レジスタで引渡し
+
+					if(0<=i2&&i2<=3){
+						if(i2==0) reg=REG_RCX;
+						else if(i2==1) reg=REG_RDX;
+						else if(i2==2) reg=REG_R8;
+						else if(i2==3) reg=REG_R9;
+
+						//movd reg,temp_reg
+						compiler.codeGenerator.op_movd_RX(reg,temp_reg);
+					}
+				}
+				else if( calcType.IsWhole() ){
+					//整数型の場合は、64ビットへ拡張する
+					ExtendTypeTo64( calcType.GetBasicType(), temp_reg );
+				}
+			}
+			else{
+				//型チェック
+				// TODO: _System_ReturnValueが考慮されていない？
+				if(bHas_System_LocalThis) i3=i2-1;
+				else i3=i2;
+				CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i3);
+
+				if( dummyType.IsDouble() ){
+					//Double型へ変換
+					ChangeTypeToXmm_Double(calcType.GetBasicType(),reg,temp_reg);
+				}
+				else if( dummyType.IsSingle() ){
+					//Single型へ変換
+					ChangeTypeToXmm_Single(calcType.GetBasicType(),reg,temp_reg);
+				}
+				else if( dummyType.IsWhole() ){
+					//実数型 → 整数型
+					ChangeTypeToWhole(calcType,dummyType,reg,temp_reg);
+				}
+			}
+		}
+		else{
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+
+				temp_reg=reg;
+				Type calcType;
+				if( !NumOpe(&temp_reg, Parms[i2]+2, dummyType, calcType) ){
+					break;
+				}
+
+				dummyType.PtrLevelUp();
+
+				//型チェック
+				if(bHas_System_LocalThis) i3=i2-1;
+				else i3=i2;
+				CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i3);
+
+				if( calcType.IsReal() ){
+					//実数型 → 整数型
+					ChangeTypeToWhole( calcType, Type(DEF_QWORD), reg, temp_reg );
+				}
+			}
+			else{
+				if( useTempParameters[i2] ){
+					//一時オブジェクトをコピー
+
+					//mov reg, qword ptr[rsp+offset]
+					pobj_sf->ref_offset_data( reg, StackOffsetOfTempObject[i2] );
+				}
+				else{
+					//変数のアドレスを取得
+					Type varType;
+					if(GetVarOffset(
+						false,
+						false,
+						Parms[i2],
+						&RelativeVar,
+						varType)){
+
+							if( !dummyType.IsAny() ){
+								//型チェックを行う
+								if( dummyType.GetBasicType() == varType.GetBasicType() ){
+									if( dummyType.IsObject() ){
+										if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){
+											compiler.errorMessenger.Output(11,Parms[i2],cp);
+										}
+									}
+									else if( dummyType.IsStruct() ){
+										if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){
+											compiler.errorMessenger.Output(11,Parms[i2],cp);
+										}
+									}
+								}
+								else if( (varType.GetBasicType()&FLAG_PTR)
+									&&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){
+									//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+								}
+								else{
+									compiler.errorMessenger.Output(11,Parms[i2],cp);
+								}
+							}
+
+							//変数アドレスをレジスタにセット
+							SetVarPtrToReg(reg,&RelativeVar);
+
+					}
+				}
+			}
+		}
+
+next:
+
+		if(reg==REG_RAX){
+			//スタックフレームへコピー
+			//mov qword ptr[rsp+offset],rax
+			compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+		}
+		else if(xmm_temp_sw){
+			//スタックフレームへコピー
+
+			//movlpd qword ptr[rsp+offset],xmm0
+			compiler.codeGenerator.op_movlpd_MR(REG_XMM0,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+		}
+
+
+		/////////////////////
+		// レジスタをロック
+		/////////////////////
+
+		if(0<=i2&&i2<=3){
+			//	※rcx, rdx, r8, r9の場合のみ
+			pobj_BlockReg->lock(reg);
+		}
+	}
+
+	//パラメータが収まるだけのスタックフレームを確保
+	pobj_sf->parameter_allocate((int)params.size()*sizeof(_int64)+   sizeof(_int64)/*ret用*/  );
+}
+void ParamImpl::BackupParameter(int pi_num){
+	///////////////////////////////////////////////////////////
+	// スタックフレームに存在する既存のパラメータをバックアップ
+	///////////////////////////////////////////////////////////
+	int i2;
+
+	for(i2=0;i2<ParmsNum;i2++){
+		/////////////////////
+		// バックアップ
+		/////////////////////
+
+		extern CDBLockParms obj_DBLockParms;
+		if(obj_DBLockParms.array_LevelCount[i2]){
+			//mov r14,qword ptr[rsp+offset]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R14,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+
+		if(3<i2){
+			//スタックフレームをロック
+			extern CDBLockParms obj_DBLockParms;
+			obj_DBLockParms.lock(i2);
+		}
+	}
+}
+void ParamImpl::RestoreParameter(int pi_num){
+	///////////////////////////////////////////////////////////
+	// スタックフレームに存在する既存のパラメータを復元
+	///////////////////////////////////////////////////////////
+	int i2;
+
+	for(i2=ParmsNum-1;i2>=0;i2--){
+		/////////////////////
+		// 復元
+		/////////////////////
+
+		if(3<i2){
+			//スタックフレームをアンロック
+			extern CDBLockParms obj_DBLockParms;
+			obj_DBLockParms.unlock(i2);
+		}
+
+		extern CDBLockParms obj_DBLockParms;
+		if(obj_DBLockParms.array_LevelCount[i2]){
+			//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(REG_R14);
+
+			//mov qword ptr[rsp+offset],r14
+			compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_R14,REG_RSP,i2*sizeof(_int64),MOD_BASE_DISP32);
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/CodeGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/CodeGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/CodeGenerator.cpp	(revision 774)
@@ -0,0 +1,1751 @@
+#include "stdafx.h"
+
+
+//////////////////////
+// rexプリフィックス
+//////////////////////
+void CodeGenerator::set_rex(int op_size,int reg,int index_reg,int base_reg){
+	char RexByte;
+
+	if(reg==REG_NON&&index_reg==REG_NON){
+		/////////////////////////////////////
+		// レジスタをr/mのみに指定するとき
+		/////////////////////////////////////
+
+		if((base_reg&0x08)==0){
+			if(op_size==sizeof(char)&&(base_reg&0x04)){
+				// r/m に spl,bpl,sil,dilを指定するとき
+				RexByte=0x40;
+			}
+			else RexByte=0;
+		}
+		else RexByte=(char)0x41;
+	}
+	else{
+		/////////////////
+		// 通常
+		/////////////////
+
+		if((reg&0x08)==0){
+			//reg … rax～rdi
+
+			if((index_reg&0x08)==0){
+				if((base_reg&0x08)==0) RexByte=0;
+				else RexByte=(char)0x41;
+			}
+			else{
+				if((base_reg&0x08)==0) RexByte=(char)0x42;
+				else RexByte=(char)0x43;
+			}
+		}
+		else{
+			//reg … r8～r15
+
+			if((index_reg&0x08)==0){
+				if((base_reg&0x08)==0) RexByte=(char)0x44;
+				else RexByte=(char)0x45;
+			}
+			else{
+				if((base_reg&0x08)==0) RexByte=(char)0x46;
+				else RexByte=(char)0x47;
+			}
+		}
+	}
+
+	if(op_size==sizeof(_int64)){
+		//64ビットオペランド
+		RexByte|=0x48;
+	}
+
+	if(RexByte) pNativeCode->Put( RexByte );
+}
+
+
+
+/////////////////////////////////////////////////
+// ModR/Mバイト、SIBバイト、ディスプレースメント
+/////////////////////////////////////////////////
+
+//スケール
+#define SCALE_NON	(char)0x00
+#define SCALE_2		(char)0x40
+#define SCALE_4		(char)0x80
+#define SCALE_8		(char)0xC0
+
+//インデックスなし
+#define INDEX_NON	0x04
+
+const PertialSchedule *CodeGenerator::set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType, bool isPertialSchedule )
+{
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(mod==MOD_DISP32){
+		//ModR/Mバイト
+		pNativeCode->Put( (char)(      REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(0x04)) );
+
+		base_reg=0x05;
+		index_reg=INDEX_NON;
+	}
+	else{
+		//ModR/Mバイト
+		pNativeCode->Put( (char)(mod | REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(base_reg)) );
+	}
+
+
+	//レジスタモードの場合は、ここで終了
+	if(mod==MOD_REG) return pPertialSchedule;
+
+
+	if(REGISTER_OPERAND(base_reg)==0x04||mod==MOD_DISP32){
+		//////////////////////
+		// SIBバイトを使う
+		//////////////////////
+
+		pNativeCode->Put( (char)(scale| REGISTER_OPERAND(index_reg)<<3 | REGISTER_OPERAND(base_reg)) );
+	}
+
+	//ディスプレースメントを必要としない場合は、ここで終了
+	if(mod==MOD_BASE) return pPertialSchedule;
+
+
+	//////////////////////////
+	// ディスプレースメント
+	//////////////////////////
+
+	if(mod==MOD_BASE_DISP8)
+	{
+		pNativeCode->Put( (char)disp );
+	}
+	else
+	{
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+
+		this->PutWithSchedule( disp, scheduleType );
+	}
+
+	return pPertialSchedule;
+}
+
+
+
+const PertialSchedule *CodeGenerator::__op_format(int op_size,char op_prefix,char opcode1,char opcode2,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//命令プリフィックス
+	if(op_prefix) pNativeCode->Put( op_prefix );
+
+	//rexプリフィックス
+	set_rex(op_size,reg,0,base_reg);
+
+	//オペコード
+	pNativeCode->Put( opcode1 );
+	if(opcode2) pNativeCode->Put( opcode2 );
+
+	//ModR/M, SIB, disp
+	return set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset, scheduleType, isPertialSchedule );
+}
+
+
+
+///////////////////
+// mov関連
+///////////////////
+
+const PertialSchedule *CodeGenerator::op_mov_RV(int op_size,int reg,long i32data, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg,i32data
+
+	//rexプリフィックス
+	set_rex(op_size,REG_NON,REG_NON,reg);
+
+	if(op_size==sizeof(_int64)){
+		//オペコード
+		pNativeCode->Put( (char)0xC7 );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg) ) );
+	}
+	else{
+		//レジスタ
+		pNativeCode->Put( (char)(0xB8| REGISTER_OPERAND(reg) ) );
+	}
+
+	//即値
+	const PertialSchedule *pPertialSchedule = NULL;
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( i32data, scheduleType );
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_mov_RV64( int reg, _int64 i64data, bool isPertialSchedule )
+{
+	//mov reg,i64data
+
+	//rexプリフィックス
+	set_rex(sizeof(_int64),REG_NON,REG_NON,reg);
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xB8| REGISTER_OPERAND(reg) ) );
+
+	//即値
+	const PertialSchedule *pPertialSchedule = NULL;
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(_int64) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	pNativeCode->Put( i64data );
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_mov_RM(int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg64,qword ptr[base_reg+offset]
+	//mov reg32,dword ptr[base_reg+offset]
+	//mov reg16,word ptr[base_reg+offset]
+	//mov reg8,byte ptr[base_reg+offset]
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x8A;
+	else opcode=(char)0x8B;
+
+	return __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg64,qword ptr[base_reg1+base_reg2+offset]
+	//mov reg32,dword ptr[base_reg1+base_reg2+offset]
+	//mov reg16,word ptr[base_reg1+base_reg2+offset]
+	//mov reg8,byte ptr[base_reg1+base_reg2+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_RSP){
+		//SIBバイトのindex部にrspは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_RSP;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	set_rex(op_size,reg,base_reg1,base_reg2);
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x8A );
+	else pNativeCode->Put( (char)0x8B );
+
+	if(bUseOffset){
+		///////////////////////////
+		// オフセット値を使う
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x84| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		///////////////////////////
+		// オフセット値を使わない
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x04| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,long offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov qword ptr[base_reg+offset],reg64
+	//mov dword ptr[base_reg+offset],reg32
+	//mov word ptr[base_reg+offset],reg16
+	//mov byte ptr[base_reg+offset],reg8
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x88;
+	else opcode=(char)0x89;
+
+	return __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov qword ptr[base_reg1+base_reg2+offset],reg64
+	//mov dword ptr[base_reg1+base_reg2+offset],reg32
+	//mov word ptr[base_reg1+base_reg2+offset],reg16
+	//mov byte ptr[base_reg1+base_reg2+offset],reg8
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_RSP){
+		//SIBバイトのindex部にrspは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_RSP;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	set_rex(op_size,reg,base_reg1,base_reg2);
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x88 );
+	else pNativeCode->Put( (char)0x89 );
+
+	if(bUseOffset==USE_OFFSET){
+		//////////////////////////
+		//オフセット値を使う
+		//////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x84| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		//////////////////////////
+		//オフセット値を使わない
+		//////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x04| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+
+	return pPertialSchedule;
+}
+
+const PertialSchedule *CodeGenerator::op_mov_MV(int op_size,int base_reg,int offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, BOOL bUseOffset,long i32data){
+	//mov ptr[base_reg+offset],i32data
+	//mov ptr[base_reg       ],i32data
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	set_rex(op_size,0,0,base_reg);
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0xC6 );
+	else pNativeCode->Put( (char)0xC7 );
+
+	if(bUseOffset==USE_OFFSET){
+		//////////////////////////
+		//オフセット値を使う
+		//////////////////////////
+
+		//ModR/M, SIB, disp
+		pPertialSchedule = set_mod_rm_sib_disp(MOD_BASE_DISP32,0,SCALE_NON,INDEX_NON,base_reg,offset, offsetScheduleType, isPertialSchedule );
+	}
+	else{
+		//ModR/M, SIB, disp
+		set_mod_rm_sib_disp(MOD_BASE,0,SCALE_NON,INDEX_NON,base_reg,0);
+	}
+
+	//即値
+	if(op_size==sizeof(_int64)||op_size==sizeof(long)){
+		//32/64ビット
+		pNativeCode->Put( i32data );
+	}
+	else if(op_size==sizeof(short)){
+		//16ビット
+		pNativeCode->Put( (short)i32data );
+	}
+	else if(op_size==sizeof(char)){
+		//16ビット
+		pNativeCode->Put( (char)i32data );
+	}
+
+	return pPertialSchedule;
+}
+
+void CodeGenerator::op_mov_RR(int reg1,int reg2){
+	//mov reg1,reg2
+	char RexByte=-1;
+
+	if(reg1==reg2) return;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	// [8bit rex] 1000 1011 11xx xbbb
+	pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x8B );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+void CodeGenerator::op_movsxd(int reg64,int reg32){
+	//movsxd reg64,reg32
+	char RexByte=-1;
+
+	if(REG_RAX<=reg64&&reg64<=REG_RDI){
+		if(REG_RAX<=reg32&&reg32<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg32&&reg32<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg64&&reg64<=REG_R15){
+		if(REG_RAX<=reg32&&reg32<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg32&&reg32<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0110 0011 11rr rbbb
+	pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x63 );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg32)) );
+}
+void CodeGenerator::op_movsx64_FromReg16(int reg64,int reg16){
+	//movsx reg64,reg16
+	char RexByte=-1;
+
+	if(REG_RAX<=reg64&&reg64<=REG_RDI){
+		if(REG_RAX<=reg16&&reg16<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg16&&reg16<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg64&&reg64<=REG_R15){
+		if(REG_RAX<=reg16&&reg16<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg16&&reg16<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 1111 1011 1111 11rr rbbb
+	pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xBF );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg16)) );
+}
+void CodeGenerator::op_movsx64_FromReg8(int reg64,int reg8){
+	//movsx reg64,reg8
+	char RexByte=-1;
+
+	if(REG_RAX<=reg64&&reg64<=REG_RDI){
+		if(REG_RAX<=reg8&&reg8<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg64&&reg64<=REG_R15){
+		if(REG_RAX<=reg8&&reg8<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 1111 1011 1110 11rr rbbb
+	pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xBE );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg64)<<3 | REGISTER_OPERAND(reg8)) );
+}
+
+
+
+//////////////////
+// mov32関連
+//////////////////
+
+void CodeGenerator::op_movsx32_FromReg16(int reg32,int reg16){
+	//movsx reg32,reg16
+	char RexByte=-1;
+
+	if(REG_RAX<=reg32&&reg32<=REG_RDI){
+		if(REG_RAX<=reg16&&reg16<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg16&&reg16<=REG_R15) RexByte=(char)0x41;
+	}
+	if(REG_R8<=reg32&&reg32<=REG_R15){
+		if(REG_RAX<=reg16&&reg16<=REG_RDI) RexByte=(char)0x44;
+		if(REG_R8<=reg16&&reg16<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 1111 1011 1111 11rr rbbb
+	if(RexByte) pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xBF );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg16)) );
+}
+void CodeGenerator::op_movsx32_FromReg8(int reg32,int reg8){
+	//movsx reg32,reg8
+	char RexByte=-1;
+
+	if(REG_RAX<=reg32&&reg32<=REG_RDI){
+		if(REG_RAX<=reg8&&reg8<=REG_RBX) RexByte=0;
+		if(REG_RSP<=reg8&&reg8<=REG_RDI) RexByte=(char)0x40;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x41;
+	}
+	if(REG_R8<=reg32&&reg32<=REG_R15){
+		if(REG_RAX<=reg8&&reg8<=REG_RDI) RexByte=(char)0x44;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 1111 1011 1110 11rr rbbb
+	if(RexByte) pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xBE );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg8)) );
+}
+
+
+
+/////////////////////
+// mov16関連
+/////////////////////
+
+void CodeGenerator::op_movsx16_FromReg8(int reg32,int reg8){
+	//movsx reg16,reg8
+	char RexByte=-1;
+
+	if(REG_RAX<=reg32&&reg32<=REG_RDI){
+		if(REG_RAX<=reg8&&reg8<=REG_RBX) RexByte=0;
+		if(REG_RSP<=reg8&&reg8<=REG_RDI) RexByte=(char)0x40;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x41;
+	}
+	if(REG_R8<=reg32&&reg32<=REG_R15){
+		if(REG_RAX<=reg8&&reg8<=REG_RDI) RexByte=(char)0x44;
+		if(REG_R8<=reg8&&reg8<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//0110 0110 [8bit rex] 0000 1111 1011 1110 11rr rbbb
+	pNativeCode->Put( (char)0x66 );
+	if(RexByte) pNativeCode->Put( RexByte );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xBE );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg32)<<3 | REGISTER_OPERAND(reg8)) );
+}
+
+
+
+//////////////////////////////////
+// ビット拡張
+//////////////////////////////////
+
+void CodeGenerator::op_cqo()
+{
+	pNativeCode->Put( (char)0x48 );
+	pNativeCode->Put( (char)0x99 );
+}
+
+
+
+//////////////////////////////////
+// インクリメント・デクリメント
+//////////////////////////////////
+
+void CodeGenerator::op_inc(int reg){
+	//inc reg
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0xFF;
+
+	__op_format(sizeof(_int64),op_prefix,opcode,0,0,reg,0,MOD_REG);
+}
+void CodeGenerator::op_dec(int reg){
+	//dec reg
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0xFF;
+
+	__op_format(sizeof(_int64),op_prefix,opcode,0,0x01,reg,0,MOD_REG);
+}
+
+
+
+/////////////////////
+// add関連
+/////////////////////
+
+const PertialSchedule *CodeGenerator::op_add_RM(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//add reg64,qword ptr[base_reg+offset]
+	//add reg32,dword ptr[base_reg+offset]
+	//add reg16,word ptr[base_reg+offset]
+	//add reg8,byte ptr[base_reg+offset]
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x02;
+	else opcode=(char)0x03;
+
+	return __op_format(op_size,op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+
+const PertialSchedule *CodeGenerator::op_add_RV(int reg,long offset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//add reg,offset
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	char RexByte=-1;
+
+	if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0x48;
+	if(REG_R8<=reg&&reg<=REG_R15) RexByte=0x49;
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(reg==REG_RAX){
+		//raxのみ特殊
+
+		// [8bit rex] 0000 0101 [32bit offset]
+		pNativeCode->Put( (char)RexByte );
+		pNativeCode->Put( (char)0x05 );
+	}
+	else{
+		//rax以外
+
+		//[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+		pNativeCode->Put( (char)RexByte );
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)) );
+	}
+
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( offset, scheduleType );
+
+	return pPertialSchedule;
+}
+void CodeGenerator::op_add_RR(int reg1,int reg2){
+	//add reg1,reg2
+	char RexByte=-1;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 0011 11rr rbbb
+	pNativeCode->Put( (char)RexByte );
+	pNativeCode->Put( (char)0x03 );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_add32_reg(int reg1,int reg2){
+	//add reg1,reg2
+	char RexByte=-1;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0000 0011 11rr rbbb
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+	pNativeCode->Put( (char)0x03 );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+
+
+////////////////////////
+// sub関連
+////////////////////////
+
+void CodeGenerator::op_sub_RV(int op_size,int reg,long i32data){
+	//sub reg,i32data
+
+	//rexプリフィックス
+	set_rex(op_size,REG_NON,REG_NON,reg);
+
+	if(reg==REG_RAX){
+		//raxのみ特殊
+		pNativeCode->Put( (char)0x2D );
+	}
+	else{
+		//オペコード
+		pNativeCode->Put( (char)0x81 );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xE8| REGISTER_OPERAND(reg) ) );
+	}
+
+	//即値
+	pNativeCode->Put( i32data );
+}
+void CodeGenerator::op_sub64_reg(int reg1,int reg2){
+	//sub reg1,reg2
+	char RexByte=-1;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0010 1011 11rr rbbb
+	pNativeCode->Put( (char)RexByte );
+	pNativeCode->Put( (char)0x2B );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_sub32_reg(int reg1,int reg2){
+	//sub reg1,reg2
+	char RexByte=-1;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 0010 1011 11rr rbbb
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+	pNativeCode->Put( (char)0x2B );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_sbb_RR( int op_size, int reg1, int reg2 ){
+	//sbb reg1,reg2
+
+	//rexプリフィックス
+	set_rex(0,reg1,0,reg2);
+
+	//オペコード
+	pNativeCode->Put( (char)0x1B );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+
+
+////////////////////////
+// imul関連
+////////////////////////
+
+void CodeGenerator::op_imul_RR(int op_size,int reg1,int reg2){
+	//imul reg1,reg2
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0xAF );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_imul_RV(int op_size,int reg,long i32data){
+	//imul reg,i32data
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x4D;
+	}
+	else{
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x45;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	if(-128<=i32data&&i32data<=127){
+		//オペコード
+		pNativeCode->Put( (char)0x6B );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+
+		//値
+		pNativeCode->Put( (char)i32data );
+	}
+	else{
+		//オペコード
+		pNativeCode->Put( (char)0x69 );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+
+		//値
+		pNativeCode->Put( i32data );
+	}
+}
+
+
+
+////////////////////////
+// div、idiv関連
+////////////////////////
+
+void CodeGenerator::op_div64_reg(int reg){
+	//div reg
+	char RexByte=-1;
+
+	if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+	if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//rexプリフィックス
+	pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0xF7 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xF0| REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_idiv64_reg(int reg){
+	//idiv reg
+	char RexByte=-1;
+
+	if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+	if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//rexプリフィックス
+	pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0xF7 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xF8| REGISTER_OPERAND(reg)) );
+}
+
+
+
+////////////////////
+// ビットシフト関連
+////////////////////
+
+void CodeGenerator::op_shl_reg(int op_size,int reg){
+	//shl reg,cl
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+	}
+	else if(op_size==sizeof(char)){
+		if(REG_RAX<=reg&&reg<=REG_RBX) RexByte=0;
+		if(REG_RSP<=reg&&reg<=REG_RDI) RexByte=(char)0x40;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+	else{
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0xD2 );
+	else pNativeCode->Put( (char)0xD3 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xE0| REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_sar_reg(int op_size,int reg){
+	//sar reg,cl
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+	}
+	else if(op_size==sizeof(char)){
+		if(REG_RAX<=reg&&reg<=REG_RBX) RexByte=0;
+		if(REG_RSP<=reg&&reg<=REG_RDI) RexByte=(char)0x40;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+	else{
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0xD2 );
+	else pNativeCode->Put( (char)0xD3 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xF8| REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_shr_reg(int op_size,int reg){
+	//shr reg,cl
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+	}
+	else if(op_size==sizeof(char)){
+		if(REG_RAX<=reg&&reg<=REG_RBX) RexByte=0;
+		if(REG_RSP<=reg&&reg<=REG_RDI) RexByte=(char)0x40;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+	else{
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0xD2 );
+	else pNativeCode->Put( (char)0xD3 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xE8| REGISTER_OPERAND(reg)) );
+}
+
+
+
+////////////////////
+// and 関連
+////////////////////
+
+void CodeGenerator::op_and_reg(int op_size,int reg1,int reg2){
+	//and reg1,reg2
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x23 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_and64_value(int reg,long offset){
+	//and reg,offset
+	char RexByte=-1;
+
+	if(REG_RAX<=reg&&reg<=REG_RDI) (char)RexByte=0x48;
+	if(REG_R8<=reg&&reg<=REG_R15) (char)RexByte=0x49;
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(reg==REG_RAX){
+		//raxのみ特殊
+
+		// [8bit rex] 0010 0101 [32bit offset]
+		pNativeCode->Put( (char)RexByte );
+		pNativeCode->Put( (char)0x25 );
+		pNativeCode->Put( offset );
+	}
+	else{
+		//rax以外
+
+		//[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+		pNativeCode->Put( (char)RexByte );
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)(0xE0| REGISTER_OPERAND(reg)) );
+		pNativeCode->Put( offset );
+	}
+}
+void CodeGenerator::op_and32_value(int reg,long offset){
+	//and reg,offset
+	char RexByte=-1;
+
+	if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+	if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(reg==REG_RAX){
+		//eaxのみ特殊
+
+		// [8bit rex] 0010 0101 [32bit offset]
+		pNativeCode->Put( (char)0x25 );
+		pNativeCode->Put( offset );
+	}
+	else{
+		//eax以外
+
+		//[8bit rex] 1000 0001 1100 0xxx [32bit offset]
+		if(RexByte) pNativeCode->Put( (char)RexByte );
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)(0xE0| REGISTER_OPERAND(reg)) );
+		pNativeCode->Put( offset );
+	}
+}
+
+
+
+////////////////////////
+// or 関連
+////////////////////////
+
+void CodeGenerator::op_or_reg(int op_size,int reg1,int reg2){
+	//or reg1,reg2
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x0B );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+
+
+////////////////////////
+// xor 関連
+////////////////////////
+
+void CodeGenerator::op_xor_reg(int op_size,int reg1,int reg2){
+	//xor reg1,reg2
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x33 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+
+
+///////////////////////
+// not 関連
+///////////////////////
+
+void CodeGenerator::op_not_reg(int op_size,int reg){
+	//not reg
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+	}
+	else{
+		if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+		if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0xF7 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xD0| REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_neg( int reg ){
+	//neg reg
+
+	//オペコード
+	pNativeCode->Put( (char)0xF7 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xD8| REGISTER_OPERAND(reg)) );
+}
+
+
+
+////////////////////
+// test関連
+////////////////////
+
+void CodeGenerator::op_test(int reg1,int reg2){
+	//test reg1,reg2
+	char RexByte=-1;
+
+	if(REG_RAX<=reg1&&reg1<=REG_RDI){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+	}
+	if(REG_R8<=reg1&&reg1<=REG_R15){
+		if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+		if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+	//[8bit rex] 1000 0101 11rr rbbb
+	pNativeCode->Put( (char)RexByte );
+	pNativeCode->Put( (char)0x85 );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+
+
+/////////////////////
+// cmp 関連
+/////////////////////
+
+void CodeGenerator::op_cmp_reg(int op_size,int reg1,int reg2){
+	//cmp reg1,reg2
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_RAX<=reg1&&reg1<=REG_RDI){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_R8<=reg1&&reg1<=REG_R15){
+			if(REG_RAX<=reg2&&reg2<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg2&&reg2<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x3B );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_cmp_value(int op_size,int reg,char byte_data){
+	//cmp reg,byte_data
+
+	if(op_size==sizeof(char)&&reg==REG_RAX){
+		//alレジスタの場合は特殊
+		pNativeCode->Put( (char)0x3C );
+
+		//8ビット値
+		pNativeCode->Put( byte_data );
+
+		return;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//rexプリフィックス
+	set_rex(op_size,REG_NON,REG_NON,reg);
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x80 );
+	else pNativeCode->Put( (char)0x83 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xF8| REGISTER_OPERAND(reg)) );
+
+	//8ビット値
+	pNativeCode->Put( byte_data );
+}
+void CodeGenerator::op_setne( int reg ){
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x95 );
+
+	//レジスタ
+	pNativeCode->Put( (char)( 0xC0 | REGISTER_OPERAND(reg) ) );
+}
+
+
+////////////////////
+// SSE2関連
+////////////////////
+
+const PertialSchedule *CodeGenerator::op_movlpd_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//movlpd qword ptr[base_reg+offset],xmm_reg
+	return __op_format(0,(char)0x66,(char)0x0F,(char)0x13,xmm_reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_movlpd_RM(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//movlpd xmm_reg,qword ptr[base_reg+offset]
+	return __op_format(0,(char)0x66,(char)0x0F,(char)0x12,xmm_reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+void CodeGenerator::op_movsd_RR(int xmm_reg1,int xmm_reg2){
+	if(xmm_reg1==xmm_reg2) return;
+
+	//movsd xmm_reg1,xmm_reg2
+	__op_format(0,(char)0xF2,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
+}
+const PertialSchedule *CodeGenerator::op_movsd_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//movsd qword ptr[reg+offset],xmm_reg
+	//movsd qword ptr[reg],xmm_reg
+	return __op_format(0,(char)0xF2,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+void CodeGenerator::op_movss_RR(int xmm_reg1,int xmm_reg2){
+	if(xmm_reg1==xmm_reg2) return;
+
+	//movss xmm_reg1,xmm_reg2
+	__op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg1,xmm_reg2,0,MOD_REG);
+}
+const PertialSchedule *CodeGenerator::op_movss_RM(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//movss xmm_reg,dword ptr[base_reg+offset]
+	return __op_format(0,(char)0xF3,(char)0x0F,(char)0x10,xmm_reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_movss_MR(int xmm_reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//movss dword ptr[reg+offset],xmm_reg
+	//movss dword ptr[reg],xmm_reg
+	return __op_format(0,(char)0xF3,(char)0x0F,(char)0x11,xmm_reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+
+void CodeGenerator::op_movd_RX(int reg,int xmm_reg){
+	__op_format(sizeof(_int64),(char)0x66,(char)0x0F,(char)0x7E,xmm_reg,reg,0,MOD_REG);
+}
+
+void CodeGenerator::op_cvtsd2ss(int xmm_reg1,int xmm_reg2){
+	//cvtsd2ss xmm_reg1,xmm_reg2
+
+	//オペコード
+	pNativeCode->Put( (char)0xF2 );
+
+	//rexプリフィックス
+	set_rex(sizeof(long),xmm_reg1,0,xmm_reg2);
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x5A );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2)) );
+}
+void CodeGenerator::op_cvtss2sd(int xmm_reg1,int xmm_reg2){
+	//cvtss2sd xmm_reg1,xmm_reg2
+
+	//オペコード
+	pNativeCode->Put( (char)0xF3 );
+
+	//rexプリフィックス
+	set_rex(0,xmm_reg1,0,xmm_reg2);
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x5A );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2)) );
+}
+void CodeGenerator::op_cvttsd2si_xmm(int op_size,int reg,int xmm_reg){
+	//cvttsd2si reg,xmm_reg
+
+	//オペコード
+	pNativeCode->Put( (char)0xF2 );
+
+	//rexプリフィックス
+	set_rex(op_size,reg,0,xmm_reg);
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2C );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(xmm_reg)) );
+}
+void CodeGenerator::op_cvttss2si_xmm(int op_size,int reg,int xmm_reg){
+	//cvttss2si reg,xmm_reg
+
+	//オペコード
+	pNativeCode->Put( (char)0xF3 );
+
+	//rexプリフィックス
+	set_rex(op_size,reg,0,xmm_reg);
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2C );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(xmm_reg)) );
+}
+void CodeGenerator::op_cvtsi2sd_reg(int op_size,int xmm_reg,int reg){
+	//cvtsi2sd xmm_reg,reg
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//オペコード
+	pNativeCode->Put( (char)0xF2 );
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2A );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg)<<3 | REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_cvtsi2ss_reg(int op_size,int xmm_reg,int reg){
+	//cvtsi2ss xmm_reg,reg
+	char RexByte=-1;
+
+	if(op_size==sizeof(_int64)){
+		if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x48;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x49;
+		}
+		if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x4C;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x4D;
+		}
+	}
+	else{
+		if(REG_XMM0<=xmm_reg&&xmm_reg<=REG_XMM7){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=0;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x41;
+		}
+		if(REG_XMM8<=xmm_reg&&xmm_reg<=REG_XMM15){
+			if(REG_RAX<=reg&&reg<=REG_RDI) RexByte=(char)0x44;
+			if(REG_R8<=reg&&reg<=REG_R15) RexByte=(char)0x45;
+		}
+	}
+
+	if(RexByte==-1) compiler.errorMessenger.Output(300,NULL,cp);
+
+
+	//オペコード
+	pNativeCode->Put( (char)0xF3 );
+
+	//rexプリフィックス
+	if(RexByte) pNativeCode->Put( (char)RexByte );
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2A );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg)<<3 | REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_comisd(int xmm_reg1,int xmm_reg2){
+	//comisd xmm_reg1,xmm_reg2
+
+	//オペコード
+	pNativeCode->Put( (char)0x66 );
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2F );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2)) );
+}
+void CodeGenerator::op_comiss(int xmm_reg1,int xmm_reg2){
+	//comiss xmm_reg1,xmm_reg2
+
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x2F );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2)) );
+}
+
+
+
+/////////////////////
+// ストリング関係
+/////////////////////
+
+void CodeGenerator::op_rep_movs(int op_size){
+	if(op_size==sizeof(BYTE)){
+		//rep movs byte ptr[edi],byte ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0xA4 );
+	}
+	else if(op_size==sizeof(short)){
+		//rep movs word ptr[edi],word ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0x66 );
+		pNativeCode->Put( (char)0xA5 );
+	}
+	else if(op_size==sizeof(long)){
+		//rep movs dword ptr[edi],dword ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0xA5 );
+	}
+}
+
+
+
+
+void CodeGenerator::op_add_rsp(long num){
+	//スタックポインタの加算（pop方向）
+
+	//add rsp,num
+	if(0xFFFFFF80&num){
+		pNativeCode->Put( (char)0x48 );
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)0xC4 );
+		pNativeCode->Put( num );
+	}
+	else{
+		//「-128 < num < 127」の場合
+		pNativeCode->Put( (char)0x48 );
+		pNativeCode->Put( (char)0x83 );
+		pNativeCode->Put( (char)0xC4 );
+		pNativeCode->Put( (char)num );
+	}
+}
+const PertialSchedule *CodeGenerator::op_sub_rsp( long num, bool isPertialSchedule )
+{
+	//スタックポインタの減算（push方向）
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	//sub rsp,num
+	if( (0xFFFFFF80&num) != 0 || isPertialSchedule ){
+		pNativeCode->Put( (char)0x48 );
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)0xEC );
+
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		pNativeCode->Put( num );
+	}
+	else{
+		//「-128 < num < 127」の場合
+		pNativeCode->Put( (char)0x48 );
+		pNativeCode->Put( (char)0x83 );
+		pNativeCode->Put( (char)0xEC );
+		pNativeCode->Put( (char)num );
+	}
+
+	return pPertialSchedule;
+}
+
+
+
+//////////////////////////////
+// 浮動小数点関連
+//////////////////////////////
+
+void CodeGenerator::op_fld_ptr_esp(int type){
+	//スタックポインタが示すバッファのデータを浮動小数点レジスタへロード
+
+	if(type==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		pNativeCode->Put( (char)0xDD );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_SINGLE){
+		//fld dword ptr[esp]
+		pNativeCode->Put( (char)0xD9 );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_INT64){
+		//fild qword ptr[esp]
+		pNativeCode->Put( (char)0xDF );
+		pNativeCode->Put( (char)0x2C );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_LONG){
+		//fild dword ptr[esp]
+		pNativeCode->Put( (char)0xDB );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+}
+
+
+
+//////////////////////////////
+// レジスタ関連
+//////////////////////////////
+
+void CodeGenerator::op_zero_reg(int reg){
+	//レジスタに0をセット
+
+	if(REG_RAX<=reg&&reg<=REG_RDI){
+		/*	rax～rdi
+			0100 1000 0011 0011 11 xxx xxx	*/
+		pNativeCode->Put( (char)0x48 );
+		pNativeCode->Put( (char)0x33 );
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+	}
+	if(REG_R8<=reg&&reg<=REG_R15){
+		/*	r8～r15
+			0100 1101 0011 0011 11 xxx xxx	*/
+		pNativeCode->Put( (char)0x4D );
+		pNativeCode->Put( (char)0x33 );
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+	}
+}
+
+
+
+/////////////////////////////
+// 関数呼び出し
+/////////////////////////////
+
+void CodeGenerator::op_call( const UserProc *pUserProc ){
+	pNativeCode->Put( (char)0xE8 );
+	pNativeCode->PutUserProcSchedule( pUserProc, true );
+}
+void CodeGenerator::op_call( const DllProc *pDllProc ){
+	pNativeCode->Put( (char)0xFF );
+	pNativeCode->Put( (char)0x15 );
+	pNativeCode->PutDllProcSchedule( pDllProc );
+}
+void CodeGenerator::op_ret(){
+	pNativeCode->Put( (char)0xC3 );
+}
+void CodeGenerator::op_addressof( int reg, const UserProc *pUserProc )
+{
+	//mov reg,userProcAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutUserProcSchedule( pUserProc, false );
+}
+void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass )
+{
+	// mov reg,com_vtblAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutComVtblSchedule( pClass );
+}
+void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
+{
+	// mov reg,vtblAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutVtblSchedule( pClass );
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/CommandValue.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/CommandValue.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/CommandValue.h	(revision 774)
@@ -0,0 +1,97 @@
+/* 命令語定数 */
+
+//条件、分岐、繰り返し
+#define COM_DO		0x1021
+/* 0x22は「"」なので使用不可 */
+#define COM_GOTO	0x1023
+#define COM_GOSUB	0x1024
+#define COM_LOOP	0x1026
+#define COM_RETURN	0x1027
+/* 0x28は「(」なので使用不可 */
+/* 0x29は「)」なので使用不可 */
+#define COM_FOR		0x1031
+#define COM_NEXT	0x1032
+#define COM_WHILE	0x1036
+#define COM_WEND	0x1037
+#define COM_FOREACH	0x1038
+
+//データ操作
+#define COM_DIM		0x1062
+#define COM_LET		0x1066
+#define COM_DELETE	0x1068
+#define COM_SWEEPINGDELETE	0x1069
+
+//その他
+#define COM_DEBUG		0x1073
+
+//ポインタ
+#define COM_SETDOUBLE		0x10C1
+#define COM_SETSINGLE		0x10C2
+#define COM_SETQWORD		0x10C3
+#define COM_SETDWORD		0x10C4
+#define COM_SETWORD			0x10C5
+#define COM_SETBYTE			0x10C6
+
+
+
+///////////////////////////////////
+// 以下はProjectEditorで使用される
+
+//入出力コマンド
+#define COM_PRINT		0x1150
+#define COM_INPUT		0x1151
+#define COM_OPEN		0x1152
+#define COM_CLOSE		0x1153
+#define COM_FIELD		0x1154
+#define COM_WRITE		0x1155
+
+//条件、分岐、繰り返し
+#define COM_IF			0x1160
+#define COM_SELECT		0x1161
+
+//ファイル操作
+#define COM_CHDIR		0x1170
+#define COM_KILL		0x1171
+#define COM_MKDIR		0x1172
+#define COM_GET			0x1173
+#define COM_PUT			0x1174
+
+//グラフィックス
+#define COM_CIRCLE		0x1180
+#define COM_LINE		0x1181
+#define COM_PAINT		0x1182
+#define COM_PSET		0x1183
+
+//データ操作
+#define COM_CONST		0x1190
+#define COM_TYPEDEF		0x1191
+
+//クラス関連
+#define COM_CLASS		0x1195
+#define COM_PRIVATE		0x1196
+#define COM_PUBLIC		0x1197
+#define COM_INHERITS	0x1198
+#define COM_PROTECTED	0x1199
+
+//その他
+#define COM_BEEP		0x11A0
+#define COM_CLS			0x11A1
+#define COM_COLOR		0x11A2
+#define COM_DECLARE		0x11A4
+#define COM_DEF			0x11A5
+#define COM_END			0x11A6
+#define COM_FUNCTION	0x11A7
+#define COM_LOCATE		0x11A8
+#define COM_RANDOMIZE	0x11A9
+#define COM_REM			0x11AA
+#define COM_SLEEP		0x11AB
+#define COM_SUB			0x11AC
+#define COM_TYPE		0x11AD
+#define COM_VIRTUAL		0x11AE
+#define COM_WITH		0x11AF
+#define COM_ENUM		0x11B0
+
+//ウィンドウ制御
+#define COM_DELWND		0x11C0
+#define COM_MSGBOX		0x11C1
+#define COM_WINDOW		0x11C2
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc.cpp	(revision 774)
@@ -0,0 +1,274 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void SetVariableFromRax( const Type &varType, int CalcType,RELATIVE_VAR *pRelativeVar){
+	/////////////////////////////////////////////////
+	// raxの内容を変数にコピーするコードを抽出
+	/////////////////////////////////////////////////
+
+	if( varType.IsBoolean() )
+	{
+		//bool
+		SetBooleanVariable(CalcType,pRelativeVar);
+	}
+	else if( varType.IsReal() )
+	{
+		// Double/Single型変数へレジスタの値を代入
+		SetRealVariable(varType.GetBasicType(), CalcType, pRelativeVar);
+	}
+	else if( varType.IsWhole() || varType.IsObject() )
+	{
+		//整数変数へraxの値を格納する
+		SetWholeVariable( varType.GetSize(), CalcType, pRelativeVar );
+	}
+	else{
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+}
+void OpcodeCalc(const char *Command){
+	int i,i2,i3;
+	char variable[VN_SIZE];
+
+
+	//////////////////////////////////////
+	// インクリメント・デクリメント
+	//////////////////////////////////////
+
+	for(i=0;;i++){
+		if(Command[i]=='\"'){
+			//ダブルクォートは不正なのでエラー扱い
+			variable[i]=0;
+			compiler.errorMessenger.Output(3,variable,cp);
+			return;
+		}
+
+		if(Command[i]=='('){
+			i2=GetStringInPare(variable+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='['){
+			i2=GetStringInBracket(variable+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='\0'){
+
+			///////////////////////////////////
+			// インクリメント・デクリメント
+			///////////////////////////////////
+
+			if(i>2){
+				if(Command[i-2]=='+'&&Command[i-1]=='+'){
+					//インクリメント
+					variable[i-2]=0;
+					IncDec(CALC_ADDITION,variable,"1");
+					return;
+				}
+				else if(Command[i-2]=='-'&&Command[i-1]=='-'){
+					//デクリメント
+					variable[i-2]=0;
+					IncDec(CALC_SUBTRACTION,variable,"1");
+					return;
+				}
+			}
+
+
+			//先端部分の識別子をエラーキーワードにする
+			for(i=0;;i++){
+				if(!IsVariableChar(Command[i])){
+					variable[i]=0;
+					break;
+				}
+				variable[i]=Command[i];
+			}
+
+			if(GetVarType(variable,Type(),0)){
+				//変数リストに該当したとき
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+			else{
+				if( compiler.GetObjectModule().meta.GetGlobalConsts().IsExistDuplicationKeyName(variable)
+					|| compiler.GetObjectModule().meta.GetGlobalConstMacros().IsExistDuplicationKeyName(variable) )
+				{
+					//定数リストに該当したとき
+					compiler.errorMessenger.Output(1,NULL,cp);
+				}
+				else{
+					//変数リスト、定数リストに該当しないとき
+					compiler.errorMessenger.Output(3,variable,cp);
+				}
+			}
+			return;
+		}
+
+		i2=GetCalcId(Command+i,&i3);
+		if(i2){
+			variable[i]=0;
+
+			if(Command[i]=='=') break;
+
+			if(Command[i+1+i3]=='='){
+				IncDec(i2,variable,Command+i+1+i3+1);
+				return;
+			}
+		}
+
+		variable[i]=Command[i];
+	}
+
+	if(Command[i+1]=='\0'){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+
+
+	///////////////////////////////////////////////////////////////
+	// インデクサのsetアクセサ（[]=演算子のオーバーロードに対応）
+	///////////////////////////////////////////////////////////////
+
+	char ObjName[VN_SIZE],array_element[VN_SIZE];
+	GetArrayElement(variable,ObjName,array_element);
+	if(array_element[0]){
+		Type varType;
+		if( GetVarType(ObjName,varType,0) && varType.IsObject() ){
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
+
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s,%s",array_element,Command+i+1);
+
+			int idProc;
+			void *pProc;
+			idProc=GetProc(temporary,(void **)&pProc);
+			if( idProc )
+			{
+				CallProc(
+					idProc,
+					pProc,
+					temporary,
+					temp2,
+					Type(),			// ベースタイプはなし
+					Type()
+				);
+				return;
+			}
+		}
+	}
+
+
+	if( lstrcmpi( variable, "This" ) == 0 ){
+		compiler.errorMessenger.Output(133,NULL,cp);
+		return;
+	}
+
+
+	////////////////////////////////////////
+	// 変数のタイプ型を識別して、演算を行う
+	////////////////////////////////////////
+
+	Type varType;
+
+	//型を識別
+	if( !GetTermTypeOnlyVariable(variable,varType) ){
+
+		// プロパティ用のメソッドを呼び出す
+		if(!CallPropertyMethod( variable, Command+i+1, Type() )){
+			//エラーを表示
+			GetVarType(variable,varType,true);
+		}
+
+		return;
+	}
+
+	//NumOpe...（rax、またはxmm0に答えが格納される）
+	int reg=REG_RAX;
+	Type calcType;
+	bool isNeedHeapFreeStructure;
+	if( !NumOpe(&reg,Command+i+1,varType,calcType,&isNeedHeapFreeStructure) ){
+		return;
+	}
+
+	if(reg!=REG_RAX&&calcType.IsWhole()||
+		varType.IsNull()||calcType.IsNull()){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	//結果を格納しているレジスタをブロッキング
+	pobj_BlockReg->lock(reg);
+
+	//変数アドレスを取得
+	RELATIVE_VAR VarRelativeVar;
+	if( !TermOpeOnlyVariable( variable, varType, VarRelativeVar, true ) )
+	{
+		compiler.errorMessenger.OutputFatalError();
+		return;
+	}
+
+	//レジスタのブロッキングを解除
+	pobj_BlockReg->clear();
+
+	if(varType.GetBasicType()&FLAG_PTR){
+		compiler.errorMessenger.Output(14,variable,cp);
+		return;
+	}
+
+	if( varType.IsStruct() ){
+		//構造体インスタンスへの代入
+		SetStructVariableFromRax(varType,calcType,&VarRelativeVar,isNeedHeapFreeStructure);
+		return;
+	}
+
+	if( calcType.IsObject() && !calcType.Equals( varType ) ){
+		bool isUpCast = false;
+		if( varType.IsObject() ){
+			if( varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
+				isUpCast = true;
+			}
+		}
+		if( !isUpCast ){
+			//キャスト演算子のオーバーロードに対応する
+			CallCastOperatorProc(REG_RAX,calcType,isNeedHeapFreeStructure,varType);
+		}
+	}
+
+	if( varType.IsObject() && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( calcType ) ){
+		// Blittable型をオブジェクトとして扱う
+		std::vector<const UserProc *> userProcs;
+		compiler.GetObjectModule().meta.GetBlittableTypes().GetClass( calcType ).GetStaticMethods().Enum( "_Create", userProcs );
+		if( userProcs.size() != 1 ){
+			compiler.errorMessenger.OutputFatalError();
+			return;
+		}
+		const UserProc *pUserProc = userProcs[0];
+
+		// mov rcx, rax
+		compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX );
+
+		// call System.[TypeClass]._Create
+		compiler.codeGenerator.op_call( pUserProc );
+
+		calcType = pUserProc->ReturnType();
+	}
+
+	/////////////////////////////////
+	// 右辺、左辺の型チェックを行う
+	/////////////////////////////////
+
+	CheckDifferentType(varType,calcType,0,0);
+
+
+	/////////////////////////////////////////////////
+	// rax（実数はxmm0）の内容を変数にコピー
+	/////////////////////////////////////////////////
+	SetVariableFromRax(varType,calcType.GetBasicType(),&VarRelativeVar);
+
+
+	// コード生成過程で発生した構造体の一時メモリを破棄する
+	compiler.codeGenerator.op_FreeTempStructure();
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc_PushVar.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc_PushVar.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Calc_PushVar.cpp	(revision 774)
@@ -0,0 +1,188 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg){
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//movlpd xmm_reg,qword ptr[r11+offset]
+			compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_R11, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//movlpd xmm_reg,qword ptr[offset]
+			compiler.codeGenerator.op_movlpd_RM( xmm_reg, 0, (long)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//movlpd xmm_reg,qword ptr[rsp+r11+offset]
+			compiler.codeGenerator.PutOld(
+				(char)0x66,
+				(char)0x42,
+				(char)0x0F,
+				(char)0x12,
+				(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3),
+				(char)0x1C
+			);
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.PutOld( (long)pRelativeVar->offset, true )
+			);
+		}
+		else{
+			//movlpd xmm_reg,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//movlpd xmm_reg,qword ptr[r11]
+		compiler.codeGenerator.op_movlpd_RM( xmm_reg, REG_R11, 0, MOD_BASE);
+	}
+}
+void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg){
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//movss xmm_reg,dword ptr[r11+offset]
+			compiler.codeGenerator.op_movss_RM( xmm_reg, REG_R11, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//movss xmm_reg,dword ptr[offset]
+			compiler.codeGenerator.op_movss_RM( xmm_reg, 0, (long)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//movss xmm_reg,dword ptr[rsp+r11+offset]
+			compiler.codeGenerator.PutOld(
+				(char)0xF3,
+				(char)0x42,
+				(char)0x0F,
+				(char)0x10,
+				(char)(0x84 | REGISTER_OPERAND(xmm_reg)<<3),
+				(char)0x1C
+			);
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.PutOld( (long)pRelativeVar->offset, true )
+			);
+		}
+		else{
+			//movss xmm_reg,dword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_movss_RM( xmm_reg, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//movss xmm_reg,dword ptr[r11]
+		compiler.codeGenerator.op_movss_RM( xmm_reg, REG_R11, 0, MOD_BASE);
+	}
+}
+
+
+void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg)
+{
+	int varSize = type.GetSize();
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov reg, ptr[r11+offset]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,REG_R11,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov reg, ptr[offset]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov r11,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov reg, ptr[rsp+r11+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM_ex(varSize,reg,REG_RSP,REG_R11,(int)pRelativeVar->offset,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//mov reg, ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(varSize,reg,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//mov reg, ptr[r11]
+		compiler.codeGenerator.op_mov_RM(varSize,reg,REG_R11,0,MOD_BASE);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_CallProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_CallProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_CallProc.cpp	(revision 774)
@@ -0,0 +1,639 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+using namespace ActiveBasic::Compiler;
+
+void Call_DebugSys_SaveContext(){
+	//call _System_GetEip
+	extern const UserProc *pSub_System_GetEip;
+	compiler.codeGenerator.op_call(pSub_System_GetEip);
+
+	//mov rdx,rax
+	compiler.codeGenerator.op_mov_RR(REG_RDX,REG_RAX);
+
+	//mov rcx,rsp
+	compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RSP);
+
+	//call _DebugSys_SaveContext
+	extern const UserProc *pSub_DebugSys_SaveContext;
+	compiler.codeGenerator.op_call(pSub_DebugSys_SaveContext);
+}
+
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer)
+{
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	////////////////////////
+	// パラメータのセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(lpszParms);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pProcPointer->Params() );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	//スタックフレームに存在する既存のパラメータをバックアップ
+	pobj_parameter->BackupParameter( (int)pProcPointer->Params().size() );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter(variable,pProcPointer->Params() );
+
+
+
+	RELATIVE_VAR RelativeVar;
+	GetVarOffsetReadOnly(variable,&RelativeVar,Type());
+	SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+	//mov rax,qword ptr[rax]
+	compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE);
+
+	//call rax
+	compiler.codeGenerator.PutOld(
+		(char)0xFF,
+		(char)0xD0
+	);
+
+
+	//レジスタのブロッキングを解除		※パラメータセット時にロックされたレジスタ
+	pobj_BlockReg->clear();
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//スタックフレームに存在する既存のパラメータを復元
+	pobj_parameter->RestoreParameter( (int)pProcPointer->Params().size() );
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName)
+{
+	if( pUserProc->IsMacro() ){
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
+			Opcode_Print(Parameter,0);
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
+			Opcode_Input(Parameter);
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
+			Opcode_Print(Parameter,1);
+			return true;
+		}
+	}
+	if( (dwFlags&PROCFLAG_PERMIT_CONSTRUCTOR) == 0 && pUserProc->IsConstructor() )
+	{
+		// コンストラクタの直接呼出しはエラーとする
+		compiler.errorMessenger.Output(145,NULL,cp);
+		return false;
+	}
+	if( (dwFlags&PROCFLAG_PERMIT_DESTRUCTOR) == 0 && pUserProc->IsDestructor() )
+	{
+		// デストラクタの直接呼出しはエラーとする
+		compiler.errorMessenger.Output(146,NULL,cp);
+		return false;
+	}
+
+	pUserProc->Using();
+
+	bool isStatic = false;
+	const CClass *pobj_c = NULL;
+	const CMethod *pMethod = NULL;
+	Type leftType;
+	bool isFixedClass = false;
+	if( pUserProc->GetParentClassPtr() ){
+		//クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
+		if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0)
+		{
+			if(lstrcmpi(ObjectName,"Super")==0)
+			{
+				//クラスメンバ関数内から基底クラスの呼び出し
+				pobj_c=&compiler.GetCompilingClass().GetSuperClass();
+
+				isFixedClass = true;
+			}
+			else
+			{
+				//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+				Type varType;
+				if( GetTermType( ObjectName, varType ) )
+				{
+					if( varType.IsObject() )
+					{
+						pobj_c = &varType.GetClass();
+						leftType = varType;
+					}
+				}
+
+				if( !pobj_c )
+				{
+					pobj_c = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+						LexicalAnalyzer::FullNameToSymbol( ObjectName )
+					);
+					if( pobj_c ){
+						isStatic = true;
+					}
+					else{
+						compiler.errorMessenger.Output(300,NULL,cp);
+					}
+				}
+			}
+		}
+		else{
+			if(dwFlags&PROCFLAG_NEW){
+				GetVarType( ObjectName, leftType, false );
+
+				//New演算子によるコンストラクタ呼び出し
+				pobj_c = pUserProc->GetParentClassPtr();
+			}
+			else{
+				//クラスメンバ関数内から同一クラスのメンバ関数の呼び出し
+				pobj_c = &compiler.GetCompilingClass();
+			}
+		}
+
+
+		/////////////////////////////////
+		// メソッド情報を取得
+		/////////////////////////////////
+		pMethod = NULL;
+		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
+		if( ! pMethod ){
+			//動的メソッドが取得できなかったときは静的メソッドを当たる
+			pMethod = pobj_c->GetStaticMethods().GetMethodPtr( pUserProc );
+			if( !pMethod ){
+				compiler.errorMessenger.Output(300,NULL,cp);
+				return false;
+			}
+
+			//静的メンバ
+			isStatic = true;
+		}
+
+
+		//////////////////////////////
+		// アクセスエラーチェック
+		//////////////////////////////
+
+		if(ObjectName[0]){
+			//外部からの呼び出し
+			if( compiler.IsCompilingClass() && pobj_c == &compiler.GetCompilingClass() )
+			{
+				//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+				if( pMethod->IsNoneAccess() )
+				{
+					compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+					return false;
+				}
+			}
+			else
+			{
+				if( pMethod->IsPrivate()
+					|| pMethod->IsNoneAccess() )
+				{
+					compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+				}
+				if( !pMethod->GetUserProc().GetParentClass().IsEqualsOrSubClass( pobj_c ) && pMethod->IsProtected() )
+				{
+					compiler.errorMessenger.Output(110,pUserProc->GetName(),cp);
+					return false;
+				}
+			}
+		}
+		else{
+			//クラス内部からの呼び出し（継承によるACCESS_NONのみをエラーとする）
+			if( pMethod->IsNoneAccess() ){
+				compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+				return false;
+			}
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////
+	// _System_LocalThisのダミーをセット
+	///////////////////////////////////////////////////////////////
+
+	char temporary[VN_SIZE]={0};
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
+		//_System_LocalThis（第一パラメータ）のダミーを作成
+		lstrcpy(temporary,"0,");
+	}
+	if( pUserProc->ReturnType().IsStruct() ){
+		// ※ByRef _System_ReturnValue パラメータのダミーをセット
+		lstrcat(temporary,"0,");
+	}
+
+	if(Parameter[0]=='\0'&&temporary[0])
+		temporary[lstrlen(temporary)-1]=0;
+	else lstrcat(temporary,Parameter);
+
+
+	//パラメータセット前のspオフセットを取得（Newの場合はここにThisポインタが格納されている）
+	int this_sp_offset = pobj_sf->GetNowSp();
+
+
+	////////////////////////
+	// パラメータをセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(temporary);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() );
+
+	// 型パラメータを適用
+	pobj_parameter->SetLeftType( leftType );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	if(pUserProc->IsMacro()){
+		//マクロ関数の場合は、パラメータ省略を考慮する
+		pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
+	}
+
+	//スタックフレームに存在する既存のパラメータをバックアップ
+	pobj_parameter->BackupParameter( (int)pUserProc->RealParams().size() );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum(), pUserProc );
+
+	if( pUserProc->ReturnType().IsStruct() ){
+		//////////////////////////////////////////////////////
+		// 戻り値に構造体インスタンスを持つ場合
+		// ※ByRef _System_ReturnValue パラメータをセット
+		//////////////////////////////////////////////////////
+
+
+		//////////////////////////////////////////////////////
+		/////    レジスタ資源のバックアップ
+		{	BACKUP_REGISTER_RESOURCE
+		//////////////////////////////////////////////////////
+
+			int object_size = pUserProc->ReturnType().GetClass().GetSize();
+
+			//mov rcx,object_size
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+			//call calloc
+			extern const UserProc *pSub_calloc;
+			compiler.codeGenerator.op_call(pSub_calloc);
+
+			//mov r13,rax
+			compiler.codeGenerator.op_mov_RR(REG_R13,REG_RAX);
+
+		/////////////////////////////////////////////
+		//////   レジスタ資源を復元
+			RESTORE_REGISTER_RESOURCE
+		}////////////////////////////////////////////
+
+		if( pUserProc->GetParentClassPtr() && isStatic == false ){
+			//mov rdx,r13
+			compiler.codeGenerator.op_mov_RR(REG_RDX,REG_R13);
+		}
+		else{
+			//mov rcx,r13
+			compiler.codeGenerator.op_mov_RR(REG_RCX,REG_R13);
+		}
+	}
+
+
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
+		///////////////////////////////
+		// メンバ関数の場合
+		// thisポインタをrcxで受け渡す
+		///////////////////////////////
+
+		if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){
+			if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+			else{
+				bool isLiteral, isNeedHeapFreeStructure = false;
+				Type baseType( DEF_OBJECT, *pUserProc->GetParentClassPtr() ) , resultType;
+				if( !TermOpe( ObjectName, baseType, resultType, isLiteral, isNeedHeapFreeStructure, NULL, false, !pMethod->IsConst() ) )
+				{
+					return false;
+				}
+				if( !resultType.IsObject() )
+				{
+					compiler.errorMessenger.OutputFatalError();
+				}
+
+				// 実態ポインタをraxにコピー
+				compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX );
+			}
+		}
+		else{
+InClassMember:
+			if(dwFlags&PROCFLAG_NEW){
+				//New演算子によるコンストラクタ呼び出しの場合
+
+				//mov rcx,qword ptr[rsp+offset]     ※スタックフレームを利用
+				pobj_sf->ref_offset_data(REG_RCX, this_sp_offset);
+			}
+			else{
+				//自身のオブジェクトのThisポインタをrcxにコピー
+				SetThisPtrToReg(REG_RCX);
+			}
+		}
+	}
+
+	if( pUserProc->IsVirtual() && !isFixedClass ){
+		int vtblIndex;
+		if( pobj_c->IsInterface() )
+		{
+			// インターフェイス メソッド呼び出し
+
+			int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
+
+			// vtblのポインタを取得
+			//mov r11,qword ptr[rcx+offset_vtbl]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8);
+
+			int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
+
+			// インターフェイスの場合は更に__thisを取得する
+			//mov rcx,qword ptr[rcx+offset_this]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8);
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+			if( vtblMasterListIndex != 0 )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+		}
+		else if( pobj_c->IsComInterface() )
+		{
+			// COMインターフェイス メソッド呼び出し
+
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl1 -> func1
+			//               -> func2
+			//               -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblのポインタを取得
+			//mov r11,qword ptr[rcx]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);		}
+		else
+		{
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl_master_list -> vtbl1 -> func1
+			//                                   -> func2
+			//                                   -> func3
+			//                          -> vtbl2 -> func1
+			//                                   -> func2
+			//                                   -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblマスターリストのポインタを取得
+			//mov r11,qword ptr[rcx+sizeof(com_vtbl)]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8);
+
+			// vtblのポインタを取得
+			//mov r11,dword ptr[r11+vtblMasterListIndex]
+			compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
+		}
+
+		//call qword ptr[r11+func_index]
+		if( vtblIndex * PTR_SIZE <= 0x7F ){
+			compiler.codeGenerator.PutOld(
+				(char)0x41,
+				(char)0xFF,
+				(char)0x53,
+				(char)(vtblIndex*PTR_SIZE)
+			);
+		}
+		else{
+			compiler.codeGenerator.PutOld(
+				(char)0x41,
+				(char)0xFF,
+				(char)0x93,
+				(long)(vtblIndex*PTR_SIZE)
+			);
+		}
+	}
+	else{
+		//通常呼び出し
+
+		//call ProcAddr
+		compiler.codeGenerator.op_call(pUserProc);
+	}
+
+	/* 64コンパイラでは不要
+	if(pDllProc->bCdecl){
+		//add esp,ParmSize
+	}*/
+
+
+	//レジスタのブロッキングを解除		※パラメータセット時にロックされたレジスタ
+	pobj_BlockReg->clear();
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//スタックフレームに存在する既存のパラメータを復元
+	pobj_parameter->RestoreParameter( (int)pUserProc->RealParams().size() );
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
+
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc==0 && pDllProc->IsEqualSymbol( LexicalAnalyzer::FullNameToSymbol( "DebugBreak" ) ) )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	////////////////////////
+	// パラメータのセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(lpszParms);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pDllProc->Params() );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	//スタックフレームに存在する既存のパラメータをバックアップ
+	pobj_parameter->BackupParameter( (int)pDllProc->Params().size() );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
+
+
+	//レジスタのブロッキングを解除		※パラメータセット時にロックされたレジスタ
+	pobj_BlockReg->clear();
+
+
+	//動的リンクされたプロシージャの呼び出し
+
+	//call dword ptr[ImportTable]
+	compiler.codeGenerator.op_call( pDllProc );
+
+	/* 64コンパイラでは不要
+	if(pDllProc->bCdecl){
+		//add esp,ParmSize
+	}*/
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//スタックフレームに存在する既存のパラメータを復元
+	pobj_parameter->RestoreParameter( (int)pDllProc->Params().size() );
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
+{
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	///////////////////////////////////////////////////////////////
+	// _System_LocalThisのダミーをセット
+	///////////////////////////////////////////////////////////////
+
+	char temporary[VN_SIZE]={0};
+	bool isDynamicCall = false;
+	if( objPtrValueStr && objPtrValueStr[0] ){
+		//_System_LocalThis（第一パラメータ）のダミーを作成
+		lstrcpy(temporary,"0,");
+
+		isDynamicCall = true;
+	}
+	if( dg.ReturnType().IsStruct() ){
+		// ※ByRef _System_ReturnValue パラメータのダミーをセット
+		lstrcat(temporary,"0,");
+	}
+
+	if(params[0]=='\0'&&temporary[0])
+		temporary[lstrlen(temporary)-1]=0;
+	else lstrcat(temporary,params);
+
+	const Parameters *pParams = &dg.Params();
+	if( isDynamicCall )
+	{
+		pParams = &dg.GetDynamicParams();
+	}
+
+
+	ParamImpl *pobj_parameter = new ParamImpl( temporary );
+
+	//スタックフレームに存在する既存のパラメータをバックアップ
+	pobj_parameter->BackupParameter( (int)pParams->size() );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( dg.GetName(), *pParams );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter( dg.GetName(), *pParams );
+
+
+	if( objPtrValueStr && objPtrValueStr[0] )
+	{
+		RELATIVE_VAR RelativeVar;
+		//Constアクセスが不可能なメソッドの場合
+		if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
+			Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
+			return;
+		}
+
+		SetVarPtrToReg(REG_RCX,&RelativeVar);
+
+		// 参照を実体ポインタにする
+		//mov rcx,qword ptr[rcx]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
+	}
+
+
+	{
+		////////////////////////
+		// call
+		////////////////////////
+		RELATIVE_VAR RelativeVar;
+		GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
+		SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+		//mov rax,qword ptr[rax]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RAX,0,MOD_BASE);
+
+		//call rax
+		compiler.codeGenerator.PutOld(
+			(char)0xFF,
+			(char)0xD0
+		);
+	}
+
+
+	//レジスタのブロッキングを解除		※パラメータセット時にロックされたレジスタ
+	pobj_BlockReg->clear();
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//スタックフレームに存在する既存のパラメータを復元
+	pobj_parameter->RestoreParameter( (int)pParams->size() );
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Func.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Func.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Func.cpp	(revision 774)
@@ -0,0 +1,665 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+#include "FunctionValue.h"
+
+void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn, int resultReg = REG_RAX );
+
+int GetFunctionFromName(char *FuncName){
+	if( lstrcmpi( FuncName, "Len" ) == 0 )				return FUNC_LEN;
+	if( lstrcmpi( FuncName, "AddressOf" ) == 0 )		return FUNC_ADDRESSOF;
+	if( lstrcmpi( FuncName, "SizeOf" ) == 0 )			return FUNC_SIZEOF;
+	if( lstrcmpi( FuncName, "__ClassSizeOf" ) == 0 )			return FUNC_CLASS_SIZEOF;
+	if( lstrcmpi( FuncName, "VarPtr" ) == 0 )			return FUNC_VARPTR;
+	if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )			return FUNC_OBJPTR;
+	if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )	return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
+	if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )		return FUNC_DELEGATE_STATICMETHOD_CALL;
+	if( lstrcmpi( FuncName, "_System_GetNowScopeCatchAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS;
+	if( lstrcmpi( FuncName, "_System_GetNowScopeFinallyAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS;
+	if( lstrcmpi( FuncName, "_System_GetBp" ) == 0 )	return FUNC_SYSTEM_GET_BP;
+	if( lstrcmpi( FuncName, "_System_GetSp" ) == 0 )	return FUNC_SYSTEM_GET_SP;
+	if( lstrcmp( FuncName, "_System_GetComVtbl" ) == 0 )		return FUNC_SYSTEM_GET_COM_VTBL;
+	if( lstrcmp( FuncName, "_System_GetVtblList" ) == 0 )		return FUNC_SYSTEM_GET_VTBL_LIST;
+	if( lstrcmp( FuncName, "_System_GetDefaultConstructor" ) == 0 )	return FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR;
+	if( lstrcmp( FuncName, "_System_GetDestructor" ) == 0 )			return FUNC_SYSTEM_GET_DESTRUCTOR;
+	if( lstrcmpi( FuncName, "GetDouble" ) == 0 )		return FUNC_GETDOUBLE;
+	if( lstrcmpi( FuncName, "GetSingle" ) == 0 )		return FUNC_GETSINGLE;
+	if( lstrcmpi( FuncName, "GetQWord" ) == 0 )			return FUNC_GETQWORD;
+	if( lstrcmpi( FuncName, "GetDWord" ) == 0 )			return FUNC_GETDWORD;
+	if( lstrcmpi( FuncName, "GetWord" ) == 0 )			return FUNC_GETWORD;
+	if( lstrcmpi( FuncName, "GetByte" ) == 0 )			return FUNC_GETBYTE;
+	return 0;
+}
+void Opcode_Func_Len( const char *Parameter ){
+	BOOL bArrayHead;
+
+	const char *tempParm=Parameter;
+	char temporary[VN_SIZE];
+	char temp2[32];
+	Type type;
+	if( !GetVarType(Parameter,type,0) ){
+		sprintf(temporary,"_System_DummyStr2=%s",Parameter);
+		OpcodeCalc(temporary);
+
+		lstrcpy(temp2,"_System_DummyStr2");
+		tempParm=temp2;
+
+		type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
+	}
+
+	if( type.IsStringClass() ){
+		//Stringオブジェクトの場合
+		sprintf(temporary,"%s.Length",tempParm);
+
+		int reg=REG_RAX;
+		NumOpe(&reg,temporary,Type(),Type());
+		return;
+	}
+
+	Subscripts subscripts;
+	RELATIVE_VAR RelativeVar;
+	if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,&subscripts)) return;
+
+	if(type.GetBasicType()&FLAG_PTR){
+		type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
+
+		bArrayHead=1;
+	}
+	else bArrayHead=0;
+
+	int typeSize = type.GetSize();
+
+	if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
+
+	//mov rax,TypeSize
+	compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,typeSize);
+
+	return;
+}
+
+void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
+{
+	if( userProc.IsVirtual() )
+	{
+		///////////////////////////////
+		// 仮想関数の場合
+		// thisポインタをrcxにコピー
+		///////////////////////////////
+
+		const CClass *pobj_c;
+
+		char ObjectName[VN_SIZE];
+		ReferenceKind referenceKind;
+		SplitObjectName(methodInstanceName,ObjectName, referenceKind );
+
+		if(ObjectName[0]){
+			if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+			else{
+				RELATIVE_VAR RelativeVar;
+				Type type;
+				if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
+				SetVarPtrToReg(REG_RCX,&RelativeVar);
+
+				//参照タイプが整合しているかをチェック
+				if( !( type.IsObject() && referenceKind == RefDot
+					|| type.IsObjectPtr() && referenceKind == RefPointer ) )
+				{
+					compiler.errorMessenger.Output(104,ObjectName,cp);
+				}
+
+				if(type.IsObjectPtr()){
+					//mov rcx,qword ptr[rcx]
+					compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,0,MOD_BASE);
+				}
+			}
+		}
+		else{
+InClassMember:
+			//自身のオブジェクトのThisポインタをrcxにコピー
+			SetThisPtrToReg(REG_RCX);
+
+			pobj_c = &compiler.GetCompilingClass();
+		}
+
+
+		int vtblIndex;
+		if( pobj_c->IsInterface() )
+		{
+			// インターフェイスメソッド
+
+			int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
+
+			// vtblのポインタを取得
+			//mov r11,qword ptr[rcx+offset_vtbl]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,offset_vtbl,MOD_BASE_DISP8);
+
+			int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
+
+			// インターフェイスの場合は更に__thisを取得する
+			//mov rcx,qword ptr[rcx+offset_this]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RCX,REG_RCX,offset_this,MOD_BASE_DISP8);
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+			if( vtblMasterListIndex != 0 )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+		}
+		else if( pobj_c->IsComInterface() )
+		{
+			//仮想関数（オブジェクトメソッド）
+			// pObj -> vtbl1 -> func1
+			//               -> func2
+			//               -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblのポインタを取得
+			//mov r11,qword ptr[rcx]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
+		}
+		else
+		{
+			//仮想関数（オブジェクトメソッド）
+			// pObj -> vtbl_master_list -> vtbl1 -> func1
+			//                                   -> func2
+			//                                   -> func3
+			//                          -> vtbl2 -> func1
+			//                                   -> func2
+			//                                   -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblマスターリストのポインタを取得
+			//mov r11,qword ptr[rcx+sizeof(com_vtbl)]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,PTR_SIZE,MOD_BASE_DISP8);
+
+			// vtblのポインタを取得
+			//mov r11,dword ptr[r11+vtblMasterListIndex]
+			compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_R11, REG_R11, vtblMasterListIndex, MOD_BASE_DISP32 );
+		}
+
+		//mov rax,qword ptr[r11+func_index]
+		if( vtblIndex * PTR_SIZE <= 0x7F )
+		{
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP8);
+		}
+		else
+		{
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_R11,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
+		}
+	}
+	else{
+		//一般の関数
+
+		//mov rax,ProcAddr
+		compiler.codeGenerator.op_addressof( REG_RAX, &userProc );
+	}
+
+	userProc.Using();
+}
+void Opcode_CreateDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc )
+{
+	/////////////////////////////////////////////////////////////////
+	// 関数ポインタをpush
+	/////////////////////////////////////////////////////////////////
+
+	//mov rax,AddressOf
+	_Opcode_Func_AddressOf( methodInstanceName, userProc );
+
+
+	if( userProc.HasParentClass() && userProc.GetMethod().IsDynamic() )
+	{
+		//mov rdx,rax
+		compiler.codeGenerator.op_mov_RR( REG_RDX, REG_RAX );
+
+		pobj_BlockReg->lock( REG_RDX );
+
+
+		/////////////////////////////////////////////////////////////////
+		// オブジェクト ポインタをpush
+		/////////////////////////////////////////////////////////////////
+
+		// オブジェクト名を取得
+		char objectName[VN_SIZE];
+		char memberName[VN_SIZE];
+		char *thisPtrName = "This";
+		Type type;
+		if( SplitMemberName( methodInstanceName, objectName, memberName ) )
+		{
+			if( GetVarType( objectName, type, false ) )
+			{
+				thisPtrName = objectName;
+			}
+		}
+
+		// オブジェクト ポインタをrcxに取得
+		Opcode_Func_ObjPtr( thisPtrName, type, true, REG_RCX );
+
+		pobj_BlockReg->unlock( REG_RDX );
+	}
+	else
+	{
+		//mov rcx,rax
+		compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RAX );
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// call _CreateDynamicDelegate/_CreateStaticDelegate
+	/////////////////////////////////////////////////////////////////
+
+	std::vector<const UserProc *> subs;
+	if( userProc.HasParentClass() && userProc.GetMethod().IsDynamic() )
+	{
+		dgClass.GetStaticMethods().Enum( "_CreateDynamicDelegate", subs );
+	}
+	else
+	{
+		dgClass.GetStaticMethods().Enum( "_CreateStaticDelegate", subs );
+	}
+
+	// call _CreateDynamicDelegate
+	compiler.codeGenerator.op_call( subs[0] );
+}
+void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType )
+{
+	extern int cp;
+
+	const Parameters *pBaseParams = NULL;
+	const Type *pBaseReturnType = NULL;
+	if( baseType.IsProcPtr() )
+	{
+		// 左辺で関数ポインタを要求されているとき
+		const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
+		pBaseParams = &pTempProcPointer->Params();
+		pBaseReturnType = &pTempProcPointer->ReturnType();
+	}
+	else if( baseType.IsDelegate() )
+	{
+		// 左辺でデリゲートを要求されているとき
+		const Delegate *pTempDelegate = &compiler.GetObjectModule().meta.ToDelegate( baseType.GetClass() );
+		pBaseParams = &pTempDelegate->Params();
+		pBaseReturnType = &pTempDelegate->ReturnType();
+	}
+
+	const UserProc *pUserProc;
+	if( pBaseParams && pBaseReturnType )
+	{
+		//左辺の型にのっとり、オーバーロードを解決
+
+		std::vector<const UserProc *> subs;
+		GetOverloadSubHash( name, subs );
+		if( subs.size() == 0 ){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+
+		//オーバーロードを解決
+		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
+
+		if( isCallOn )
+		{
+			// コード生成を伴う場合はエラーチェックを行う
+
+			if( baseType.IsDelegate() )
+			{
+				// デリゲート
+				// 共変戻り値、反変引数をサポート
+				if( !(
+					pBaseParams->Equals( pUserProc->Params(), true )
+					&& ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
+					) )
+				{
+					compiler.errorMessenger.Output(67, name, cp );
+				}
+			}
+			else
+			{
+				// 関数ポインタ
+				if( !(
+					pBaseParams->Equals( pUserProc->Params() )
+					&& pBaseReturnType->Equals( pUserProc->ReturnType() )
+					) )
+				{
+					compiler.errorMessenger.Output(66, name, cp );
+				}
+			}
+		}
+
+		if(!pUserProc){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+	}
+	else{
+		pUserProc=GetSubHash(name);
+		if(!pUserProc){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+	}
+
+	if( baseType.IsDelegate() )
+	{
+		if( isCallOn )
+		{
+			// デリゲートのとき
+			Opcode_CreateDelegate( baseType.GetClass(), name, *pUserProc );
+		}
+		resultType = baseType;
+	}
+	else
+	{
+		if( isCallOn )
+		{
+			// 関数ポインタのとき
+			_Opcode_Func_AddressOf( name, *pUserProc );
+		}
+		resultType.SetBasicType( DEF_PTR_VOID );
+	}
+}
+void Opcode_Func_SizeOf( const std::string &typeName )
+{
+	Type tempType;
+	if( !compiler.StringToType( typeName, tempType ) )
+	{
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return;
+	}
+
+	//mov rax,size
+	compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, compiler.SizeOf( tempType ) );
+}
+void Opcode_Func_ClassSizeOf( const std::string &typeName )
+{
+	Type tempType;
+	if( !compiler.StringToType( typeName, tempType ) )
+	{
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return;
+	}
+
+	if( !tempType.IsObject() )
+	{
+		compiler.errorMessenger.Output(1,typeName,cp);
+		return;
+	}
+
+	//mov rax,size
+	compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RAX, tempType.GetClass().GetSize() );
+}
+void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn ){
+	if( isCallOn == false ){
+		// 戻り値の型を取得するだけ
+
+		//変数のアドレスを取得
+		if(!GetVarType( Parameter, resultType, true )) return;
+
+		resultType.PtrLevelUp();
+
+		return;
+	}
+
+	if( lstrcmpi( Parameter, "This" )==0 )
+	{
+		compiler.errorMessenger.Output( 144, "", cp );
+	}
+
+	RELATIVE_VAR RelativeVar;
+
+	//変数のアドレスを取得
+	if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
+
+	int beforeType = resultType.GetBasicType();
+
+	resultType.PtrLevelUp();
+
+	SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+	// TODO: 取り除く（この動きはObjPtrに託す）
+	/*
+	if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
+		//参照をオブジェクトポインタに変更
+
+		//mov rax,qword ptr[rax]
+		compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
+
+		compiler.errorMessenger.Output(-120,NULL,cp);
+	}*/
+}
+void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn, int resultReg ){
+	if( isCallOn == false ){
+		// 戻り値の型を取得するだけ
+
+		//変数のアドレスを取得
+		if(!GetVarType( Parameter, resultType, true )) return;
+
+		resultType.PtrLevelUp();
+
+		return;
+	}
+
+	RELATIVE_VAR RelativeVar;
+
+	//変数のアドレスを取得
+	if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
+
+	int beforeType = resultType.GetBasicType();
+
+	resultType.PtrLevelUp();
+
+	SetVarPtrToReg(resultReg,&RelativeVar);
+
+	if( lstrcmpi( Parameter, "This" )==0 ){
+		// Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
+	}
+	else if( beforeType == DEF_OBJECT ){
+		//参照をオブジェクトポインタに変更
+
+		//mov resultReg,qword ptr[resultReg]
+		compiler.codeGenerator.op_mov_RM( sizeof(_int64), resultReg, resultReg, 0, MOD_BASE );
+	}
+	else{
+		compiler.errorMessenger.Output(134,NULL,cp );
+	}
+}
+
+void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
+{
+	if( isCallOn )
+	{
+		int i = 0;
+		char methodPtrParamStr[VN_SIZE];
+		i = GetOneParameter( paramsStr, i, methodPtrParamStr );
+
+		char objPtrValueStr[VN_SIZE] = "";
+		if( isDynamicCall )
+		{
+			i = GetOneParameter( paramsStr, i, objPtrValueStr );
+		}
+
+		Opcode_CallDelegate( compiler.GetObjectModule().meta.ToDelegate( compiler.GetCompilingClass() ), methodPtrParamStr, objPtrValueStr, paramsStr + i );
+	}
+
+	resultType = compiler.GetCompilingUserProc().ReturnType();
+}
+
+void Opcode_Func_System_Get_Bp()
+{
+	//mov rax,rbp
+	compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RBP);
+}
+void Opcode_Func_System_Get_Sp()
+{
+	//mov rax,rsp
+	compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RSP);
+}
+
+void Opcode_Func_System_GetComVtbl( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	// mov rax,com_vtbl
+	compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RAX, &classType.GetClass() );
+}
+void Opcode_Func_System_GetVtblList( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	// mov rax,com_vtbl
+	compiler.codeGenerator.op_mov_RV_vtbl( REG_RAX, &classType.GetClass() );
+}
+void Opcode_Func_System_GetDefaultConstructor( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	if( classType.GetClass().GetConstructorMethod() )
+	{
+		//mov rax,ProcAddr
+		compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetConstructorMethod()->GetUserProc() );
+	}
+	else
+	{
+		// デフォルトコンストラクタを持たない
+
+		//xor rax,rax
+		compiler.codeGenerator.op_zero_reg( REG_RAX );
+	}
+}
+void Opcode_Func_System_GetDestructor( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	//mov rax,ProcAddr
+	compiler.codeGenerator.op_addressof( REG_RAX, &classType.GetClass().GetDestructorMethod()->GetUserProc() );
+}
+
+void Opcode_Func_GetPtrData( const char *Parameter, const int type ){
+	int reg=REG_RAX;
+	Type tempType;
+	if( !NumOpe(&reg,Parameter,Type(),tempType) ){
+		return;
+	}
+	if(!tempType.IsWhole()){
+		compiler.errorMessenger.Output(11,Parameter,cp);
+		return;
+	}
+
+	if(type==DEF_DOUBLE){
+		//movlpd xmm0,qword ptr[rax]
+		compiler.codeGenerator.op_movlpd_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
+	}
+	else if(type==DEF_SINGLE){
+		//movss xmm0,dword ptr[rax]
+		compiler.codeGenerator.op_movss_RM(REG_XMM0,REG_RAX,0,MOD_BASE);
+	}
+	else{
+		//mov rax,ptr[rax]
+		compiler.codeGenerator.op_mov_RM(Type(type).GetSize(),REG_RAX,REG_RAX,0,MOD_BASE);
+	}
+}
+
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn )
+{
+	switch(FuncNum){
+		case FUNC_LEN:
+			if( isCallOn ) Opcode_Func_Len(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_ADDRESSOF:
+			Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
+			break;
+		case FUNC_SIZEOF:
+			if( isCallOn ) Opcode_Func_SizeOf(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_CLASS_SIZEOF:
+			if( isCallOn ) Opcode_Func_ClassSizeOf(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_VARPTR:
+			Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
+			break;
+		case FUNC_OBJPTR:
+			Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
+			break;
+		case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
+			break;
+		case FUNC_DELEGATE_STATICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
+			break;
+		case FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS:
+			if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeCatchAddress();
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS:
+			if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeFinallyAddress();
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_BP:
+			if( isCallOn ) Opcode_Func_System_Get_Bp();
+			resultType.SetBasicType( DEF_INT64 );
+			break;
+		case FUNC_SYSTEM_GET_SP:
+			if( isCallOn ) Opcode_Func_System_Get_Sp();
+			resultType.SetBasicType( DEF_INT64 );
+			break;
+		case FUNC_SYSTEM_GET_COM_VTBL:
+			if( isCallOn ) Opcode_Func_System_GetComVtbl( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_VTBL_LIST:
+			if( isCallOn ) Opcode_Func_System_GetVtblList( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR:
+			if( isCallOn ) Opcode_Func_System_GetDefaultConstructor( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_DESTRUCTOR:
+			if( isCallOn ) Opcode_Func_System_GetDestructor( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+
+		case FUNC_GETDOUBLE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
+			resultType.SetBasicType( DEF_DOUBLE );
+			break;
+		case FUNC_GETSINGLE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
+			resultType.SetBasicType( DEF_SINGLE );
+			break;
+		case FUNC_GETQWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
+			resultType.SetBasicType( DEF_QWORD );
+			break;
+		case FUNC_GETDWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
+			resultType.SetBasicType( DEF_DWORD );
+			break;
+		case FUNC_GETWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
+			resultType.SetBasicType( DEF_WORD );
+			break;
+		case FUNC_GETBYTE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
+			resultType.SetBasicType( DEF_BYTE );
+			break;
+		default:
+			return false;
+	}
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Object.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Object.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Object.cpp	(revision 774)
@@ -0,0 +1,377 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+void _call_constructor( const CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+	////////////////////////////
+	// コンストラクタの呼び出し
+	////////////////////////////
+	
+	//この関数を使用する場合は、
+	//・ebxにオブジェクトの個数（複数個の場合のみ）
+	//・スタックフレームの先頭参照位置に先頭Thisポインタ
+	//をセットしておかなければならない
+
+
+	//jnzの番地
+	/*extern int obp;
+	int jnz_back = obp;*/
+
+	if(bSomeObjects){
+		compiler.errorMessenger.OutputFatalError();
+		//mov qword ptr[rsp+offset],rbx     ※スタックフレームを利用
+		//pobj_sf->push(REG_RBX);
+
+		// ※ここでプッシュされた値はコンストラクタのthisポインタとなる
+		//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+		//pobj_sf->push(REG_RAX);
+	}
+
+
+	////////////////////////
+	// オーバーロードを解決
+	////////////////////////
+
+	std::vector<const UserProc *> subs;
+	pobj_c->GetDynamicMethods().Enum( pobj_c->GetName().c_str(), subs );
+
+	const UserProc *pUserProc;
+	if( subs.size() > 0 ){
+		//オーバーロードを解決
+		pUserProc=OverloadSolutionWithStrParam(pobj_c->GetName().c_str(),
+			subs,CreateParameter,"");
+
+		if(!pUserProc) return;
+	}
+
+	{
+		// 動的型情報をセットする
+		// obj._System_SetType( _System_TypeBase_Search( fullName ) )
+		subs.clear();
+		pobj_c->GetDynamicMethods().Enum( "_System_SetType", subs );
+		if( subs.size() == 1 ){
+			char temporary[VN_SIZE];
+			sprintf( temporary, "_System_TypeBase_Search(\"%s\"))", pobj_c->GetFullName().c_str() );
+
+			Opcode_CallProc(temporary,
+				subs[0],
+				PROCFLAG_NEW,"");
+		}
+		else{
+			compiler.errorMessenger.OutputFatalError();
+		}
+	}
+
+	//コンストラクタを呼び出す
+	Opcode_CallProc(CreateParameter,
+		pUserProc,
+		PROCFLAG_NEW | PROCFLAG_PERMIT_CONSTRUCTOR,"");
+
+	if(bSomeObjects){
+		/*
+		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RAX);
+
+		//mov rbx,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RBX);
+
+		//add rax,TypeSize
+		compiler.codeGenerator.op_add_RV( REG_RAX, ObjectSize );
+
+		//sub rbx,1
+		compiler.codeGenerator.op_sub_RV( sizeof(_int64), REG_RBX, 1 );
+
+		//jnz ↑
+		compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
+		*/
+	}
+}
+void Operator_New( const CClass &objClass, const char *objectSizeStr, const char *parameter, const Type &baseType )
+{
+	const CClass *pClass = &objClass;
+
+	if( pClass->IsInterface() )
+	{
+		pClass = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr();
+	}
+
+	int typeSize = pClass->GetSize();
+
+	if(pClass->IsAbstract())
+	{
+		std::string tempMessage;
+		foreach( const CMethod *pMethod, pClass->GetDynamicMethods() ){
+			if(pMethod->IsVirtual()){
+				if(pMethod->IsAbstract()){
+					if( !tempMessage.empty() )
+					{
+						tempMessage += ", ";
+					}
+					tempMessage += pMethod->GetUserProc().GetName();
+				}
+			}
+		}
+
+		// インターフェイスのvtbl
+		foreach( const ::Interface *pInterface, pClass->GetInterfaces() )
+		{
+			foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+				if(pMethod->IsVirtual()){
+					if(pMethod->IsAbstract()){
+						if( !tempMessage.empty() )
+						{
+							tempMessage += ", ";
+						}
+						tempMessage += pMethod->GetUserProc().GetName();
+					}
+				}
+			}
+		}
+
+		//抽象クラスだったとき
+		compiler.errorMessenger.Output(-1,"\"%s\" は抽象クラスです。インスタンス化することはできません（抽象メソッド … " + tempMessage + "）。",cp);
+	}
+
+	BOOL bSomeObjects=0;
+	if(objectSizeStr[0]){
+		bSomeObjects=1;
+
+		int reg=REG_RAX;
+		Type tempType;
+		NumOpe(&reg,objectSizeStr,Type(),tempType);
+		if( !tempType.IsWhole() ) compiler.errorMessenger.Output(49,NULL,cp);
+
+		//※添え字上限値であることを考慮
+		//add rax,1
+		compiler.codeGenerator.op_add_RV(REG_RAX,1);
+
+		//オブジェクトの個数をrbxに一時保持
+		//※rbxは関数が呼ばれても不変
+		//mov rbx,rax
+		compiler.codeGenerator.op_mov_RR(REG_RBX,REG_RAX);
+
+		//imul rax,size
+		compiler.codeGenerator.op_imul_RV(sizeof(_int64),REG_RAX,typeSize);
+
+		//add rax,OBJECT_HEAD_SIZE
+		compiler.codeGenerator.op_add_RV(REG_RAX,OBJECT_HEAD_SIZE);
+
+		//mov rcx,rax
+		compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RAX);
+	}
+	else{
+		//オブジェクトの個数をrbxに一時保持
+		//※rbxは関数が呼ばれても不変
+		//mov rbx,1
+		compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RBX,1);
+
+		//mov rcx,typeSize+OBJECT_HEAD_SIZE
+		compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,typeSize+OBJECT_HEAD_SIZE);
+	}
+
+	if( baseType.IsObject() ){
+		// オブジェクト インスタンス
+		// ※DeleteはGCで処理
+
+		//call _System_GC_malloc_ForObject
+		extern const UserProc *pSub_System_GC_malloc_ForObject;
+		compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObject);
+	}
+	else{
+		// オブジェクトポインタ
+		// ※明示的なDeleteが必要
+
+		//call _System_GC_malloc_ForObjectPtr
+		extern const UserProc *pSub_System_GC_malloc_ForObjectPtr;
+		compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObjectPtr);
+	}
+
+
+	/*
+	確保されたヒープ領域のポインタ（callocの戻り値eax）をpPtrとすると、
+	pPtr-=OBJECT_HEAD_SIZE ... ( sizeof(DWORD)*4 )
+	pPtr[0]=オブジェクトの個数
+	pPtr[1]=オブジェクトのサイズ
+	pPtr[2]=デストラクタの関数ポインタ
+	pPtr[3]=reserve
+	*/
+
+
+	//mov qword ptr[rax],rbx（オブジェクトの個数）
+	compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	//mov qword ptr[rax],typeSize（オブジェクトのサイズ）
+	compiler.codeGenerator.op_mov_MV(sizeof(_int64),REG_RAX,0, Schedule::None, false, NON_OFFSET,typeSize);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	const CMethod *method = pClass->GetDestructorMethod();
+	if( method == NULL ) return;
+
+	//mov rcx,DestructorProcAddr（デストラクタの関数ポインタ）
+	compiler.codeGenerator.op_addressof( REG_RCX, &method->GetUserProc() );
+
+	//mov qword ptr[rax],rcx
+	compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	// リザーブ領域
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	// ※ここでプッシュされた値はNew演算子の戻り値となる
+	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+	pobj_sf->push(REG_RAX);
+
+
+	//仮想関数テーブルを初期化
+	if( pClass->IsExistVirtualFunctions()
+		&& !pClass->IsAbstract() )
+	{
+		// mov rcx,com_vtbl
+		compiler.codeGenerator.op_mov_RV_com_vtbl( REG_RCX, pClass );
+
+		//mov qword ptr[rax],rcx
+		compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
+
+		// mov rcx,vtblAddress
+		compiler.codeGenerator.op_mov_RV_vtbl( REG_RCX, pClass );
+
+		//mov qword ptr[rax+sizeof(com_vtbl)],rcx
+		compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,PTR_SIZE,MOD_BASE_DISP8);
+
+
+		// 仮想関数になるメソッドに使用チェックをつける
+		foreach( const CMethod *pMethod, pClass->GetDynamicMethods() )
+		{
+			if( pMethod->IsVirtual() )
+			{
+				pMethod->GetUserProc().Using();
+			}
+		}
+		foreach( const ::Interface *pInterface, pClass->GetInterfaces() )
+		{
+			foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() )
+			{
+				if( pMethod->IsVirtual() )
+				{
+					pMethod->GetUserProc().Using();
+				}
+			}
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////////
+
+	////////////////////////////
+	// コンストラクタの呼び出し
+	////////////////////////////
+
+	_call_constructor(pClass,parameter,typeSize,bSomeObjects);
+
+
+	//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_RAX);
+}
+void OpcodeDelete(const char *Parameter, bool isSweeping){
+	int reg=REG_RAX;
+	Type tempType;
+	if( !NumOpe(&reg,Parameter,Type(),tempType) ){
+		return;
+	}
+	if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) compiler.errorMessenger.Output(122,NULL,cp);
+
+	//sub rax,OBJECT_HEAD_SIZE
+	compiler.codeGenerator.op_sub_RV(sizeof(_int64),REG_RAX,OBJECT_HEAD_SIZE);
+
+	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+	pobj_sf->push(REG_RAX);
+
+
+	//mov rbx,qword ptr[rax]（オブジェクトの個数）
+	compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	//mov rsi,qword ptr[rax]（オブジェクトのサイズ）
+	compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RSI,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	//mov rdi,qword ptr[rax]（デストラクタの関数ポインタ）
+	compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RDI,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	// リザーブ領域
+	//add rax,PTR_SIZE
+	compiler.codeGenerator.op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	//mov rcx,rax
+	compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RAX);
+
+
+	//jnzの番地
+	//int jnz_back=obp;
+
+	//mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
+	pobj_sf->push(REG_RCX);
+
+	//call rdi
+	compiler.codeGenerator.PutOld(
+		(char)0xFF,
+		(char)0xD7
+	);
+
+	//mov rcx,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_RCX);
+
+	//add rcx,rsi
+	compiler.codeGenerator.op_add_RR(REG_RCX,REG_RSI);
+
+	//sub rbx,1
+	compiler.codeGenerator.op_sub_RV(sizeof(_int64),REG_RBX,1);
+
+	//jnz ↑
+	//compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
+
+
+	//////////////////////////////////////////
+	// オブジェクトメンバ変数用のメモリを解放
+	//////////////////////////////////////////
+
+	//mov rcx,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_RCX);
+
+	if( isSweeping ){
+		//call _System_GC_free_for_SweepingDelete
+		extern const UserProc *pSub_System_GC_free_for_SweepingDelete;
+		compiler.codeGenerator.op_call(pSub_System_GC_free_for_SweepingDelete);
+	}
+	else{
+		//call free
+		extern const UserProc *pSub_free;
+		compiler.codeGenerator.op_call(pSub_free);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_ProcOp.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_ProcOp.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_ProcOp.cpp	(revision 774)
@@ -0,0 +1,700 @@
+#include "stdafx.h"
+
+#include "Opcode.h"
+
+void SystemProc( const UserProc &userProc ){
+	if( userProc.GetName() == "_System_GetEip" ){
+		//mov rax,qword ptr[rsp]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RAX,REG_RSP,0,MOD_BASE);
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_InitDllGlobalVariables" ){
+		////////////////////////////////////////
+		// DLLのグローバル領域をコンパイル
+		////////////////////////////////////////
+		if(!compiler.IsDll()){
+			//ret
+			compiler.codeGenerator.op_ret();
+
+			return;
+		}
+
+		int BackCp;
+		BackCp=cp;
+		cp=-1;
+
+		//sub rsp,スタックフレームサイズ
+		const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
+
+		if( compiler.IsDebug() )
+		{
+			//デバッグ用の変数を定義
+			DebugVariable();
+		}
+
+		//GC用の変数を定義
+		InitGCVariables();
+
+		//_System_StartupProgramの呼び出し
+		extern const UserProc *pSub_System_StartupProgram;
+		compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+
+		//クラスに属する静的メンバを定義
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_InitStaticMember(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+
+		GetGlobalDataForDll();
+
+		//add rsp,スタックフレームサイズ
+		compiler.codeGenerator.op_add_RV(REG_RSP,pobj_sf->GetFrameSize(0));
+
+		//スタックフレームスケジュール（subコマンドに渡す値）
+		compiler.codeGenerator.opfix( pStackFramePertialSchedule, pobj_sf->GetFrameSize(0) );
+
+		cp=BackCp;
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_InitStaticLocalVariables" ){
+		//静的ローカルオブジェクトのコンストラクタ呼び出し
+
+		//sub rsp,スタックフレームサイズ
+		const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
+
+		foreach( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+
+
+
+			if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
+				//コンストラクタ呼び出し
+				if( pVar->GetType().IsObject() ){
+
+					//エラー用
+					cp=pVar->source_code_address;
+
+					CallConstructor(
+						pVar->GetName().c_str(),
+						pVar->GetSubscripts(),
+						pVar->GetType(),
+						pVar->GetParamStrForConstructor().c_str());
+				}
+			}
+		}
+
+		//add rsp,スタックフレームサイズ
+		compiler.codeGenerator.op_add_RV(REG_RSP,pobj_sf->GetFrameSize(0));
+
+		//スタックフレームスケジュール（subコマンドに渡す値）
+		compiler.codeGenerator.opfix( pStackFramePertialSchedule, pobj_sf->GetFrameSize(0) );
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_Call_Destructor_of_GlobalObject" )
+	{
+		//sub rsp,8（※RSPを16バイト境界にあわせるため）
+		compiler.codeGenerator.op_sub_rsp(0x8);
+		compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+		//add rsp,8
+		compiler.codeGenerator.op_add_RV(REG_RSP,0x8);
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+void AutoGeneration(const UserProc &userProc){
+	if( userProc.GetName() == "InitializeUserTypes"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_TypeBase" )
+	{
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_System_InitializeUserTypes(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+	}
+	else if( userProc.GetName() == "InitializeUserTypesForBaseType"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_TypeBase" )
+	{
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+	}
+	else if( userProc.GetName() == "RegisterGlobalRoots"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_CGarbageCollection" )
+	{
+		Compile_AddGlobalRootsForGc();
+	}
+	else if( userProc.GetName() == compiler.GetGlobalAreaProcName() )
+	{
+		////////////////////////////////////////
+		// グローバル領域をコンパイル
+		////////////////////////////////////////
+
+		UserProc::pGlobalProc = &userProc;
+
+		int BackCp = cp;
+		cp=-1;
+
+		//クラスに属する静的メンバを定義
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_InitStaticMember(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+
+		//グローバル実行領域をコンパイル開始
+		CompileBuffer(0,0);
+
+		//Goto未知ラベルスケジュールが存在したらエラーにする
+		foreach( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
+		{
+			if(pGotoLabelSchedule->GetName().size()>0){
+				compiler.errorMessenger.Output(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
+			}
+			else{
+				char temporary[255];
+				sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
+				compiler.errorMessenger.Output(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
+			}
+		}
+
+		cp=BackCp;
+	}
+	else if( userProc.HasParentClass()
+		&& userProc.IsCastOperator()
+		&& userProc.ReturnType().IsInterface() )
+	{
+		// インターフェイス型にキャストするためのメソッド
+
+		int vtblMasterListIndex = userProc.GetParentClass().GetVtblMasterListIndex( &userProc.ReturnType().GetClass() );
+
+		char temporary[1024];
+		sprintf( temporary,
+			"Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
+			compiler.TypeToString( userProc.ReturnType() ).c_str(),
+			vtblMasterListIndex
+		);
+		MakeMiddleCode( temporary );
+
+		ChangeOpcode( temporary );
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+void _compile_proc(const UserProc *pUserProc){
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i3,i4;
+	char temporary[VN_SIZE];
+
+	if( pUserProc->GetLocalVars().size() ){
+		compiler.errorMessenger.OutputFatalError();
+		return;
+	}
+
+	trace_for_sourcecodestep( "★★★ " << FormatEscapeSequenceStringToDefaultString( pUserProc->GetFullName() ) << "のコンパイルを開始" );
+
+	pUserProc->CompleteCompile();
+
+	extern BOOL bDebugSupportProc;
+	if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
+		if( !compiler.IsDebug() )
+		{
+			return;
+		}
+		bDebugSupportProc=1;
+	}
+	else bDebugSupportProc=0;
+
+	compiler.StartProcedureCompile( pUserProc );
+
+	if(pUserProc->IsAutoGenerationSystem()){
+		////////////////////
+		// 特殊関数
+		////////////////////
+
+		extern int AllLocalVarSize;
+		AllLocalVarSize=0;
+
+		//スタックフレーム管理用オブジェクトを初期化
+		extern StackFrame *pobj_sf;
+		pobj_sf=new StackFrame();
+
+		SystemProc(*pUserProc);
+
+		//スタックフレーム管理用オブジェクトを破棄
+		delete pobj_sf;
+		pobj_sf=0;
+
+		return;
+	}
+
+	if( !pUserProc->IsAutoGeneration() )
+	{
+		// 対象のソースコードを含むオブジェクトモジュールのインデックスを指定する
+		// ※テンプレート展開がされている場合、対象のソースコードが現在のオブジェクトモジュールではない場合がある
+		compiler.SetCurrentRelationalObjectModuleIndexForSource( pUserProc->GetSourceCodePosition().GetRelationalObjectModuleIndex() );
+		basbuf = const_cast<char *>(compiler.GetCurrentSource().GetBuffer());
+
+		cp=pUserProc->GetSourceCodePosition().GetPos();
+		for(;;cp++){
+			if(IsCommandDelimitation(basbuf[cp])) break;
+		}
+		cp--;
+	}
+
+	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+	compiler.codeGenerator.exitSubCodePositions.clear();
+
+	//ラベル用のメモリを確保
+	compiler.codeGenerator.gotoLabels.clear();
+
+	//Gotoラベルスケジュール
+	compiler.codeGenerator.gotoLabelSchedules.clear();
+
+	//With情報を初期化
+	extern WithInfos withInfos;
+	withInfos.clear();
+
+	//Continueアドレスを初期化
+	compiler.codeGenerator.ClearContinueArea();
+
+	//ローカル変数に関する情報
+	extern int AllLocalVarSize;
+	AllLocalVarSize=0;
+
+	//レキシカルスコープ情報を初期化
+	compiler.codeGenerator.lexicalScopes.Init( compiler.codeGenerator.GetNativeCodeSize() );
+
+
+	/////////////////////////////////////
+	// パラメータ用の変数データを考慮
+	/////////////////////////////////////
+
+	//パラメータ用の変数データを考慮
+	for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
+		Parameter &param = *pUserProc->RealParams()[i3];
+
+		Variable *pVar = new Variable(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( param.GetVarName().c_str() ),
+			param,
+			false,
+			param.IsRef(),
+			"",
+			false
+		);
+
+		if( param.IsArray() ){
+			pVar->SetArray( param.GetSubscripts() );
+		}
+
+		int varSize;
+		if( param.IsRef() == false && param.IsStruct() ){
+			//構造体のByValパラメータ
+			pVar->ThisIsByValStructParameter();
+			varSize=PTR_SIZE;
+		}
+		else{
+			if( param.IsArray() == false ){
+				varSize = pVar->GetMemorySize();
+			}
+			else{
+				varSize=PTR_SIZE;
+			}
+		}
+		AllLocalVarSize+=varSize;
+		pVar->SetOffsetAddress( AllLocalVarSize );
+
+		//レキシカルスコープ情報
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		pUserProc->GetLocalVars().push_back( pVar );
+	}
+
+	//Thisポインタを示すローカルオフセット値をセット
+	extern int LocalVar_ThisPtrOffset;
+	LocalVar_ThisPtrOffset=AllLocalVarSize;
+
+	//スタックフレーム管理用クラスを初期化
+	extern StackFrame *pobj_sf;
+	pobj_sf=new StackFrame();
+
+
+	///////////////////////
+	// ここからコード生成
+
+	for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
+		Parameter &param = *pUserProc->RealParams()[i3];
+		if(i3==3){
+			if(param.IsReal()&&param.IsRef() == false){
+				//movsd qword ptr[rsp+0x20],xmm3
+				compiler.codeGenerator.op_movsd_MR(REG_XMM3,REG_RSP,0x20,MOD_BASE_DISP32);
+			}
+			else{
+				//mov qword ptr[rsp+0x20],r9
+				compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_R9,REG_RSP,0x20,MOD_BASE_DISP32);
+			}
+		}
+		if(i3==2){
+			if(param.IsReal()&&param.IsRef() == false){
+				//movsd qword ptr[rsp+0x18],xmm2
+				compiler.codeGenerator.op_movsd_MR(REG_XMM2,REG_RSP,0x18,MOD_BASE_DISP32);
+			}
+			else{
+				//mov qword ptr[rsp+0x18],r8
+				compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_R8,REG_RSP,0x18,MOD_BASE_DISP32);
+			}
+		}
+		if(i3==1){
+			if(param.IsReal()&&param.IsRef() == false){
+				//movsd qword ptr[rsp+0x10],xmm1
+				compiler.codeGenerator.op_movsd_MR(REG_XMM1,REG_RSP,0x10,MOD_BASE_DISP32);
+			}
+			else{
+				//mov qword ptr[rsp+0x10],rdx
+				compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RDX,REG_RSP,0x10,MOD_BASE_DISP32);
+			}
+		}
+		if(i3==0){
+			if(param.IsReal()&&param.IsRef() == false){
+				//movsd qword ptr[rsp+0x8],xmm0
+				compiler.codeGenerator.op_movsd_MR(REG_XMM0,REG_RSP,0x8,MOD_BASE_DISP32);
+			}
+			else{
+				//mov qword ptr[rsp+0x8],rcx
+				compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RCX,REG_RSP,0x8,MOD_BASE_DISP32);
+			}
+		}
+	}
+
+	//ret用のアドレスを考慮
+	AllLocalVarSize+=sizeof(_int64);
+
+	//sub rsp,スタックフレームサイズ
+	const PertialSchedule *pStackFramePertialSchedule = compiler.codeGenerator.op_sub_rsp( 0, true );
+
+	//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+	pobj_sf->push(REG_RBX);
+	pobj_sf->push(REG_RSI);
+	pobj_sf->push(REG_RDI);
+	pobj_sf->push(REG_R12);
+	pobj_sf->push(REG_R13);
+	pobj_sf->push(REG_R14);
+	pobj_sf->push(REG_R15);
+
+	//ローカル変数のベース値
+	int BaseLocalVar;
+	BaseLocalVar=AllLocalVarSize;
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//戻り値が存在するとき
+
+		const char *temp = pUserProc->GetName().c_str();
+		if( temp[0]==1&&temp[1]==ESC_OPERATOR ){
+			temp = "_System_ReturnValue";
+		}
+
+		if( pUserProc->ReturnType().IsStruct() ){
+			//戻り値用の構造体（値型）はパラメータで引き渡される
+		}
+		else{
+			if( pUserProc->ReturnType().IsObject() ){
+				sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() );
+			}
+			else{
+				//戻り値用の変数の定義
+				sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() );
+			}
+
+			OpcodeDim(temporary,0);
+		}
+	}
+
+	const PertialSchedule *pRspOffsetPertialSchedule1 = NULL;
+	const PertialSchedule *pRspOffsetPertialSchedule2 = NULL;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		//mov rdx, qword ptr[rsp+スタックフレームサイズ]
+		pRspOffsetPertialSchedule1 = compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_RDX,REG_RSP,0,MOD_BASE_DISP32, Schedule::None, true );
+
+		//mov rcx,rsp
+		compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RSP);
+
+		//add rcx,スタックフレームサイズ+sizeof(_int64) ※ret用のサイズを考慮
+		pRspOffsetPertialSchedule2 = compiler.codeGenerator.op_add_RV(REG_RCX,0, Schedule::None, true );
+
+		//call _DebugSys_StartProc
+		extern const UserProc *pSub_DebugSys_StartProc;
+		compiler.codeGenerator.op_call(pSub_DebugSys_StartProc);
+	}
+
+	if( compiler.IsCompilingClass() ){
+		if( pUserProc->GetName() == compiler.GetCompilingClass().GetName() ){
+			////////////////////////////////////
+			// コンストラクタをコンパイルするとき
+			////////////////////////////////////
+
+			//コンストラクタのコンパイル開始を通知
+			compiler.GetCompilingClass().NotifyStartConstructorCompile();
+
+			if( compiler.GetCompilingClass().HasSuperClass() )
+			{
+				/* サブクラスコンストラクタをコンパイルしているときは、
+					基底クラスのコンストラクタを呼び出す */
+
+				i3=cp+1;
+				while(IsCommandDelimitation(basbuf[i3])) i3++;
+				for(i4=0;;i3++,i4++){
+					if(!IsVariableChar(basbuf[i3])){
+						temporary[i4]=0;
+						break;
+					}
+					temporary[i4]=basbuf[i3];
+				}
+				if( compiler.GetCompilingClass().GetSuperClass().GetName() == temporary ){
+					//基底クラスのコンストラクタを呼び出す
+					cp=i3;
+					for(i4=0;;cp++,i4++){
+						if(IsCommandDelimitation(basbuf[cp])){
+							temporary[i4]=0;
+							break;
+						}
+						temporary[i4]=basbuf[cp];
+					}
+					if(!(temporary[0]=='('&&temporary[lstrlen(temporary)-1]==')')){
+						compiler.errorMessenger.Output(1,NULL,cp);
+					}
+					RemoveStringPare(temporary);
+
+
+					////////////////////////
+					// オーバーロードを解決
+					////////////////////////
+
+					std::vector<const UserProc *> subs;
+					compiler.GetCompilingClass().GetSuperClass().GetDynamicMethods().Enum( compiler.GetCompilingClass().GetSuperClass().GetName().c_str(), subs );
+
+					const UserProc *pUserProc = NULL;
+					if( subs.size() > 0 )
+					{
+						//オーバーロードを解決
+						pUserProc=OverloadSolutionWithStrParam(  compiler.GetCompilingClass().GetSuperClass().GetName().c_str(),
+							subs,temporary,"");
+					}
+					if( !pUserProc )
+					{
+						compiler.errorMessenger.Output(1,NULL,cp);
+					}
+					else
+					{
+						Type dummyType;
+						CallProc( PROC_DEFAULT
+							, pUserProc
+							, pUserProc->GetName().c_str()
+							, temporary
+							, Type()		// baseTypeはなし
+							, dummyType
+							, true
+							, PROCFLAG_PERMIT_CONSTRUCTOR
+						);
+					}
+				}
+				else{
+					if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() != NULL )
+					{
+						// 基底クラスがデフォルトコンストラクタを保有するとき
+
+						// 基底クラスのコンストラクタを暗黙的に呼び出す
+						Opcode_CallProc("",
+							&compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
+							PROCFLAG_PERMIT_CONSTRUCTOR,
+							""
+						);
+					}
+				}
+			}
+		}
+		else if( pUserProc->IsDestructor() ){
+			//デストラクタをコンパイルしたとき
+
+			//デストラクタのコンパイル開始を通知
+			compiler.GetCompilingClass().NotifyStartDestructorCompile();
+		}
+	}
+
+	//////////////////////////////////////////
+	//////////////////////////////////////////
+	////// プロシージャ内をコンパイル ////////
+	if( pUserProc->IsAutoGeneration() ){
+		AutoGeneration( *pUserProc );
+	}
+	else{
+		if(pUserProc->IsMacro()){
+			CompileBuffer(ESC_ENDMACRO,0);
+		}
+		else{
+			if(pUserProc->IsSub()){
+				CompileBuffer(ESC_ENDSUB,0);
+			}
+			else if(pUserProc->IsFunction()){
+				CompileBuffer(ESC_ENDFUNCTION,0);
+			}
+		}
+	}
+	//////////////////////////////////////////
+	//////////////////////////////////////////
+
+	if( compiler.IsCompilingClass() ){
+
+		if( compiler.GetCompilingClass().IsCompilingConstructor() ){
+			// コンストラクタをコンパイルしていたとき
+
+			// コンストラクタのコンパイルが完了したことを通知
+			compiler.GetCompilingClass().NotifyFinishConstructorCompile();
+		}
+		else if( pUserProc->IsDestructor() ){
+			////////////////////////////////////
+			//デストラクタをコンパイルしたとき
+			////////////////////////////////////
+
+			// デストラクタのコンパイルが完了したことを通知
+			compiler.GetCompilingClass().NotifyFinishDestructorCompile();
+
+			if( compiler.GetCompilingClass().HasSuperClass() ){
+				/* サブクラスのデストラクタをコンパイルしているときは、
+					基底クラスのデストラクタを呼び出す */
+
+				const CMethod *method = compiler.GetCompilingClass().GetSuperClass().GetDestructorMethod();
+				if( method ){
+					Opcode_CallProc("",
+						&method->GetUserProc(),
+						PROCFLAG_PERMIT_DESTRUCTOR,
+						"");
+				}
+			}
+		}
+	}
+
+	// Tryスコープの検証
+	Exception::InspectTryScope();
+
+	//ローカルオブジェクト（レキシカルスコープレベル=0）の解放処理
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+	compiler.codeGenerator.ResolveExitSubSchedule();
+
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		//call _DebugSys_EndProc
+		extern const UserProc *pSub_DebugSys_EndProc;
+		compiler.codeGenerator.op_call(pSub_DebugSys_EndProc);
+	}
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//////////////////////////////////
+		// 戻り値をraxまたはxmm0に設定
+		//////////////////////////////////
+
+		RELATIVE_VAR RelativeVar;
+
+		const char *temp = pUserProc->GetName().c_str();
+		if( temp[0]==1 && temp[1]==ESC_OPERATOR ){
+			temp="_System_ReturnValue";
+		}
+		GetVarOffsetReadWrite(temp,&RelativeVar,Type());
+
+		const Type &returnType = pUserProc->ReturnType();
+		if( returnType.IsObject() || returnType.IsStruct() )
+		{
+			SetVarPtrToReg(REG_RAX,&RelativeVar);
+			if( returnType.IsObject() )
+			{
+				//mov rax,qword ptr[rax]
+				compiler.codeGenerator.op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
+			}
+		}
+		else if( returnType.IsDouble() )
+		{
+			//64ビット実数型
+			SetXmmReg_DoubleVariable(&RelativeVar,REG_XMM0);
+		}
+		else if( returnType.IsSingle() )
+		{
+			//32ビット実数型
+			SetXmmReg_SingleVariable(&RelativeVar,REG_XMM0);
+		}
+		else if( returnType.IsWhole() )
+		{
+			//整数型
+			SetReg_WholeVariable(returnType,&RelativeVar,REG_RAX);
+		}
+		else compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	//ローカル変数領域のサイズをスタックフレームに通知
+	int localParmSize = AllLocalVarSize - BaseLocalVar;
+	int stackFrameSize = pobj_sf->GetFrameSize( localParmSize );
+
+	//ローカル変数アドレススケジュール
+	foreach( const PertialSchedule *pPertialSchedule, compiler.codeGenerator.localVarPertialSchedules )
+	{
+		compiler.codeGenerator.opfix_offset( pPertialSchedule, AllLocalVarSize + stackFrameSize );
+	}
+	compiler.codeGenerator.localVarPertialSchedules.clear();
+	foreach( Variable *pVar, pUserProc->GetLocalVars() ){
+		//後にデバッグで利用する
+		pVar->SetOffsetAddress(
+			AllLocalVarSize + stackFrameSize - pVar->GetOffsetAddress()
+		);
+	}
+
+	//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_R15);
+	pobj_sf->pop(REG_R14);
+	pobj_sf->pop(REG_R13);
+	pobj_sf->pop(REG_R12);
+	pobj_sf->pop(REG_RDI);
+	pobj_sf->pop(REG_RSI);
+	pobj_sf->pop(REG_RBX);
+
+	int stackFrameAndLocalParamSize = localParmSize + stackFrameSize;
+
+	//add rsp,スタックフレームサイズ
+	compiler.codeGenerator.op_add_rsp(stackFrameAndLocalParamSize);
+
+	//ret
+	compiler.codeGenerator.op_ret();
+
+
+	//デバッグ用
+	if( pRspOffsetPertialSchedule1 ){
+		compiler.codeGenerator.opfix( pRspOffsetPertialSchedule1, stackFrameAndLocalParamSize );
+		compiler.codeGenerator.opfix( pRspOffsetPertialSchedule2, stackFrameAndLocalParamSize + sizeof(_int64) );
+	}
+
+
+	//スタックフレームスケジュール（subコマンド）
+	compiler.codeGenerator.opfix( pStackFramePertialSchedule, stackFrameAndLocalParamSize );
+
+	//スタックフレームスケジュールを実行
+	pobj_sf->RunningSchedule( stackFrameSize );
+	delete pobj_sf;
+	pobj_sf=0;
+
+
+	compiler.FinishProcedureCompile();
+
+
+	//ローカル変数のネーム情報は後に解放する
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Set_Var.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Set_Var.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Set_Var.cpp	(revision 774)
@@ -0,0 +1,347 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar){
+	if(pRelativeVar->bOffsetOffset||pRelativeVar->dwKind==VAR_DIRECTMEM) return 1;
+	return 0;
+}
+
+void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap){
+	int RightTermReg;
+	pobj_reg=new CRegister(REG_RCX);
+
+	//VarRegにオブジェクトポインタをコピー
+	int VarReg;
+	VarReg=pobj_reg->LockReg();
+	SetVarPtrToReg(VarReg,pRelativeVar);
+
+	//右辺
+	if( calcType.IsReal() ){
+		RightTermReg=pobj_reg->LockXmmReg();
+
+		if( calcType.IsDouble() ){
+			//movlsd RightTermReg,xmm0
+			compiler.codeGenerator.op_movsd_RR(RightTermReg,REG_XMM0);
+		}
+		else if( calcType.IsSingle() ){
+			//movlss RightTermReg,xmm0
+			compiler.codeGenerator.op_movss_RR(RightTermReg,REG_XMM0);
+		}
+	}
+	else{
+		RightTermReg=pobj_reg->LockReg();
+
+		//mov RightTermReg,rax
+		compiler.codeGenerator.op_mov_RR(RightTermReg,REG_RAX);
+	}
+
+	//右辺用レジスタを解除
+	if( calcType.IsReal() ) pobj_reg->UnlockXmmReg();
+	else pobj_reg->UnlockReg();
+
+	//左辺用レジスタを解除
+	pobj_reg->UnlockReg();
+
+	//レジスタ管理オブジェクトを破棄
+	delete pobj_reg;
+	pobj_reg=0;
+
+
+	if( calcType.IsStruct() ){
+		if( varType.GetClass().IsEquals( &calcType.GetClass() ) ){			//等しい
+
+				//双方のオブジェクト型が一致、または派生・継承関係にあるとき
+				//※コピーを行う
+
+				//mov rsi,RightTermReg
+				compiler.codeGenerator.op_mov_RR(REG_RSI,RightTermReg);
+
+				//mov rdi,VarReg
+				compiler.codeGenerator.op_mov_RR(REG_RDI,VarReg);
+
+				int object_size = varType.GetClass().GetSize();
+
+				//mov rcx,object_size
+				compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+				if(bUseHeap){
+					//mov rax,rsi
+					compiler.codeGenerator.op_mov_RR(REG_RAX,REG_RSI);
+				}
+
+				//rep movs byte ptr[rdi],byte ptr[rsi]
+				compiler.codeGenerator.op_rep_movs(sizeof(BYTE));
+
+				if(bUseHeap){
+					//mov rcx,rax
+					compiler.codeGenerator.op_mov_RR(REG_RCX,REG_RAX);
+
+					//call free
+					extern const UserProc *pSub_free;
+					compiler.codeGenerator.op_call(pSub_free);
+				}
+
+				return;
+		}
+	}
+
+	compiler.errorMessenger.Output(1,NULL,cp);
+}
+
+
+void SetDoubleVariable(int type,RELATIVE_VAR *pRelative){
+	//////////////////////////
+	// Double型変数に書き込む
+	//////////////////////////
+
+	//xmm0に型変換
+	ChangeTypeToXmm_Double(type,REG_XMM0,REG_RAX);
+
+	if(pRelative->dwKind==VAR_GLOBAL){
+		if(pRelative->bOffsetOffset){
+			//movsd qword ptr[r11+offset],xmm0
+			compiler.codeGenerator.op_movsd_MR( REG_XMM0, REG_R11, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//movsd qword ptr[offset],xmm0
+			compiler.codeGenerator.op_movsd_MR( REG_XMM0, 0, (long)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelative->dwKind==VAR_REFGLOBAL){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else if(pRelative->dwKind==VAR_LOCAL){
+		if(pRelative->bOffsetOffset){
+			//movsd qword ptr[rsp+r11+offset],xmm0
+			compiler.codeGenerator.PutOld(
+				(char)0xF2,
+				(char)0x42,
+				(char)0x0F,
+				(char)0x11,
+				(char)0x84,
+				(char)0x1C
+			);
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.PutOld( (long)pRelative->offset, true )
+			);
+		}
+		else{
+			//movsd qword ptr[rsp+offset],xmm0
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_movsd_MR( REG_XMM0, REG_RSP, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelative->dwKind == VAR_REFLOCAL ){
+		if(pRelative->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+		//movsd qword ptr[r11],xmm0
+		compiler.codeGenerator.op_movsd_MR( REG_XMM0, REG_R11, 0, MOD_BASE );
+	}
+}
+void SetSingleVariable(int type,RELATIVE_VAR *pRelative){
+	//////////////////////////
+	// Single型変数に書き込む
+	//////////////////////////
+
+	//xmm0に型変換
+	ChangeTypeToXmm_Single(type,REG_XMM0,REG_RAX);
+
+	if(pRelative->dwKind==VAR_GLOBAL){
+		if(pRelative->bOffsetOffset){
+			//movss dword ptr[r11+offset],xmm0
+			compiler.codeGenerator.op_movss_MR( REG_XMM0, REG_R11, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//movss dword ptr[offset],xmm0
+			compiler.codeGenerator.op_movss_MR( REG_XMM0, 0, (long)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelative->dwKind==VAR_REFGLOBAL){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else if(pRelative->dwKind==VAR_LOCAL){
+		if(pRelative->bOffsetOffset){
+			//movss dword ptr[rsp+r11+offset],xmm0
+			compiler.codeGenerator.PutOld(
+				(char)0xF3,
+				(char)0x42,
+				(char)0x0F,
+				(char)0x11,
+				(char)0x84,
+				(char)0x1C
+			);
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.PutOld( (long)pRelative->offset, true )
+			);
+		}
+		else{
+			//movss dword ptr[rsp+offset],xmm0
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_movss_MR( REG_XMM0, REG_RSP, (long)pRelative->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelative->dwKind == VAR_REFLOCAL ){
+		if(pRelative->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+		//movss dword ptr[r11],xmm0
+		compiler.codeGenerator.op_movss_MR( REG_XMM0, REG_R11, 0, MOD_BASE );
+	}
+}
+void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar){
+	if(VarType==DEF_DOUBLE){
+		//Double型変数へスタックの内容を格納する
+		SetDoubleVariable(CalcType,pRelativeVar);
+	}
+	else if(VarType==DEF_SINGLE){
+		//Single型変数へスタックの内容を格納する
+		SetSingleVariable(CalcType,pRelativeVar);
+	}
+}
+void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
+	if(type==DEF_DOUBLE){
+		//Double型
+
+		//cvttsd2si rax,xmm0
+		compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+	}
+	else if(type==DEF_SINGLE){
+		//Single型
+
+		//cvttss2si rax,xmm0
+		compiler.codeGenerator.op_cvttss2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+	}
+
+	//cmp rax,0
+	compiler.codeGenerator.op_cmp_value(Type(type).GetSize(),REG_RAX,0);
+
+	//setne al
+	compiler.codeGenerator.op_setne( REG_RAX );
+
+	SetWholeVariable( sizeof(char), DEF_BYTE, pRelative);
+}
+void SetWholeVariable(int varSize,int type,RELATIVE_VAR *pRelative){
+	if(type==DEF_DOUBLE){
+		//Double型
+
+		//cvttsd2si rax,xmm0
+		compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+	}
+	else if(type==DEF_SINGLE){
+		//Single型
+
+		//cvttss2si rax,xmm0
+		compiler.codeGenerator.op_cvttss2si_xmm(sizeof(_int64),REG_RAX,REG_XMM0);
+	}
+	else{
+		//その他の整数
+
+		if(varSize==sizeof(_int64)){
+			//レジスタの値を64ビット（rax）に拡張する
+			ExtendTypeTo64(type,REG_RAX);
+		}
+		else if(varSize==sizeof(long)){
+			//レジスタの値を32ビット（eax）に拡張する
+			ExtendTypeTo32(type,REG_RAX);
+		}
+		else if(varSize==sizeof(short)){
+			//レジスタの値を16ビット（ax）に拡張する
+			ExtendTypeTo16(type,REG_RAX);
+		}
+		//8ビットは拡張なし
+	}
+
+	if(pRelative->dwKind==VAR_GLOBAL){
+		if(pRelative->bOffsetOffset){
+			//mov ptr[r11+offset],rax/eax/ax/al
+			compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_R11,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov ptr[offset],rax/eax/ax/al
+			compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,0,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if( pRelative->dwKind == VAR_REFGLOBAL ){
+		if(pRelative->bOffsetOffset){
+			//add r11,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelative->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov r11,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_LOCAL){
+		if(pRelative->bOffsetOffset){
+			//mov ptr[rsp+r11+offset],rax/eax/ax/al
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_MR_ex(varSize,REG_RAX,REG_RSP,REG_R11,(int)pRelative->offset,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ptr[rsp+offset],rax/eax/ax/al
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelative->dwKind == VAR_REFLOCAL ){
+		if(pRelative->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_RSP, (int)pRelative->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+
+		//mov ptr[r11],rax/eax/ax/al
+		compiler.codeGenerator.op_mov_MR(varSize,REG_RAX,REG_R11,0,MOD_BASE);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Statement.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Statement.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Statement.cpp	(revision 774)
@@ -0,0 +1,1052 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void OpcodeOthers(const char *Command){
+	int i,i2;
+
+	char leftTerm[8192];
+	int lastParePos = 0;
+	for(i=0;;i++){
+		if(Command[i]=='\"'){
+			//ダブルクォートは不正なのでエラー扱い
+			leftTerm[i]=0;
+			compiler.errorMessenger.Output(3,leftTerm,cp);
+			return;
+		}
+
+		if(Command[i]=='('){
+			lastParePos = i;
+			i2=GetStringInPare(leftTerm+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='['){
+			i2=GetStringInBracket(leftTerm+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='\0'){
+			leftTerm[i] = 0;
+			break;
+		}
+
+		if( IsNumCalcMark( Command, i ) ){
+			leftTerm[i] = 0;
+			break;
+		}
+
+		leftTerm[i]=Command[i];
+	}
+	if(!(
+		IsVariableTopChar(leftTerm[0])||
+		leftTerm[0]=='.'||
+		(leftTerm[0]==1&&leftTerm[1]==ESC_PSMEM)
+		)){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+
+	if(Command[i]=='\0' && lastParePos == 0){
+		//////////////////////////////
+		// パラメータ無しのマクロ検索
+		//////////////////////////////
+
+		const UserProc *pUserProc=GetSubHash(Command);
+
+		//GetSubHash内でエラー提示が行われた場合
+		if(pUserProc==(UserProc *)-1) return;
+
+		if(pUserProc==0){
+			char temporary[VN_SIZE];
+			lstrcpy(temporary,Command);
+
+			CharUpper(temporary);
+			pUserProc=GetSubHash(temporary);
+
+			//GetSubHash内でエラー提示が行われた場合
+			if(pUserProc==(UserProc *)-1) return;
+		}
+
+		if(pUserProc){
+			if( !pUserProc->IsMacro() ){
+				compiler.errorMessenger.Output(10,Command,cp);
+			}
+
+			Opcode_CallProc("",pUserProc,0,"");
+
+			return;
+		}
+	}
+	else if(IsNumCalcMark(Command,i)){
+		//代入演算
+		OpcodeCalc(Command);
+		return;
+	}
+
+	if( pobj_reg ){
+		compiler.errorMessenger.OutputFatalError();
+	}
+	pobj_reg=new CRegister(REG_RAX);
+
+	Type resultType;
+	bool isLiteral, isNeedHeapFreeStructure = false;
+	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, isNeedHeapFreeStructure, NULL, true );
+
+	delete pobj_reg;
+	pobj_reg = NULL;
+
+	if( result ){
+
+		/////////////////////
+		// 戻り値の処理
+		/////////////////////
+
+		if( resultType.IsStruct() ){
+			//mov r14,rax
+			compiler.codeGenerator.op_mov_RR(REG_R14,REG_RAX);
+
+			FreeTempObject(REG_R14,&resultType.GetClass());
+		}
+
+		return;
+	}
+
+	// どこにも当てはまらなかったため、失敗
+	compiler.errorMessenger.Output(1,NULL,cp);
+}
+
+void Judgment(char *buffer){
+	int reg=REG_RAX;
+	Type resultType;
+	bool isNeedHeapFreeStructure;
+	if( !NumOpe(&reg,buffer,Type(DEF_BOOLEAN),resultType, &isNeedHeapFreeStructure) ){
+		return;
+	}
+
+	if( resultType.IsObject() )
+	{
+		// Boolean型にキャストする
+		Type booleanType( DEF_BOOLEAN );
+		CallCastOperatorProc( reg, resultType, isNeedHeapFreeStructure, booleanType );
+		resultType = booleanType;
+	}
+
+	int offset;
+
+	if(resultType.IsDouble()){
+		double dbl=0;
+		offset=compiler.GetObjectModule().dataTable.Add( dbl );
+
+		//comisd xmm0,qword ptr[data table offset]
+		compiler.codeGenerator.PutOld(
+			(char)0x66,
+			(char)0x0F,
+			(char)0x2F,
+			(char)0x04,
+			(char)0x25
+		);
+		compiler.codeGenerator.PutOld(
+			(long)offset,
+			Schedule::DataTable
+		);
+	}
+	else if(resultType.IsSingle()){
+		float flt=0;
+		offset=compiler.GetObjectModule().dataTable.Add( flt );
+
+		//comiss xmm0,dword ptr[data table offset]
+		compiler.codeGenerator.PutOld(
+			(char)0x0F,
+			(char)0x2F,
+			(char)0x04,
+			(char)0x25
+		);
+		compiler.codeGenerator.PutOld(
+			(long)offset,
+			Schedule::DataTable
+		);
+	}
+	else{
+		//整数型
+
+		//cmp rax,0
+		compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
+	}
+}
+
+void OpcodeIf(char *Parameter){
+	for(int i=0;;i++){
+		if(Parameter[i]=='\0'){
+			compiler.errorMessenger.Output(21,NULL,cp);
+			return;
+		}
+		if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
+			Parameter[i]=0;
+			break;
+		}
+	}
+
+	//条件式を実行してフラグをセット
+	Judgment(Parameter);
+
+	//je (endif、または else まで条件ジャンプ)
+	const PertialSchedule *pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+
+	/////////////////////////
+	// If内をコード化
+	/////////////////////////
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start(
+		compiler.codeGenerator.GetNativeCodeSize(),
+		LexicalScope::SCOPE_TYPE_IF
+	);
+
+	int i2=CompileBuffer(ESC_ENDIF,0);
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+
+	if(i2==ESC_ELSE){
+		//jmp (endifまで)
+		const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
+
+
+
+		/////////////////////////
+		// Else内をコード化
+		/////////////////////////
+
+		//レキシカルスコープをレベルアップ
+		compiler.codeGenerator.lexicalScopes.Start(
+			compiler.codeGenerator.GetNativeCodeSize(),
+			LexicalScope::SCOPE_TYPE_IF
+		);
+
+		CompileBuffer(ESC_ENDIF,0);
+
+		//レキシカルスコープをレベルダウン
+		compiler.codeGenerator.lexicalScopes.End();
+
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+	}
+	else{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
+	}
+}
+
+int GetLabelAddress(char *LabelName,int LineNum){
+	if(LabelName){
+		foreach( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
+		{
+			if( label.name.size() > 0 )
+			{
+				if( label.name == LabelName )
+				{
+					return label.address;
+				}
+			}
+		}
+	}
+	else{
+		foreach( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
+		{
+			if( label.name.size() == 0 )
+			{
+				if( label.line == LineNum )
+				{
+					return label.address;
+				}
+			}
+		}
+	}
+	return -1;
+}
+void OpcodeGoto(char *Parameter){
+	extern HANDLE hHeap;
+	int i,LineNum;
+
+	if(Parameter[0]=='*'){
+		i=GetLabelAddress(Parameter+1,0);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+	else{
+		LineNum=atoi(Parameter);
+		i=GetLabelAddress(0,LineNum);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+}
+void OpcodeWhile(char *Parameter){
+	extern HANDLE hHeap;
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	if(!Parameter[0]) compiler.errorMessenger.Output(10,"While",cp);
+
+	//条件式を実行してフラグをセット
+	Judgment(Parameter);
+
+	//je (Wend まで)
+	const PertialSchedule *pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_WHILE );
+
+	//While内をコンパイル
+	CompileBuffer(0,COM_WEND);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+char szNextVariable[VN_SIZE];
+void OpcodeFor(char *Parameter){
+	extern HANDLE hHeap;
+	Type resultType;
+	int i,i2;
+	char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
+	bool isError = false;
+
+	//第１パラメータを取得
+	i=GetOneParameter(Parameter,0,temporary);
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(12,"For",cp);
+		isError = true;
+		goto ErrorStep;
+	}
+
+	for(i2=0;;i2++){
+		if(temporary[i2]=='='){
+			variable[i2]=0;
+
+			//カウンタ初期化
+			OpcodeCalc(temporary);
+			break;
+		}
+		if(temporary[i2]=='\0'){
+			compiler.errorMessenger.Output(12,"For",cp);
+			isError = true;
+			goto ErrorStep;
+		}
+		variable[i2]=temporary[i2];
+	}
+
+	//jmp ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	//第２パラメータを取得（to～）
+	i=GetOneParameter(Parameter,i,JudgeNum);
+
+	//第３パラメータを取得（step～）
+	if(Parameter[i]){
+		i=GetOneParameter(Parameter,i,StepNum);
+		if(Parameter[i]) compiler.errorMessenger.Output(12,"For",cp);
+	}
+	else lstrcpy(StepNum,"1");
+
+	//カウンタを増加させる
+	sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
+	OpcodeCalc(temporary);
+
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//増加か減少かを区別する
+	sprintf(temporary,"(%s)>=0",StepNum);
+
+	int reg;
+	reg=REG_RAX;
+	if( !NumOpe(&reg,temporary,Type(),resultType) ){
+		return;
+	}
+
+	//cmp rax,0
+	compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
+
+	//je [カウンタ減少の場合の判定]
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	//判定（カウンタ増加の場合）
+	sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
+
+	reg=REG_RAX;
+	NumOpe(&reg,temporary,Type(),Type());
+
+	//jmp [カウンタ減少の場合の判定を飛び越す]
+	const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//判定（カウンタ減少の場合）
+	sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
+
+	reg=REG_RAX;
+	NumOpe(&reg,temporary,Type(),resultType);
+
+	//jmpジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+
+	//cmp rax,0
+	compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
+
+ErrorStep:
+
+	//je ...
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+
+	//For内をコンパイル
+	CompileBuffer(0,COM_NEXT);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	if(szNextVariable[0]){
+		if(lstrcmp(szNextVariable,variable)!=0){
+			compiler.errorMessenger.Output(55,szNextVariable,cp);
+		}
+	}
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+void OpcodeForeach( const char *Parameter )
+{
+	Type resultType;
+	char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
+	bool isError = false;
+	std::string elementTypeName;
+
+	//第１パラメータを取得
+	int i = 0;
+	GetCustomToken( variable, Parameter, i, ESC_IN, true );
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(12,"Foreach",cp);
+		isError = true;
+		goto ErrorStep;
+	}
+	i++;
+
+	//第２パラメータを取得（in～）
+	lstrcpy( collectionVar, Parameter + i );
+
+
+	Exception::TryCommand(); //Finallyで_System_ForeachEnumerator.Disposeするため
+
+	//Enumeratorの取得
+	sprintf(temporary,"_System_ForeachEnumerator=%s.GetEnumerator()", collectionVar );
+	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+
+	{
+		Type collectionType;
+		if( !NumOpe_GetType( collectionVar, Type(), collectionType ) )
+		{
+			isError = true;
+			goto ErrorStep;
+		}
+
+		Type elementType;
+		if( collectionType.GetClass().IsExpanded() )
+		{
+			// テンプレート展開されたジェネリッククラス
+			elementType = collectionType.GetClass().expandedClassActualTypeParameters[0];
+		}
+		else
+		{
+			// 通常のジェネリッククラス
+			elementType = collectionType.GetActualGenericType(0);
+		}
+
+		elementTypeName = compiler.TypeToString( elementType );
+	}
+
+	if( !GetVarType( variable, resultType, false ) )
+	{
+
+		// 未定義の場合は自動的に定義する
+		sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+	}
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	// MoveNextメソッドを呼び出す
+	int reg = REG_RAX;
+	NumOpe( &reg, "_System_ForeachEnumerator.MoveNext()", Type(), resultType );
+
+	//cmp rax,0
+	compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
+
+ErrorStep:
+
+	//je ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	if( !isError )
+	{
+		// Currentプロパティから現在の値を取得
+		sprintf( temporary, "%s=_System_ForeachEnumerator.Current%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
+		Compile( temporary );
+	}
+
+	//For内をコンパイル
+	CompileBuffer(0,COM_NEXT);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	if(szNextVariable[0]){
+		if(lstrcmp(szNextVariable,variable)!=0){
+			compiler.errorMessenger.Output(55,szNextVariable,cp);
+		}
+	}
+
+	if( !isError )
+	{
+		//jmp ...
+		compiler.codeGenerator.op_jmp_continue();
+	}
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Disposeを呼んでTryスコープを終える
+	Exception::FinallyCommand();
+	Compile( "_System_ForeachEnumerator.Dispose()" );
+	Exception::EndTryCommand();
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+void OpcodeDo(char *Parameter){
+	extern HANDLE hHeap;
+	int i,i2,i3;
+
+	if(Parameter[0]) compiler.errorMessenger.Output(10,"Do",cp);
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_DO );
+
+	//Do内をコンパイル
+	CompileBuffer(0,COM_LOOP);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	const PertialSchedule *pDoPertialSchedule = NULL;
+
+	extern char *basbuf;
+	char temporary[VN_SIZE];
+	for(i=cp-1;;i--){
+		if(IsCommandDelimitation(basbuf[i])){
+			i+=3;
+			if(!(basbuf[i]=='0'||basbuf[i]=='1')){
+				//無条件ループ
+				break;
+			}
+			i3=i;
+
+			for(i+=2,i2=0;;i++,i2++){
+				if(IsCommandDelimitation(basbuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+
+			//条件式を実行してフラグをセット
+			Judgment(temporary);
+
+			if(basbuf[i3]=='0'){
+				//While
+
+				//je 5（ループ終了）
+				pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
+			}
+			else if(basbuf[i3]=='1'){
+				//Until
+
+				//jne 5（ループ終了）
+				pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+			}
+			break;
+		}
+	}
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	if( pDoPertialSchedule )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
+	}
+
+	//jmp ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jmpジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+void OpcodeContinue(void){
+	//jmp ...(Continue addr)
+	compiler.codeGenerator.op_jmp_continue();
+}
+
+void OpcodeExitSub(void){
+	if( compiler.IsGlobalAreaCompiling() ){
+		compiler.errorMessenger.Output(12,"Exit Sub/Function",cp);
+		return;
+	}
+
+	//未解放のローカルオブジェクトのデストラクタを呼び出す
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn();
+
+	//jmp ...(End Sub/Function)
+	compiler.codeGenerator.op_jmp_exitsub();
+}
+
+//Caseスケジュール
+class SelectSchedule
+{
+public:
+	SelectSchedule( int typeSize )
+		: typeSize( typeSize )
+		, nowCaseSchedule( 0 )
+	{
+	}
+
+	PertialSchedules casePertialSchedules;
+	int typeSize;
+	int nowCaseSchedule;
+};
+std::vector<SelectSchedule> selectSchedules;
+
+void OpcodeSelect( const char *lpszParms )
+{
+	extern HANDLE hHeap;
+	extern char *basbuf;
+	int i,i2,i3,NowCaseCp;
+	char temporary[VN_SIZE];
+	
+	int reg1=REG_RAX;
+	Type type1;
+	bool result = NumOpe(&reg1,lpszParms,Type(), type1 );
+
+	selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
+
+	if( result )
+	{
+		if( selectSchedules.back().typeSize < sizeof(long) ){
+			selectSchedules.back().typeSize = sizeof(long);
+		}
+
+		if(type1.IsDouble()){
+			//movsd qword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
+			pobj_sf->push(reg1,sizeof(double));
+		}
+		else if(type1.IsSingle()){
+			//movss dword ptr[rsp+offset],xmm_reg		※スタックフレームを利用
+			pobj_sf->push(reg1,sizeof(float));
+		}
+		else{
+			ExtendTypeTo64(type1.GetBasicType(),reg1);
+
+			//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+			pobj_sf->push(reg1);
+		}
+
+		for(i=cp;;i++){
+			if(basbuf[i]=='\0'){
+				selectSchedules.pop_back();
+				compiler.errorMessenger.Output(22,"Select",cp);
+				return;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
+				for(i2=0;;i++){
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
+						i2--;
+						if(i2==0) break;
+					}
+				}
+				continue;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT) break;
+
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
+				NowCaseCp=i;
+
+				i++;
+				while(1){
+					for(i++,i2=0;;i++,i2++){
+						if(basbuf[i]=='\"'){
+							i3=GetStringInQuotation(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='('){
+							i3=GetStringInPare(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='['){
+							i3=GetStringInBracket(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+
+						if(IsCommandDelimitation(basbuf[i])){
+							temporary[i2]=0;
+							break;
+						}
+						if(basbuf[i]==','){
+							temporary[i2]=0;
+							break;
+						}
+
+						temporary[i2]=basbuf[i];
+					}
+
+					//エラー用
+					i2=cp;
+					cp=NowCaseCp;
+
+					int reg2=REG_RDX;
+					Type type2;
+					if( !NumOpe(&reg2,temporary,type1,type2) ){
+						return;
+					}
+
+					cp=i2;
+
+					if(type1.IsObject()){
+						std::vector<const UserProc *> subs;
+						type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
+						if( subs.size() == 0 ){
+							return;
+						}
+
+						Parameters params;
+						params.push_back( new Parameter( "", Type( type2 ) ) );
+
+						//オーバーロードを解決
+						const UserProc *pUserProc = OverloadSolution( "==", subs, params, Type( DEF_BOOLEAN ), type1 );
+
+						delete params[0];
+
+						if(!pUserProc){
+							//エラー
+							return;
+						}
+
+
+						//実体オブジェクト
+						if(reg2!=REG_RDX){
+							//mov rdx,reg2
+							compiler.codeGenerator.op_mov_RR(REG_RDX,reg2);
+						}
+
+						//mov rcx,qword ptr[rsp+offset]		※スタックフレームから参照
+						pobj_sf->ref(REG_RCX);
+
+						//call operator_proc	※ ==演算子
+						compiler.codeGenerator.op_call(pUserProc);
+
+						//test rax,rax
+						compiler.codeGenerator.op_test(REG_RAX,REG_RAX);
+
+						//jne ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_jne( 0, sizeof(long), true )
+						);
+					}
+					else{
+						if(type1.IsDouble()){
+							int xmm_reg;
+							if(IsXmmReg(reg2)) xmm_reg=reg2;
+							else xmm_reg=REG_XMM5;
+							ChangeTypeToXmm_Double(type2.GetBasicType(),xmm_reg,reg2);
+
+							//movsd xmm4,qword ptr[rsp+offset]	※スタックフレームから参照
+							pobj_sf->ref(REG_XMM4,sizeof(double));
+
+							//comiss xmm_reg1,xmm_reg2
+							compiler.codeGenerator.op_comisd(xmm_reg,REG_XMM4);
+						}
+						else if(type1.IsSingle()){
+							int xmm_reg;
+							if(IsXmmReg(reg2)) xmm_reg=reg2;
+							else xmm_reg=REG_XMM5;
+							ChangeTypeToXmm_Single(type2.GetBasicType(),xmm_reg,reg2);
+
+							//movss xmm4,dword ptr[rsp+offset]	※スタックフレームから参照
+							pobj_sf->ref(REG_XMM4,sizeof(float));
+
+							//comiss xmm_reg1,xmm_reg2
+							compiler.codeGenerator.op_comiss(xmm_reg,REG_XMM4);
+						}
+						else{
+							//その他整数型
+
+							i2=NeutralizationType(type1.GetBasicType(),-1,type2.GetBasicType(),-1);
+
+							//mov r14,qword ptr[rsp+offset]		※スタックフレームから参照
+							pobj_sf->ref(REG_R14);
+
+							//cmp reg2,r14
+							compiler.codeGenerator.op_cmp_reg(Type(i2).GetSize(),reg2,REG_R14);
+						}
+
+						//je ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_je( 0, sizeof(long), true )
+						);
+					}
+
+					if(basbuf[i]!=',') break;
+				}
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
+				//jmp ...
+				selectSchedules.back().casePertialSchedules.push_back(
+					compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+				);
+			}
+		}
+
+		//スタックフレームを1スペースだけ解除
+		pobj_sf->pop(REG_NON);
+	}
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_SELECT );
+
+	//Select Case内をコンパイル
+	CompileBuffer(ESC_ENDSELECT,0);
+
+	//jmp EndSelect
+	selectSchedules.back().casePertialSchedules.push_back(
+		compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+	);
+
+	//最終スケジュール
+	for(i=selectSchedules.back().nowCaseSchedule;i<(int)selectSchedules.back().casePertialSchedules.size();i++){
+		compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[i] );
+	}
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	selectSchedules.pop_back();
+}
+void OpcodeCase(char *Parameter){
+	int i;
+
+	if(selectSchedules.back().typeSize==-1){
+		compiler.errorMessenger.Output(30,"Case",cp);
+		return;
+	}
+
+	//jmp EndSelect
+	selectSchedules.back().casePertialSchedules.push_back(
+		compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+	);
+
+	i=0;
+	while(1){
+		//Caseスケジュール
+		compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[selectSchedules.back().nowCaseSchedule] );
+		selectSchedules.back().nowCaseSchedule++;
+
+		i=JumpOneParameter(Parameter,i);
+		if(Parameter[i]=='\0') break;
+	}
+}
+
+void OpcodeGosub(char *Parameter){
+	compiler.errorMessenger.Output(-1,"Gosub ～ Returnステートメントは64ビットコンパイラで利用することはできません。",cp);
+}
+void OpcodeReturn(char *Parameter){
+	if( compiler.IsGlobalAreaCompiling() ){
+		compiler.errorMessenger.Output(62,NULL,cp);
+	}
+	else{
+		//戻り値をセット
+		if(Parameter[0]){
+			const UserProc &proc = compiler.GetCompilingUserProc();
+
+			const char *temp = "_System_ReturnValue";
+			if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
+			{
+			}
+			else{
+				temp=proc.GetName().c_str();
+			}
+
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s=%s",temp,Parameter);
+			OpcodeCalc(temporary);
+		}
+
+		//プロシージャを抜け出す（C言語のreturnと同様の処理を行う）
+		OpcodeExitSub();
+	}
+}
+
+
+////////////
+// ポインタ
+////////////
+
+void OpcodeSetPtrData(char *Parameter,int type){
+	int i;
+	char temporary[VN_SIZE];
+
+	if(Parameter[0]=='('){
+		i=JumpStringInPare(Parameter,1);
+		if(Parameter[i+1]=='\0'){
+			for(i=0;;i++){
+				Parameter[i]=Parameter[i+1];
+				if(Parameter[i]=='\0') break;
+			}
+			Parameter[i-1]=0;
+		}
+	}
+
+	//第１パラメータを取得
+	i=GetOneParameter(Parameter,0,temporary);
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	int reg_ptr=REG_RAX;
+	Type resultType;
+	if( !NumOpe(&reg_ptr,temporary,Type(),resultType) ){
+		return;
+	}
+	if(!resultType.IsWhole()){
+		compiler.errorMessenger.Output(11,Parameter,cp);
+		return;
+	}
+
+	//結果を格納しているレジスタをブロッキング
+	pobj_BlockReg->lock(reg_ptr);
+
+	//第２パラメータを取得
+	i=GetOneParameter(Parameter,i,temporary);
+	if(Parameter[i]){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	int temp_reg=REG_NON;
+	if( !NumOpe(&temp_reg,temporary,Type(),resultType) ){
+		return;
+	}
+
+	//レジスタのブロッキングを解除
+	pobj_BlockReg->clear();
+
+	if(type==DEF_DOUBLE){
+		ChangeTypeToXmm_Double(resultType.GetBasicType(),REG_XMM0,temp_reg);
+
+		//movsd qword ptr[reg_ptr],xmm0
+		compiler.codeGenerator.op_movsd_MR(REG_XMM0,reg_ptr,0,MOD_BASE);
+	}
+	else if(type==DEF_SINGLE){
+		ChangeTypeToXmm_Single(resultType.GetBasicType(),REG_XMM0,temp_reg);
+
+		//movss dword ptr[reg_ptr],xmm0
+		compiler.codeGenerator.op_movss_MR(REG_XMM0,reg_ptr,0,MOD_BASE);
+	}
+	else{
+		ChangeTypeToWhole(resultType,Type(type),REG_RCX,temp_reg);
+
+		//mov ptr[reg_ptr],rcx
+		compiler.codeGenerator.op_mov_MR(Type(type).GetSize(),REG_RCX,reg_ptr,0,MOD_BASE);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Compile_Var.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Compile_Var.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Compile_Var.cpp	(revision 774)
@@ -0,0 +1,1361 @@
+#include "stdafx.h"
+
+#include "Opcode.h"
+
+//変数
+// TODO: xml未完成
+int AllLocalVarSize;
+
+using namespace ActiveBasic::Compiler;
+
+void SetRelativeOffset( Type &resultType, RELATIVE_VAR *pRelativeVar,const char *lpPtrOffset){
+	/////////////////////////////////////////////
+	// 先頭ポインタをr12に取得してメモリへ退避
+	/////////////////////////////////////////////
+
+	SetReg_WholeVariable(Type(DEF_INT64),pRelativeVar,REG_R11);
+
+	//mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
+	pobj_sf->push(REG_R11);
+
+
+	////////////////////////////////
+	// 添え字を計算する
+	////////////////////////////////
+
+	int reg=REG_NON;
+	Type type;
+	NumOpe( &reg, lpPtrOffset, Type(), type );
+	if( !type.IsWhole() ){
+		compiler.errorMessenger.Output(46,NULL,cp);
+	}
+	ExtendTypeTo64(type.GetBasicType(),reg);
+
+	if(reg==REG_R14){
+		//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R14);
+	}
+
+	if( resultType.PtrLevel() ){
+		resultType.PtrLevelDown();
+
+		int typeSize = resultType.GetSize();
+		if(typeSize>=2){
+			//imul reg,i2
+			compiler.codeGenerator.op_imul_RV(sizeof(_int64),reg,typeSize);
+		}
+	}
+	else{
+		//エラー
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+
+	//////////////////////////////
+	// 先頭ポインタに添え字を加算
+	//////////////////////////////
+
+	//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_R11);
+
+	//add r11,reg
+	compiler.codeGenerator.op_add_RR(REG_R11,reg);
+}
+void SetRelativeOffset( RELATIVE_VAR &relativeVar ){
+	if(relativeVar.dwKind==VAR_DIRECTMEM){
+		//mov r11,qword ptr[r11]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
+	}
+	else{
+		//直接参照に切り替え
+		SetVarPtrToReg(REG_R12,&relativeVar);
+		relativeVar.dwKind=VAR_DIRECTMEM;
+
+		//mov r11,qword ptr[r12]
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+	}
+}
+bool GetArrayOffset(const Subscripts &subscripts,char *array, const Type &type){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4;
+	char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+	for(i=0,i2=0,i3=0;;i++,i2++){
+		if(array[i]=='('){
+			i4=GetStringInPare(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]=='['){
+			i4=GetStringInBracket(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]==','||array[i]=='\0'){
+			if( i3 >= (int)subscripts.size() )
+			{
+				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+				return false;
+			}
+
+			temporary[i2]=0;
+
+			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(pParm[i3],temporary);
+
+			i3++;
+
+			if(array[i]=='\0'){
+				if( i3 < (int)subscripts.size() )
+				{
+					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+					return false;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=array[i];
+	}
+
+	//mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
+	pobj_sf->push(REG_R11);
+
+	//xor r12,r12
+	compiler.codeGenerator.op_zero_reg(REG_R12);
+
+	for(i=i3-1;i>=0;i--){
+		//mov qword ptr[rsp+offset],r12     ※スタックフレームを利用
+		pobj_sf->push(REG_R12);
+
+		int reg=REG_NON;
+		Type type;
+		bool isNeedHeapFreeStructure;
+		NumOpe( &reg, pParm[i], Type( DEF_LONG ), type, &isNeedHeapFreeStructure );
+		if( type.IsObject() )
+		{
+			//キャスト演算子のオーバーロードに対応する
+			CallCastOperatorProc(reg,
+				type,
+				isNeedHeapFreeStructure, Type(DEF_LONG) );
+			type.SetBasicType( DEF_LONG );
+		}
+
+		if( !type.IsWhole() )
+		{
+			compiler.errorMessenger.Output(46,NULL,cp);
+		}
+		ExtendTypeTo64( type.GetBasicType(), reg );
+
+		if(reg==REG_R14){
+			//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(REG_R14);
+		}
+
+		//mov r12,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R12);
+
+		for(i2=i+1,i4=1;i2<i3;i2++) i4*=subscripts[i2]+1;
+
+		//imul reg,i4
+		compiler.codeGenerator.op_imul_RV(sizeof(_int64),reg,i4);
+
+		//add r12,reg
+		compiler.codeGenerator.op_add_RR(REG_R12,reg);
+
+		HeapDefaultFree(pParm[i]);
+	}
+
+	//imul r12,TypeSize
+	compiler.codeGenerator.op_imul_RV( sizeof(_int64), REG_R12, type.GetSize() );
+
+	//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_R11);
+
+	//add r11,r12
+	compiler.codeGenerator.op_add_RR( REG_R11, REG_R12 );
+
+	return true;
+}
+bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const Type &classType, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess)
+{
+	const CClass &objClass = classType.GetClass();
+
+	//////////////////////////////////////
+	// クラス、配列の構成要素を解析する
+	//////////////////////////////////////
+
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	ReferenceKind refType;
+	lstrcpy(VarName,member);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
+
+
+	////////////////////////////
+	// メンバオフセットを取得
+	////////////////////////////
+
+	const Member *pMember = objClass.FindDynamicMember( VarName );
+	if( !pMember )
+	{
+		if(isErrorEnabled) compiler.errorMessenger.Output(103,VarName,cp);
+		return false;
+	}
+
+	int offset = objClass.GetMemberOffset( VarName );
+
+
+	//アクセシビリティをチェック
+	if( compiler.IsCompilingClass() && &objClass == &compiler.GetCompilingClass() ){
+		//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+		if(pMember->IsNoneAccess()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+	}
+	else{
+		if((bPrivateAccess==0&&pMember->IsPrivate())||
+			pMember->IsNoneAccess()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+		else if(bPrivateAccess==0&&pMember->IsProtected()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(108,VarName,cp);
+			return false;
+		}
+	}
+
+	//Const定義の場合は書き込みアクセスを制限する
+	//※コンストラクタをコンパイル中の場合は例外的に許可する
+	if( pMember->IsConst() &&		//定数メンバである
+		isWriteAccess &&							//書き込みアクセスを要求されている
+		objClass.IsCompilingConstructor() == false	//コンストラクタ コンパイル中を除く
+		){
+			//Const定義の変数に書き込みアクセスをしようとした場合
+			compiler.errorMessenger.Output(61,VarName,cp);
+	}
+
+	resultType = pMember->GetType();
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType );
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if( pMember->GetSubscripts().size() == 0 ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) compiler.errorMessenger.Output(16,member,cp);
+			return false;
+		}
+	}
+
+	if(offset){
+		//add r11,offset
+		compiler.codeGenerator.op_add_RV( REG_R11, offset );
+	}
+
+	if(array[0]){
+		//配列オフセット
+		if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
+			if(isErrorEnabled) compiler.errorMessenger.Output(14,member,cp);
+			return false;
+		}
+	}
+	else if( pMember->GetSubscripts().size() > 0 ){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(NestMember[0]){
+		//入れ子構造の場合
+
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			if( refType != RefDot ){
+				if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+				return false;
+			}
+
+			if( resultType.IsObject() ){
+				// 参照内容へのポインタを抽出
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//構造体ポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
+					&& refType != RefDot ){
+						if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+						return false;
+				}
+
+				//直接参照に切り替え
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				lpPtrOffset[0]=0;
+			}
+			else{
+				//pObj->member
+				if( (resultType.IsObjectPtr() || resultType.IsStructPtr() )
+					&& refType != RefPointer ){
+						if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+						return false;
+				}
+
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_OBJECT,2)
+			|| resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_STRUCT,2)){
+			//構造体ポインタのポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				//ppObj[n]->member
+				if( refType != RefPointer ){
+					if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+					return false;
+				}
+
+				//直接参照に切り替え
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				lpPtrOffset[0]=0;
+
+				//mov r11,qword ptr[r11]
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_R11,0,MOD_BASE);
+			}
+			else{
+				if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+				return false;
+			}
+		}
+
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			pMember->GetType(),
+			NestMember,
+			pRelativeVar,
+			resultType,
+			0)) return false;
+	}
+
+	if(lpPtrOffset[0]){
+		SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+	}
+
+	return true;
+}
+
+int LocalVar_ThisPtrOffset;
+void SetThisPtrToReg(int reg){
+	//自身のオブジェクトのThisポインタをregにコピー
+
+	RELATIVE_VAR RelativeVar;
+	RelativeVar.dwKind=VAR_LOCAL;
+	RelativeVar.bOffsetOffset=0;
+	RelativeVar.offset=-LocalVar_ThisPtrOffset;
+
+	SetReg_WholeVariable(Type(DEF_PTR_VOID),&RelativeVar,reg);
+}
+bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
+	char variable[VN_SIZE];
+
+	if(NameBuffer[0]=='.'){
+		GetWithName(variable);
+		lstrcat(variable,NameBuffer);
+	}
+	else lstrcpy(variable,NameBuffer);
+
+	// 名前空間を分離
+	char namespaceStr[VN_SIZE]="", simpleName[VN_SIZE];
+	compiler.GetObjectModule().meta.GetNamespaces().SplitNamespace( variable, namespaceStr, simpleName );
+
+	// 先頭オブジェクトまたはクラス名と入れ子メンバに分割
+	ReferenceKind refType;
+	char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
+
+	// 名前空間を分離していた場合は結合
+	char VarName[VN_SIZE];
+	if( namespaceStr[0] ){
+		sprintf( VarName, "%s.%s", namespaceStr, simpleName );
+	}
+	else{
+		lstrcpy( VarName, simpleName );
+	}
+
+	const Subscripts *pSubscripts;
+	bool bConst = false;
+
+
+	if( compiler.IsLocalAreaCompiling() ){
+		//////////////////
+		// ローカル変数
+		//////////////////
+
+		const Variable *pVar = compiler.GetCompilingUserProc().GetLocalVars().BackSearch(
+			LexicalAnalyzer::FullNameToSymbol( VarName ),
+			compiler.codeGenerator.lexicalScopes.GetNowLevel()
+		);
+		if( pVar ){
+			//ポインタ変数の場合
+			if( pVar->GetType().IsPointer() ){
+				if( !pVar->IsArray() ){
+					lstrcpy(lpPtrOffset,array);
+					array[0]=0;
+				}
+			}
+			else{
+				if(lpPtrOffset[0]){
+					compiler.errorMessenger.Output(16,variable,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+			}
+
+			pRelativeVar->offset=-pVar->GetOffsetAddress();
+			pRelativeVar->bOffsetOffset=0;
+			if( pVar->IsRef() || pVar->IsByValStructParameter() )
+			{
+				// 参照型
+				pRelativeVar->dwKind = VAR_REFLOCAL;
+			}
+			else pRelativeVar->dwKind=VAR_LOCAL;
+			resultType = pVar->GetType();
+			pSubscripts = &pVar->GetSubscripts();
+			bConst = pVar->IsConst();
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+
+			if( resultType.IsTypeParameter() )
+			{
+				// 型パラメータだったとき
+
+				int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
+
+				// 制約クラス（指定されていないときはObjectクラス）にセットする
+				resultType.SetBasicType( DEF_OBJECT );
+
+				for( int i=0; i<ptrLevel; i++ )
+				{
+					resultType.PtrLevelUp();
+				}
+			}
+
+			//
+			/////////////////////////////////////////////////////////
+
+			goto ok;
+		}
+	}
+
+	if( compiler.IsCompilingClass() ){
+		//////////////////////
+		// クラスメンバの参照
+		//////////////////////
+
+		if(lstrcmpi(variable,"This")==0){
+			//自身のオブジェクトのThisポインタをr11にコピー
+			SetThisPtrToReg(REG_R11);
+
+			pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+			resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+			return true;
+		}
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内の動的メンバを参照するとき（通常）
+
+			if( !compiler.GetCompilingClass().HasDynamicMember( VarName ) )
+			{
+				goto NonClassMember;
+			}
+		}
+
+		//Const修飾子のメソッド内でメンバ書き込みアクセスが発生したとき
+		//（コンストラクタ、デストラクタ内を除く）
+		const CMethod *pMethod = &compiler.GetCompilingUserProc().GetMethod();
+		if( isWriteAccess &&
+			pMethod->IsConst() &&
+			compiler.GetCompilingClass().IsCompilingConstructor() == false &&
+			compiler.GetCompilingClass().IsCompilingDestructor() == false
+			){
+				compiler.errorMessenger.Output(131, NULL, cp );
+		}
+
+		//自身のオブジェクトのThisポインタをr11にコピー
+		SetThisPtrToReg(REG_R11);
+
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			Type( DEF_OBJECT, compiler.GetCompilingClass() ),
+			variable,
+			pRelativeVar,
+			resultType,1)) return false;
+		return true;
+	}
+
+NonClassMember:
+
+	{
+		const Variable *pVar;
+
+		//////////////////////////
+		// 静的ローカル変数
+		// ※"Static.Object.Method.Variable"
+		//////////////////////////
+
+		char temporary[VN_SIZE];
+		if( compiler.IsLocalAreaCompiling() ){
+			GetNowStaticVarFullName(VarName,temporary);
+
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temporary ) );
+			if( pVar ){
+				goto GlobalOk;
+			}
+		}
+
+
+		//////////////////////////
+		// クラスの静的メンバ
+		//////////////////////////
+
+		if(member[0]){
+			lstrcpy(temporary,member);
+
+			// TODO: 名前空間を考慮したコードになっていない
+
+			char tempMember[VN_SIZE];
+			char tempArray[VN_SIZE];
+			{
+				ReferenceKind refType;
+				GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
+			}
+
+			const TypeDef *pTypeDef = compiler.GetObjectModule().meta.GetTypeDefs().Find(
+				LexicalAnalyzer::FullNameToSymbol( VarName )
+			);
+			if( pTypeDef )
+			{
+				// TypeDef後の型名だったとき
+				lstrcpy( VarName, pTypeDef->GetBaseName().c_str() );
+			}
+
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s.%s",VarName,temporary);
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+			if( pVar ){
+				lstrcpy(member,tempMember);
+				lstrcpy(array,tempArray);
+				goto GlobalOk;
+			}
+		}
+
+		if( compiler.IsCompilingClass() ){
+			//自身のクラスから静的メンバを参照する場合
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s.%s",compiler.GetCompilingClass().GetName().c_str(),VarName);
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+			if( pVar ){
+				goto GlobalOk;
+			}
+		}
+
+		/////////////////////
+		// グローバル変数
+		/////////////////////
+
+		pVar = compiler.GetObjectModule().meta.GetGlobalVars().BackSearch(
+			LexicalAnalyzer::FullNameToSymbol( VarName ),
+			compiler.codeGenerator.lexicalScopes.GetNowLevel()
+		);
+		if( pVar ){
+			goto GlobalOk;
+		}
+
+		if(isErrorEnabled) compiler.errorMessenger.Output(3,variable,cp);
+		pRelativeVar->dwKind=NON_VAR;
+		return false;
+
+
+
+GlobalOk:
+		//ポインタ変数の場合
+		if( pVar->GetType().IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]){
+				compiler.errorMessenger.Output(16,variable,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+		}
+
+		pRelativeVar->offset=pVar->GetOffsetAddress();
+		pRelativeVar->bOffsetOffset=0;
+		if( pVar->IsRef() ){
+			// 参照型
+			pRelativeVar->dwKind = VAR_REFGLOBAL;
+		}
+		else pRelativeVar->dwKind=VAR_GLOBAL;
+		resultType = pVar->GetType();
+		pSubscripts=&pVar->GetSubscripts();
+		bConst = pVar->IsConst();
+	}
+
+
+
+ok:
+
+	if( bConst && isWriteAccess ){
+		//Const定義の変数に書き込みアクセスをしようとした場合
+		if( resultType.IsObject() ){
+			//オブジェクト定数
+			compiler.errorMessenger.Output(130, VarName, cp );
+		}
+		else{
+			//一般のConst変数
+			compiler.errorMessenger.Output(61,VarName,cp);
+		}
+	}
+
+	if( array[0] == 0 && pSubscripts->size() > 0 ){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+
+		if( pResultSubscripts )
+		{
+			(*pResultSubscripts) = *pSubscripts;
+		}
+		return true;
+	}
+
+	if( array[0] || member[0] ){
+		//xor r11,r11（r11を0に初期化する）
+		//※r11は変数ベースアドレスからの相対オフセットを示す
+		compiler.codeGenerator.op_zero_reg(REG_R11);
+
+		pRelativeVar->bOffsetOffset=1;
+	}
+	if(array[0]){
+		if(!GetArrayOffset(*pSubscripts,array,resultType)){
+			compiler.errorMessenger.Output(14,variable,cp);
+			pRelativeVar->dwKind=NON_VAR;
+			return false;
+		}
+	}
+	if(member[0]){
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			//実態オブジェクトのメンバを参照（obj.member）
+			if( refType != RefDot ){
+				compiler.errorMessenger.Output(104,VarName,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+
+			if( resultType.IsObject() ){
+				// 参照内容へのポインタを抽出
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( refType != RefDot ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+			else{
+				//pObj->member
+				if( refType != RefPointer ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+
+				SetVarPtrToReg(REG_R12,pRelativeVar);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				//mov r11,qword ptr[r12]
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+			}
+		}
+		else if( resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_OBJECT,2) || resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_STRUCT,2)){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//ppObj[n]->member
+				if( refType != RefPointer ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+
+				SetVarPtrToReg(REG_R12,pRelativeVar);
+
+				//mov r11,qword ptr[r12]
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_R12,0,MOD_BASE);
+			}
+			else{
+				compiler.errorMessenger.Output(104,VarName,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+		}
+		else{
+			compiler.errorMessenger.Output(102,VarName,cp);
+			pRelativeVar->dwKind=NON_VAR;
+			return false;
+		}
+
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			resultType,
+			member,pRelativeVar,resultType,0)) return false;
+
+		return true;
+	}
+
+	if(lpPtrOffset[0]){
+		SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+	}
+
+	return true;
+}
+
+bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
+	int i2,i3;
+	char temporary[VN_SIZE];
+	char InitBuf[VN_SIZE];
+	lstrcpy( InitBuf, lpszInitBuf );
+
+	if(InitBuf[0]=='['){
+		SlideString(InitBuf+1,-1);
+		InitBuf[lstrlen(InitBuf)-1]=0;
+
+		int typeSize = type.GetSize();
+
+		if( subscripts.size() > 0 ){
+			Subscripts nestSubscripts;
+			for( int i=1; i<(int)subscripts.size(); i++ )
+			{
+				nestSubscripts.push_back( subscripts[i] );
+			}
+
+			typeSize*=JumpSubScripts( nestSubscripts );
+			{
+				int i=0;
+				i2=0;
+				while(1){
+					if( subscripts[0] < i2 ){
+						compiler.errorMessenger.Output(41,0,cp);
+						return 0;
+					}
+					i=GetOneParameter(InitBuf,i,temporary);
+					if(!SetInitGlobalData(
+						offset+i2*typeSize,
+						type,
+						nestSubscripts,
+						temporary)) return false;
+					i2++;
+					if(InitBuf[i]=='\0') break;
+				}
+			}
+			return true;
+		}
+
+		if(type.IsStruct()){
+			const CClass &objClass = type.GetClass();
+
+			int i = 0;
+			foreach( Member *pMember, objClass.GetDynamicMembers() ){
+				if(InitBuf[i]=='\0'){
+					compiler.errorMessenger.Output(41,0,cp);
+					return false;
+				}
+
+				i=GetOneParameter(InitBuf,i,temporary);
+
+				i3=objClass.GetMemberOffset( pMember->GetName().c_str() );
+
+				if(!SetInitGlobalData(offset+i3,
+					pMember->GetType(),
+					pMember->GetSubscripts(),
+					temporary)) return false;
+			}
+			return true;
+		}
+
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+
+	///////////////////////////////////////
+	// 単発式（[]で囲まれていない）
+	///////////////////////////////////////
+
+	if( subscripts.size() > 0 ){
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type calcType;
+
+	if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
+		//動的データだった場合
+		return false;
+	}
+	if( calcType.IsReal() ){
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+	else dbl=(double)i64data;
+
+	//型チェック
+	CheckDifferentType(
+		type,
+		calcType,
+		0,0);
+
+	if( type.IsDouble() ){
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&dbl,
+			sizeof(double)
+		);
+	}
+	else if( type.IsSingle() ){
+		float flt = (float)dbl;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&flt,
+			sizeof(float)
+		);
+	}
+	else if( type.Is64() || type.IsPointer() ){
+		if( type.GetBasicType() == typeOfPtrChar && type.GetIndex() == LITERAL_STRING ){
+			//文字列定数のとき
+
+			char *temp;
+			temp=(char *)i64data;
+			i2 = compiler.AddStringToDataTable( temp );
+			HeapDefaultFree(temp);
+
+			//mov rax,DataPos
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,i2, Schedule::DataTable );
+
+			//mov qword ptr[offset],rax
+			compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,0,offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+				offset,
+				(const char *)&i64data,
+				sizeof(_int64)
+			);
+		}
+	}
+	else if( type.IsDWord() || type.IsLong() ){
+		long l = (long)i64data;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&l,
+			sizeof(long)
+		);
+	}
+	else if( type.IsWord() || type.IsInteger() ){
+		short s = (short)i64data;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&s,
+			sizeof(short)
+		);
+	}
+	else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
+		char c = (char)i64data;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&c,
+			sizeof(char)
+		);
+	}
+
+	return true;
+}
+bool InitLocalVar(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
+	int i2,i3;
+	char temporary[VN_SIZE];
+	char InitBuf[VN_SIZE];
+	lstrcpy( InitBuf, lpszInitBuf );
+
+	if(InitBuf[0]=='['){
+		SlideString(InitBuf+1,-1);
+		InitBuf[lstrlen(InitBuf)-1]=0;
+
+		int typeSize = type.GetSize();
+
+		if( subscripts.size() > 0 ){
+			Subscripts nestSubscripts;
+			for( int i=1; i<(int)subscripts.size(); i++ )
+			{
+				nestSubscripts.push_back( subscripts[i] );
+			}
+
+			typeSize*=JumpSubScripts( nestSubscripts );
+			{
+				int i=0;
+				i2=0;
+				while(1){
+					if( subscripts[0] < i2 ){
+						compiler.errorMessenger.Output(41,0,cp);
+						return 0;
+					}
+					i=GetOneParameter(InitBuf,i,temporary);
+					if(!InitLocalVar(
+						offset+i2*typeSize,
+						type,
+						nestSubscripts,
+						temporary)) return false;
+					i2++;
+					if(InitBuf[i]=='\0') break;
+				}
+			}
+			return true;
+		}
+
+		if(type.IsStruct()){
+			const CClass &objClass = type.GetClass();
+
+			int i = 0;
+			foreach( Member *pMember, objClass.GetDynamicMembers() ){
+				if(InitBuf[i]=='\0'){
+					compiler.errorMessenger.Output(41,0,cp);
+					return false;
+				}
+
+				i=GetOneParameter(InitBuf,i,temporary);
+
+				i3=objClass.GetMemberOffset( pMember->GetName().c_str() );
+
+				if(!InitLocalVar(offset+i3,
+					pMember->GetType(),
+					pMember->GetSubscripts(),
+					temporary)) return false;
+
+				if(InitBuf[i]=='\0') break;
+			}
+			return true;
+		}
+
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+
+	///////////////////////////////////////
+	// 単発式（[]で囲まれていない）
+	///////////////////////////////////////
+
+	if( subscripts.size() > 0 ){
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type calcType;
+
+	if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
+		//動的データだった場合
+		return false;
+	}
+	if( calcType.IsReal() ){
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+	else dbl=(double)i64data;
+
+	//型チェック
+	CheckDifferentType(
+		type,
+		calcType,
+		0,0);
+
+	if( type.IsDouble() ){
+		memcpy(&i64data,&dbl,sizeof(double));
+
+		//mov rax,i64data
+		compiler.codeGenerator.op_mov_RV64(REG_RAX,i64data);
+
+		//mov qword ptr[rsp+offset],rax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	else if( type.IsSingle() ){
+		float flt;
+		flt=(float)dbl;
+
+		//mov dword ptr[rsp+offset],value
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV(sizeof(long),REG_RSP,offset, Schedule::None, true, USE_OFFSET,*(int *)&flt)
+		);
+	}
+	else if( type.Is64() || type.IsPointer() ){
+		if( type.GetBasicType() == typeOfPtrChar && type.GetIndex() == LITERAL_STRING ){
+			//文字列定数のとき
+
+			char *temp;
+			temp=(char *)i64data;
+			i2 = compiler.AddStringToDataTable( temp );
+			HeapDefaultFree(temp);
+
+			//mov rax,i2
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RAX,i2, Schedule::DataTable );
+
+			//mov qword ptr[rsp+offset],rax
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			if(i64data&0xFFFFFFFF00000000){
+				//mov rax,i64data
+				compiler.codeGenerator.op_mov_RV64(REG_RAX,i64data);
+
+				//mov qword ptr[rsp+offset],rax
+				compiler.codeGenerator.localVarPertialSchedules.push_back(
+					compiler.codeGenerator.op_mov_MR(sizeof(_int64),REG_RAX,REG_RSP,offset,MOD_BASE_DISP32, Schedule::None, true )
+				);
+			}
+			else{
+				//mov qword ptr[rsp+offset],value
+				compiler.codeGenerator.localVarPertialSchedules.push_back(
+					compiler.codeGenerator.op_mov_MV(sizeof(_int64),REG_RSP,offset, Schedule::None, true, USE_OFFSET,(int)i64data)
+				);
+			}
+		}
+	}
+	else if( type.IsDWord() || type.IsLong() ){
+		//mov dword ptr[rsp+offset],value
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV(sizeof(long),REG_RSP,offset, Schedule::None, true, USE_OFFSET,(int)i64data)
+		);
+	}
+	else if( type.IsWord() || type.IsInteger() ){
+		//mov word ptr[rsp+offset],value
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV(sizeof(short),REG_RSP,offset, Schedule::None, true, USE_OFFSET,(int)i64data)
+		);
+	}
+	else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
+		//mov byte ptr[rsp+offset],value
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV(sizeof(char),REG_RSP,offset, Schedule::None, true, USE_OFFSET,(int)i64data)
+		);
+	}
+	return true;
+}
+
+void dim( char *VarName, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags)
+{
+	if( compiler.IsGlobalAreaCompiling() ){
+		/////////////////////////
+		// グローバル変数
+		/////////////////////////
+
+		AddGlobalVariable(VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags);
+	}
+	else{
+		/////////////////
+		// ローカル変数
+		/////////////////
+
+		if( compiler.GetCompilingUserProc().GetLocalVars().DuplicateCheck( LexicalAnalyzer::FullNameToSymbol( VarName ), compiler.codeGenerator.lexicalScopes.GetNowLevel() ) ){
+			//２重定義のエラー
+			compiler.errorMessenger.Output(15,VarName,cp);
+			return;
+		}
+
+		bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
+
+		Variable *pVar = new Variable(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( VarName ),
+			type,
+			isConst,
+			false,
+			ConstractParameter,
+			false
+		);
+
+		if( subscripts.size() > 0 ){
+			//配列あり
+			pVar->SetArray( subscripts );
+		}
+
+		//レキシカルスコープ
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		//エラー用
+		pVar->source_code_address=cp;
+
+		// 変数を追加
+		compiler.GetCompilingUserProc().GetLocalVars().push_back( pVar );
+
+		//アラインメントを考慮
+		if( pVar->GetType().IsStruct() ){
+			int alignment = pVar->GetType().GetClass().GetFixedAlignment();
+
+			if( alignment ){
+				if( AllLocalVarSize % alignment ){
+					AllLocalVarSize += alignment - (AllLocalVarSize % alignment);
+				}
+			}
+
+			if( alignment == PTR_SIZE*2 ){
+				// ポインタに要するサイズよりも一回り大きなアラインメントが指定されているとき
+				// （例:CONTEXT構造体など）
+				// 呼び出し側のオフセットズレを考慮する
+
+				if( 0 == ( compiler.GetCompilingUserProc().RealParams().GetMemorySize() + PTR_SIZE /* ret分 */ ) % alignment ){
+					AllLocalVarSize += PTR_SIZE;
+				}
+			}
+		}
+
+		AllLocalVarSize += pVar->GetMemorySize();
+		pVar->SetOffsetAddress( AllLocalVarSize );
+
+		//レキシカルスコープ
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		if(InitBuf[0]){
+			//初期代入時のみ、書き込みアクセスを許可する
+			if( isConst ){
+				pVar->ConstOff();
+			}
+
+			int result = 0;
+			if( !pVar->GetType().IsObject() ){
+				result = InitLocalVar(-pVar->GetOffsetAddress(),
+					pVar->GetType(),
+					pVar->GetSubscripts(),
+					InitBuf);
+			}
+
+			if(!result){
+				//動的な式だった場合は代入演算を行う
+				char temporary[8192];
+				sprintf(temporary,"%s=%s",VarName,InitBuf);
+				OpcodeCalc(temporary);
+			}
+
+			if( isConst ){
+				pVar->ConstOn();
+			}
+		}
+		else{
+			//0初期化
+
+			//mov r8, 0
+			compiler.codeGenerator.op_zero_reg( REG_R8 );
+
+			//mov rdx, VarSize
+			compiler.codeGenerator.op_mov_RV( sizeof(_int64), REG_RDX, pVar->GetMemorySize() );
+
+			//mov rcx, rsp
+			compiler.codeGenerator.op_mov_RR( REG_RCX, REG_RSP );
+
+			//add rcx, offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV( REG_RCX, -pVar->GetOffsetAddress(), Schedule::None, true )
+			);
+
+			//call FillMemory
+			DllProc *pDllProc;
+			pDllProc=GetDeclareHash("FillMemory");
+			compiler.codeGenerator.op_call( pDllProc );
+		}
+	}
+
+	//New呼び出し
+	if( type.IsObject()
+		&& !type.IsInterface() &&  !type.IsComInterface()
+		&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
+		&&InitBuf[0]=='\0')
+	{
+		char objectSize[255];
+		if( subscripts.size() == 0 ){
+			objectSize[0] = 0;
+		}
+		else{
+			if( subscripts.size() > 1 ){
+				compiler.errorMessenger.Output(300,NULL,cp);
+			}
+			sprintf( objectSize, "%d", subscripts[0] );
+		}
+		Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
+
+		Type tempType;
+		RELATIVE_VAR RelativeVar;
+		GetVarOffset( true, false, VarName, &RelativeVar, tempType );
+		if( RelativeVar.dwKind == VAR_DIRECTMEM ){
+			compiler.errorMessenger.OutputFatalError();
+		}
+		SetVariableFromRax( Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() ), DEF_OBJECT, &RelativeVar );
+	}
+}
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar){
+	if(!IsGeneralReg(reg)) compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,offset
+			compiler.codeGenerator.op_add_RV( REG_R11, (long)pRelativeVar->offset, Schedule::GlobalVar );
+
+			//mov reg,r11
+			compiler.codeGenerator.op_mov_RR(reg,REG_R11);
+		}
+		else{
+			//mov reg,offset
+			compiler.codeGenerator.op_mov_RV( sizeof(_int64), reg, (long)pRelativeVar->offset, Schedule::GlobalVar );
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFGLOBAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov r11,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV( REG_R11, (long)pRelativeVar->offset, Schedule::None, true )
+			);
+
+			//add r11,rsp
+			compiler.codeGenerator.op_add_RR(REG_R11,REG_RSP);
+
+			//mov reg,r11
+			compiler.codeGenerator.op_mov_RR(reg,REG_R11);
+		}
+		else{
+			//mov reg,rsp
+			compiler.codeGenerator.op_mov_RR(reg,REG_RSP);
+
+			//add reg,offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV(reg,(long)pRelativeVar->offset, Schedule::None, true )
+			);
+		}
+	}
+	else if( pRelativeVar->dwKind == VAR_REFLOCAL ){
+		if(pRelativeVar->bOffsetOffset){
+			//add r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM( sizeof(_int64), REG_R11, REG_RSP, (long)pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov r11,qword ptr[rsp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(_int64),REG_R11,REG_RSP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//mov reg,r11
+		compiler.codeGenerator.op_mov_RR(reg,REG_R11);
+	}
+}
+
+bool Compile_AddGlobalRootsForGc()
+{
+	const UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
+	if( !pUserProc_AddGlobalRootPtr )
+	{
+		compiler.errorMessenger.Output(3, "_System_CGarbageCollection.AddGlobalRootPtr", -1 );
+		return false;
+	}
+
+	foreach( const Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+		if( pVar->GetType().IsObject() || pVar->GetType().IsPointer() || pVar->GetType().IsStruct() ){
+			// オブジェクトまたはポインタだったとき
+			// ※構造体も含む（暫定対応）
+
+			// 変数領域に要するLONG_PTR単位の個数を引き渡す
+			//mov r8,count
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64), REG_R8,pVar->GetMemorySize()/PTR_SIZE);
+
+			// ルートポインタを引き渡す
+			//mov rdx,offset
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64), REG_RDX,(int)pVar->GetOffsetAddress(), Schedule::GlobalVar );
+
+			// Thisポインタを引き渡す
+			SetThisPtrToReg(REG_RCX);
+
+			// call AddGlobalRootPtr
+			compiler.codeGenerator.op_call( pUserProc_AddGlobalRootPtr );
+		}
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Debug.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Debug.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Debug.cpp	(revision 774)
@@ -0,0 +1,677 @@
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+ULONG_PTR rva_to_real(DWORD p){
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	return p+ImageBase+MemPos_CodeSection;
+}
+
+void ShowVarList(DEBUG_EVENT *pde,BOOL bExit){
+	extern DWORD ImageBase;
+	extern DWORD _DebugSys_dwThreadID[256];
+	extern HANDLE hDebugProcess;
+	extern int MemPos_RWSection;
+	SIZE_T stAccBytes;
+	ReadProcessMemory(hDebugProcess,
+		(void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+		_DebugSys_dwThreadID,sizeof(DWORD)*256,&stAccBytes);
+
+	//デバッグダイアログを表示
+	extern HINSTANCE hInst;
+	extern HWND hMainDlg;
+	extern HWND hDebugWnd;
+	extern DWORD dwStepRun;
+	dwStepRun=0;
+	if(!hDebugWnd) SendMessage(hMainDlg,WM_SHOWVARLIST,0,pde->dwThreadId);
+	else InitVarList(pde->dwThreadId);
+
+	if(bExit){
+		//"中断"
+		SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+
+		extern HWND hDebuggerToolbar;
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_START,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPOVER,TBSTATE_INDETERMINATE);
+		SendMessage(hDebuggerToolbar,TB_SETSTATE,IDC_DEBUG_STEPIN,TBSTATE_INDETERMINATE);
+	}
+	else{
+		//"継続"
+		SetDlgItemText(hDebugWnd,IDCANCEL,STRING_CONTINUE);
+	}
+	while(hDebugWnd&&dwStepRun==0) Sleep(1);
+}
+void DebugMessage(char *buffer){
+	extern HWND hMainDlg;
+	int pos;
+
+	if(!IsWindowEnabled(GetDlgItem(hMainDlg,IDC_DEBUGLIST))){
+		SetDlgItemText(hMainDlg,IDC_DEBUGLIST,"");
+		EnableWindow(GetDlgItem(hMainDlg,IDC_DEBUGLIST),1);
+	}
+
+	pos=GetWindowTextLength(GetDlgItem(hMainDlg,IDC_DEBUGLIST));
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_SETSEL,pos,pos);
+	SendDlgItemMessage(hMainDlg,IDC_DEBUGLIST,EM_REPLACESEL,0,(LPARAM)buffer);
+}
+SUBINFO *GetSubFromObp(ULONG_PTR pos){
+	extern SUBINFO **ppSubHash;
+	SUBINFO *psi;
+	int i2;
+
+	for(i2=0;i2<MAX_HASH;i2++){
+		psi=ppSubHash[i2];
+		while(psi){
+			if(rva_to_real(psi->CompileAddress) <= pos  &&
+				pos < rva_to_real(psi->EndOpAddr))
+				return psi;
+
+			psi=psi->pNextData;
+		}
+	}
+	return 0;
+}
+void ReleaseSingleStep(HANDLE hThread,CONTEXT *pContext){
+	//以前にシングルステップ実行をした場合
+	extern HANDLE hDebugProcess;
+	extern DWORD *lpdwDebugThreadID;
+	extern HANDLE *lphDebugThread;
+	extern int DebugThreadNum;
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int FileSize_CodeSection;
+	extern char *OpBuffer;
+	int i2;
+	SIZE_T stAccBytes;
+
+	//シングルステップOFF
+	WriteProcessMemory(hDebugProcess,
+		(void *)(LONG_PTR)(ImageBase+MemPos_CodeSection),
+		OpBuffer,FileSize_CodeSection,&stAccBytes);
+
+	if(ImageBase+MemPos_CodeSection <= pContext->Rip &&
+		pContext->Rip < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+		//オリジナルコード内のみ、シングルステップ用の"int 3"を考慮
+		pContext->Rip--;
+		SetThreadContext(hThread,pContext);
+	}
+
+	//他のスレッドのサスペンドを解除
+	for(i2=0;i2<DebugThreadNum;i2++){
+		if(hThread!=lphDebugThread[i2])
+			ResumeThread(lphDebugThread[i2]);
+	}
+}
+void SetThreadId_ToProcessMemory(DWORD dwThreadId,BOOL bReset){
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+	extern HANDLE hDebugProcess;
+
+	DWORD array_dwData[256];
+	SIZE_T stAccBytes;
+
+	ReadProcessMemory(hDebugProcess,
+		(void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+		array_dwData,sizeof(DWORD)*256,&stAccBytes);
+
+	int i2;
+	for(i2=0;i2<256;i2++){
+		if(bReset==0){
+			if(array_dwData[i2]==0){
+				array_dwData[i2]=dwThreadId;
+				break;
+			}
+		}
+		else{
+			if(array_dwData[i2]==dwThreadId){
+				array_dwData[i2]=0;
+				break;
+			}
+		}
+	}
+
+	WriteProcessMemory(hDebugProcess,
+		(void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+		array_dwData,sizeof(DWORD)*256,&stAccBytes);
+}
+void AddThread(DWORD dwThreadId, HANDLE hThread){
+	extern HANDLE hDebugProcess;
+	extern DWORD ImageBase;
+	extern int MemPos_RWSection;
+
+	//プロセスIDをターゲットアプリのメモリに書き込む
+	SetThreadId_ToProcessMemory(dwThreadId,0);
+
+	extern int DebugThreadNum;
+
+	//デバッグID
+	extern DWORD *lpdwDebugThreadID;
+	lpdwDebugThreadID=(DWORD *)HeapReAlloc(hHeap,0,lpdwDebugThreadID,(DebugThreadNum+1)*sizeof(DWORD));
+	lpdwDebugThreadID[DebugThreadNum]=dwThreadId;
+
+	//デバッグハンドル
+	extern HANDLE *lphDebugThread;
+	lphDebugThread=(HANDLE *)HeapReAlloc(hHeap,0,lphDebugThread,(DebugThreadNum+1)*sizeof(HANDLE));
+	lphDebugThread[DebugThreadNum]=hThread;
+
+	//カウンタ
+	DebugThreadNum++;
+}
+void ReadOpBuffer(){
+	extern int FileSize_CodeSection;
+
+	extern char *OpBuffer;
+	if(OpBuffer) HeapDefaultFree(OpBuffer);
+	OpBuffer=(char *)HeapAlloc(hHeap,0,FileSize_CodeSection);
+
+	extern HANDLE hDebugProcess;
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	SIZE_T stAccByte;
+	ReadProcessMemory(hDebugProcess,(void *)(LONG_PTR)(ImageBase+MemPos_CodeSection),OpBuffer,FileSize_CodeSection,&stAccByte);
+}
+char *MakeSingleStepCode(){
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+
+	extern int FileSize_CodeSection;
+	char *buffer;
+	buffer=(char *)HeapAlloc(hHeap,0,FileSize_CodeSection);
+
+	extern char *OpBuffer;
+	memcpy(buffer,OpBuffer,FileSize_CodeSection);
+
+	extern int MaxLineInfoNum;
+	extern LINEINFO *pLineInfo;
+	int i2;
+	for(i2=0;i2<MaxLineInfoNum;i2++){
+		if(!(
+			pLineInfo[i2].dwCodeType&CODETYPE_SYSTEMPROC||
+			pLineInfo[i2].dwCodeType&CODETYPE_DEBUGPROC
+			)){
+			//int 3
+			buffer[pLineInfo[i2].TopObp]=(char)0xCC;
+		}
+	}
+
+	return buffer;
+}
+void DeleteDebugInfo(void);
+void DebugProgram(void){
+	extern HWND hMainDlg;
+	extern char OutputFileName[MAX_PATH];
+	extern DWORD ImageBase;
+	extern int MemPos_CodeSection;
+	extern int MemPos_RWSection;
+	extern int FileSize_CodeSection;
+	extern char *OpBuffer;
+	int i2,i3,i4;
+	char temporary[VN_SIZE];
+	DWORD dwData[256];
+	SIZE_T stAccBytes;
+
+	extern BOOL bDll;
+	char ExeFilePathForDll[MAX_PATH];
+	if(bDll){
+		//DLLをデバッグする場合
+		extern char szDebugExeForDll[1024];
+		if(szDebugExeForDll[0]){
+			//指定済み
+			lstrcpy(ExeFilePathForDll,szDebugExeForDll);
+		}
+		else{
+			//ユーザーに実行ファイルを選択させる
+			extern HWND hOwnerEditor;
+			extern LPSTR ExeFileFilter;
+			if(!GetFilePathDialog(hOwnerEditor,ExeFilePathForDll,ExeFileFilter,"デバッグ用の実行可能ファイルを指定してください。",1)) return;
+		}
+	}
+
+	//"中断"
+	SetDlgItemText(hMainDlg,IDOK,STRING_STOP);
+
+	//スレッド情報
+	extern DWORD *lpdwDebugThreadID;
+	extern HANDLE *lphDebugThread;
+	extern int DebugThreadNum;
+	lpdwDebugThreadID=(DWORD *)HeapAlloc(hHeap,0,1);
+	lphDebugThread=(HANDLE *)HeapAlloc(hHeap,0,1);
+	DebugThreadNum=0;
+
+	//カレントディレクトリを設定
+	extern char BasicCurDir[MAX_PATH];
+	SetCurrentDirectory(BasicCurDir);
+
+	SendDlgItemMessage(hMainDlg,IDC_SHOWERROR,BM_SETCHECK,BST_UNCHECKED,0);
+	SendDlgItemMessage(hMainDlg,IDC_SHOWDEBUG,BM_SETCHECK,BST_CHECKED,0);
+	SendMessage(hMainDlg,WM_COMMAND,IDC_SHOWDEBUG,0);
+
+
+
+	extern BOOL bAttach;
+	if(bAttach){
+		extern DWORD dwAttachProcessId;
+
+		//プロセスIDを元にハンドルを取得
+		HANDLE hProcess;
+		hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwAttachProcessId);
+		if(!hProcess) goto AttachError;
+
+		//そのプロセスにおける実行モジュールのインスタンスハンドルを取得
+		HINSTANCE hModule;
+		DWORD cbReturned;
+		if(!EnumProcessModules( hProcess, &hModule, sizeof(HINSTANCE), &cbReturned )) goto AttachError;
+
+		//実行ファイル名を取得
+		GetModuleFileNameEx(hProcess,hModule,OutputFileName,MAX_PATH);
+
+		CloseHandle(hProcess);
+
+
+		//デバッグ用の拡張情報を取得
+		ReadDebugFile();
+
+		if(!DebugActiveProcess(dwAttachProcessId)){
+AttachError:
+			DebugMessage("アタッチに失敗しました。");
+			return;
+		}
+	}
+	else{
+		if(!ReadDebugFile()){
+			extern BOOL bDebugCompile;
+			bDebugCompile=1;
+			OutputExe();
+			ReadDebugFile();
+		}
+
+		//スレッドを生成
+		STARTUPINFO si;
+		PROCESS_INFORMATION pi;
+		memset(&si,0,sizeof(STARTUPINFO));
+		si.cb=sizeof(STARTUPINFO);
+		if(!bDll){
+			//EXEファイルをデバッグ
+			CreateProcess(OutputFileName,"",NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&si,&pi);
+		}
+		else{
+			//DLLファイルをデバッグ
+			CreateProcess(ExeFilePathForDll,"",NULL,NULL,0,NORMAL_PRIORITY_CLASS|DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&si,&pi);
+		}
+
+		CloseHandle(pi.hProcess);
+		CloseHandle(pi.hThread);
+	}
+
+
+
+	extern BOOL bClipCompileView;
+	//"プログラムを実行しています（デバッグ中）"
+	MakeMessageText(temporary,STRING_DEBUGGING,0);
+	SetDlgItemText(hMainDlg,IDC_MESSAGE,temporary);
+	if(bClipCompileView) InvalidateRect(GetDlgItem(hMainDlg,IDC_PROGRESS),NULL,1);
+
+	char *SingleStepCodeBuffer;
+	SingleStepCodeBuffer=0;
+
+	SUBINFO *psi;
+
+	extern DWORD dwStepRun;
+	BOOL bFirstBreak=1;
+	CONTEXT Context;
+	HANDLE hMainThread;
+	extern HANDLE hDebugProcess;
+
+	DEBUG_EVENT de;
+	memset(&de,0,sizeof(DEBUG_EVENT));
+
+	while(WaitForDebugEvent(&de,INFINITE)){
+		if(de.dwDebugEventCode==LOAD_DLL_DEBUG_EVENT){
+			WCHAR wcBuf[MAX_PATH];
+			LONG_PTR lpData;
+
+			wcBuf[0]=0;
+			temporary[0]=0;
+
+			if(de.u.LoadDll.lpImageName){
+				if(!ReadProcessMemory(hDebugProcess,de.u.LoadDll.lpImageName,&lpData,sizeof(LONG_PTR),&stAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",(DWORD)(LONG_PTR)de.u.LoadDll.lpImageName);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+				if(!ReadProcessMemory(hDebugProcess,(void *)lpData,wcBuf,sizeof(WCHAR)*MAX_PATH,&stAccBytes)){
+					sprintf(temporary,"ロードされたDLLの名前取得（アドレス:&H%08x）に失敗しました。\r\n",lpData);
+					DebugMessage(temporary);
+					goto NextContinue;
+				}
+
+				if(de.dwThreadId,de.u.LoadDll.fUnicode)
+					WideCharToMultiByte(CP_ACP,0,wcBuf,-1,temporary,255,NULL,NULL);
+				else lstrcpy(temporary,(char *)wcBuf);
+			}
+			else{
+				//アタッチした場合
+				GetModuleFileNameEx(hDebugProcess,(HINSTANCE)de.u.LoadDll.lpBaseOfDll,temporary,MAX_PATH);
+			}
+
+			char temp2[1024];
+			sprintf(temp2,"\"%s\" をロードしました。\r\n",temporary);
+			DebugMessage(temp2);
+
+			if(lstrcmpi(temporary, OutputFileName)==0){
+				ImageBase=(DWORD)(LONG_PTR)de.u.LoadDll.lpBaseOfDll;
+				AddThread(de.dwThreadId,hMainThread);
+
+				//実行用コードバッファを読み取る
+				ReadOpBuffer();
+
+				//シングルステップ用のコードバッファを作成
+				SingleStepCodeBuffer=MakeSingleStepCode();
+			}
+		}
+
+		else if(de.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT){
+			hDebugProcess=de.u.CreateProcessInfo.hProcess;
+			hMainThread=de.u.CreateProcessInfo.hThread;
+			if(bDll) goto NextContinue;
+
+			//実行用コードバッファを読み取る
+			ReadOpBuffer();
+
+			//シングルステップ用のコードバッファを作成
+			SingleStepCodeBuffer=MakeSingleStepCode();
+
+			AddThread(de.dwThreadId,de.u.CreateProcessInfo.hThread);
+		}
+		else if(de.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENT){
+			AddThread(de.dwThreadId,de.u.CreateThread.hThread);
+		}
+		else if(de.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT){
+			//プロセスIDをターゲットアプリのメモリから消去
+			SetThreadId_ToProcessMemory(de.dwThreadId,1);
+
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+
+			//"デバッグは正常に終了しました。"
+			MakeMessageText(temporary,STRING_DEBUG_FINISH,0);
+			SetDlgItemText(hMainDlg,IDC_MESSAGE,temporary);
+			if(bClipCompileView) InvalidateRect(GetDlgItem(hMainDlg,IDC_PROGRESS),NULL,1);
+
+			//"プログラムはコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_PROCESSFINISH,de.u.ExitProcess.dwExitCode);
+			DebugMessage(temporary);
+			break;
+		}
+		else if(de.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENT){
+			//プロセスIDをターゲットアプリのメモリから消去
+			SetThreadId_ToProcessMemory(de.dwThreadId,1);
+
+			//"スレッド(&H%X)はコード &H%X で終了しました。\r\n"
+			sprintf(temporary,STRING_DEBUG_THREADFINISH,de.dwThreadId,de.u.ExitThread.dwExitCode);
+			DebugMessage(temporary);
+
+			//以前にシングルステップ実行をした場合
+			//ステップ実行を解除
+			if(dwStepRun){
+				extern HWND hDebugWnd;
+				if(hDebugWnd) SendMessage(hDebugWnd,WM_VARLIST_CLOSE,0,0);
+
+				for(i4=0;i4<DebugThreadNum;i4++){
+					if(de.dwThreadId==lpdwDebugThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL;
+				GetThreadContext(lphDebugThread[i4],&Context);
+
+				ReleaseSingleStep(lphDebugThread[i4],&Context);
+			}
+
+			for(i2=0;i2<DebugThreadNum;i2++){
+				if(lpdwDebugThreadID[i2]==de.dwThreadId){
+					DebugThreadNum--;
+					for(;i2<DebugThreadNum;i2++){
+						lpdwDebugThreadID[i2]=lpdwDebugThreadID[i2+1];
+						lphDebugThread[i2]=lphDebugThread[i2+1];
+					}
+					break;
+				}
+			}
+		}
+		else if(de.dwDebugEventCode==OUTPUT_DEBUG_STRING_EVENT){
+			ReadProcessMemory(hDebugProcess,(void *)de.u.DebugString.lpDebugStringData,temporary,de.u.DebugString.nDebugStringLength,&stAccBytes);
+			DebugMessage(temporary);
+		}
+		else if(de.dwDebugEventCode==EXCEPTION_DEBUG_EVENT){
+
+			//初回例外は無視
+			if(bFirstBreak){
+				bFirstBreak=0;
+				goto NextContinue;
+			}
+
+			if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_INVALID_HANDLE){
+
+				//"スレッド(&H%X)でハンドル違反がありました(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_THREAD_INVALID_HANDLE,de.dwThreadId,(LONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				MessageBeep(MB_ICONEXCLAMATION);
+				ShowVarList(&de,1);
+				break;
+			}
+			if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_ACCESS_VIOLATION){
+
+				//"スレッド(&H%X)でアクセス違反がありました(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_THREAD_ACCESSVIOLATION,de.dwThreadId,(LONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				MessageBeep(MB_ICONEXCLAMATION);
+				ShowVarList(&de,1);
+				break;
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT){
+				i3=dwStepRun;
+
+				for(i4=0;i4<DebugThreadNum;i4++){
+					if(de.dwThreadId==lpdwDebugThreadID[i4]) break;
+				}
+				Context.ContextFlags=CONTEXT_CONTROL;
+				GetThreadContext(lphDebugThread[i4],&Context);
+
+				if(i3==0||
+					i3&&(!(ImageBase+MemPos_CodeSection<=Context.Rip&&Context.Rip<ImageBase+MemPos_CodeSection+FileSize_CodeSection))
+					){
+					//"スレッド(&H%X)のブレーク ポイント(EPI=&H%08X)。\r\n"
+					sprintf(temporary,STRING_DEBUG_BREAKPOINT,de.dwThreadId,(LONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+					DebugMessage(temporary);
+				}
+
+				ShowVarList(&de,0);
+
+				//以前にシングルステップ実行をした場合
+				//ステップ実行を解除
+				if(i3) ReleaseSingleStep(lphDebugThread[i4],&Context);
+
+				if(dwStepRun){
+					//新たにシングルステップを行う場合
+
+					if(ImageBase+MemPos_CodeSection <= Context.Rip &&
+						Context.Rip < ImageBase+MemPos_CodeSection+FileSize_CodeSection){
+						//Debug命令語が続く場合はシングルステップは不要になるので、無効にする
+						//（オリジナルコード内のみ）
+						if(OpBuffer[Context.Rip-ImageBase-MemPos_CodeSection]==(char)0xCC)
+							dwStepRun=0;
+					}
+					if(dwStepRun==1){
+						//ステップイン
+StepIn:
+						//シングルステップON
+						WriteProcessMemory(hDebugProcess,
+							(void *)(LONG_PTR)(ImageBase+MemPos_CodeSection),
+							SingleStepCodeBuffer,FileSize_CodeSection,&stAccBytes);
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=Context.Rip&&Context.Rip<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)Context.Rip,&OpBuffer[Context.Rip-ImageBase-MemPos_CodeSection],1,&stAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<DebugThreadNum;i4++){
+							if(de.dwThreadId!=lpdwDebugThreadID[i4])
+								SuspendThread(lphDebugThread[i4]);
+						}
+					}
+					else if(dwStepRun==2){
+						//ステップオーバー
+
+						BOOL bRet;
+						bRet=ReadProcessMemory(hDebugProcess,
+							(void *)Context.Rip,
+							temporary,
+							5,
+							&stAccBytes);
+						if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
+
+						extern SUBINFO *pSub_DebugSys_EndProc;
+						if((BYTE)temporary[0]==0xE8&&
+							*((long *)(temporary+1))+5==(long)rva_to_real(pSub_DebugSys_EndProc->CompileAddress)-(long)Context.Rip){
+							//プロシージャの終端位置の場合はステップインを行う
+							goto StepIn;
+						}
+
+						//スレッドのプロシージャ実行状況を取得
+						bRet=ReadProcessMemory(hDebugProcess,
+							(void *)(LONG_PTR)(ImageBase+MemPos_RWSection),
+							dwData,sizeof(DWORD)*256,&stAccBytes);
+						if(!bRet) MessageBox(hMainDlg,"プロセスメモリーの読み込みに失敗","error",MB_OK);
+						for(i2=0;;i2++){
+							if(dwData[i2]==de.dwThreadId) break;
+						}
+						GetDebugThreadInfo(i2);
+
+						extern int GlobalOpBufferSize;
+						extern DEBUG_PROCINFO dpi;
+						if(ImageBase+MemPos_CodeSection<=dpi.lpqwObp[dpi.num]&&
+							dpi.lpqwObp[dpi.num]<ImageBase+MemPos_CodeSection+GlobalOpBufferSize){
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)(LONG_PTR)(ImageBase+MemPos_CodeSection),
+								SingleStepCodeBuffer,
+								GlobalOpBufferSize,
+								&stAccBytes);
+						}
+						else{
+							//プロシージャを識別
+							psi=GetSubFromObp(dpi.lpqwObp[dpi.num]);
+
+							//シングルステップON
+							WriteProcessMemory(hDebugProcess,
+								(void *)(LONG_PTR)rva_to_real(psi->CompileAddress),
+								SingleStepCodeBuffer+psi->CompileAddress,
+								psi->EndOpAddr-psi->CompileAddress,
+								&stAccBytes);
+						}
+						DeleteDebugThreadInfo();
+
+						//次の命令語のブレーク命令は解除しておく（シングルステップ実行後のみ）
+						//（オリジナルコード内のみ）
+						if(i3&&ImageBase+MemPos_CodeSection<=Context.Rip&&Context.Rip<ImageBase+MemPos_CodeSection+FileSize_CodeSection)
+							WriteProcessMemory(hDebugProcess,(void *)Context.Rip,&OpBuffer[Context.Rip-ImageBase-MemPos_CodeSection],1,&stAccBytes);
+
+						//他のスレッドを一時中断
+						for(i4=0;i4<DebugThreadNum;i4++){
+							if(de.dwThreadId!=lpdwDebugThreadID[i4])
+								SuspendThread(lphDebugThread[i4]);
+						}
+					}
+				}
+			}
+			else if(de.u.Exception.ExceptionRecord.ExceptionCode==STATUS_INTEGER_DIVIDE_BY_ZERO){
+				//"0による除算が行われました。スレッド(&H%X) ブレーク ポイント(EPI=&H%08X)。\r\n"
+				sprintf(temporary,STRING_DEBUG_DIVIDE_BY_ZERO,de.dwThreadId,(LONG_PTR)de.u.Exception.ExceptionRecord.ExceptionAddress);
+				DebugMessage(temporary);
+
+				ShowVarList(&de,1);
+				break;
+			}
+			else{
+				//"例外処理\ncode:%X"
+				sprintf(temporary,STRING_DEBUG_ERROR,de.u.Exception.ExceptionRecord.ExceptionCode);
+				MessageBox(0,temporary,"ActiveBasic Debug",0);
+			}
+		}
+NextContinue:
+		ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);
+	}
+
+	//シングルステップ用のコードバッファを解放
+	if(SingleStepCodeBuffer) HeapDefaultFree(SingleStepCodeBuffer);
+
+	extern HWND hDebugWnd;
+	if(hDebugWnd) SendMessage(hDebugWnd,WM_COMMAND,IDCANCEL,0);
+
+	//スレッド情報を解放
+	HeapDefaultFree(lpdwDebugThreadID);
+	HeapDefaultFree(lphDebugThread);
+
+	//デバッグに利用した情報を解放（ReadDebugで確保した情報）
+	DeleteDebugInfo();
+
+	//"閉じる"
+	SetDlgItemText(hMainDlg,IDOK,STRING_CLOSE);
+}
+void DeleteDebugInfo(void){
+	int i2;
+
+	//インクルード情報を解放
+	extern INCLUDEFILEINFO IncludeFileInfo;
+	for(i2=0;i2<IncludeFileInfo.FilesNum;i2++)
+		HeapDefaultFree(IncludeFileInfo.ppFileNames[i2]);
+	HeapDefaultFree(IncludeFileInfo.ppFileNames);
+
+	//グローバル変数に関する情報を解放
+	extern VARIABLE *GlobalVar;
+	HeapDefaultFree(GlobalVar);
+
+	//ローカル変数に関する情報を解放
+	extern SUBINFO **ppSubHash;
+	SUBINFO *psi;
+	for(i2=0;i2<MAX_HASH;i2++){
+		psi=ppSubHash[i2];
+		while(psi){
+			if(psi->bCompile)
+				HeapDefaultFree(psi->pVar);
+
+			psi=psi->pNextData;
+		}
+	}
+
+	//列挙型に関するメモリを解放
+	DeleteEnumInfo();
+
+	//クラスに関するメモリを解放
+	delete pobj_DBClass;
+	pobj_DBClass=0;
+
+	//サブルーチン情報のメモリ解放
+	DeleteSubInfo();
+
+	//定数に関する情報を解放
+	DeleteConstInfo();
+
+	//ソースコードを解放
+	extern char *pBaseBuffer;
+	HeapDefaultFree(pBaseBuffer);
+
+	//コードと行番号の関係を解放
+	extern LINEINFO *pLineInfo;
+	HeapDefaultFree(pLineInfo);
+
+	//コードバッファを解放
+	extern char *OpBuffer;
+	if(OpBuffer){
+		HeapDefaultFree(OpBuffer);
+		OpBuffer=0;
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/FunctionValue.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/FunctionValue.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/FunctionValue.h	(revision 774)
@@ -0,0 +1,34 @@
+/* 関数定数 */
+
+//データ型変換
+#define FUNC_CUDBL	0x0210
+
+//文字列
+#define FUNC_LEN	0x031D
+
+//メモリ操作
+#define FUNC_VARPTR		0x0591
+#define FUNC_OBJPTR		0x0592
+
+//その他
+#define FUNC_ADDRESSOF		0x0619
+#define FUNC_SIZEOF			0x0620
+#define FUNC_DELEGATE_DYNAMICMETHOD_CALL	0x0621
+#define FUNC_DELEGATE_STATICMETHOD_CALL		0x0622
+#define FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS		0x0623
+#define FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS	0x0624
+#define FUNC_SYSTEM_GET_BP	0x0625
+#define FUNC_SYSTEM_GET_SP	0x0626
+#define FUNC_SYSTEM_GET_COM_VTBL	0x0627
+#define FUNC_SYSTEM_GET_VTBL_LIST	0x0628
+#define FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR		0x0629
+#define FUNC_SYSTEM_GET_DESTRUCTOR				0x062A
+#define FUNC_CLASS_SIZEOF	0x062B
+
+//ポインタ
+#define FUNC_GETDOUBLE		0x0630
+#define FUNC_GETSINGLE		0x0631
+#define FUNC_GETQWORD		0x0632
+#define FUNC_GETDWORD		0x0634
+#define FUNC_GETWORD		0x0635
+#define FUNC_GETBYTE		0x0636
Index: branches/egtra/ab5.0/abdev/compiler_x64/MachineFixed.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/MachineFixed.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/MachineFixed.h	(revision 774)
@@ -0,0 +1,57 @@
+//レジスタを示す定数
+#define REG_EAX 1
+#define REG_EBX 2
+#define REG_ECX 3
+#define REG_EDX 4
+#define REG_ESP 5
+#define REG_EBP 6
+
+#define REGISTER_OPERAND(reg) (reg&0x07)
+
+#define REG_NON		-1
+#define REG_RAX		0x00	//reg:000
+#define REG_RCX		0x01	//reg:001
+#define REG_RDX		0x02	//reg:010
+#define REG_RBX		0x03	//reg:011
+#define REG_RSP		0x04	//reg:100
+#define REG_RBP		0x05	//reg:101
+#define REG_RSI		0x06	//reg:110
+#define REG_RDI		0x07	//reg:111
+#define REG_R8		0x08	//reg:000（REXプリフィックス）
+#define REG_R9		0x09	//reg:001（REXプリフィックス）
+#define REG_R10		0x0A	//reg:010（REXプリフィックス）
+#define REG_R11		0x0B	//reg:011（REXプリフィックス）
+#define REG_R12		0x0C	//reg:100（REXプリフィックス）
+#define REG_R13		0x0D	//reg:101（REXプリフィックス）
+#define REG_R14		0x0E	//reg:110（REXプリフィックス）
+#define REG_R15		0x0F	//reg:111（REXプリフィックス）
+
+#define REG_XMM0	0x10	//reg:000
+#define REG_XMM1	0x11	//reg:001
+#define REG_XMM2	0x12	//reg:010
+#define REG_XMM3	0x13	//reg:011
+#define REG_XMM4	0x14	//reg:100
+#define REG_XMM5	0x15	//reg:101
+#define REG_XMM6	0x16	//reg:110
+#define REG_XMM7	0x17	//reg:111
+#define REG_XMM8	0x18	//reg:000
+#define REG_XMM9	0x19	//reg:001
+#define REG_XMM10	0x1A	//reg:010
+#define REG_XMM11	0x1B	//reg:011
+#define REG_XMM12	0x1C	//reg:100
+#define REG_XMM13	0x1D	//reg:101
+#define REG_XMM14	0x1E	//reg:110
+#define REG_XMM15	0x1F	//reg:111
+
+#define IS_XMM_REG(reg) (reg&0x10)
+
+
+//Mod（モード）
+#define MOD_BASE		(char)0x00
+#define MOD_DISP32		(char)0xFF
+#define MOD_BASE_DISP8	(char)0x40
+#define MOD_BASE_DISP32	(char)0x80
+#define MOD_REG				(char)0xC0
+
+#define USE_OFFSET 1
+#define NON_OFFSET 0
Index: branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp	(revision 774)
@@ -0,0 +1,1695 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "../BasicCompiler_Common/DebugSection.h"
+#include "Opcode.h"
+
+
+////////////////////////////
+// 特殊関数の構造体ポインタ
+////////////////////////////
+
+// グローバル関数、静的メソッド
+const UserProc
+	*pSub_System_StartupProgram,
+	*pSub_System_GlobalArea,
+	*pSub_DebugSys_StartProc,
+	*pSub_DebugSys_EndProc,
+	*pSub_DebugSys_SaveContext,
+	*pSub_System_GetEip,
+	*pSub_System_InitDllGlobalVariables,
+	*pSub_System_InitStaticLocalVariables,
+	*pSub_System_Call_Destructor_of_GlobalObject,
+	*pSub_System_End,
+	*pSub_pow,
+	*pSub_calloc,
+	*pSub_realloc,
+	*pSub_free,
+	*pSub_System_GC_malloc_ForObject,
+	*pSub_System_GC_malloc_ForObjectPtr,
+	*pSub_System_GC_free_for_SweepingDelete,
+	*pSub_System_AddNeedFreeTempStructure,
+	*pSub_System_FreeTempStructure,
+	*pSubStaticMethod_System_TypeBase_InitializeUserTypes,
+	*pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType;
+
+// 動的メソッド
+const UserProc
+	*pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
+
+
+//////////////////////////////
+// 各セクションの位置とサイズ
+int FileSize_CodeSection,
+	FileSize_ExportSection,
+	FileSize_ImportSection,
+	FileSize_DataSection,
+	FileSize_RWSection,
+	FileSize_RSrcSection,
+	FileSize_RelocSection,
+	FileSize_DebugSection;
+int FilePos_CodeSection,
+	FilePos_ExportSection,
+	FilePos_ImportSection,
+	FilePos_DataSection,
+	FilePos_RWSection,
+	FilePos_RSrcSection,
+	FilePos_RelocSection,
+	FilePos_DebugSection;
+int MemSize_CodeSection,
+	MemSize_ExportSection,
+	MemSize_ImportSection,
+	MemSize_DataSection,
+	MemSize_RWSection,
+	MemSize_RSrcSection,
+	MemSize_RelocSection,
+	MemSize_DebugSection;
+int MemPos_CodeSection,
+	MemPos_ExportSection,
+	MemPos_ImportSection,
+	MemPos_DataSection,
+	MemPos_RWSection,
+	MemPos_RSrcSection,
+	MemPos_RelocSection,
+	MemPos_DebugSection;
+int bUse_CodeSection,
+	bUse_ExportSection,
+	bUse_ImportSection,
+	bUse_DataSection,
+	bUse_RWSection,
+	bUse_RSrcSection,
+	bUse_RelocSection,
+	bUse_DebugSection;
+
+
+void MakeExe()
+{
+	extern HWND hMainDlg;
+	extern HWND hOwnerEditor;
+	extern HANDLE hHeap;
+	extern DWORD ImageBase;
+	extern int obp_AllocSize;
+	extern char *basbuf;
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],*temp2;
+	HANDLE hFile;
+
+
+	//コードセクションのメモリ上の位置
+	MemPos_CodeSection=		0x1000;
+
+	//データセクションのメモリ上の位置（仮定）
+	MemPos_DataSection=		0x10000000;
+
+
+	//エクスポート セクションを利用するかどうか
+	if( compiler.IsDll() ) bUse_ExportSection=1;
+	else bUse_ExportSection=0;
+
+
+	// 静的リンク
+	compiler.PreStaticLink( compiler.staticLibraries );
+	compiler.StaticLink( compiler.staticLibraries );
+
+	// 依存関係の解決
+	ActiveBasic::Common::Lexical::ResolveErrors resolveErrors;
+	compiler.GetObjectModule().Resolve( resolveErrors );
+	foreach( const ResolveError &resolveError, resolveErrors )
+	{
+		compiler.errorMessenger.Output( ErrorInfo( 13, resolveError.GetTargetItemName(), -1 ) );
+	}
+
+
+	//////////////////
+	// データテーブル
+	if( compiler.IsDebug() )
+	{
+		compiler.GetObjectModule().dataTable.Add( (long)0x00000002 );
+	}
+
+
+	//"メタ情報を解析中..."
+	compiler.messenger.Output( STRING_ANALYZING_META_INFO );
+
+
+	//////////////////////
+	// コード生成前の準備
+	//////////////////////
+
+	// 重複エラー情報をクリア
+	compiler.errorMessenger.ClearSynonymKeyWords();
+
+	//列挙体に関する情報を収集
+	{
+		ActiveBasic::Compiler::LexicalAnalyzer::CollectEnums(
+			compiler.GetCurrentSource().GetBuffer(),
+			compiler.enumInfoCollection
+		);
+
+		// デリゲートからクラスコードを生成
+		std::string tempSource = ActiveBasic::Compiler::LexicalAnalyzer::GenerateEnumsSourceCode(
+			compiler.enumInfoCollection
+		);
+		AddSourceCode( tempSource.c_str() );
+	}
+
+	// 名前空間情報を取得
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectNamespaces(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetNamespaces()
+	);
+
+	// デリゲートに関する情報を収集
+	{
+		ActiveBasic::Compiler::LexicalAnalyzer::CollectDelegates(
+			compiler.GetCurrentSource().GetBuffer(),
+			compiler.GetObjectModule().meta.GetDelegates()
+		);
+		compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
+
+		// デリゲートからクラスコードを生成
+		std::string tempSource = ActiveBasic::Compiler::LexicalAnalyzer::GenerateDelegatesSourceCode(
+			compiler.GetObjectModule().meta.GetDelegates()
+		);
+		AddSourceCode( tempSource.c_str() );
+	}
+
+	//クラス名を取得（詳細情報はCollectClassesで取得）
+	//   CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。
+	//     ※オブジェクトの内容までは取得しない
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectClassesForNameOnly(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+	//TypeDef情報を収集
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectTypeDefs(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetTypeDefs()
+	);
+
+	/*
+	デリゲートのパラメータを再取得
+	クラス/TypeDefなどの型名前情報がすべて揃ってからでないと
+	型情報に依存するパラメータ情報を取得できないため、ここでの再取得が必要
+	*/
+	ActiveBasic::Compiler::LexicalAnalyzer::RefleshDelegatesParameterAndReturnType(
+		compiler.GetObjectModule().meta.GetDelegates()
+	);
+
+	//定数情報を取得
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectConsts(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetGlobalConsts(),
+		compiler.GetObjectModule().meta.GetGlobalConstMacros()
+	);
+
+	//サブルーチン（ユーザー定義、DLL関数）の識別子、アドレスを取得
+	compiler.SetCompilingClass( NULL );
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectProcedures(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetUserProcs(),
+		compiler.GetObjectModule().meta.GetDllProcs()
+	);
+
+	// クラス情報を取得（※注 - CollectProceduresの後に呼び出す）
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectClasses(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+	// サブルーチン（ユーザー定義、DLL関数）のイテレータの準備
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Init();
+
+
+	///////////////////////////
+	// 最低限必要な関数を取得
+	///////////////////////////
+	cp=-1;
+
+	if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
+		pSub_System_StartupProgram->Using();
+
+	if(pSub_System_GlobalArea=GetSubHash(compiler.GetGlobalAreaProcName().c_str(),1))
+	{
+		pSub_System_GlobalArea->Using();
+		pSub_System_GlobalArea->ThisIsAutoGenerationProc();
+	}
+
+	if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
+		pSub_DebugSys_StartProc->Using();
+
+	if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
+		pSub_DebugSys_EndProc->Using();
+
+	if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
+		pSub_DebugSys_SaveContext->Using();
+
+	if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
+		pSub_System_GetEip->Using();
+		pSub_System_GetEip->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
+		pSub_System_InitDllGlobalVariables->Using();
+		pSub_System_InitDllGlobalVariables->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
+		pSub_System_InitStaticLocalVariables->Using();
+		pSub_System_InitStaticLocalVariables->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
+		pSub_System_Call_Destructor_of_GlobalObject->Using();
+		pSub_System_Call_Destructor_of_GlobalObject->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_End=GetSubHash("_System_End",1)){
+		pSub_System_End->Using();
+	}
+
+	if(pSub_pow=GetSubHash("pow",1))
+		pSub_pow->Using();
+
+	if(pSub_calloc=GetSubHash("calloc",1))
+		pSub_calloc->Using();
+
+	if(pSub_realloc=GetSubHash("realloc",1))
+		pSub_realloc->Using();
+
+	if(pSub_free=GetSubHash("free",1))
+		pSub_free->Using();
+
+	if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
+		pSub_System_GC_malloc_ForObject->Using();
+
+	if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
+		pSub_System_GC_malloc_ForObjectPtr->Using();
+
+	if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
+		pSub_System_GC_free_for_SweepingDelete->Using();
+
+	if( pSub_System_AddNeedFreeTempStructure = GetSubHash( "_System_AddNeedFreeTempStructure",1 ) )
+	{
+		pSub_System_AddNeedFreeTempStructure->Using();
+	}
+	if( pSub_System_FreeTempStructure = GetSubHash( "_System_FreeTempStructure",1 ) )
+	{
+		pSub_System_FreeTempStructure->Using();
+	}
+
+	if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypes",1 ) ){
+		pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
+		pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
+	}
+
+	if( pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypesForBaseType",1 ) ){
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->Using();
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->ThisIsAutoGenerationProc();
+	}
+
+	if( pUserProc_System_CGarbageCollection_RegisterGlobalRoots = GetClassMethod( "_System_CGarbageCollection", "RegisterGlobalRoots" ) ){
+		pUserProc_System_CGarbageCollection_RegisterGlobalRoots->Using();
+		pUserProc_System_CGarbageCollection_RegisterGlobalRoots->ThisIsAutoGenerationProc();
+	}
+
+	//リロケーション情報
+	pobj_Reloc=new CReloc();
+
+	//レジスタのブロッキングを管理するためのオブジェクトを生成
+	pobj_BlockReg=new CBlockReg;
+
+	//レキシカルスコープ情報を初期化
+	compiler.codeGenerator.lexicalScopes.Init(0);
+
+	// 名前空間が初期化されているかをチェック
+	if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// デバッグコンパイル用のログを生成する
+	/////////////////////////////////////////////////////////////////
+#ifdef _DEBUG
+	{
+		std::ofstream ofs( ( Jenga::Common::Environment::GetAppDir() + "\\middle_code.txt" ).c_str() );
+		ofs << basbuf << std::endl;
+		ofs.close();
+	}
+#endif
+
+
+	//"コンパイル中..."
+	compiler.messenger.Output(STRING_COMPILE_COMPILING);
+
+
+	//////////////////////
+	// グローバル実行領域
+	//////////////////////
+
+	cp=-1;
+	compiler.StartGlobalAreaCompile();
+
+	if( !compiler.IsDll() )
+	{
+		//ラベル管理オブジェクトを初期化
+		compiler.codeGenerator.gotoLabels.clear();
+
+		//Gotoラベルスケジュール
+		compiler.codeGenerator.gotoLabelSchedules.clear();
+
+		//With情報を初期化
+		extern WithInfos withInfos;
+		withInfos.clear();
+
+		//Continueアドレスを初期化
+		compiler.codeGenerator.ClearContinueArea();
+
+		//スタックフレーム管理用クラスを選択
+		pobj_sf=new StackFrame();
+
+		// コード生成対象を選択
+		compiler.codeGenerator.Select( compiler.GetObjectModule().globalNativeCode );
+
+		trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" );
+
+		if( compiler.IsCore() )
+		{
+			//sub rsp,スタックフレームサイズ
+			compiler.codeGenerator.op_sub_RV( sizeof(_int64), REG_RSP, 0x108 );
+
+			if( compiler.IsDebug() )
+			{
+				//デバッグ用の変数を定義
+				DebugVariable();
+			}
+
+			//GC用の変数を定義
+			InitGCVariables();
+
+			//_System_StartupProgramの呼び出し
+			compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+		}
+
+		// _System_GlobalArea の呼び出し
+		compiler.codeGenerator.op_call( pSub_System_GlobalArea );
+
+		if( !compiler.IsSll() )
+		{
+			///////////////////////////////////////
+			// グローバル文字列変数の解放処理
+			///////////////////////////////////////
+
+			//call _System_End
+			extern const UserProc *pSub_System_End;
+			compiler.codeGenerator.op_call(pSub_System_End);
+
+
+			//add rsp,スタックフレームサイズ
+			compiler.codeGenerator.op_add_RV( REG_RSP, 0x108 );
+
+			//xor rax,rax（raxを0に初期化する）
+			compiler.codeGenerator.op_zero_reg(REG_RAX);
+
+			//ret
+			compiler.codeGenerator.op_ret();
+		}
+
+		//スタックフレームスケジュールを実行
+		pobj_sf->RunningSchedule( 0x100 );
+		delete pobj_sf;
+		pobj_sf=0;
+
+		//グローバル実行領域のコードサイズ
+		extern int GlobalOpBufferSize;
+		GlobalOpBufferSize = compiler.linker.GetNativeCode().GetSize();
+
+		// 名前空間が正しく閉じられているかをチェック
+		if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() ){
+			compiler.errorMessenger.Output(63,NULL,-1);
+		}
+
+	}
+	else{
+		////////////////
+		// DLLの場合
+		////////////////
+
+
+	}
+
+
+	StepCompileProgress();
+
+
+	/////////////////////
+	// ローカル実行領域
+	/////////////////////
+
+	//プロシージャをコンパイル開始
+	cp=0;
+	CompileLocal();
+
+	// 終了
+	///////////////////////
+
+	StepCompileProgress();
+
+
+	//レジスタのブロッキングを管理するためのオブジェクトを破棄
+	delete pobj_BlockReg;
+
+	//ネイティブコード生成はここまで
+	//////////////////////////////////////////////////////////
+
+
+
+	trace( "コード生成が終了しました。" );
+
+
+	if( compiler.IsSll() )
+	{
+		// 静的リンクライブラリ
+
+		// 外部参照をlibから取り除く
+		ActiveBasic::Common::Environment::SetRemoveExternalMark( true );
+
+		// 格納先ディレクトリを作る
+		Jenga::Common::Path path( program.GetOutputFilePath() );
+		Jenga::Common::Directory dir( path.GetDirPath(), true );
+
+		// 書き込む
+		if( !compiler.GetObjectModule().Write( program.GetOutputFilePath() ) )
+		{
+			MessageBox(0,"XML書き込みに失敗","test",0);
+		}
+		return;
+	}
+
+	if( !compiler.errorMessenger.HasError() )
+	{
+		compiler.messenger.Output( "リンク中..." );
+	}
+
+
+	compiler.linker.Link( compiler.GetObjectModule() );
+
+
+	/////////////////////////////////////////////////////////////////
+	// vtblの構築
+	/////////////////////////////////////////////////////////////////
+
+	ActiveBasic::Compiler::VtblGenerator::GenerateVTablesForAllClasses(
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+
+
+	////////////////////////////////
+	// ここで一旦ログを取る
+	////////////////////////////////
+	Diagnose();
+
+
+
+	////////////////////////////////
+	// 使用するDLL関数のチェック
+	////////////////////////////////
+	foreach( const Schedule &schedule, compiler.linker.GetNativeCode().GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::DllProc )
+		{
+			schedule.GetDllProc().Using();
+		}
+	}
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+	{
+		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+		if( !pDllProc->IsUsing() ){
+			continue;
+		}
+/*
+		//エラーチェック
+		HINSTANCE hLib;
+		hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
+		if(!hLib){
+			char temp2[MAX_PATH],temp3[MAX_PATH];
+			_splitpath(program.GetOutputFilePath().c_str(),temp2,temp3,NULL,NULL);
+			lstrcat(temp2,temp3);
+			lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
+			GetFullPath(temp3,temp2);
+			hLib=LoadLibrary(temp3);
+
+			if(!hLib){
+				compiler.errorMessenger.Output(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetSourceCodePosition().GetPos());
+			}
+		}
+
+		if(hLib){
+			if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
+				FreeLibrary(hLib);
+				compiler.errorMessenger.Output(-107,pDllProc->GetAlias(),pDllProc->GetSourceCodePosition().GetPos());
+			}
+			FreeLibrary(hLib);
+		}
+*/
+	}
+
+
+
+	/////////////////////////////
+	// リソースデータを読み込む
+	/////////////////////////////
+	extern char ResourceFileName[MAX_PATH];
+	compiler.resourceManager.Load( ResourceFileName );
+
+
+	//////////////////////////////
+	// エクスポート情報（DLLのみ）
+	//////////////////////////////
+	IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+	DWORD *lpdwExportAddressTable;
+	DWORD *lpdwExportNamePointerTable;
+	WORD *lpwExportOrdinalTable;
+	char lpExportNames[8192];
+	int ExportNamesLength;
+	int ExportNum;
+	int DllMain_EntryPoint;
+
+	DllMain_EntryPoint=-1;
+	ExportNum=0;
+	ExportNamesLength=0;
+	lpdwExportAddressTable=(DWORD *)HeapAlloc(hHeap,0,1);
+	lpdwExportNamePointerTable=(DWORD *)HeapAlloc(hHeap,0,1);
+	lpwExportOrdinalTable=(WORD *)HeapAlloc(hHeap,0,1);
+
+	if(bUse_ExportSection){
+		_splitpath(program.GetOutputFilePath().c_str(),NULL,NULL,lpExportNames,temporary);
+		lstrcat(lpExportNames,temporary);
+		ExportNamesLength=lstrlen(lpExportNames)+1;
+
+		while(1)
+		{
+			UserProc *pUserProc = NULL;
+
+			//辞書順にサーチ
+			temporary[0]=0;
+			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			{
+				UserProc *pTempUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+				if(pTempUserProc->IsExport()){
+					if(temporary[0]=='\0'){
+						lstrcpy(temporary,pTempUserProc->GetName().c_str());
+						pUserProc = pTempUserProc;
+					}
+					else{
+						i3=lstrlen(temporary);
+						i4=(int)pTempUserProc->GetName().size();
+						if(i3<i4) i3=i4;
+						if(memcmp(temporary,pTempUserProc->GetName().c_str(),i3)>0){
+							lstrcpy(temporary,pTempUserProc->GetName().c_str());
+							pUserProc = pTempUserProc;
+						}
+					}
+				}
+			}
+			if( pUserProc == NULL )
+			{
+				break;
+			}
+
+			pUserProc->ExportOff();
+
+			if( pUserProc->GetName() == "DllMain" ){
+				DllMain_EntryPoint = pUserProc->GetBeginOpAddress();
+			}
+
+			lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
+			lpdwExportAddressTable[ExportNum] = pUserProc->GetBeginOpAddress();
+
+			lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
+			lpdwExportNamePointerTable[ExportNum]=ExportNamesLength;
+
+			lpwExportOrdinalTable=(WORD *)HeapReAlloc(hHeap,0,lpwExportOrdinalTable,(ExportNum+1)*sizeof(WORD));
+			lpwExportOrdinalTable[ExportNum]=ExportNum;
+
+			lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str());
+			ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
+
+			ExportNum++;
+		}
+		for(i=0;i<ExportNum;i++){
+			lpdwExportNamePointerTable[i]+=
+				sizeof(IMAGE_EXPORT_DIRECTORY)+	//エクスポートディレクトリテーブルを飛び越す
+				ExportNum*sizeof(DWORD)+		//エクスポート アドレス テーブルを飛び越す
+				ExportNum*sizeof(DWORD)+		//エクスポート名ポインタ テーブルを飛び越す
+				ExportNum*sizeof(WORD);			//エクスポート序数テーブルを飛び越す
+		}
+
+		ImageExportDirectory.Characteristics=0;
+		ImageExportDirectory.TimeDateStamp=(DWORD)time(NULL);
+		ImageExportDirectory.MajorVersion=0;
+		ImageExportDirectory.MinorVersion=0;
+		ImageExportDirectory.Name=sizeof(IMAGE_EXPORT_DIRECTORY)+
+			ExportNum*sizeof(DWORD)+	//エクスポート アドレス テーブルを飛び越す
+			ExportNum*sizeof(DWORD)+	//エクスポート名ポインタ テーブルを飛び越す
+			ExportNum*sizeof(WORD);		//エクスポート序数テーブルを飛び越す
+		ImageExportDirectory.Base=1;
+		ImageExportDirectory.NumberOfFunctions=ExportNum;
+		ImageExportDirectory.NumberOfNames=ExportNum;
+		ImageExportDirectory.AddressOfFunctions=sizeof(IMAGE_EXPORT_DIRECTORY);
+		ImageExportDirectory.AddressOfNames=ImageExportDirectory.AddressOfFunctions+ExportNum*sizeof(DWORD);
+		ImageExportDirectory.AddressOfNameOrdinals=ImageExportDirectory.AddressOfNames+ExportNum*sizeof(DWORD);
+	}
+
+
+	/////////////////////
+	//インポートDLL情報
+	/////////////////////
+
+	/*
+	インポート アドレス テーブル（ルックアップと同じ内容だが、プログラム実行時に実行アドレスに書き換えられる）
+	ルックアップ テーブル（ヒントを示すRVA）
+	IMAGE_IMPORT_DESCRIPTOR1[size=0x14]	インポートヘッダ
+	IMAGE_IMPORT_DESCRIPTOR2[size=0x14]
+	IMAGE_IMPORT_DESCRIPTOR3[size=0x14]
+	...
+	Dll名1[size=0x10]
+	Dll名2[size=0x10]
+	Dll名3[size=0x10]
+	...
+	ヒントテーブル（関数名を羅列したもの）
+	*/
+
+	/*
+	IMAGE_IMPORT_DESCRIPTOR1[size=0x14]	インポートヘッダ
+	IMAGE_IMPORT_DESCRIPTOR2[size=0x14]
+	IMAGE_IMPORT_DESCRIPTOR3[size=0x14]
+	...
+	Dll名1[size=0x10]
+	Dll名2[size=0x10]
+	Dll名3[size=0x10]
+	...
+	ルックアップ テーブル（ヒントを示すRVA）
+	ヒントテーブル
+	インポート アドレス テーブル（ルックアップと同じ内容だが、プログラム実行時に実行アドレスに書き換えられる）
+	*/
+
+	char **ppDllNames=(char **)HeapAlloc(hHeap,0,1);
+
+	int ImportDllNum=0;
+
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+	{
+		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+		if( !pDllProc->IsUsing() ){
+			continue;
+		}
+
+		if( pDllProc->GetDllFileName().size() > 16 ){
+			compiler.errorMessenger.Output(7,NULL,cp);
+			break;
+		}
+		for(i2=0;i2<ImportDllNum;i2++){
+			if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
+				break;
+			}
+		}
+		if(i2==ImportDllNum){
+			ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
+			ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
+			lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
+			ImportDllNum++;
+		}
+	}
+
+	//IMAGE_IMPORT_DESCRIPTOR、及びルックアップ テーブル サイズの計算
+	IMAGE_IMPORT_DESCRIPTOR *pImportDescriptor;
+	int LookupSize;
+	LookupSize=0;
+	pImportDescriptor=(IMAGE_IMPORT_DESCRIPTOR *)HeapAlloc(hHeap,0,(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR));
+	for(i=0;i<ImportDllNum;i++){
+		//IMAGE_IMPORT_DESCRIPTOR
+		pImportDescriptor[i].OriginalFirstThunk=LookupSize;	//※すぐ下で再計算
+		pImportDescriptor[i].TimeDateStamp=0;
+		pImportDescriptor[i].ForwarderChain=0;
+		pImportDescriptor[i].Name=i*0x10;	//※すぐ下で再計算
+
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップデータのサイズを追加
+				LookupSize+=sizeof(_int64);
+			}
+		}
+		LookupSize+=sizeof(_int64);	//NULL用
+	}
+	memset(&pImportDescriptor[i],0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
+	for(i=0;i<ImportDllNum;i++){
+		//インポートアドレステーブル分の差分を追加
+		pImportDescriptor[i].OriginalFirstThunk+=LookupSize;
+
+		//DLL名への差分を追加
+		pImportDescriptor[i].Name+=
+			LookupSize+			//インポート アドレス テーブル
+			LookupSize+			//ルックアップテーブル
+			(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);	//IMAGE_IMPORT_DESCRIPTOR
+	}
+
+	//ルックアップ テーブル、ヒント テーブル
+	unsigned _int64 *pLookupTable;
+	pLookupTable=(unsigned _int64 *)HeapAlloc(hHeap,0,LookupSize*sizeof(_int64)+1);
+	char *pHintTable;
+	int HintSize,HintAllocSize;
+	HintSize=0;
+	HintAllocSize=128*2;
+	pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
+	for(i=0,i5=0;i<ImportDllNum;i++){
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップの位置をセット（後にインポート アドレス テーブルにセットしなおされる）
+				pDllProc->SetLookupAddress( i5*sizeof(_int64) );
+
+				//ルックアップ テーブルの値をセット
+				pLookupTable[i5++]=
+					LookupSize+			//インポート アドレス テーブル
+					LookupSize+			//ルックアップテーブル
+					(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+	//IMAGE_IMPORT_DESCRIPTOR
+					ImportDllNum*0x10+	//DLL名の羅列
+					HintSize;			//ヒント名へのオフセット
+
+				//ヒント テーブル
+				pHintTable[HintSize++]=0;
+				pHintTable[HintSize++]=0;
+				lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
+				i4=(int)pDllProc->GetAlias().size();
+				HintSize+=i4+1;
+				if(i4%2==0) pHintTable[HintSize++]=0;
+
+				if(HintAllocSize<HintSize+128){
+					HintAllocSize+=128;
+					pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);
+				}
+			}
+		}
+		pLookupTable[i5++]=0;
+	}
+
+
+	if( compiler.IsDll() ){
+		//DLLの場合はリロケーション情報を仮生成
+		//※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。
+		pobj_Reloc->ResetRelocBuffer();
+	}
+
+
+
+	//グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
+	//（デバッグ情報で利用される）
+	foreach( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+		if(pVar->GetOffsetAddress()&0x80000000){
+			pVar->SetOffsetAddress(
+				(pVar->GetOffsetAddress()&0x7FFFFFFF)
+				+ compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+			);
+		}
+	}
+
+
+
+	////////////////////////////////////
+	// デバッグセクションを生成
+	////////////////////////////////////
+
+	//デバッグセクションを生成
+	DebugSection *pobj_DebugSection;
+	pobj_DebugSection=new DebugSection();
+	if( compiler.IsDebug() && !compiler.errorMessenger.HasError() )
+	{
+		compiler.messenger.Output( "デバッグ情報を生成しています。" );
+
+		pobj_DebugSection->make( compiler.linker.GetNativeCode().GetSourceLines() );
+
+		compiler.messenger.Output( "デバッグ情報の生成が完了しました。" );
+	}
+
+
+
+	/////////////////////////////////////
+	// 各セクションの位置とサイズを計算
+	/////////////////////////////////////
+
+	//コードセッションのファイル上のサイズ
+	if(compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT)
+	{
+		FileSize_CodeSection =
+			compiler.linker.GetNativeCode().GetSize()
+			+ (FILE_ALIGNMENT-compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT);
+	}
+	else
+	{
+		FileSize_CodeSection = compiler.linker.GetNativeCode().GetSize();
+	}
+	if(FileSize_CodeSection) bUse_CodeSection=1;
+	else bUse_CodeSection=0;
+
+	//エクスポートセクションのファイル上のサイズ
+	i=	sizeof(IMAGE_EXPORT_DIRECTORY)+	//エクスポートディレクトリテーブルを飛び越す
+		ExportNum*sizeof(DWORD)+		//エクスポート アドレス テーブルを飛び越す
+		ExportNum*sizeof(DWORD)+		//エクスポート名ポインタ テーブルを飛び越す
+		ExportNum*sizeof(WORD)+			//エクスポート序数テーブルを飛び越す
+		ExportNamesLength;				//シンボル名バッファ
+	if(bUse_ExportSection){
+		if(i%FILE_ALIGNMENT) FileSize_ExportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		else FileSize_ExportSection=i;
+	}
+	else FileSize_ExportSection=0;
+
+	//インポートセクションのファイル上のサイズ
+	i=
+		LookupSize+			//インポート アドレス テーブル
+		LookupSize+			//ルックアップテーブル
+		(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+	//IMAGE_IMPORT_DESCRIPTOR
+		ImportDllNum*0x10+	//DLL名の羅列
+		HintSize;			//ヒント名
+	if(i%FILE_ALIGNMENT) FileSize_ImportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+	else FileSize_ImportSection=i;
+	bUse_ImportSection=1;	//インポートセクションは必ず存在する
+
+	//データセクションのファイル上のサイズ
+	if(compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT) FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize()+(FILE_ALIGNMENT-compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT);
+	else FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize();
+	if(FileSize_DataSection) bUse_DataSection=1;
+	else bUse_DataSection=0;
+
+	//リライタブルセクションのファイル上のサイズ（グローバル変数の初期情報のみを格納）
+	if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() % FILE_ALIGNMENT )
+	{
+		FileSize_RWSection =
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+			+ (FILE_ALIGNMENT-compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()%FILE_ALIGNMENT);
+	}
+	else{
+		if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() )
+		{
+			FileSize_RWSection = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize();
+		}
+		else FileSize_RWSection=FILE_ALIGNMENT;
+	}
+	bUse_RWSection=1;
+
+	//リソースセクションのファイル上のサイズ
+	char *RSrcSectionBuffer;
+	int RSrcSectionSize;
+	RSrcSectionBuffer=GetRSrcSectionBuffer(&RSrcSectionSize);
+	if(RSrcSectionSize%FILE_ALIGNMENT) FileSize_RSrcSection=RSrcSectionSize+(FILE_ALIGNMENT-RSrcSectionSize%FILE_ALIGNMENT);
+	else FileSize_RSrcSection=RSrcSectionSize;
+	if(FileSize_RSrcSection) bUse_RSrcSection=1;
+	else bUse_RSrcSection=0;
+
+	//リロケーションセクションのファイル上のサイズ
+	if(pobj_Reloc->length%FILE_ALIGNMENT) FileSize_RelocSection=pobj_Reloc->length+(FILE_ALIGNMENT-pobj_Reloc->length%FILE_ALIGNMENT);
+	else FileSize_RelocSection=pobj_Reloc->length;
+	if(FileSize_RelocSection) bUse_RelocSection=1;
+	else bUse_RelocSection=0;
+
+	//デバッグセクションのファイル上のサイズ
+	if(pobj_DebugSection->length%FILE_ALIGNMENT) FileSize_DebugSection=pobj_DebugSection->length+(FILE_ALIGNMENT-pobj_DebugSection->length%FILE_ALIGNMENT);
+	else FileSize_DebugSection=pobj_DebugSection->length;
+	if(FileSize_DebugSection) bUse_DebugSection=1;
+	else bUse_DebugSection=0;
+
+
+	//各セッションのファイル上の位置
+	FilePos_CodeSection=	EXE_HEADER_SIZE;
+	FilePos_ExportSection=	FilePos_CodeSection+
+							FileSize_CodeSection;
+	FilePos_ImportSection=	FilePos_ExportSection+
+							FileSize_ExportSection;
+	FilePos_DataSection=	FilePos_ImportSection+
+							FileSize_ImportSection;
+	FilePos_RWSection=		FilePos_DataSection+
+							FileSize_DataSection;
+	FilePos_RSrcSection=	FilePos_RWSection+
+							FileSize_RWSection;
+	FilePos_RelocSection=	FilePos_RSrcSection+
+							FileSize_RSrcSection;
+	FilePos_DebugSection=	FilePos_RelocSection+
+							FileSize_RelocSection;
+
+	//コードセッションのメモリ上のサイズ
+	if(FileSize_CodeSection%MEM_ALIGNMENT) MemSize_CodeSection=FileSize_CodeSection+(MEM_ALIGNMENT-FileSize_CodeSection%MEM_ALIGNMENT);
+	else MemSize_CodeSection=FileSize_CodeSection;
+
+	//エクスポートセクションのメモリ上のサイズ
+	if(FileSize_ExportSection%MEM_ALIGNMENT) MemSize_ExportSection=FileSize_ExportSection+(MEM_ALIGNMENT-FileSize_ExportSection%MEM_ALIGNMENT);
+	else MemSize_ExportSection=FileSize_ExportSection;
+
+	//インポートセクションのメモリ上のサイズ
+	if(FileSize_ImportSection%MEM_ALIGNMENT) MemSize_ImportSection=FileSize_ImportSection+(MEM_ALIGNMENT-FileSize_ImportSection%MEM_ALIGNMENT);
+	else MemSize_ImportSection=FileSize_ImportSection;
+
+	//データセクションのメモリ上のサイズ
+	if(FileSize_DataSection%MEM_ALIGNMENT) MemSize_DataSection=FileSize_DataSection+(MEM_ALIGNMENT-FileSize_DataSection%MEM_ALIGNMENT);
+	else MemSize_DataSection=FileSize_DataSection;
+
+	//リライタブルセクションのメモリ上のサイズ
+	i = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+		+ compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
+	if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
+	else MemSize_RWSection=i;
+
+	//リソースセクションのメモリ上のサイズ
+	if(FileSize_RSrcSection%MEM_ALIGNMENT) MemSize_RSrcSection=FileSize_RSrcSection+(MEM_ALIGNMENT-FileSize_RSrcSection%MEM_ALIGNMENT);
+	else MemSize_RSrcSection=FileSize_RSrcSection;
+
+	//リロケーションセクションのメモリ上のサイズ
+	if(FileSize_RelocSection%MEM_ALIGNMENT) MemSize_RelocSection=FileSize_RelocSection+(MEM_ALIGNMENT-FileSize_RelocSection%MEM_ALIGNMENT);
+	else MemSize_RelocSection=FileSize_RelocSection;
+
+	//デバッグセクションのメモリ上のサイズ
+	if(FileSize_DebugSection%MEM_ALIGNMENT) MemSize_DebugSection=FileSize_DebugSection+(MEM_ALIGNMENT-FileSize_DebugSection%MEM_ALIGNMENT);
+	else MemSize_DebugSection=FileSize_DebugSection;
+
+
+	//各セッションのメモリ上の位置
+	if(bUse_ExportSection)	MemPos_ExportSection=	0x1000+
+													MemSize_CodeSection;
+	else					MemPos_ExportSection=0;
+	if(bUse_ImportSection)	MemPos_ImportSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection;
+	else					MemPos_ImportSection=0;
+	if(bUse_DataSection)	MemPos_DataSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection;
+	else					MemPos_DataSection=0;
+	if(bUse_RWSection)		MemPos_RWSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection;
+	else					MemPos_RWSection=0;
+	if(bUse_RSrcSection)	MemPos_RSrcSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection;
+	else					MemPos_RSrcSection=0;
+	if(bUse_RelocSection)	MemPos_RelocSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection;
+	else					MemPos_RelocSection=0;
+	if(bUse_DebugSection)	MemPos_DebugSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection+
+													MemSize_RelocSection;
+	else					MemPos_DebugSection=0;
+
+
+
+	////////////////////////////
+	// エクスポート情報の再配置
+	////////////////////////////
+	if(bUse_ExportSection){
+		for(i=0;i<ExportNum;i++){
+			lpdwExportAddressTable[i]+=MemPos_CodeSection;
+			lpdwExportNamePointerTable[i]+=MemPos_ExportSection;
+		}
+
+		ImageExportDirectory.Name+=						MemPos_ExportSection;
+		ImageExportDirectory.AddressOfFunctions+=		MemPos_ExportSection;
+		ImageExportDirectory.AddressOfNames+=			MemPos_ExportSection;
+		ImageExportDirectory.AddressOfNameOrdinals+=	MemPos_ExportSection;
+	}
+
+
+	////////////////////////////
+	// インポート情報の再配置
+	////////////////////////////
+	for(i=0,i5=0;i<ImportDllNum;i++){
+		//IMAGE_IMPORT_DESCRIPTOR
+		pImportDescriptor[i].OriginalFirstThunk+=MemPos_ImportSection;
+		pImportDescriptor[i].Name+=MemPos_ImportSection;
+
+		//インポート アドレス テーブル（ルックアップ テーブルを差し引く）
+		pImportDescriptor[i].FirstThunk=pImportDescriptor[i].OriginalFirstThunk-
+			LookupSize;			//ルックアップテーブル
+
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップ テーブル
+				pLookupTable[i5++]+=MemPos_ImportSection;
+			}
+		}
+		i5++;
+	}
+
+
+	////////////////////////////////////////
+	//仮想関数データテーブルスケジュール
+	ActiveBasic::Compiler::VtblGenerator::ActionVtblScheduleForAllClasses(
+		compiler.GetObjectModule().meta.GetClasses(),
+		ImageBase,
+		MemPos_CodeSection,
+		MemPos_DataSection
+	);
+
+
+	if( compiler.IsDll() ){
+		//DLLの場合はリロケーション情報を生成
+		pobj_Reloc->ResetRelocBuffer();
+	}
+
+	compiler.linker.SetDataTable( compiler.GetObjectModule().dataTable );
+
+	compiler.linker.SetImageBase( ImageBase );
+	compiler.linker.ResolveDataTableSchedules( MemPos_DataSection );
+	compiler.linker.ResolveCatchAddressSchedules( MemPos_CodeSection );
+	compiler.linker.ResolveDllProcSchedules( MemPos_CodeSection, MemPos_ImportSection, LookupSize, HintSize );
+	compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
+	compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
+	compiler.linker.ResolveVtblSchedule( MemPos_DataSection );
+	compiler.linker.ResolveTypeInfoSchedule( MemPos_DataSection );
+
+
+	////////////////////////////////
+	// リソースアドレススケジュール
+	extern DWORD *lpdwRSrcAddrSchedule;
+	extern int RSrcAddrScheduleNum;
+	for(i=0;i<RSrcAddrScheduleNum;i++){
+		*(DWORD *)(RSrcSectionBuffer+lpdwRSrcAddrSchedule[i])+=MemPos_RSrcSection;
+	}
+	HeapDefaultFree(lpdwRSrcAddrSchedule);
+
+
+	//Dosスタブ
+	char *DosStubBuffer;
+	int DosStubSize;
+	hFile=CreateFile(
+		( ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dosstub.pgm" ).c_str(),
+		GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		MessageBox(hOwnerEditor,"dosstub.pgmの読み込みに失敗","error",MB_OK);
+		goto EndWriteOpcode;
+	}
+	DosStubSize=GetFileSize(hFile,NULL);
+	DosStubBuffer=(char *)HeapAlloc(hHeap,0,DosStubSize);
+	ReadFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+	CloseHandle(hFile);
+
+
+	if( compiler.errorMessenger.HasError() )
+	{
+		goto EndWriteOpcode;
+	}
+
+
+	////////////////////////////
+	// EXEファイルのヘッダ情報
+	////////////////////////////
+
+	IMAGE_DOS_HEADER ImageDosHeader;
+	ImageDosHeader.e_magic=	0x5A4D;
+	ImageDosHeader.e_cblp=	0x0090;
+	ImageDosHeader.e_cp=	0x0003;
+	ImageDosHeader.e_crlc=	0;
+	ImageDosHeader.e_cparhdr=4;
+	ImageDosHeader.e_minalloc=0x0000;
+	ImageDosHeader.e_maxalloc=0xFFFF;
+	ImageDosHeader.e_ss=	0x0000;
+	ImageDosHeader.e_sp=	0x00B8;
+	ImageDosHeader.e_csum=	0x0000;
+	ImageDosHeader.e_ip=	0x0000;
+	ImageDosHeader.e_cs=	0x0000;
+	ImageDosHeader.e_lfarlc=0x0040;
+	ImageDosHeader.e_ovno=	0x0000;
+	ImageDosHeader.e_res[0]=0;
+	ImageDosHeader.e_res[1]=0;
+	ImageDosHeader.e_res[2]=0;
+	ImageDosHeader.e_res[3]=0;
+	ImageDosHeader.e_oemid=	0x0000;
+	ImageDosHeader.e_oeminfo=0x0000;
+	ImageDosHeader.e_res2[0]=0;
+	ImageDosHeader.e_res2[1]=0;
+	ImageDosHeader.e_res2[2]=0;
+	ImageDosHeader.e_res2[3]=0;
+	ImageDosHeader.e_res2[4]=0;
+	ImageDosHeader.e_res2[5]=0;
+	ImageDosHeader.e_res2[6]=0;
+	ImageDosHeader.e_res2[7]=0;
+	ImageDosHeader.e_res2[8]=0;
+	ImageDosHeader.e_res2[9]=0;
+	ImageDosHeader.e_lfanew=0x0100;	//PEヘッダの位置
+
+
+	/////////////////////////////////////////////
+	// PEヘッダ
+	/////////////////////////////////////////////
+
+	IMAGE_NT_HEADERS64 ImagePeHdr;
+	ImagePeHdr.Signature=IMAGE_NT_SIGNATURE;
+
+	//マシンタイプ
+	ImagePeHdr.FileHeader.Machine=				IMAGE_FILE_MACHINE_AMD64;
+
+	ImagePeHdr.FileHeader.NumberOfSections=		bUse_CodeSection+
+												bUse_ExportSection+
+												bUse_ImportSection+
+												bUse_DataSection+
+												bUse_RWSection+
+												bUse_RSrcSection+
+												bUse_RelocSection+
+												bUse_DebugSection;	//セクション数
+	ImagePeHdr.FileHeader.TimeDateStamp=		(DWORD)time(NULL);
+	ImagePeHdr.FileHeader.PointerToSymbolTable=	0x00000000;
+	ImagePeHdr.FileHeader.NumberOfSymbols=		0x00000000;
+	ImagePeHdr.FileHeader.SizeOfOptionalHeader=	IMAGE_SIZEOF_NT_OPTIONAL64_HEADER;
+	if( compiler.IsDll() ){
+		ImagePeHdr.FileHeader.Characteristics=	IMAGE_FILE_EXECUTABLE_IMAGE|
+												IMAGE_FILE_DLL|
+												IMAGE_FILE_LARGE_ADDRESS_AWARE;
+	}
+	else{
+		ImagePeHdr.FileHeader.Characteristics=	IMAGE_FILE_RELOCS_STRIPPED|
+												IMAGE_FILE_EXECUTABLE_IMAGE|
+												IMAGE_FILE_LARGE_ADDRESS_AWARE;
+	}
+
+	ImagePeHdr.OptionalHeader.Magic=				IMAGE_NT_OPTIONAL_HDR64_MAGIC;
+	ImagePeHdr.OptionalHeader.MajorLinkerVersion=	5;
+	ImagePeHdr.OptionalHeader.MinorLinkerVersion=	0;
+	ImagePeHdr.OptionalHeader.SizeOfCode=			FileSize_CodeSection;	//コードサイズ（.textのセッションサイズ）
+	ImagePeHdr.OptionalHeader.SizeOfInitializedData=FileSize_DataSection;	//データサイズ（.dataのセッションサイズ）
+	ImagePeHdr.OptionalHeader.SizeOfUninitializedData=0;					//未初期化データのサイズ（なし）
+	if( compiler.IsDll() ){
+		if(DllMain_EntryPoint==-1)
+			ImagePeHdr.OptionalHeader.AddressOfEntryPoint=0;
+		else
+			ImagePeHdr.OptionalHeader.AddressOfEntryPoint=MemPos_CodeSection+DllMain_EntryPoint;
+	}
+	else ImagePeHdr.OptionalHeader.AddressOfEntryPoint=	MemPos_CodeSection;
+	ImagePeHdr.OptionalHeader.BaseOfCode=			MemPos_CodeSection;	//.textのアドレス
+
+	ImagePeHdr.OptionalHeader.ImageBase=			ImageBase;		//イメージベース
+	ImagePeHdr.OptionalHeader.SectionAlignment=		MEM_ALIGNMENT;		//セクションアラインメント
+	ImagePeHdr.OptionalHeader.FileAlignment=		FILE_ALIGNMENT;
+	ImagePeHdr.OptionalHeader.MajorOperatingSystemVersion=4;
+	ImagePeHdr.OptionalHeader.MinorOperatingSystemVersion=0;
+	ImagePeHdr.OptionalHeader.MajorImageVersion=	0;
+	ImagePeHdr.OptionalHeader.MinorImageVersion=	0;
+	ImagePeHdr.OptionalHeader.MajorSubsystemVersion=4;
+	ImagePeHdr.OptionalHeader.MinorSubsystemVersion=0;
+	ImagePeHdr.OptionalHeader.Win32VersionValue=	0;
+	ImagePeHdr.OptionalHeader.SizeOfImage=			EXE_HEADER_SIZE+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection+
+													MemSize_RelocSection+
+													MemSize_DebugSection;//すべてのイメージサイズ
+	ImagePeHdr.OptionalHeader.SizeOfHeaders=		EXE_HEADER_SIZE;//ヘッダサイズ
+	ImagePeHdr.OptionalHeader.CheckSum=				0;
+	extern unsigned short TypeOfSubSystem;
+	ImagePeHdr.OptionalHeader.Subsystem=			TypeOfSubSystem;
+	ImagePeHdr.OptionalHeader.DllCharacteristics=	0;
+	ImagePeHdr.OptionalHeader.SizeOfStackReserve=	0x00100000;
+	ImagePeHdr.OptionalHeader.SizeOfStackCommit=	0x00001000;
+	ImagePeHdr.OptionalHeader.SizeOfHeapReserve=	0x00100000;
+	ImagePeHdr.OptionalHeader.SizeOfHeapCommit=		0x00001000;
+	ImagePeHdr.OptionalHeader.LoaderFlags=			0;
+	ImagePeHdr.OptionalHeader.NumberOfRvaAndSizes=	IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
+
+	//データ ディクショナリ
+	ImagePeHdr.OptionalHeader.DataDirectory[0].VirtualAddress=MemPos_ExportSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[0].Size=FileSize_ExportSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[1].VirtualAddress=	//IMAGE_IMPORT_DESCRIPTORを指す
+		MemPos_ImportSection+
+		LookupSize+	//インポート アドレス テーブル
+		LookupSize;	//ルックアップ テーブル
+	ImagePeHdr.OptionalHeader.DataDirectory[1].Size=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);
+	ImagePeHdr.OptionalHeader.DataDirectory[2].VirtualAddress=MemPos_RSrcSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[2].Size=RSrcSectionSize;
+	ImagePeHdr.OptionalHeader.DataDirectory[3].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[3].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[4].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[4].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[5].VirtualAddress=MemPos_RelocSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[5].Size=pobj_Reloc->length;
+	ImagePeHdr.OptionalHeader.DataDirectory[6].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[6].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[7].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[7].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[8].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[8].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[9].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[9].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[10].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[10].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[11].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[11].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[12].VirtualAddress=MemPos_ImportSection;//インポート アドレス テーブル
+	ImagePeHdr.OptionalHeader.DataDirectory[12].Size=LookupSize;
+	ImagePeHdr.OptionalHeader.DataDirectory[13].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[13].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[14].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[14].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[15].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[15].Size=0;
+
+
+	//コードセクションヘッダ
+	IMAGE_SECTION_HEADER CodeSectionHeader;
+	memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)CodeSectionHeader.Name,".text");
+	CodeSectionHeader.Misc.VirtualSize=			MemSize_CodeSection;
+	CodeSectionHeader.VirtualAddress=			MemPos_CodeSection;	//開始アドレス
+	CodeSectionHeader.SizeOfRawData=			FileSize_CodeSection;
+	CodeSectionHeader.PointerToRawData=			FilePos_CodeSection;	//ファイル上の開始アドレス
+	CodeSectionHeader.PointerToRelocations=		0;
+	CodeSectionHeader.PointerToLinenumbers=		0;
+	CodeSectionHeader.NumberOfRelocations=		0;
+	CodeSectionHeader.NumberOfLinenumbers=		0;
+	CodeSectionHeader.Characteristics=			IMAGE_SCN_MEM_EXECUTE|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_CNT_CODE;
+
+	//エクスポートセクションヘッダ
+	IMAGE_SECTION_HEADER ExportSectionHeader;
+	memset((char *)ExportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)ExportSectionHeader.Name,".edata");
+	ExportSectionHeader.Misc.VirtualSize=		MemSize_ExportSection;
+	ExportSectionHeader.VirtualAddress=			MemPos_ExportSection;	//開始アドレス
+	ExportSectionHeader.SizeOfRawData=			FileSize_ExportSection;	//サイズ
+	ExportSectionHeader.PointerToRawData=		FilePos_ExportSection;	//ファイル上の開始アドレス
+	ExportSectionHeader.PointerToRelocations=	0;
+	ExportSectionHeader.PointerToLinenumbers=	0;
+	ExportSectionHeader.NumberOfRelocations=	0;
+	ExportSectionHeader.NumberOfLinenumbers=	0;
+	ExportSectionHeader.Characteristics=		IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//インポートセクションヘッダ
+	IMAGE_SECTION_HEADER ImportSectionHeader;
+	memset((char *)ImportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)ImportSectionHeader.Name,".idata");
+	ImportSectionHeader.Misc.VirtualSize=
+		LookupSize+			//インポートアドレステーブル
+		LookupSize+			//ルックアップテーブル
+		(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+		16*ImportDllNum+	//DLL名
+		HintSize;			//ヒント名（関数名）テーブル
+	ImportSectionHeader.VirtualAddress=			MemPos_ImportSection;	//開始アドレス
+	ImportSectionHeader.SizeOfRawData=			FileSize_ImportSection;	//サイズ
+	ImportSectionHeader.PointerToRawData=		FilePos_ImportSection;	//ファイル上の開始アドレス
+	ImportSectionHeader.PointerToRelocations=	0;
+	ImportSectionHeader.PointerToLinenumbers=	0;
+	ImportSectionHeader.NumberOfRelocations=	0;
+	ImportSectionHeader.NumberOfLinenumbers=	0;
+	ImportSectionHeader.Characteristics=		IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//データセクションヘッダ
+	IMAGE_SECTION_HEADER DataSectionHeader;
+	memset((char *)DataSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)DataSectionHeader.Name,".sdata");
+	DataSectionHeader.Misc.VirtualSize=			MemSize_DataSection;
+	DataSectionHeader.VirtualAddress=			MemPos_DataSection;
+	DataSectionHeader.SizeOfRawData=			FileSize_DataSection;
+	DataSectionHeader.PointerToRawData=			FilePos_DataSection;
+	DataSectionHeader.PointerToRelocations=		0;
+	DataSectionHeader.PointerToLinenumbers=		0;
+	DataSectionHeader.NumberOfRelocations=		0;
+	DataSectionHeader.NumberOfLinenumbers=		0;
+	DataSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_MEM_WRITE;
+
+	//リライタブルセクションヘッダ
+	IMAGE_SECTION_HEADER RWSectionHeader;
+	memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RWSectionHeader.Name,".data");
+	RWSectionHeader.Misc.VirtualSize=			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+												+ compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
+	RWSectionHeader.VirtualAddress=				MemPos_RWSection;
+	RWSectionHeader.SizeOfRawData=				FileSize_RWSection;
+	RWSectionHeader.PointerToRawData=			FilePos_RWSection;
+	RWSectionHeader.PointerToRelocations=		0;
+	RWSectionHeader.PointerToLinenumbers=		0;
+	RWSectionHeader.NumberOfRelocations=		0;
+	RWSectionHeader.NumberOfLinenumbers=		0;
+	RWSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_MEM_WRITE;
+
+	//リソースセクションヘッダ
+	IMAGE_SECTION_HEADER RSrcSectionHeader;
+	memset((char *)RSrcSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RSrcSectionHeader.Name,".rsrc");
+	RSrcSectionHeader.Misc.VirtualSize=			RSrcSectionSize;
+	RSrcSectionHeader.VirtualAddress=			MemPos_RSrcSection;
+	RSrcSectionHeader.SizeOfRawData=			FileSize_RSrcSection;
+	RSrcSectionHeader.PointerToRawData=			FilePos_RSrcSection;
+	RSrcSectionHeader.PointerToRelocations=		0;
+	RSrcSectionHeader.PointerToLinenumbers=		0;
+	RSrcSectionHeader.NumberOfRelocations=		0;
+	RSrcSectionHeader.NumberOfLinenumbers=		0;
+	RSrcSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//リロケーションセクションヘッダ
+	IMAGE_SECTION_HEADER RelocSectionHeader;
+	memset((char *)RelocSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RelocSectionHeader.Name,".reloc");
+	RelocSectionHeader.Misc.VirtualSize=		pobj_Reloc->length;
+	RelocSectionHeader.VirtualAddress=			MemPos_RelocSection;	//開始アドレス
+	RelocSectionHeader.SizeOfRawData=			FileSize_RelocSection;	//サイズ
+	RelocSectionHeader.PointerToRawData=		FilePos_RelocSection;	//ファイル上の開始アドレス
+	RelocSectionHeader.PointerToRelocations=	0;
+	RelocSectionHeader.PointerToLinenumbers=	0;
+	RelocSectionHeader.NumberOfRelocations=		0;
+	RelocSectionHeader.NumberOfLinenumbers=		0;
+	RelocSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_DISCARDABLE|
+												IMAGE_SCN_MEM_READ;
+
+	//デバッグセクションヘッダ
+	IMAGE_SECTION_HEADER DebugSectionHeader;
+	memset((char *)DebugSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)DebugSectionHeader.Name,".debug");
+	DebugSectionHeader.Misc.VirtualSize=		pobj_DebugSection->length;
+	DebugSectionHeader.VirtualAddress=			MemPos_DebugSection;	//開始アドレス
+	DebugSectionHeader.SizeOfRawData=			FileSize_DebugSection;	//サイズ
+	DebugSectionHeader.PointerToRawData=		FilePos_DebugSection;	//ファイル上の開始アドレス
+	DebugSectionHeader.PointerToRelocations=	0;
+	DebugSectionHeader.PointerToLinenumbers=	0;
+	DebugSectionHeader.NumberOfRelocations=		0;
+	DebugSectionHeader.NumberOfLinenumbers=		0;
+	DebugSectionHeader.Characteristics=			IMAGE_SCN_MEM_DISCARDABLE|
+												IMAGE_SCN_MEM_READ;
+
+
+	hFile=CreateFile(program.GetOutputFilePath().c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		compiler.errorMessenger.Output(53,program.GetOutputFilePath().c_str(),-1);
+		goto EndWriteOpcode;
+	}
+
+	//ヘッダ
+	WriteFile(hFile,(void *)&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),(DWORD *)&i2,NULL);
+	i=i2;
+
+	//Dosスタブ
+	WriteFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+	i+=i2;
+
+	//0x0100までNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,0x0100-i);
+	WriteFile(hFile,temp2,0x0100-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	//PEヘッダ
+	WriteFile(hFile,&ImagePeHdr,sizeof(IMAGE_NT_HEADERS64),(DWORD *)&i2,NULL);
+	i+=i2;
+
+	//コード セクション ヘッダ
+	WriteFile(hFile,&CodeSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+	i+=i2;
+
+	if(bUse_ExportSection){
+		//エクスポート セクション ヘッダ
+		WriteFile(hFile,&ExportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_ImportSection){
+		//インポート セクション ヘッダ
+		WriteFile(hFile,&ImportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_DataSection){
+		//データ セクション ヘッダ
+		WriteFile(hFile,&DataSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RWSection){
+		//リライタブルセクションヘッダ
+		WriteFile(hFile,&RWSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RSrcSection){
+		//リソースセクションヘッダ
+		WriteFile(hFile,&RSrcSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RelocSection){
+		//リロケーションセクションヘッダ
+		WriteFile(hFile,&RelocSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_DebugSection){
+		//デバッグセクションヘッダ
+		WriteFile(hFile,&DebugSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//EXE_HEADER_SIZEまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,EXE_HEADER_SIZE-i);
+	WriteFile(hFile,temp2,EXE_HEADER_SIZE-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	//コード
+	WriteFile(
+		hFile,
+		compiler.linker.GetNativeCode().GetBuffer(),
+		compiler.linker.GetNativeCode().GetSize(),
+		(DWORD *)&i2,
+		NULL
+	);
+	i+=i2;
+
+	//FilePos_ExportSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ExportSection-i);
+	WriteFile(hFile,temp2,FilePos_ExportSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_ExportSection){
+		//エクスポート ディレクトリ テーブル
+		WriteFile(hFile,&ImageExportDirectory,sizeof(IMAGE_EXPORT_DIRECTORY),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート アドレス テーブル
+		WriteFile(hFile,lpdwExportAddressTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート名ポインタ テーブル
+		WriteFile(hFile,lpdwExportNamePointerTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート序数テーブル
+		WriteFile(hFile,lpwExportOrdinalTable,ExportNum*sizeof(WORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//シンボル名
+		WriteFile(hFile,lpExportNames,ExportNamesLength,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_ImportSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ImportSection-i);
+	WriteFile(hFile,temp2,FilePos_ImportSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_ImportSection){
+		//インポート アドレス テーブル
+		WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//ルックアップ テーブル
+		WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//インポート ディレクトリ テーブル（Nullディレクトリ テーブルを含む）
+		for(i3=0;i3<(ImportDllNum+1);i3++){
+			WriteFile(hFile,&pImportDescriptor[i3],sizeof(IMAGE_IMPORT_DESCRIPTOR),(DWORD *)&i2,NULL);
+			i+=i2;
+		}
+
+		//DLL名
+		for(i3=0;i3<ImportDllNum;i3++){
+			WriteFile(hFile,ppDllNames[i3],16,(DWORD *)&i2,NULL);
+			i+=i2;
+		}
+
+		//ヒント テーブル
+		WriteFile(hFile,pHintTable,HintSize,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_DataSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_DataSection-i);
+	WriteFile(hFile,temp2,FilePos_DataSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_DataSection){
+		//データ テーブル
+		WriteFile(
+			hFile,
+			compiler.linker.GetDataTable().GetPtr(),
+			compiler.linker.GetDataTable().GetSize(),
+			(DWORD *)&i2,
+			NULL
+		);
+		i+=i2;
+	}
+
+	//FilePos_RWSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RWSection-i);
+	WriteFile(hFile,temp2,FilePos_RWSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RWSection){
+		//リライタブル データ テーブル（グローバル変数の初期バッファ）
+		char *temp = (char *)calloc( FileSize_RWSection, 1 );
+		memcpy(
+			temp,
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetBuffer(),
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+		);
+
+		WriteFile(hFile,temp,FileSize_RWSection,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		free( temp );
+	}
+
+	//FilePos_RSrcSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RSrcSection-i);
+	WriteFile(hFile,temp2,FilePos_RSrcSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RSrcSection){
+		//リソースバッファ
+		WriteFile(hFile,RSrcSectionBuffer,RSrcSectionSize,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_RelocSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RelocSection-i);
+	WriteFile(hFile,temp2,FilePos_RelocSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RelocSection){
+		//リロケーション情報
+		WriteFile(hFile,pobj_Reloc->buffer,pobj_Reloc->length,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//ファイルアラインメントを考慮
+	if(i%FILE_ALIGNMENT){
+		temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+		HeapDefaultFree(temp2);
+		i+=i2;
+	}
+
+	if(bUse_DebugSection){
+		//デバッグセクション
+		WriteFile(hFile,pobj_DebugSection->buffer,pobj_DebugSection->length,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//ファイルアラインメントを考慮
+	if(i%FILE_ALIGNMENT){
+		temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+		HeapDefaultFree(temp2);
+		i+=i2;
+	}
+
+	//書き込み終了
+	CloseHandle(hFile);
+
+
+EndWriteOpcode:
+
+	//Dosスタブ用のメモリを解放
+	HeapDefaultFree(DosStubBuffer);
+
+	//エクスポート テーブル情報を解放
+	HeapDefaultFree(lpdwExportAddressTable);
+	HeapDefaultFree(lpdwExportNamePointerTable);
+	HeapDefaultFree(lpwExportOrdinalTable);
+
+	//インポートDLL情報を解放
+	HeapDefaultFree(pImportDescriptor);
+	for(i=0;i<ImportDllNum;i++)
+		HeapDefaultFree(ppDllNames[i]);
+	HeapDefaultFree(ppDllNames);
+
+	//ルックアップテーブルに関する情報を解放
+	HeapDefaultFree(pLookupTable);
+
+	//ヒントテーブルに関する情報を解放
+	HeapDefaultFree(pHintTable);
+
+	//リソースセクションバッファを解放
+	HeapDefaultFree(RSrcSectionBuffer);
+
+	//デバッグセクションを開放
+	delete pobj_DebugSection;
+
+	//リロケーション情報を解放
+	delete pobj_Reloc;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/NumOpe.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/NumOpe.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/NumOpe.cpp	(revision 774)
@@ -0,0 +1,1459 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+using namespace ActiveBasic::Compiler;
+
+void NewStringObject(int reg, const char *str){
+	///////////////////////////////////////////////////////
+	// lpszTextを元にStringオブジェクトを生成し、
+	// オブジェクトポインタをregに格納する
+	///////////////////////////////////////////////////////
+
+
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		char *parameter = (char *)malloc( lstrlen( str ) + 32 );
+		sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS );
+
+		Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) );
+
+		free( parameter );
+
+		//mov reg,rax
+		compiler.codeGenerator.op_mov_RR( reg, REG_RAX );
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+}
+
+void SetUseRegFromRax(int type,int UseReg,int XmmReg){
+	if(IsRealNumberType(type)){
+		//実数型
+		if(XmmReg==REG_XMM4){
+			if(type==DEF_DOUBLE){
+				//movsd qword ptr[rsp+offset],xmm0	※スタックフレームを利用
+				pobj_sf->push(REG_XMM0,sizeof(double));
+			}
+			if(type==DEF_SINGLE){
+				//movss dword ptr[rsp+offset],xmm0	※スタックフレームを利用
+				pobj_sf->push(REG_XMM0,sizeof(float));
+			}
+		}
+		else{
+			if(type==DEF_DOUBLE){
+				//movsd xmm_reg,xmm0
+				compiler.codeGenerator.op_movsd_RR(XmmReg,REG_XMM0);
+			}
+			else if(type==DEF_SINGLE){
+				//movss xmm_reg,xmm0
+				compiler.codeGenerator.op_movss_RR(XmmReg,REG_XMM0);
+			}
+		}
+	}
+	else{
+		//整数型
+		if(UseReg==REG_R14){
+			//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+			pobj_sf->push(REG_RAX);
+		}
+		else{
+			//mov reg,rax
+			compiler.codeGenerator.op_mov_RR(UseReg,REG_RAX);
+		}
+	}
+}
+
+void ExtendRegToBigType( int reg, int bigBasicType, int baseBasicType ){
+	switch( Type::GetBasicSize( bigBasicType ) ){
+		case sizeof(_int64):
+			ExtendTypeTo64(baseBasicType,reg);
+			break;
+		case sizeof(long):
+			ExtendTypeTo32(baseBasicType,reg);
+			break;
+		case sizeof(short):
+			ExtendTypeTo16(baseBasicType,reg);
+			break;
+	}
+}
+
+
+bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){
+	int UseReg=pobj_reg->GetNextReg();
+	int XmmReg=pobj_reg->GetNextXmmReg();
+
+	//大きな型への暗黙の変換
+	int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
+
+	if(resultType.GetBasicType()&FLAG_PTR){
+		//配列ポインタ
+		resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) );
+
+		SetVarPtrToReg(UseReg,&relativeVar);
+	}
+	else if(resultType.IsReal()){
+		//実数型
+		if( resultType.IsDouble() )
+			SetXmmReg_DoubleVariable(&relativeVar,XmmReg);
+		if( resultType.IsSingle() )
+			SetXmmReg_SingleVariable(&relativeVar,XmmReg);
+	}
+	else if( resultType.IsWhole() || resultType.IsObject()){
+		//整数型
+		SetReg_WholeVariable(resultType,&relativeVar,UseReg);
+	}
+	else if( resultType.IsStruct() ){
+		//構造体ポインタをUseRegへ格納（構造体は値型）
+		SetVarPtrToReg(UseReg,&relativeVar);
+	}
+	else{
+		return false;
+	}
+
+	if( resultType.GetBasicType() != bigType ){
+		// 大きな型へ変換された場合
+		// ※レジスタの値をキャストする
+		ExtendRegToBigType( UseReg, bigType, resultType.GetBasicType() );
+
+		resultType.SetBasicType( bigType );
+	}
+
+	return true;
+}
+bool TermMemberOpe( const Type &leftType, bool &isNeedHeapFreeStructure, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member, bool &isVariable, RELATIVE_VAR &relativeVar )
+{
+	const CClass &objClass = leftType.GetClass();
+
+	const int useReg=pobj_reg->GetNextReg();
+	const int xmmReg=pobj_reg->GetNextXmmReg();
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(member,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		if( VarName[0] == '\0' )
+		{
+			classType = leftType;
+
+			if( classType.IsObject() )
+			{
+				// 既にuseRegにオブジェクトポインタが格納されており、それに対するインデクサを呼び出す場合
+				// ※「プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す」場合にここにくる
+
+				// オブジェクトメンバのポインタは既にraxに入っている
+			}
+		}
+		else
+		{
+			GetMemberType( leftType, VarName, classType, 0, false );
+
+			if( classType.IsObject() )
+			{
+				//オブジェクトポインタをr11にコピー
+				compiler.codeGenerator.op_mov_RR( REG_R11, useReg );
+
+				RELATIVE_VAR tempRelativeVar;
+				tempRelativeVar.dwKind=VAR_DIRECTMEM;
+
+				if( !_member_offset(
+					true,	//エラー表示あり
+					false,	//読み込み専用
+					leftType,
+					VarName,&tempRelativeVar,classType,0)){
+						return false;
+				}
+
+				// オブジェクトメンバのポインタをraxにコピー
+				if( !VarToReg( tempRelativeVar, baseType, resultType ) ){
+					compiler.errorMessenger.Output(11,termFull,cp);
+				}
+			}
+		}
+
+		if( classType.IsObject() )
+		{
+			//////////////////////////////////////////////////////
+			/////    レジスタ資源のバックアップ
+			{	BACKUP_REGISTER_RESOURCE
+			//////////////////////////////////////////////////////
+
+				//オブジェクトポインタをスタックに入れておく
+				//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+				pobj_sf->push( useReg );
+
+				char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE];
+				GetArrayElement(termFull,objectFullName,dummyArrayElements);
+
+				CallIndexerGetterProc(useReg,classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW );
+
+				pobj_sf->pop();
+
+			/////////////////////////////////////////////
+			//////   レジスタ資源を復元
+				RESTORE_REGISTER_RESOURCE
+			}////////////////////////////////////////////
+
+			return true;
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// メンバを検索
+	///////////////////////////////////////////////////////////////////
+	if( GetMemberType( leftType, member, resultType, 0, false ) ){
+		// メンバが見つかったとき
+
+		if( isNeedHeapFreeStructure )
+		{
+			if( !leftType.IsStruct() )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			pobj_reg->LockReg();
+
+			// 親となる構造体が一時メモリに存在していた場合、後ほど解放する必要がある
+			compiler.codeGenerator.op_AddNeedFreeTempStructure( useReg );
+			isNeedHeapFreeStructure = false;
+
+			pobj_reg->UnlockReg();
+		}
+
+		//オブジェクトポインタをr11にコピー
+		compiler.codeGenerator.op_mov_RR( REG_R11, useReg );
+
+		relativeVar.dwKind=VAR_DIRECTMEM;
+
+		if( !_member_offset(
+			true,	//エラー表示あり
+			false,	//読み込み専用
+			leftType,
+			member,&relativeVar,resultType,0)){
+				return false;
+		}
+
+		// 変数として扱う
+		isVariable = true;
+
+		return true;
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// 動的メソッドを検索
+	///////////////////////////////////////////////////////////////////
+	std::vector<const UserProc *> userProcs;
+
+	char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1];
+	ReferenceKind refType;
+	PareOrBracket pareOrBracket = None;
+	lstrcpy( methodName, member );
+	GetVarFormatString( methodName, parameter, lpPtrOffset, dummy, refType, &pareOrBracket );
+
+	objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
+	if(userProcs.size()){
+		//オーバーロードを解決
+		const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
+
+		if( pUserProc )
+		{
+			if(
+				pUserProc->Params().size() == 0				// 仮引数の個数は0
+				&& parameter[0]								// 実引数は1つ以上
+				&& pUserProc->ReturnType().IsObject()		// 戻り値がクラス型の場合
+				&& pareOrBracket == Bracket )				// 実引数は[]で囲まれている
+			{
+				// プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す
+
+				// まずはプロパティ値を取得
+				bool dummyIsVariable;
+				RELATIVE_VAR dummyRelativeVar;
+				TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull, termLeft, methodName, dummyIsVariable, dummyRelativeVar );
+
+				// 戻り値のオブジェクトインスタンスのインデクサを呼び出す
+				char temporary[VN_SIZE], temp2[VN_SIZE];
+				sprintf( temporary, "[%s]", parameter );
+				sprintf( temp2, "%s.%s", termLeft, methodName );
+				Type classType = resultType;
+				return TermMemberOpe( classType, isNeedHeapFreeStructure, baseType, resultType, termFull, temp2, temporary, isVariable, relativeVar );
+			}
+
+			resultType = pUserProc->ReturnType();
+
+
+			//////////////////////////////////////////////////////
+			/////    レジスタ資源のバックアップ
+			{	BACKUP_REGISTER_RESOURCE
+			//////////////////////////////////////////////////////
+
+				//オブジェクトポインタをスタックに入れておく
+				//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+				pobj_sf->push( useReg );
+
+				if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft ) ){
+					//レジスタ資源を復元
+					RESTORE_REGISTER_RESOURCE
+
+					return false;
+				}
+
+				pobj_sf->pop();
+
+				/////////////////////
+				// 戻り値の処理
+				/////////////////////
+
+				//大きな型への暗黙の変換
+				int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+				if( resultType.GetBasicType() != bigType ){
+					// 大きな型へ変換された場合
+					// ※レジスタの値をキャストする
+					ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
+
+					resultType.SetBasicType( bigType );
+				}
+
+				SetUseRegFromRax(resultType.GetBasicType(),useReg,xmmReg);
+
+				// 型パラメータを解決
+				ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc );
+
+
+			/////////////////////////////////////////////
+			//////   レジスタ資源を復元
+				RESTORE_REGISTER_RESOURCE
+			}////////////////////////////////////////////
+			
+			return true;
+		}
+	}
+	else if( pareOrBracket == Pare )
+	{
+		// 関数ポインタ
+		compiler.errorMessenger.OutputFatalError();
+
+		///////////////////////////////////////////////////////////////////
+		// メンバを検索
+		///////////////////////////////////////////////////////////////////
+		if( GetMemberType( leftType, methodName, resultType, 0, false ) ){
+			// メンバが見つかったとき
+		}
+	}
+
+	compiler.errorMessenger.OutputFatalError();
+
+	return false;
+}
+bool _TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool &isNeedHeapFreeStructure, bool *pIsClassName, bool isProcedureCallOnly, bool &isVariable, RELATIVE_VAR &relativeVar, bool isWriteAccess )
+{
+	char parameter[VN_SIZE];
+
+	// Withを解決
+	char termFull[VN_SIZE];
+	if(term[0]=='.'){
+		GetWithName(termFull);
+		lstrcat(termFull,term);
+	}
+	else lstrcpy(termFull,term);
+
+	char termLeft[VN_SIZE];
+	lstrcpy(termLeft,termFull);
+
+	// パース
+	char member[VN_SIZE];
+	ReferenceKind refType;
+	if( SplitMemberName( termFull, termLeft, member, refType ) ){
+		///////////////////////////////////////////////////////////////////
+		// オブジェクトとメンバに分解できるとき
+		// termLeft.member
+		///////////////////////////////////////////////////////////////////
+
+		isLiteral = false;
+
+		// オブジェクト側の型を取得
+		bool isClassName = false;
+		Type leftType;
+		if( GetTermType( termLeft, Type(), leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					compiler.GetObjectModule().meta.GetBlittableTypes().Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+			}
+		}
+
+		if( !TermOpe( termLeft, baseType, leftType, isLiteral, isNeedHeapFreeStructure, &isClassName ) ){
+			goto globalArea;
+		}
+
+		if( isClassName ){
+			// 静的メンバ/メソッドの場合
+			goto globalArea;
+		}
+
+		if( !leftType.HasMember() ){
+			// メンバを持たない型の場合
+			if( isProcedureCallOnly )
+			{
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+			return false;
+		}
+
+		return TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull, termLeft, member, isVariable, relativeVar );
+	}
+globalArea:
+
+	//////////////////////////////////////////////
+	// クラス名かどうかをチェック（静的メンバ用）
+	//////////////////////////////////////////////
+
+	if( pIsClassName ){
+		if( compiler.GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( termFull ) ) ){
+			*pIsClassName = true;
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// グローバル属性エリア
+	/////////////////////////////////////////////////////////////////
+
+	int UseReg=pobj_reg->GetNextReg();
+	int XmmReg=pobj_reg->GetNextXmmReg();
+
+
+	if(lstrcmpi(termFull,"This")==0 && isProcedureCallOnly == false ){
+		if( !compiler.IsCompilingClass() )
+		{
+			compiler.errorMessenger.Output(142,NULL,cp);
+			return false;
+		}
+
+		//Thisオブジェクト
+		resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+
+		SetThisPtrToReg( UseReg );
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	//////////////////////////////////////
+	// 関数（DLL、ユーザー定義、組み込み）
+	//////////////////////////////////////
+	char procName[VN_SIZE];
+	char temporary[8192];
+
+	int i2=GetCallProcName(termFull,procName);
+	if(termFull[i2]=='('){
+		int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
+
+		void *pInfo;
+		int idProc=GetProc(procName,(void **)&pInfo);
+
+		if(idProc){
+			//閉じカッコ")"に続く文字がNULLでないとき
+			if(termFull[i2+1+i4+1]!='\0'){
+				compiler.errorMessenger.Output(42,NULL,cp);
+			}
+
+
+			//////////////////////////////////////////////////////
+			/////    レジスタ資源のバックアップ
+			{	BACKUP_REGISTER_RESOURCE
+			//////////////////////////////////////////////////////
+
+
+				////////////////
+				// 呼び出し
+				////////////////
+
+				CallProc(idProc,pInfo,procName,parameter, baseType,resultType);
+
+
+				/////////////////////
+				// 戻り値の処理
+				/////////////////////
+
+				//大きな型への暗黙の変換
+				int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+				if( resultType.GetBasicType() != bigType ){
+					// 大きな型へ変換された場合
+					// ※レジスタの値をキャストする
+					ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
+
+					resultType.SetBasicType( bigType );
+				}
+
+				SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
+
+			/////////////////////////////////////////////
+			//////   レジスタ資源を復元
+				RESTORE_REGISTER_RESOURCE
+			}////////////////////////////////////////////
+
+			if(resultType.IsStruct())
+			{
+				//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+				//※後にfreeする必要あり
+				// TODO: 解放はGCに任せる
+				isNeedHeapFreeStructure = true;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+
+		ConstMacro *pConstMacro = compiler.GetObjectModule().meta.GetGlobalConstMacros().Find(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( procName )
+		);
+		if( pConstMacro )
+		{
+			if( ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, parameter, temporary ) )
+			{
+				/////////////////////////
+				// マクロ関数
+				/////////////////////////
+
+				//閉じカッコ")"に続く文字がNULLでないときはエラーにする
+				if(termFull[i2+1+i4+1]!='\0') compiler.errorMessenger.Output(42,NULL,cp);
+
+				//マクロ関数の場合
+				NumOpe(&UseReg, temporary,Type(),resultType);
+
+				if(!IS_LITERAL(resultType.GetIndex())){
+					//リテラル値ではなかったとき
+					isLiteral = false;
+				}
+
+				return true;
+			}
+		}
+	}
+	else if( isProcedureCallOnly ){
+		// 関数呼び出し以外は受け付けない
+		return false;
+	}
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(termFull,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		GetVarType(VarName,classType,false);
+		if( classType.IsObject() )
+		{
+			CallIndexerGetterProc(UseReg,classType,VarName,ArrayElements,resultType);
+
+			isLiteral = false;
+
+			return true;
+		}
+	}
+
+
+	////////////////////////////////
+	// 変数
+	////////////////////////////////
+
+	if(GetVarOffset(
+		false,	//エラー表示なし
+		isWriteAccess,
+		termFull,
+		&relativeVar,resultType)){
+		//////////
+		// 変数
+		//////////
+
+		// 変数として扱う
+		isVariable = true;
+
+		isLiteral = false;
+
+		return true;
+	}
+
+/*
+	////////////////////////////////
+	// 型名
+	////////////////////////////////
+
+	if( compiler.StringToType( termFull, resultType ) ){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
+		return true;
+	}*/
+
+
+	/////////////////////////////////
+	// プロパティ用のメソッド
+	/////////////////////////////////
+
+	//配列要素を排除
+	GetArrayElement(termFull,VarName,ArrayElements);
+
+	if(GetSubHash(VarName,0)){
+
+		//////////////////////////////////////////////////////
+		/////    レジスタ資源のバックアップ
+		{	BACKUP_REGISTER_RESOURCE
+		//////////////////////////////////////////////////////
+
+			CallPropertyMethod(termFull,NULL,resultType);
+
+			//大きな型への暗黙の変換
+			int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+			if( resultType.GetBasicType() != bigType ){
+				// 大きな型へ変換された場合
+				// ※レジスタの値をキャストする
+				ExtendRegToBigType( REG_RAX, bigType, resultType.GetBasicType() );
+
+				resultType.SetBasicType( bigType );
+			}
+
+			SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
+
+		/////////////////////////////////////////////
+		//////   レジスタ資源を復元
+			RESTORE_REGISTER_RESOURCE
+		}////////////////////////////////////////////
+
+		if(resultType.IsStruct())
+		{
+			//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+			//※後にfreeする必要あり
+			// TODO: 解放はGCに任せる
+			isNeedHeapFreeStructure = true;
+		}
+
+		isLiteral = false;
+
+		return true;
+	}
+
+	if( isProcedureCallOnly )
+	{
+		compiler.errorMessenger.Output(3, termLeft, cp );
+	}
+
+	return false;
+}
+
+bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool &isNeedHeapFreeStructure, bool *pIsClassName, bool isProcedureCallOnly, bool isWriteAccess )
+{
+	bool isInitRegSwitch = false;
+	if( !pobj_reg )
+	{
+		isInitRegSwitch = true;
+
+		//作業用レジスタを取得
+		pobj_reg = new CRegister( REG_RAX );
+	}
+
+	//エラー時の復旧用
+	CRegister objReg_Backup = *pobj_reg;
+
+
+	RELATIVE_VAR relativeVar;
+	bool isVariable = false;
+	bool result = _TermOpe( term, baseType, resultType, isLiteral, isNeedHeapFreeStructure, pIsClassName, isProcedureCallOnly, isVariable, relativeVar, isWriteAccess );
+
+	if( isVariable )
+	{
+		// 変数の場合はeaxに変数ポインタを格納する
+		if( !VarToReg( relativeVar, baseType, resultType ) ){
+			compiler.errorMessenger.Output(11,term,cp);
+		}
+	}
+
+
+	if( !result )
+	{
+		*pobj_reg = objReg_Backup;
+	}
+
+	if( isInitRegSwitch ){
+		//整合性をチェック（バグ回避）
+		if( result )
+		{
+			pobj_reg->bug_check();
+		}
+
+		//作業レジスタを解放
+		delete pobj_reg;
+		pobj_reg = NULL;
+	}
+
+	return result;
+}
+bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess )
+{
+	if( pobj_reg )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	//作業用レジスタを取得
+	pobj_reg = new CRegister( REG_NON );
+
+	bool isLiteral, isVariable = false, isNeedHeapFreeStructure = false;
+	bool result = _TermOpe( term, Type(), resultType, isLiteral, isNeedHeapFreeStructure, NULL, false, isVariable, relativeVar, isWriteAccess );
+
+	if( !isVariable )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	//整合性をチェック（バグ回避）
+	if( result )
+	{
+		pobj_reg->bug_check();
+	}
+
+	//作業レジスタを解放
+	delete pobj_reg;
+	pobj_reg=0;
+
+	return result;
+}
+
+
+bool _numope( int *pReg,
+			const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			bool *pbIsNeedHeapFreeStructure )
+{
+	int i,i2,i3;
+	char temporary[1024],temp2[1024];
+
+	if(expression[0]=='\0'){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return false;
+	}
+
+	if( !baseType.IsNull() && expression[0] == '[' ){
+		// リテラル配列の場合
+
+		int dataTableOffset;
+		if( !ActiveBasic::Compiler::DataTableGenerator::MakeLiteralArrayBuffer( compiler.GetObjectModule().dataTable, expression, baseType, dataTableOffset ) )
+		{
+			return false;
+		}
+
+		//mov reg,i2
+		compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable );
+
+		resultType = baseType;
+
+		return true;
+	}
+
+	bool isLiteralCalculation;
+	if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
+	{
+		if( isLiteralCalculation )
+		{
+			//右辺値が数値の定数式の場合
+			_int64 i64data;
+			StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
+
+			if(resultType.IsReal()){
+				if(baseType.IsReal()) resultType=baseType;
+
+				int xmmReg = pobj_reg->GetNextXmmReg();
+				*pReg = xmmReg;
+
+				if(resultType.IsDouble()){
+					i3 = compiler.GetObjectModule().dataTable.Add( i64data );
+
+					//movlpd xmm_reg,qword ptr[data table offset]
+					compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+				}
+				if(resultType.IsSingle()){
+					double dbl;
+					memcpy(&dbl,&i64data,sizeof(_int64));
+
+					float flt;
+					int i32data;
+					flt=(float)dbl;
+					memcpy(&i32data,&flt,sizeof(long));
+
+					i3 = compiler.GetObjectModule().dataTable.Add( i32data );
+
+					//movss xmm_reg,dword ptr[data table offset]
+					compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+				}
+			}
+			else{
+				if(!resultType.Is64()){
+					//整数（符号有り/無し）
+
+					i3=(long)i64data;
+
+					if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
+					if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
+
+					i64data=(_int64)i3;
+				}
+
+				//mov reg,i64data
+				compiler.codeGenerator.op_mov_RV64(*pReg,i64data);
+			}
+			return true;
+		}
+	}
+
+	if( expression[0] == 1 )
+	{
+		if( expression[1]==ESC_NEW )
+		{
+			//New演算子（オブジェクト生成）
+
+			if( pobj_BlockReg->check(REG_RAX) ){
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			//////////////////////////////////////////////////////
+			/////    レジスタ資源のバックアップ
+			{	BACKUP_REGISTER_RESOURCE
+			//////////////////////////////////////////////////////
+
+				if( !Operator_New( expression+2, baseType, resultType ) ){
+					return false;
+				}
+
+			/////////////////////////////////////////////
+			//////   レジスタ資源を復元
+				RESTORE_REGISTER_RESOURCE
+			}////////////////////////////////////////////
+
+			//mov reg,rax
+			compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
+
+			return true;
+		}
+		else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
+		{
+			// 静的領域にオブジェクトを作る
+
+			// 静的領域にオブジェクトを生成
+			int dataTableOffset;
+			if( !ActiveBasic::Compiler::DataTableGenerator::MakeConstObjectToProcessStaticBuffer( compiler.GetObjectModule().dataTable, expression + 2, resultType, dataTableOffset ) )
+			{
+				return false;
+			}
+
+			//mov reg,i2
+			compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable);
+
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////
+	// 式要素を逆ポーランド式で取得
+	/////////////////////////////////
+
+	char *values[255];
+	long calc[255];
+	long stack[255];
+	int pnum;
+	if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
+		for(i=0;i<pnum;i++){
+			if(values[i]) HeapDefaultFree(values[i]);
+		}
+		return 0;
+	}
+
+
+	////////////////////////////////
+	// 演算部分のコード生成を開始
+	////////////////////////////////
+
+	BOOL bError;
+	bError=0;
+
+	//リテラル値のみの計算かどうかを判別するためのフラグ
+	BOOL bLiteralCalculation=1;
+
+	double dbl;
+	int sp;
+	int type_stack[255];
+	LONG_PTR index_stack[255];
+	bool isNothing_stack[255];
+	bool isNeedHeapFreeStructureStack[255];
+	_int64 i64data;
+	int UseReg,XmmReg;
+	BOOL bXmm;
+	for(i=0,sp=0;i<pnum;i++){
+		int idCalc;
+		idCalc=calc[i]%100;
+
+		if(idCalc){
+			if( sp>=2 && type_stack[sp-2]==DEF_OBJECT )
+			{
+				if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& index_stack[sp-1] == index_stack[sp-2]
+					|| isNothing_stack[sp-2] ){
+						// 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
+				}
+				else if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
+					)){
+						// ダウンキャストを許可する
+				}
+				else{
+					//オーバーロードされたオペレータを呼び出す
+					i2=CallOperatorProc(idCalc,baseType,type_stack,index_stack,isNeedHeapFreeStructureStack,sp);
+					if(i2==0){
+						if(idCalc==CALC_EQUAL) lstrcpy(temp2,"==");
+						else GetCalcName(idCalc,temp2);
+						sprintf(temporary,"Operator %s",temp2);
+						compiler.errorMessenger.Output(27,temporary,cp);
+						goto error;
+					}
+					else if(i2==-1) goto error;
+
+					continue;
+				}
+			}
+
+			if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
+		}
+
+		switch(idCalc){
+			//数値
+			case 0:
+				index_stack[sp]=-1;
+				isNothing_stack[sp] = false;
+				isNeedHeapFreeStructureStack[sp] = false;
+
+				UseReg=pobj_reg->GetNextReg();
+				XmmReg=pobj_reg->GetNextXmmReg();
+
+				bXmm=0;
+
+				char *term;
+				term=values[i];
+
+				if( calc[i+1]%100 == CALC_AS ){
+					// As演算子の右辺値
+					//型名
+					if( compiler.StringToType( term, resultType ) ){
+						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
+					}
+					else{
+						compiler.errorMessenger.Output(3, term, cp );
+						goto error;
+					}
+
+					type_stack[sp] = resultType.GetBasicType();
+					index_stack[sp] = resultType.GetIndex();
+					sp++;
+
+					break;
+				}
+
+				if( (term[0]=='e'||term[0]=='E')
+					&& (term[1]=='x'||term[1]=='X')
+					&& term[2]=='\"'
+					|| term[0] == '\"' )
+				{
+					bool isEx = true;
+					if( term[0] == '\"' )
+					{
+						isEx = false;
+					}
+
+					if( isEx )
+					{
+						// 拡張版リテラル文字列（エスケープシーケンス可能）
+						if(!RemoveStringQuotes(term+2)){
+							compiler.errorMessenger.Output(43,NULL,cp);
+							goto error;
+						}
+						i3=FormatString_EscapeSequence(term+2);
+						term+=2;
+					}
+					else
+					{
+						// 通常文字列
+						if(!RemoveStringQuotes(term)){
+							compiler.errorMessenger.Output(43,NULL,cp);
+							goto error;
+						}
+						i3=lstrlen(term);
+					}
+
+					if( !baseType.IsPointer() )
+					{
+						//要求タイプがオブジェクト、または未定のとき
+
+						//String型オブジェクトを生成
+						i2 = ActiveBasic::Compiler::DataTableGenerator::MakeConstStringObjectToProcessStaticBuffer( compiler.GetObjectModule().dataTable, term );
+
+						//mov reg,i2
+						compiler.codeGenerator.op_mov_RV(sizeof(_int64),UseReg,i2, Schedule::DataTable);
+
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+						bLiteralCalculation=0;
+
+						if(bXmm) pobj_reg->LockXmmReg();
+						else pobj_reg->LockReg();
+
+						sp++;
+						break;
+					}
+
+StrLiteral:
+
+					type_stack[sp]=typeOfPtrChar;
+					bLiteralCalculation=0;
+
+					i2 = compiler.AddStringToDataTable( std::string( term, i3 ) );
+
+					//mov reg,i2
+					compiler.codeGenerator.op_mov_RV(sizeof(_int64),UseReg,i2, Schedule::DataTable);
+
+					if(UseReg==REG_R14){
+						//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+						pobj_sf->push(REG_R14);
+					}
+				}
+				else if(IsVariableTopChar(term[0])||
+					term[0]=='*'||
+					(term[0]=='.'&&IsVariableTopChar(term[1])))
+				{
+					//////////////////
+					// 何らかの識別子
+
+					bool isLiteral;
+					if( TermOpe( term, baseType, resultType, isLiteral, isNeedHeapFreeStructureStack[sp] ) ){
+						if(resultType.IsNull()){
+							//戻り値が存在しないとき
+							for(i2=0;;i2++){
+								if(term[i2]=='('||term[i2]=='\0'){
+									term[i2]=0;
+									break;
+								}
+							}
+							compiler.errorMessenger.Output(38,term,cp);
+
+							goto error;
+						}
+
+						type_stack[sp] = resultType.GetBasicType();
+						index_stack[sp] = resultType.GetIndex();
+
+						if( !isLiteral ){
+							bLiteralCalculation=0;
+						}
+
+						if( resultType.GetBasicType() & FLAG_CAST ){
+							// 型名のみ
+							compiler.errorMessenger.OutputFatalError();
+						}
+						else{
+							if( resultType.IsReal() == false && UseReg==REG_R14 ){
+								//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+								pobj_sf->push(REG_R14);
+							}
+							if( resultType.IsReal() && XmmReg==REG_XMM4 ){
+								if(resultType.IsDouble()){
+									//movsd qword ptr[rsp+offset],xmm4	※スタックフレームを利用
+									pobj_sf->push(REG_XMM4,sizeof(double));
+								}
+								if(resultType.IsSingle()){
+									//movss dword ptr[rsp+offset],xmm4	※スタックフレームを利用
+									pobj_sf->push(REG_XMM4,sizeof(float));
+								}
+							}
+
+							if( resultType.IsReal() ){
+								pobj_reg->LockXmmReg();
+							}
+							else{
+								pobj_reg->LockReg();
+							}
+						}
+
+						sp++;
+						break;
+					}
+
+
+					// Nothing
+					if( lstrcmp( term, "Nothing" ) == 0 ){
+						isNothing_stack[sp] = true;
+
+						if( baseType.IsObject() ){
+							type_stack[sp] = DEF_OBJECT;
+							index_stack[sp] = baseType.GetIndex();
+						}
+						else{
+							type_stack[sp] = baseType.GetBasicType();
+							index_stack[sp] = baseType.GetIndex();
+						}
+
+						bLiteralCalculation = 0;
+
+						//xor reg,reg
+						compiler.codeGenerator.op_zero_reg( UseReg );
+
+						if(UseReg==REG_R14){
+							//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+							pobj_sf->push(REG_R14);
+						}
+
+						pobj_reg->LockReg();
+						sp++;
+						break;
+					}
+
+
+					//////////////
+					// 定数の場合
+					//////////////
+
+					i3 = compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType(
+						ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+					);
+					if(i3){
+						if( compiler.GetObjectModule().meta.GetGlobalConsts().IsStringPtr( ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term ), compiler.IsUnicode() ) ){
+							//リテラル文字列
+
+							if( baseType.IsObject() || baseType.IsNull() )
+							{
+								//要求タイプがオブジェクト、または未定のとき
+
+								//String型オブジェクトを生成
+								NewStringObject(UseReg,term);
+
+								type_stack[sp]=DEF_OBJECT;
+								index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+								bLiteralCalculation=0;
+
+								if(bXmm) pobj_reg->LockXmmReg();
+								else pobj_reg->LockReg();
+
+								sp++;
+								break;
+							}
+
+							double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							memcpy(&i64data,&dbl,sizeof(double));
+
+							//バイト数
+							i3=lstrlen((char *)i64data);
+
+							memcpy(term,(char *)i64data,i3);
+							term[i3]=0;
+							goto StrLiteral;
+						}
+
+						type_stack[sp] = i3;
+						if(IsRealNumberType(i3)){
+							//実数
+							double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							memcpy(&i64data,&dbl,sizeof(double));
+							goto Literal;
+						}
+						else if(IsWholeNumberType(i3)){
+							//整数
+							i64data = compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							goto Literal;
+						}
+						else{
+							compiler.errorMessenger.Output(1,NULL,0);
+							goto error;
+						}
+					}
+
+
+					//該当する識別子が見当たらないときはエラー扱いにする
+					bError=1;
+					compiler.errorMessenger.Output(3,term,cp);
+					type_stack[sp]=DEF_DOUBLE;
+				}
+				else{
+					//リテラル値
+					type_stack[sp]=GetLiteralValue(term,&i64data,baseType.GetBasicType());
+Literal:
+					if(type_stack[sp]==DEF_DOUBLE){
+						//64ビット浮動小数型
+						bXmm=1;
+
+						if(XmmReg==REG_XMM4){
+							//mov r14,i64data
+							compiler.codeGenerator.op_mov_RV64(REG_R14,i64data);
+
+
+							//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+							pobj_sf->push(REG_R14);
+						}
+						else{
+							i3 = compiler.GetObjectModule().dataTable.Add( i64data );
+
+							//movlpd xmm_reg,qword ptr[data table offset]
+							compiler.codeGenerator.op_movlpd_RM( XmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+						}
+					}
+					else if(type_stack[sp]==DEF_SINGLE){
+						//32ビット浮動小数型
+						bXmm=1;
+
+						float flt;
+						int i32data;
+						memcpy(&dbl,&i64data,sizeof(double));
+						flt=(float)dbl;
+						memcpy(&i32data,&flt,sizeof(long));
+
+						if(XmmReg==REG_XMM4){
+							compiler.errorMessenger.OutputFatalError();		// TODO: 未実装
+							//push term
+							//compiler.codeGenerator.op_push_value(i32data);
+						}
+						else{
+							i3=compiler.GetObjectModule().dataTable.Add( i32data );
+
+							//movss xmm_reg,dword ptr[data table offset]
+							compiler.codeGenerator.op_movss_RM( XmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+						}
+					}
+					else{
+						//整数
+
+						index_stack[sp]=GetLiteralIndex(i64data);
+
+						//mov reg,i64data
+						compiler.codeGenerator.op_mov_RV64(UseReg,i64data);
+
+						if(UseReg==REG_R14){
+							//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+							pobj_sf->push(REG_R14);
+						}
+					}
+				}
+
+				if(bXmm) pobj_reg->LockXmmReg();
+				else pobj_reg->LockReg();
+
+				sp++;
+				break;
+
+			//論理演算子
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+				if(!CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_NOT:
+				//value[sp-1]=Not value[sp-1]
+				//NOT演算子
+				if(!Calc_Not(type_stack,sp)) goto error;
+				break;
+
+			//比較演算子
+			case CALC_PE:		//value[sp-2] <= value[sp-1]
+			case CALC_QE:		//value[sp-2] >= value[sp-1]
+			case CALC_P:		//value[sp-2] <  value[sp-1]
+			case CALC_Q:		//value[sp-2] >  value[sp-1]
+			case CALC_NOTEQUAL:	//value[sp-2] <> value[sp-1]
+			case CALC_EQUAL:	//value[sp-2] =  value[sp-1]				
+				if(!CalcTwoTerm_Relational(idCalc,type_stack,index_stack,&sp)) goto error;
+				break;
+
+			//ビットシフト
+			case CALC_SHL:	//value[sp-2] << value[sp-1]
+			case CALC_SHR:	//value[sp-2] >> value[sp-1]
+				if(!Calc_Shift(idCalc,type_stack,&sp)) goto error;
+				break;
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				if(!CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_MOD:
+				//value[sp-2]%=value[sp-1]
+				//剰余演算
+				if(!Calc_Mod(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_QUOTIENT:
+				//value[sp-2]/=value[sp-1];
+				//除算
+				if(!Calc_Divide(type_stack,&sp,baseType.GetBasicType())) goto error;
+				break;
+			case CALC_INTQUOTIENT:
+				//value[sp-2]/=value[sp-1]
+				//整数除算
+				if(!Calc_IntDivide(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_MINUSMARK:
+				//value[sp-1]=-value[sp-1]
+				//符号反転
+				if(!Calc_MinusMark(type_stack,sp)) goto error;
+				break;
+			case CALC_POWER:
+				//べき乗演算（浮動小数点演算のみ）
+				if(!Calc_Power(type_stack,&sp)) goto error;
+				break;
+			case CALC_AS:
+				//キャスト
+				if(!Calc_Cast(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					compiler.errorMessenger.Output( 1, NULL, cp );
+					goto error;
+				}
+
+				type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
+
+				break;
+
+			default:
+				compiler.errorMessenger.Output(300,NULL,cp);
+				goto error;
+		}
+	}
+
+	if(bError) goto error;
+
+	if(sp!=1){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		goto error;
+	}
+
+	if(bLiteralCalculation){
+		compiler.errorMessenger.OutputFatalError();
+	}
+	else{
+		//右辺値が数値の定数式ではないとき
+		if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+	}
+
+	if( pbIsNeedHeapFreeStructure )
+	{
+		*pbIsNeedHeapFreeStructure = isNeedHeapFreeStructureStack[0];
+	}
+
+	if(IsRealNumberType(type_stack[0]))
+		*pReg=pobj_reg->UnlockXmmReg();
+	else
+		*pReg=pobj_reg->UnlockReg();
+
+
+	resultType.SetType( type_stack[0], index_stack[0] );
+
+	bool isSuccessful = true;
+	goto finish;
+
+
+
+	//////////////////
+	// エラー処理
+	//////////////////
+
+error:
+
+	isSuccessful = false;
+	goto finish;
+
+
+
+
+finish:
+
+	for(i=0;i<pnum;i++){
+		if(values[i]) HeapDefaultFree(values[i]);
+	}
+
+	return isSuccessful;
+}
+
+bool NumOpe( int *pReg,
+			const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			bool *pbIsNeedHeapFreeStructure )
+{
+	bool isInitRegSwitch = false;
+	if( !pobj_reg )
+	{
+		isInitRegSwitch = true;
+
+		//作業用レジスタを取得
+		pobj_reg = new CRegister( *pReg );
+	}
+
+	//エラー時の復旧用
+	CRegister objReg_Backup = *pobj_reg;
+
+	*pReg = pobj_reg->GetNextReg();
+
+
+	bool result = _numope( pReg, expression, baseType, resultType, pbIsNeedHeapFreeStructure );
+
+
+	if( !result )
+	{
+		*pobj_reg = objReg_Backup;
+	}
+
+	if( isInitRegSwitch ){
+		//整合性をチェック（バグ回避）
+		if( result )
+		{
+			pobj_reg->bug_check();
+		}
+
+		//作業レジスタを解放
+		delete pobj_reg;
+		pobj_reg = NULL;
+	}
+
+	return result;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Arithmetic.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Arithmetic.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Arithmetic.cpp	(revision 774)
@@ -0,0 +1,704 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+	/*	value[sp-2] = value[sp-2] + value[sp-1]
+		value[sp-2] = value[sp-2] - value[sp-1]
+		value[sp-2] = value[sp-2] * value[sp-1]		*/
+
+	int reg1,reg2;
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+	if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+		type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+		/////////////
+		// 実数演算
+		/////////////
+
+		int xmm_reg1,xmm_reg2;
+
+		//2つの項を適切なレジスタにセット
+		SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
+
+		if(AnswerType==DEF_DOUBLE){
+			///////////////////////
+			// Double演算
+			///////////////////////
+
+			if(idCalc==CALC_ADDITION){
+				//addsd xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF2,
+					(char)0x0F,
+					(char)0x58,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+			else if(idCalc==CALC_SUBTRACTION){
+				//subsd xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF2,
+					(char)0x0F,
+					(char)0x5C,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+			else if(idCalc==CALC_PRODUCT){
+				//mulsd xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF2,
+					(char)0x0F,
+					(char)0x59,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+
+			if(xmm_reg1==REG_XMM4){
+				//movsd qword ptr[rsp+offset],xmm4		※スタックフレームを利用
+				pobj_sf->push(REG_XMM4,sizeof(double));
+			}
+		}
+		if(AnswerType==DEF_SINGLE){
+			///////////////////////
+			// Single演算
+			///////////////////////
+
+			if(idCalc==CALC_ADDITION){
+				//addss xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF3,
+					(char)0x0F,
+					(char)0x58,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+			else if(idCalc==CALC_SUBTRACTION){
+				//subss xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF3,
+					(char)0x0F,
+					(char)0x5C,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+			else if(idCalc==CALC_PRODUCT){
+				//mulss xmm_reg1,xmm_reg2
+				compiler.codeGenerator.PutOld(
+					(char)0xF3,
+					(char)0x0F,
+					(char)0x59,
+					(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+				);
+			}
+
+			if(xmm_reg1==REG_XMM4){
+				//movss dword ptr[rsp+offset],xmm4		※スタックフレームを利用
+				pobj_sf->push(REG_XMM4,sizeof(float));
+			}
+		}
+	}
+	else if(Is64Type(type[sp-2])||Is64Type(type[sp-1])){
+		//////////////////////
+		// 64ビット整数演算
+		//////////////////////
+
+		SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+		if(idCalc==CALC_ADDITION){
+			//add reg1,reg2
+			compiler.codeGenerator.op_add_RR(reg1,reg2);
+		}
+		else if(idCalc==CALC_SUBTRACTION){
+			//sub reg1,reg2
+			compiler.codeGenerator.op_sub64_reg(reg1,reg2);
+		}
+		else if(idCalc==CALC_PRODUCT){
+			//mul reg1,reg2
+			compiler.codeGenerator.op_imul_RR(sizeof(_int64),reg1,reg2);
+		}
+
+		if(reg1==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+	}
+	else{
+		//32ビット以下の整数演算
+
+		SetTowTermToReg_Whole32Calc(type,sp,&reg1,&reg2);
+
+		if(idCalc==CALC_ADDITION){
+			//add reg1,reg2
+			compiler.codeGenerator.op_add32_reg(reg1,reg2);
+		}
+		else if(idCalc==CALC_SUBTRACTION){
+			//sub reg1,reg2
+			compiler.codeGenerator.op_sub32_reg(reg1,reg2);
+		}
+		else if(idCalc==CALC_PRODUCT){
+			//mul reg1,reg2
+			compiler.codeGenerator.op_imul_RR(sizeof(long),reg1,reg2);
+		}
+
+		if(reg1==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+	}
+
+	sp--;
+	type[sp-1]=AnswerType;
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+
+
+BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]%=value[sp-1]
+	//剰余演算
+
+	int reg1,reg2;
+	int AnswerType;
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//実数演算は行えないため、エラー扱い
+		compiler.errorMessenger.Output(45,"mod",cp);
+		return 0;
+	}
+
+	/////////////////////////
+	// 64ビット整数演算のみ
+	/////////////////////////
+
+	AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+	//2つの項を適切なレジスタにセット
+	SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+	if(reg2==REG_RAX||reg2==REG_RDX){
+		//mov r15,reg2
+		compiler.codeGenerator.op_mov_RR(REG_R15,reg2);
+
+		reg2=REG_R15;
+	}
+
+	//raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 )
+	bool isUsingRax = pobj_reg->IsUsing( REG_RAX );
+	bool isUsingRdx = pobj_reg->IsUsing( REG_RDX );
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rdx     ※スタックフレームを利用
+		pobj_sf->push(REG_RDX);
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+		pobj_sf->push(REG_RAX);
+	}
+
+	{
+
+		//mov rax,reg1
+		compiler.codeGenerator.op_mov_RR(REG_RAX,reg1);
+
+		if(IsSignedType(type[sp-2])){
+			//符号拡張
+			//rdx:rax ← rax
+
+			//cqo
+			compiler.codeGenerator.op_cqo();
+		}
+		else{
+			//ビット拡張
+			//rdx:rax ← rax
+
+			//xor rdx,rdx
+			compiler.codeGenerator.op_zero_reg(REG_RDX);
+		}
+
+		if(IsSignedType(AnswerType)){
+			//idiv reg2
+			compiler.codeGenerator.op_idiv64_reg(reg2);
+		}
+		else{
+			//div reg2
+			compiler.codeGenerator.op_div64_reg(reg2);
+		}
+
+		//mov reg1,rdx
+		compiler.codeGenerator.op_mov_RR(reg1,REG_RDX);
+
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RAX);
+	}
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov rdx,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RDX);
+	}
+
+
+	if(reg1==REG_R14){
+		//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+		pobj_sf->push(REG_R14);
+	}
+
+	sp--;
+	type[sp-1]=AnswerType;
+
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType){
+	//value[sp-2]/=value[sp-1];
+	//除算
+
+	int sp;
+	sp=*pStackPointer;
+
+	///////////////////////
+	// 実数演算のみ
+	///////////////////////
+
+	int AnswerType;
+	if(type[sp-2]==DEF_SINGLE&&type[sp-1]==DEF_SINGLE&&BaseType==DEF_SINGLE) AnswerType=DEF_SINGLE;
+	else AnswerType=DEF_DOUBLE;
+
+	int xmm_reg1,xmm_reg2;
+
+	//2つの項を適切なレジスタにセット
+	SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
+
+	if(AnswerType==DEF_DOUBLE){
+		///////////////////////
+		// Double演算
+		///////////////////////
+
+		//divsd xmm_reg1,xmm_reg2
+		compiler.codeGenerator.PutOld(
+			(char)0xF2,
+			(char)0x0F,
+			(char)0x5E,
+			(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+		);
+
+		if(xmm_reg1==REG_XMM4){
+			//movsd qword ptr[rsp+offset],xmm4		※スタックフレームを利用
+			pobj_sf->push(REG_XMM4,sizeof(double));
+		}
+	}
+	if(AnswerType==DEF_SINGLE){
+		///////////////////////
+		// Single演算
+		///////////////////////
+
+		//divss xmm_reg1,xmm_reg2
+		compiler.codeGenerator.PutOld(
+			(char)0xF3,
+			(char)0x0F,
+			(char)0x5E,
+			(char)(0xC0 | REGISTER_OPERAND(xmm_reg1)<<3 | REGISTER_OPERAND(xmm_reg2))
+		);
+
+		if(xmm_reg1==REG_XMM4){
+			//movss dword ptr[rsp+offset],xmm4		※スタックフレームを利用
+			pobj_sf->push(REG_XMM4,sizeof(float));
+		}
+	}
+
+	sp--;
+	type[sp-1]=AnswerType;
+
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]/=value[sp-1]
+	//除算（整数）
+
+	int reg1,reg2;
+	int AnswerType;
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//実数演算は行えないため、エラー扱い
+		compiler.errorMessenger.Output(45,"mod",cp);
+		return 0;
+	}
+
+	/////////////////////////
+	// 64ビット整数演算のみ
+	/////////////////////////
+
+	AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+	//2つの項を適切なレジスタにセット
+	SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+	if(reg2==REG_RAX||reg2==REG_RDX){
+		//mov r15,reg2
+		compiler.codeGenerator.op_mov_RR(REG_R15,reg2);
+
+		reg2=REG_R15;
+	}
+
+	//raxまたはrdxが使用中かどうかを調べる( true/使用中, false/未使用 )
+	bool isUsingRax = pobj_reg->IsUsing( REG_RAX );
+	bool isUsingRdx = pobj_reg->IsUsing( REG_RDX );
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rdx     ※スタックフレームを利用
+		pobj_sf->push(REG_RDX);
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+		pobj_sf->push(REG_RAX);
+	}
+
+	{
+
+		//mov rax,reg1
+		compiler.codeGenerator.op_mov_RR(REG_RAX,reg1);
+
+		if(IsSignedType(type[sp-2])){
+			//符号拡張
+			//rdx:rax ← rax
+
+			//cqo
+			compiler.codeGenerator.op_cqo();
+		}
+		else{
+			//ビット拡張
+			//rdx:rax ← rax
+
+			//xor rdx,rdx
+			compiler.codeGenerator.op_zero_reg(REG_RDX);
+		}
+
+		if(IsSignedType(AnswerType)){
+			//idiv reg2
+			compiler.codeGenerator.op_idiv64_reg(reg2);
+		}
+		else{
+			//div reg2
+			compiler.codeGenerator.op_div64_reg(reg2);
+		}
+
+		//mov reg1,rax
+		compiler.codeGenerator.op_mov_RR(reg1,REG_RAX);
+
+	}
+
+	if(reg1!=REG_RAX && isUsingRax){
+		//結果レジスタがraxでない場合（使用されている可能性があるとき）
+
+		//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RAX);
+	}
+
+	if(reg1!=REG_RDX && isUsingRdx){
+		//結果レジスタがrdxでない場合（使用されている可能性があるとき）
+
+		//mov rdx,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RDX);
+	}
+
+
+	if(reg1==REG_R14){
+		//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+		pobj_sf->push(REG_R14);
+	}
+
+	sp--;
+	type[sp-1]=AnswerType;
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_MinusMark(int *type,int sp){
+	//value[sp-1]=-value[sp-1]
+	//符号反転
+
+	int xmm_reg;
+	int reg;
+	int i32data;
+
+	if(type[sp-1]==DEF_DOUBLE){
+		SetOneTermToReg_RealCalc(type[sp-1],&xmm_reg);
+
+		double dbl;
+		dbl=-1;
+		i32data = compiler.GetObjectModule().dataTable.Add( dbl );
+
+		//mulsd xmm_reg,qword ptr[data table offset]   ※data = -1
+		compiler.codeGenerator.PutOld(
+			(char)0xF2,
+			(char)0x0F,
+			(char)0x59,
+			(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3),
+			(char)0x25
+		);
+		compiler.codeGenerator.PutOld(
+			(long)i32data,
+			Schedule::DataTable
+		);
+
+		if(xmm_reg==REG_XMM4){
+			//movsd qword ptr[rsp+offset],xmm4		※スタックフレームを利用
+			pobj_sf->push(REG_XMM4,sizeof(double));
+		}
+	}
+	else if(type[sp-1]==DEF_SINGLE){
+		SetOneTermToReg_RealCalc(type[sp-1],&xmm_reg);
+
+		float flt;
+		flt=-1;
+		i32data = compiler.GetObjectModule().dataTable.Add( flt );
+
+		//mulss xmm_reg,dword ptr[data table offset]   ※data = -1
+		compiler.codeGenerator.PutOld(
+			(char)0xF3,
+			(char)0x0F,
+			(char)0x59,
+			(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3),
+			(char)0x25
+		);
+		compiler.codeGenerator.PutOld(
+			(long)i32data,
+			Schedule::DataTable
+		);
+
+		if(xmm_reg==REG_XMM4){
+			//movss dword ptr[rsp+offset],xmm4		※スタックフレームを利用
+			pobj_sf->push(REG_XMM4,sizeof(float));
+		}
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		SetOneTermToReg_Whole64Calc(type[sp-1],&reg);
+
+		//imul reg,-1
+		compiler.codeGenerator.op_imul_RV(sizeof(_int64),reg,-1);
+
+		if(reg==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+
+		type[sp-1]=DEF_INT64;	//QWordはInt64へ
+	}
+	else if(IsWholeNumberType(type[sp-1])){
+		SetOneTermToReg_Whole32Calc(type[sp-1],&reg);
+
+		//imul reg,-1
+		compiler.codeGenerator.op_imul_RV(sizeof(long),reg,-1);
+
+		if(reg==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+
+		type[sp-1]=GetSignedType(type[sp-1]);
+	}
+
+	return 1;
+}
+
+BOOL Calc_Power(int *type,int *pStackPointer){
+	//べき乗（実数演算のみ）
+
+	int sp;
+	sp=*pStackPointer;
+
+
+	//2つの項を適切なレジスタにセット
+	int xmm_reg1,xmm_reg2;
+	SetTowTermToReg_RealCalc(DEF_DOUBLE,type,sp,&xmm_reg1,&xmm_reg2);
+
+
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+
+		////////////////
+		// 呼び出し
+		////////////////
+
+		if(xmm_reg1==REG_XMM1){
+			//movsd xmm0,xmm_reg1
+			compiler.codeGenerator.op_movsd_RR(REG_XMM0,xmm_reg1);
+
+			//movsd xmm1,xmm_reg2
+			compiler.codeGenerator.op_movsd_RR(REG_XMM1,xmm_reg2);
+		}
+		else{
+			//movsd xmm1,xmm_reg2
+			compiler.codeGenerator.op_movsd_RR(REG_XMM1,xmm_reg2);
+
+			//movsd xmm0,xmm_reg1
+			compiler.codeGenerator.op_movsd_RR(REG_XMM0,xmm_reg1);
+		}
+
+		//call pow
+		extern const UserProc *pSub_pow;
+		compiler.codeGenerator.op_call(pSub_pow);
+
+		//movsd xmm4,xmm0
+		compiler.codeGenerator.op_movsd_RR(REG_XMM4,REG_XMM0);
+
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+
+
+	//////////////////////////////////
+	// 戻り値を所定のレジスタへ格納
+	//////////////////////////////////
+
+	if(xmm_reg1==REG_XMM4){
+		//movsd qword ptr[rsp+offset],xmm4		※スタックフレームを利用
+		pobj_sf->push(REG_XMM0,sizeof(double));
+	}
+	else{
+		//movsd xmm_reg1,xmm4
+		compiler.codeGenerator.op_movsd_RR(xmm_reg1,REG_XMM4);
+	}
+
+
+	sp--;
+	type[sp-1]=DEF_DOUBLE;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer){
+	//ビットシフト
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//いずれかの項が実数のとき
+		compiler.errorMessenger.Output(45,"<<",cp);
+		return 0;
+	}
+
+
+	/////////////////////////
+	// 64ビット整数演算のみ
+	/////////////////////////
+	int reg1,reg2;
+
+	//2つの項を適切なレジスタにセット
+	SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+	int sw=0;
+	if(reg1==REG_RCX){
+		//mov r15,rcx
+		compiler.codeGenerator.op_mov_RR(REG_R15,REG_RCX);
+
+		reg1=REG_R15;
+	}
+	else if(reg2!=REG_RCX){
+		sw=1;
+
+		//mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
+		pobj_sf->push(REG_RCX);
+	}
+
+	//mov rcx,reg2
+	compiler.codeGenerator.op_mov_RR(REG_RCX,reg2);
+
+	if(idCalc==CALC_SHL){
+		//左シフトは符号あり、なしは同様の動きをする
+
+		//32ビット型にする
+		if(!Is64Type(type[sp-2])){
+			ExtendTypeTo32(type[sp-2],reg1);
+
+			if(IsSignedType(type[sp-2])) type[sp-2]=DEF_LONG;
+			else type[sp-2]=DEF_DWORD;
+		}
+
+		//shl reg1,cl
+		compiler.codeGenerator.op_shl_reg(Type(type[sp-2]).GetSize(),reg1);
+	}
+	else if(idCalc==CALC_SHR){
+		if(IsSignedType(type[sp-2])){
+			//符号あり
+
+			//sar
+			compiler.codeGenerator.op_sar_reg(Type(type[sp-2]).GetSize(),reg1);
+		}
+		else{
+			//符号なし
+
+			//shr
+			compiler.codeGenerator.op_shr_reg(Type(type[sp-2]).GetSize(),reg1);
+		}
+	}
+
+	if(sw==0){
+		//mov rcx,r15
+		compiler.codeGenerator.op_mov_RR(REG_RCX,REG_R15);
+	}
+	else{
+		//mov rcx,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_RCX);
+	}
+
+	if(reg1==REG_R14){
+		//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+		pobj_sf->push(REG_R14);
+	}
+
+	sp--;
+
+	*pStackPointer=sp;
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Logical.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Logical.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Logical.cpp	(revision 774)
@@ -0,0 +1,167 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2] xor= value[sp-1]
+	//xor演算
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//いずれかの項が実数のとき
+		compiler.errorMessenger.Output(45,"xor",cp);
+		return 0;
+	}
+
+	int reg1,reg2;
+
+	if(Is64Type(type[sp-2])||Is64Type(type[sp-1])){
+		//////////////////////
+		// 64ビット整数演算
+		//////////////////////
+
+		SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+		if(idCalc==CALC_XOR){
+			//xor reg1,reg2
+			compiler.codeGenerator.op_xor_reg(sizeof(_int64),reg1,reg2);
+		}
+		else if(idCalc==CALC_OR){
+			//or reg1,reg2
+			compiler.codeGenerator.op_or_reg(sizeof(_int64),reg1,reg2);
+		}
+		else if(idCalc==CALC_AND){
+			//and reg1,reg2
+			compiler.codeGenerator.op_and_reg(sizeof(_int64),reg1,reg2);
+		}
+		else
+		{
+			throw;
+		}
+
+		if(reg1==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+
+		sp--;
+		type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+	}
+	else{
+		//32ビット以下の整数演算
+
+		SetTowTermToReg_Whole32Calc(type,sp,&reg1,&reg2);
+
+		if(idCalc==CALC_XOR){
+			//xor reg1,reg2
+			compiler.codeGenerator.op_xor_reg(sizeof(long),reg1,reg2);
+		}
+		else if(idCalc==CALC_OR){
+			//or reg1,reg2
+			compiler.codeGenerator.op_or_reg(sizeof(long),reg1,reg2);
+		}
+		else if(idCalc==CALC_AND){
+			//and reg1,reg2
+			compiler.codeGenerator.op_and_reg(sizeof(long),reg1,reg2);
+		}
+		else
+		{
+			throw;
+		}
+
+		if(reg1==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+
+		sp--;
+		type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Not(int *type,int sp){
+	//value[sp-1]=Not value[sp-1]
+	//NOT演算子
+
+	if(IsRealNumberType(type[sp-1])){
+		//実数のとき
+		compiler.errorMessenger.Output(45,"Not",cp);
+		return 0;
+	}
+
+	int reg;
+
+	if( type[sp - 1] == DEF_BOOLEAN ){
+		SetOneTermToReg_Whole32Calc(type[sp-1],&reg);
+
+		if( reg != REG_RAX ){
+			// raxを演算レジスタとして利用するため、一時的に退避しておく
+
+			//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+			pobj_sf->push(REG_RAX);
+		}
+
+		//cmp reg,0
+		compiler.codeGenerator.op_cmp_value(Type(type[sp-1]).GetSize(),reg,0);
+
+		//setne al
+		compiler.codeGenerator.op_setne( REG_RAX );
+
+		//and rax,000000FFh
+		compiler.codeGenerator.op_and64_value(REG_RAX,(int)0xFF);
+
+		//neg
+		compiler.codeGenerator.op_neg( REG_RAX );
+
+		//sbb rax, rax
+		compiler.codeGenerator.op_sbb_RR( sizeof(_int64), REG_RAX, REG_RAX );
+
+		//add rax, 1
+		compiler.codeGenerator.op_add_RV( REG_RAX, 1 );
+
+		if( reg != REG_RAX ){
+			//mov reg,rax
+			compiler.codeGenerator.op_mov_RR( reg, REG_RAX );
+
+			//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(REG_RAX);
+		}
+
+		if(reg==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		SetOneTermToReg_Whole64Calc(type[sp-1],&reg);
+
+		//not reg
+		compiler.codeGenerator.op_not_reg(sizeof(_int64),reg);
+
+		if(reg==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+	}
+	else if(IsWholeNumberType(type[sp-1])){
+		SetOneTermToReg_Whole32Calc(type[sp-1],&reg);
+
+		//not reg
+		compiler.codeGenerator.op_not_reg(sizeof(long),reg);
+
+		if(reg==REG_R14){
+			//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+			pobj_sf->push(REG_R14);
+		}
+	}
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Relation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Relation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_Relation.cpp	(revision 774)
@@ -0,0 +1,168 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+	int reg1,reg2;
+	int AnswerType;
+
+	int sp;
+	sp=*pStackPointer;
+
+	AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(AnswerType)){
+		////////////////
+		// 実数演算
+		////////////////
+		int xmm_reg1,xmm_reg2;
+
+		//2つの項を適切なレジスタにセット
+		SetTowTermToReg_RealCalc(AnswerType,type,sp,&xmm_reg1,&xmm_reg2);
+
+		if(AnswerType==DEF_DOUBLE){
+			//comisd xmm_reg1,xmm_reg2
+			compiler.codeGenerator.op_comisd(xmm_reg1,xmm_reg2);
+		}
+		else if(AnswerType==DEF_SINGLE){
+			//comiss xmm_reg1,xmm_reg2
+			compiler.codeGenerator.op_comiss(xmm_reg1,xmm_reg2);
+		}
+
+		//Xmmレジスタを解放
+		pobj_reg->UnlockXmmReg();
+
+		//汎用レジスタを確保
+		reg1=pobj_reg->LockReg();
+	}
+	else if(Is64Type(AnswerType)){
+		//////////////////////
+		// 64ビット整数演算
+		//////////////////////
+
+		//2つの項を適切なレジスタにセット
+		SetTowTermToReg_Whole64Calc(type,sp,&reg1,&reg2);
+
+		//cmp reg1,reg2
+		compiler.codeGenerator.op_cmp_reg(sizeof(_int64),reg1,reg2);
+	}
+	else{
+		//////////////////////
+		// 32ビット整数演算
+		//////////////////////
+
+		//2つの項を適切なレジスタにセット
+		SetTowTermToReg_Whole32Calc(type,sp,&reg1,&reg2);
+
+		//cmp reg1,reg2
+		compiler.codeGenerator.op_cmp_reg(sizeof(long),reg1,reg2);
+	}
+
+
+	////////////////////
+	// 条件分岐
+	////////////////////
+
+	int jmpOffset = 5;
+
+	if(idCalc==CALC_PE){
+		//	reg1 <= reg2
+		if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+			//符号あり演算
+			//jle
+			compiler.codeGenerator.op_jle( jmpOffset );
+		}
+		else{
+			//符号なし演算
+			//jbe
+			compiler.codeGenerator.op_jbe( jmpOffset );
+		}
+	}
+	else if(idCalc==CALC_QE){
+		//  reg1 >= reg2
+		if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+			//符号あり演算
+			//jge
+			compiler.codeGenerator.op_jge( jmpOffset );
+		}
+		else{
+			//符号なし演算
+			//jae
+			compiler.codeGenerator.op_jae( jmpOffset );
+		}
+	}
+	else if(idCalc==CALC_P){
+		//	reg1 < reg2
+		if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+			//符号あり演算
+			//jl
+			compiler.codeGenerator.op_jl( jmpOffset );
+		}
+		else{
+			//符号なし演算
+			//jb
+			compiler.codeGenerator.op_jb( jmpOffset );
+		}
+	}
+	else if(idCalc==CALC_Q){
+		//  reg1 > reg2
+		if(IsSignedType(AnswerType)&&IsWholeNumberType(AnswerType)){
+			//符号あり演算
+			//jg
+			compiler.codeGenerator.op_jg( jmpOffset );
+		}
+		else{
+			//符号なし演算
+			//ja
+			compiler.codeGenerator.op_ja( jmpOffset );
+		}
+	}
+	else if(idCalc==CALC_NOTEQUAL){
+		//  reg1 <> reg2
+
+		//jne
+		compiler.codeGenerator.op_jne( jmpOffset );
+	}
+	else if(idCalc==CALC_EQUAL){
+		//  reg1 = reg2
+
+		//je
+		compiler.codeGenerator.op_je( jmpOffset );
+	}
+
+
+	//////////////////////
+	// FALSEをセット
+	//////////////////////
+
+	//xor reg1,reg1
+	compiler.codeGenerator.op_zero_reg(reg1);
+
+	//jmp 7（次のmovを飛び越す）
+	compiler.codeGenerator.op_jge( 7 );
+
+
+	///////////////////
+	// Trueをセット
+	///////////////////
+
+	//mov reg1,1
+	compiler.codeGenerator.op_mov_RV(sizeof(_int64),reg1,1);
+
+
+	if(reg1==REG_R14){
+		//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+		pobj_sf->push(REG_R14);
+	}
+
+	sp--;
+
+	*pStackPointer=sp;
+
+	type[sp-1]=DEF_BOOLEAN;
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_TypeOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_TypeOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/NumOpe_TypeOperation.cpp	(revision 774)
@@ -0,0 +1,594 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ExtendTypeTo64( const Type &oldType, int reg ){
+	if( oldType.IsLong() )
+	{
+		//movsxd reg64,reg32
+		compiler.codeGenerator.op_movsxd(reg,reg);
+	}
+	else if( oldType.IsDWord() )
+	{
+		//and reg,00000000FFFFFFFFh
+	}
+	else if( oldType.IsInteger() )
+	{
+		//movsx reg64,reg16
+		compiler.codeGenerator.op_movsx64_FromReg16(reg,reg);
+	}
+	else if( oldType.IsWord() )
+	{
+		//and reg,000000000000FFFFh
+		compiler.codeGenerator.op_and64_value(reg,(int)0xFFFF);
+	}
+	else if( oldType.IsSByte() )
+	{
+		//movsx reg64,reg8
+		compiler.codeGenerator.op_movsx64_FromReg8(reg,reg);
+	}
+	else if( oldType.IsByte() || oldType.IsBoolean() )
+	{
+		//and reg,00000000000000FFh
+		compiler.codeGenerator.op_and64_value(reg,(int)0x00FF);
+	}
+}
+void ExtendTypeTo32( const Type &oldType, int reg ){
+	if( oldType.IsInteger() )
+	{
+		//movsx reg32,reg16
+		compiler.codeGenerator.op_movsx32_FromReg16(reg,reg);
+	}
+	else if( oldType.IsWord() )
+	{
+		//and reg,0000FFFFh
+		compiler.codeGenerator.op_and32_value(reg,(int)0xFFFF);
+	}
+	else if( oldType.IsSByte() )
+	{
+		//movsx reg32,reg8
+		compiler.codeGenerator.op_movsx32_FromReg8(reg,reg);
+	}
+	else if( oldType.IsByte() || oldType.IsBoolean() )
+	{
+		//and reg,000000FFh
+		compiler.codeGenerator.op_and32_value(reg,(int)0xFF);
+	}
+}
+void ExtendTypeTo16( const Type &oldType, int reg ){
+	if( oldType.IsSByte() )
+	{
+		//movsx reg16,reg8
+		compiler.codeGenerator.op_movsx16_FromReg8(reg,reg);
+	}
+	else if( oldType.IsByte() || oldType.IsBoolean() )
+	{
+		//and reg,000000FFh
+		compiler.codeGenerator.op_and32_value(reg,(int)0xFF);
+	}
+}
+
+void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg){
+	if(type==DEF_DOUBLE){
+		//なにもしない
+	}
+	else if(type==DEF_SINGLE){
+		//Single型
+
+		//cvtss2sd
+		compiler.codeGenerator.op_cvtss2sd(xmm_reg,xmm_reg);
+	}
+	else if(Is64Type(type)){
+		//64ビット整数型
+
+		//cvtsi2sd xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2sd_reg(sizeof(_int64),xmm_reg,general_reg);
+
+		if(type==DEF_QWORD){
+			//符号なし
+
+			//test reg,reg
+			compiler.codeGenerator.op_test(general_reg,general_reg);
+
+			//jge 9
+			compiler.codeGenerator.op_jge( 9 );
+
+			//addsd xmm_reg,qword ptr[offset]	※offset value:43f0000000000000
+			_int64 i64data=0x43f0000000000000;
+			long temp=compiler.GetObjectModule().dataTable.Add( i64data );
+			compiler.codeGenerator.PutOld(
+				(char)0xF2,
+				(char)0x0F,
+				(char)0x58,
+				(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3),
+				(char)0x25
+			);
+			compiler.codeGenerator.PutOld(
+				temp,
+				Schedule::DataTable
+			);
+		}
+	}
+	else if(type==DEF_DWORD){
+		//符号なし32ビット値
+
+		//64ビットにレジスタ値を拡張
+		ExtendTypeTo64(type,general_reg);
+
+		//cvtsi2sd xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2sd_reg(sizeof(_int64),xmm_reg,general_reg);
+	}
+	else{
+		//その他整数
+
+		//32ビットにレジスタ値を拡張
+		ExtendTypeTo32(type,general_reg);
+
+		//cvtsi2sd xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2sd_reg(sizeof(long),xmm_reg,general_reg);
+	}
+}
+void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg){
+	if(type==DEF_DOUBLE){
+		//Double型
+
+		//cvtsd2ss
+		compiler.codeGenerator.op_cvtsd2ss(xmm_reg,xmm_reg);
+	}
+	else if(type==DEF_SINGLE){
+		//なにもしない
+	}
+	else if(Is64Type(type)){
+		//64ビット整数型
+
+		//cvtsi2ss xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2ss_reg(sizeof(_int64),xmm_reg,general_reg);
+
+		if(type==DEF_QWORD){
+			//符号なし
+
+			//test reg,reg
+			compiler.codeGenerator.op_test(general_reg,general_reg);
+
+			//jge 9
+			compiler.codeGenerator.op_jge( 9 );
+
+			//addss xmm_reg,dword ptr[offset]	※offset value:5f800000
+			long i32data=0x5f800000;
+			long temp=compiler.GetObjectModule().dataTable.Add( i32data );
+			compiler.codeGenerator.PutOld(
+				(char)0xF3,
+				(char)0x0F,
+				(char)0x58,
+				(char)(0x04 | REGISTER_OPERAND(xmm_reg)<<3),
+				(char)0x25
+			);
+			compiler.codeGenerator.PutOld(
+				temp,
+				Schedule::DataTable
+			);
+		}
+	}
+	else if(type==DEF_DWORD){
+		//符号なし32ビット値
+
+		//64ビットにレジスタ値を拡張
+		ExtendTypeTo64(type,general_reg);
+
+		//cvtsi2ss xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2ss_reg(sizeof(_int64),xmm_reg,general_reg);
+	}
+	else{
+		//その他整数
+
+		//32ビットにレジスタ値を拡張
+		ExtendTypeTo32(type,general_reg);
+
+		//cvtsi2ss xmm_reg,reg
+		compiler.codeGenerator.op_cvtsi2ss_reg(sizeof(long),xmm_reg,general_reg);
+	}
+}
+
+void ChangeTypeToWhole( const Type &oldType, const Type &newType, int reg, int xmm_reg )
+{
+	if( oldType.IsDouble() )
+	{
+		if( newType.Is64() )
+		{
+			//cvttsd2si reg,xmm_reg
+			compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(_int64),reg,xmm_reg);
+		}
+		else
+		{
+			//cvttsd2si reg,xmm_reg
+			compiler.codeGenerator.op_cvttsd2si_xmm(sizeof(long),reg,xmm_reg);
+		}
+	}
+	if( oldType.IsSingle() )
+	{
+		if( newType.Is64() )
+		{
+			//cvttss2si reg,xmm_reg
+			compiler.codeGenerator.op_cvttss2si_xmm(sizeof(_int64),reg,xmm_reg);
+		}
+		else
+		{
+			//cvttss2si reg,xmm_reg
+			compiler.codeGenerator.op_cvttss2si_xmm(sizeof(long),reg,xmm_reg);
+		}
+	}
+	else{
+		//整数から整数へ変換
+
+		if( newType.Is64() )
+		{
+			ExtendTypeTo64(oldType,reg);
+		}
+		if( newType.GetSize() == sizeof(long) )
+		{
+			ExtendTypeTo32(oldType,reg);
+		}
+		if( newType.GetSize() == sizeof(short) )
+		{
+			ExtendTypeTo16(oldType,reg);
+		}
+	}
+}
+
+
+
+/////////////////////////////////////////
+// 1つの項を適切なレジスタへセット
+/////////////////////////////////////////
+
+void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg){
+	int xmm_reg;
+
+	if(IsRealNumberType(TermType)){
+		//実数型
+		xmm_reg=pobj_reg->GetLockingXmmReg();
+
+		if(xmm_reg==REG_XMM4){
+			if(TermType==DEF_DOUBLE){
+				//movlpd xmm4,qword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg,sizeof(double));
+			}
+			if(TermType==DEF_SINGLE){
+				//movss xmm4,dword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg,sizeof(float));
+			}
+		}
+	}
+	else{
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	*pXmmReg=xmm_reg;
+}
+void SetOneTermToReg_Whole64Calc(int TermType,int *pReg){
+	//1つの項を適切なレジスタへセット（64ビット整数演算用）
+	int reg;
+
+	reg=pobj_reg->GetLockingReg();
+
+	if(reg==REG_R14){
+		//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R14);
+	}
+
+	//レジスタ値を64ビットに拡張
+	ExtendTypeTo64(TermType,reg);
+
+	*pReg=reg;
+}
+void SetOneTermToReg_Whole32Calc(int TermType,int *pReg){
+	//1つの項を適切なレジスタへセット（32ビット整数演算用）
+	int reg;
+
+	reg=pobj_reg->GetLockingReg();
+
+	if(reg==REG_R14){
+		//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R14);
+	}
+
+	//レジスタ値を32ビットに拡張
+	ExtendTypeTo32(TermType,reg);
+
+	*pReg=reg;
+}
+
+
+
+/////////////////////////////////////////
+// 2つの項を適切なレジスタへセット
+/////////////////////////////////////////
+
+void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2){
+	//2つの項を適切なレジスタへセット（Double演算用）
+	int xmm_reg1,xmm_reg2,temp_reg;
+
+
+	///////////////////
+	// 第2項
+	///////////////////
+
+	if(IsRealNumberType(type[sp-1])){
+		//実数型
+		xmm_reg2=pobj_reg->UnlockXmmReg();
+
+		if(xmm_reg2==REG_XMM4){
+			xmm_reg2=REG_XMM5;
+
+			if(type[sp-1]==DEF_DOUBLE){
+				//movlpd xmm5,qword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg2,sizeof(double));
+			}
+			if(type[sp-1]==DEF_SINGLE){
+				//movss xmm5,dword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg2,sizeof(float));
+			}
+		}
+		else{
+			if(!IsRealNumberType(type[sp-2])){
+				if(type[sp-1]==DEF_DOUBLE){
+					//movsd xmm5,xmm_reg
+					compiler.codeGenerator.op_movsd_RR( REG_XMM5, xmm_reg2 );
+				}
+				if(type[sp-1]==DEF_SINGLE){
+					//movss xmm5,xmm_reg
+					compiler.codeGenerator.op_movss_RR( REG_XMM5, xmm_reg2 );
+				}
+
+				xmm_reg2=REG_XMM5;
+			}
+		}
+	}
+	else{
+		//整数値
+
+		temp_reg=pobj_reg->UnlockReg();
+
+		if(temp_reg==REG_R14){
+			//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(REG_R14);
+		}
+
+		xmm_reg2=REG_XMM5;
+	}
+
+	//汎用レジスタ（temp_reg）をXMMレジスタ（xmm_reg2）にコピー
+	if(AnswerType==DEF_DOUBLE)
+		ChangeTypeToXmm_Double(type[sp-1],xmm_reg2,temp_reg);
+	if(AnswerType==DEF_SINGLE)
+		ChangeTypeToXmm_Single(type[sp-1],xmm_reg2,temp_reg);
+
+
+	///////////////////
+	// 第1項
+	///////////////////
+
+	if(IsRealNumberType(type[sp-2])){
+		//実数
+		xmm_reg1=pobj_reg->GetLockingXmmReg();
+
+		if(xmm_reg1==REG_XMM4){
+			if(type[sp-2]==DEF_DOUBLE){
+				//movlpd xmm4,qword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg1,sizeof(double));
+			}
+			if(type[sp-2]==DEF_SINGLE){
+				//movss xmm4,dword ptr[rsp+offset]		※スタックフレームを利用
+				pobj_sf->pop(xmm_reg1,sizeof(float));
+			}
+		}
+	}
+	else{
+		//整数
+
+		temp_reg=pobj_reg->UnlockReg();
+
+		if(temp_reg==REG_R14){
+			//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(REG_R14);
+		}
+
+		xmm_reg1=pobj_reg->LockXmmReg();
+	}
+
+	//汎用レジスタ（temp_reg）をXMMレジスタ（xmm_reg1）にコピー
+	if(AnswerType==DEF_DOUBLE)
+		ChangeTypeToXmm_Double(type[sp-2],xmm_reg1,temp_reg);
+	if(AnswerType==DEF_SINGLE)
+		ChangeTypeToXmm_Single(type[sp-2],xmm_reg1,temp_reg);
+
+
+	*pXmmReg1=xmm_reg1;
+	*pXmmReg2=xmm_reg2;
+}
+void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2){
+	//2つの項を適切なレジスタへセット（64ビット整数演算用）
+	int reg1,reg2;
+
+	//////////////////
+	// 第2項
+	//////////////////
+	reg2=pobj_reg->UnlockReg();
+
+	if(reg2==REG_R14){
+		//mov r15,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R15);
+
+		reg2=REG_R15;
+	}
+
+	//レジスタ値を64ビットに拡張
+	ExtendTypeTo64(type[sp-1],reg2);
+
+
+	//////////////////
+	// 第1項
+	//////////////////
+	reg1=pobj_reg->GetLockingReg();
+
+	if(reg1==REG_R14){
+		//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R14);
+	}
+
+	//レジスタ値を64ビットに拡張
+	ExtendTypeTo64(type[sp-2],reg1);
+
+
+	*pReg1=reg1;
+	*pReg2=reg2;
+}
+void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2){
+	//2つの項を適切なレジスタへセット（32ビット整数演算用）
+	int reg1,reg2;
+
+	//////////////////
+	// 第2項
+	//////////////////
+	reg2=pobj_reg->UnlockReg();
+
+	if(reg2==REG_R14){
+		//mov r15,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R15);
+
+		reg2=REG_R15;
+	}
+
+	//レジスタ値を32ビットに拡張
+	ExtendTypeTo32(type[sp-1],reg2);
+
+
+	//////////////////
+	// 第1項
+	//////////////////
+	reg1=pobj_reg->GetLockingReg();
+
+	if(reg1==REG_R14){
+		//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R14);
+	}
+
+	//レジスタ値を32ビットに拡張
+	ExtendTypeTo32(type[sp-2],reg1);
+
+
+	*pReg1=reg1;
+	*pReg2=reg2;
+}
+
+
+
+////////////////////////////
+// As 演算子によるキャスト
+////////////////////////////
+
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//キャスト
+
+	int sp;
+	sp=*pStackPointer;
+
+	int castBasicType = type[sp-1];
+	if((castBasicType&FLAG_CAST)==0){
+		compiler.errorMessenger.Output(47,NULL,cp);
+		return 0;
+	}
+	castBasicType = castBasicType&(~FLAG_CAST);
+
+	Type oldType( type[sp-2], index_stack[sp-2] );
+	Type castType( castBasicType, index_stack[sp-1] );
+
+	int xmm_reg,reg;
+	if( castType.IsReal() )
+	{
+		//実数型へキャスト
+
+		if( oldType.IsReal() )
+		{
+			SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg);
+		}
+		else
+		{
+			if( oldType.Is64() )
+			{
+				SetOneTermToReg_Whole64Calc(oldType.GetBasicType(),&reg);
+			}
+			else if( oldType.IsWhole() )
+			{
+				SetOneTermToReg_Whole32Calc(oldType.GetBasicType(),&reg);
+			}
+
+			pobj_reg->UnlockReg();
+
+			xmm_reg=pobj_reg->LockXmmReg();
+		}
+
+		if( castType.IsDouble() )
+		{
+			//Double型にデータ変換
+			ChangeTypeToXmm_Double(oldType.GetBasicType(),xmm_reg,reg);
+		}
+		else if( castType.IsSingle() )
+		{
+			//Single型にデータ変換
+			ChangeTypeToXmm_Single(oldType.GetBasicType(),xmm_reg,reg);
+		}
+
+		if(xmm_reg==REG_XMM4){
+			//movsd qword ptr[rsp+offset],xmm4		※スタックフレームを利用
+			pobj_sf->push(REG_XMM4,sizeof(double));
+		}
+	}
+	else{
+		//その他整数型へ変換
+
+		if( oldType.IsReal() )
+		{
+			SetOneTermToReg_RealCalc(oldType.GetBasicType(),&xmm_reg);
+
+			pobj_reg->UnlockXmmReg();
+
+			reg=pobj_reg->LockReg();
+
+			//整数型へデータ変換
+			ChangeTypeToWhole(oldType,castType,reg,xmm_reg);
+
+			if(reg==REG_R14){
+				//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+				pobj_sf->push(REG_R14);
+			}
+		}
+		else{
+			reg=pobj_reg->GetLockingReg();
+
+			if(reg==REG_R14){
+				//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+				pobj_sf->pop(REG_R14);
+			}
+
+			//整数型へデータ変換
+			ChangeTypeToWhole(oldType,castType,reg,0);
+
+			if(reg==REG_R14){
+				//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+				pobj_sf->push(REG_R14);
+			}
+		}
+	}
+
+	type[sp-2] = castType.GetBasicType();
+	index_stack[sp-2] = castType.GetIndex();
+
+	sp--;
+
+	*pStackPointer=sp;
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Opcode.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Opcode.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Opcode.h	(revision 774)
@@ -0,0 +1,372 @@
+#pragma once
+
+#include "MachineFixed.h"
+
+
+//変数の種類
+#define NON_VAR				0
+#define VAR_GLOBAL			1	// Global Variable
+#define VAR_REFGLOBAL		2	// Global Refference Variable
+#define VAR_LOCAL			3	// Local Variable
+#define VAR_REFLOCAL		4	// Local Refference Variable
+#define VAR_DIRECTMEM		5	// Direct memory
+
+
+extern int cp;
+
+#define breakpoint compiler.codeGenerator.PutOld( (char)0xCC );
+
+
+//プロシージャ
+struct PROCEDURE{
+	char name[255];
+	int address;
+	int types[MAX_PARMS];
+	_int8 ByVal[MAX_PARMS];
+	BOOL ReturnType;
+};
+
+//With情報
+struct WithInfo
+{
+	std::string name;
+	int sourceCodePos;
+
+	WithInfo( const std::string &name, int sourceCodePos )
+		: name( name )
+		, sourceCodePos( sourceCodePos )
+	{
+	}
+};
+typedef std::vector<WithInfo> WithInfos;
+
+
+class StackFrame
+{
+	///////////////////////////
+	// スタックフレーム管理
+	///////////////////////////
+
+	PertialSchedules pertialSchedules;
+
+	int lowest_sp;			//スタックポインタの最下位位置
+	int now_sp;				//スタックポインタ
+	int max_parm_size;		//パラメータの最大サイズ
+
+public:
+	//コンストラクタ
+	StackFrame();
+
+	//デストラクタ
+	~StackFrame();
+
+	int GetFrameSize( int localParamSize );
+	int GetNowSp();
+	void mov_sp( int reg );
+	int push(int reg);
+	void push(int xmm_reg,int varSize);
+	void ref_offset_data( int reg, int sp_offset );
+	void ref(int reg);
+	void ref(int xmm_reg,int varSize);
+	void pop(int reg = REG_NON);
+	void pop(int xmm_reg,int varSize);
+	void parameter_allocate(int size);
+	void RunningSchedule( int stackFrameSize );
+
+	void error_check(void);
+};
+extern StackFrame *pobj_sf;
+
+
+class CBlockReg{
+	int array_BlockReg[256];
+	int num;
+
+public:
+	CBlockReg();
+	void lock(int reg);
+	void unlock(int reg);
+	BOOL check(int reg);
+	void clear(void);
+
+	//レジスタのバックアップと復旧
+	void backup();
+	void restore();
+};
+extern CBlockReg *pobj_BlockReg;
+class CRegister{
+	////////////////////
+	// レジスタ管理
+	////////////////////
+
+	//利用可能なレジスタを列挙する関数
+	void EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg);
+
+	int array_UseReg[16],sp_UseReg;
+
+	int array_XmmReg[16];
+	int sp_XmmReg;
+
+	int init_sp_reg,init_sp_xmm_reg;
+
+public:
+	CRegister(){};
+	CRegister(int AnswerReg);
+	~CRegister(){};
+
+	//コンパイラにバグがないかをチェックする機構
+	void bug_check();
+
+	//汎用レジスタ
+	int GetNextReg();
+	int GetLockingReg();
+	int LockReg();
+	int UnlockReg();
+
+	//XMMレジスタ
+	int GetNextXmmReg();
+	int GetLockingXmmReg();
+	int LockXmmReg();
+	int UnlockXmmReg();
+
+	//レジスタが利用中かどうかを調べる
+	bool IsUsing( int reg );
+
+	//レジスタのバックアップと復旧
+	void backup();
+	void restore();
+};
+extern CRegister *pobj_reg;
+
+
+#define BACKUP_REGISTER_RESOURCE								\
+	/* レジスタをスタックフレームにバックアップ */				\
+	pobj_BlockReg->backup();									\
+	if(pobj_reg) pobj_reg->backup();							\
+																\
+	/* レジスタブロッキングオブジェクトを退避して再生成 */		\
+	CBlockReg *pobj_BlockReg_back;								\
+	pobj_BlockReg_back=pobj_BlockReg;							\
+	pobj_BlockReg=new CBlockReg;								\
+																\
+	/* レジスタ管理オブジェクトポインタを退避して0をセット */	\
+	CRegister *pobj_reg_back;									\
+	pobj_reg_back=pobj_reg;										\
+	pobj_reg=0;
+
+#define RESTORE_REGISTER_RESOURCE								\
+	/* レジスタブロッキングオブジェクトポインタを復元 */		\
+	delete pobj_BlockReg;										\
+	pobj_BlockReg=pobj_BlockReg_back;							\
+																\
+	/* レジスタ管理オブジェクトポインタを復元 */				\
+	delete pobj_reg;											\
+	pobj_reg=pobj_reg_back;										\
+																\
+	/* レジスタをスタックフレームから復元 */					\
+	if(pobj_reg) pobj_reg->restore();							\
+	pobj_BlockReg->restore();
+
+
+
+//RSrcSection.cpp
+char *GetRSrcSectionBuffer(int *pLen);
+
+//Compile.cpp
+void Compile( const char *source );
+void ChangeOpcode(char *Command);
+void GetGlobalDataForDll(void);
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
+
+//Register.cpp
+BOOL IsGeneralReg(int reg);
+BOOL IsXmmReg(int reg);
+BOOL IsVolatileReg(int reg);
+void IfR14Push( int reg );
+
+//Compile_Calc.cpp
+void SetVariableFromRax( const Type &varType, int CalcType,RELATIVE_VAR *pRelativeVar);
+void OpcodeCalc(const char *Command);
+
+//NumOpe.cpp
+bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess );
+bool TermOpe(
+			 const char *term,
+			 const Type &baseType,
+			 Type &resultType,
+			 bool &isLiteral,
+			 bool &isNeedHeapFreeStructure,
+			 bool *pIsClassName = NULL,
+			 bool isProcedureCallOnly = false,
+			 bool isWriteAccess = false );
+bool NumOpe( int *pReg,
+		   const char *Command,
+		   const Type &baseType,
+		   Type &resultType,
+		   bool *pbIsNeedHeapFreeStructure = NULL );
+
+//NumOpe_Arithmetic.cpp
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Mod(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_MinusMark(int *type,int sp);
+BOOL Calc_Power(int *type,int *pStackPointer);
+BOOL Calc_Shift(int idCalc,int *type,int *pStackPointer);
+
+//NumOpe_Logical.cpp
+BOOL CalcTwoTerm_Logical(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Not(int *type,int sp);
+
+//NumOpe_Relation.cpp
+BOOL CalcTwoTerm_Relational(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+
+//NumOpe_TypeOperation.cpp
+void ExtendTypeTo64( const Type &oldType, int reg );
+void ExtendTypeTo32( const Type &oldType, int reg );
+void ExtendTypeTo16( const Type &oldType, int reg );
+void ChangeTypeToXmm_Double(int type,int xmm_reg,int general_reg);
+void ChangeTypeToXmm_Single(int type,int xmm_reg,int general_reg);
+void ChangeTypeToWhole( const Type &oldType, const Type &newType, int reg, int xmm_reg );
+void SetOneTermToReg_RealCalc(int TermType,int *pXmmReg);
+void SetOneTermToReg_Whole64Calc(int TermType,int *pReg);
+void SetOneTermToReg_Whole32Calc(int TermType,int *pReg);
+void SetTowTermToReg_RealCalc(int AnswerType,int *type,int sp,int *pXmmReg1,int *pXmmReg2);
+void SetTowTermToReg_Whole64Calc(int *type,int sp,int *pReg1,int *pReg2);
+void SetTowTermToReg_Whole32Calc(int *type,int sp,int *pReg1,int *pReg2);
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
+
+//Compile_Set_Var.cpp
+BOOL IsUse_r11(RELATIVE_VAR *pRelativeVar);
+void SetStructVariableFromRax( const Type &varType, const Type &calcType, RELATIVE_VAR *pRelativeVar,BOOL bUseHeap);
+void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
+void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
+void SetWholeVariable(int varSize,int type,RELATIVE_VAR *pRelative);
+
+//increment.cpp
+void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight);
+
+//Compile_Calc_PushVar.cpp
+void SetXmmReg_DoubleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
+void SetXmmReg_SingleVariable(RELATIVE_VAR *pRelativeVar,int xmm_reg);
+void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg);
+
+//Compile_Object.cpp
+void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter,const Type &baseTypeInfo );
+void OpcodeDelete(const char *Parameter, bool isSweeping);
+
+//Compile_Var.cpp
+bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const Type &classType, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
+void SetThisPtrToReg(int reg);
+bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
+bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *InitBuf);
+#define DIMFLAG_INITDEBUGVAR			0x01
+#define DIMFLAG_NONCALL_CONSTRACTOR		0x02
+#define DIMFLAG_STATIC					0x04
+#define DIMFLAG_CONST					0x08
+void dim( char *VarName, const Subscripts &subscripts, const Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
+bool Compile_AddGlobalRootsForGc();
+
+//ParamImpl.cpp
+class ParamImpl{
+	char *Parms[255];
+	std::vector<Type> types;
+	int ParmsNum;
+
+	Type leftType;
+	Type returnType;
+
+	//一時オブジェクト管理用
+	bool useTempObject;
+	bool useTempParameters[255];
+	bool isNeedFreeStructures[255];
+	int StackOffsetOfTempObject[255];
+
+public:
+	ParamImpl(const char *buffer);
+	ParamImpl(const Parameters &params);
+	~ParamImpl();
+	void SetLeftType( const Type &type )
+	{
+		this->leftType = type;
+	}
+	void SetReturnType( const Type &returnType );
+
+private:
+	bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored );
+
+public:
+	const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType );
+	const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType = false );
+
+	void ApplyDefaultParameters( const Parameters &params );
+	bool ErrorCheck( const std::string &procName, const Parameters &params, int SecondParmNum = -1 );
+	void MacroParameterSupport( const Parameters &params );
+	void SetStructParameter( int reg, const Type &baseType, const char *expression );
+	void SetParameter( const std::string &procName, const Parameters &params, int SecondParmNum = -1, const UserProc *pUserProc = NULL );
+
+	//一時オブジェクトパラメータの生成と破棄
+	int NewTempParameters( const std::string &procName, const Parameters &params, int SecondParmNum = -1 );
+	void DeleteTempParameters();
+
+	void BackupParameter(int pi_num);
+	void RestoreParameter(int pi_num);
+};
+
+//CLockParameter.cpp
+#define MAX_LOCKPARMS 255
+class CDBLockParms{
+public:
+	int array_LevelCount[MAX_LOCKPARMS];
+	CDBLockParms();
+	~CDBLockParms();
+
+	void lock(int level);
+	void unlock(int level);
+};
+
+//Compile_CallProc.cpp
+#define PROCFLAG_NEW				1
+#define PROCFLAG_PERMIT_CONSTRUCTOR	2
+#define PROCFLAG_PERMIT_DESTRUCTOR	4
+bool Opcode_CallProcPtr(const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
+bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName);
+bool Opcode_CallDllProc( const char *lpszParms,DllProc *pDllProc);
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params );
+
+//Compile_ProcOp.cpp
+void _compile_proc(const UserProc *pUserProc);
+
+//Compile_Func.cpp
+int GetFunctionFromName(char *FuncName);
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn = true );
+
+//OperatorProc.cpp
+void FreeTempObject(int reg,const CClass *pobj_c);
+int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp);
+void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType);
+void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags = 0 );
+
+//Compile_Statement.cpp
+void OpcodeOthers(const char *Command);
+void OpcodeIf(char *Parameter);
+void OpcodeGoto(char *Parameter);
+void OpcodeWhile(char *Parameter);
+void OpcodeFor(char *Parameter);
+void OpcodeForeach(const char *Parameter);
+void OpcodeDo(char *Parameter);
+void OpcodeContinue(void);
+void OpcodeExitSub(void);
+void OpcodeSelect( const char *Parameter );
+void OpcodeCase(char *Parameter);
+void OpcodeGosub(char *Parameter);
+void OpcodeReturn(char *Parameter);
+void OpcodeSetPtrData(char *Parameter,int type);
+
+
+//InsertOpcode.cpp
+void InsertDimStatement_ToProcHead(char *lpszCommand);
+
+
+BOOL IsSafeReg(int reg);
Index: branches/egtra/ab5.0/abdev/compiler_x64/OperatorProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/OperatorProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/OperatorProc.cpp	(revision 774)
@@ -0,0 +1,363 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void FreeTempObject(int reg,const CClass *pobj_c){
+	if(!IsSafeReg(reg)) compiler.errorMessenger.Output(300,NULL,cp);
+
+	////////////////////////////////////////////////
+	// 演算過程で利用した一時オブジェクトを破棄
+	// Thisポインタをr14レジスタを介して渡す
+	////////////////////////////////////////////////
+
+	const CMethod *method = pobj_c->GetDestructorMethod();
+	if( method ){
+		//mov rcx,reg
+		compiler.codeGenerator.op_mov_RR(REG_RCX,reg);
+
+		//call DestructorProcAddr
+		compiler.codeGenerator.op_call( &method->GetUserProc() );
+	}
+
+	//mov rcx,reg
+	compiler.codeGenerator.op_mov_RR(REG_RCX,reg);
+
+	//call free
+	extern const UserProc *pSub_free;
+	compiler.codeGenerator.op_call(pSub_free);
+}
+
+int CallOperatorProc(BYTE idCalc, const Type &baseType, int *type_stack,LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp)
+{
+	Type leftType( type_stack[sp-2], index_stack[sp-2] );
+	Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
+
+	//オーバーロードされたオペレータ関数を呼び出す
+	const CClass *pobj_c = &leftType.GetClass();
+
+	std::vector<const UserProc *> subs;
+	pobj_c->GetDynamicMethods().Enum( idCalc, subs );
+	if( subs.size() == 0 ){
+		return 0;
+	}
+
+
+	//項の数
+	BOOL bTwoTerm=1;
+	if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+	/////////////////////////////////////////////
+	// オーバーロード解決用のパラメータを設定
+	/////////////////////////////////////////////
+
+	Parameters params;
+
+	if(bTwoTerm)
+	{
+		params.push_back( new Parameter( "", rightType ) );
+	}
+
+	//オーバーロードを解決
+	char temporary[255];
+	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+	else GetCalcName(idCalc,temporary);
+	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType, leftType );
+
+	if(!pUserProc){
+		if(bTwoTerm){
+			delete params[0];
+		}
+		return -1;
+	}
+	else{
+		//オーバーロードされていないが、パラメータ個数が一致しないとき
+		if(params.size()!=pUserProc->Params().size()){
+			if(bTwoTerm){
+				delete params[0];
+			}
+			return -1;
+		}
+	}
+
+	for(int i=0;i<(int)params.size();i++){
+		CheckDifferentType(
+			*pUserProc->Params()[i],
+			*params[i],
+			NULL,
+			i);
+	}
+
+	if(bTwoTerm){
+		delete params[0];
+	}
+
+	int right_side_size = rightType.GetSize();
+
+	if(bTwoTerm){
+		if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
+			//一時オブジェクトはメソッド内で破棄される
+			isNeedHeapFreeStructureStack[sp-1] = false;
+		}
+	}
+
+
+	if( pUserProc->ReturnType().IsStruct() ){
+		//////////////////////////////////////////////////////
+		// 戻り値に構造体インスタンスを持つ場合
+		// ※ByRef _System_ReturnValue パラメータ用領域を取得
+		//////////////////////////////////////////////////////
+
+
+		//////////////////////////////////////////////////////
+		/////    レジスタ資源のバックアップ
+		{	BACKUP_REGISTER_RESOURCE
+		//////////////////////////////////////////////////////
+
+			int object_size = pUserProc->ReturnType().GetClass().GetSize();
+
+			//mov rcx,object_size
+			compiler.codeGenerator.op_mov_RV(sizeof(_int64),REG_RCX,object_size);
+
+			//call calloc
+			extern const UserProc *pSub_calloc;
+			compiler.codeGenerator.op_call(pSub_calloc);
+
+			//mov r13,rax
+			compiler.codeGenerator.op_mov_RR(REG_R13,REG_RAX);
+
+		/////////////////////////////////////////////
+		//////   レジスタ資源を復元
+			RESTORE_REGISTER_RESOURCE
+		}////////////////////////////////////////////
+	}
+
+	int reg1,reg2;
+	if(bTwoTerm){
+		//右の項（実数の場合が未完成）
+		SetOneTermToReg_Whole64Calc(type_stack[sp-1],&reg2);
+		pobj_reg->UnlockReg();
+		if( !pUserProc->RealParams()[1]->IsRef() == false ){
+			//一時参照を作成
+			pobj_sf->push( reg2 );
+			pobj_sf->mov_sp( reg2 );
+		}
+	}
+
+	//左の項
+	SetOneTermToReg_Whole64Calc(DEF_INT64,&reg1);
+	pobj_reg->UnlockReg();
+
+	//ヒープ解放用に退避
+	if(isNeedHeapFreeStructureStack[sp-1]){
+		//mov qword ptr[rsp+offset],reg2     ※スタックフレームを利用
+		pobj_sf->push(reg2);
+	}
+	if(isNeedHeapFreeStructureStack[sp-2]){
+		//mov qword ptr[rsp+offset],reg1     ※スタックフレームを利用
+		pobj_sf->push(reg1);
+	}
+
+
+
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		if(reg1==REG_RDX||reg1==REG_R8){
+			//mov r14,reg1
+			compiler.codeGenerator.op_mov_RR(REG_R14,reg1);
+			reg1=REG_R14;
+		}
+
+
+		if(bTwoTerm){
+			if( pUserProc->ReturnType().IsStruct() ){
+				//mov r8,reg2
+				compiler.codeGenerator.op_mov_RR(REG_R8,reg2);
+			}
+			else{
+				//mov rdx,reg2
+				compiler.codeGenerator.op_mov_RR(REG_RDX,reg2);
+			}
+		}
+
+		if( pUserProc->ReturnType().IsStruct() ){
+			//mov rdx,r13
+			compiler.codeGenerator.op_mov_RR(REG_RDX,REG_R13);
+		}
+
+		//mov rcx,reg1
+		compiler.codeGenerator.op_mov_RR(REG_RCX,reg1);
+
+		//call operator_proc
+		compiler.codeGenerator.op_call(pUserProc);
+
+		if( !pUserProc->ReturnType().IsNull() ){
+			//戻り値を一時的に退避
+
+			//mov r13,rax
+			compiler.codeGenerator.op_mov_RR(REG_R13,REG_RAX);
+		}
+
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+
+
+
+	if( isNeedHeapFreeStructureStack[sp-2] || isNeedHeapFreeStructureStack[sp-1] )
+	{
+		//////////////////////////////////////////////////////
+		/////    レジスタ資源のバックアップ
+		{	BACKUP_REGISTER_RESOURCE
+		//////////////////////////////////////////////////////
+
+			if( isNeedHeapFreeStructureStack[sp-2] )
+			{
+				//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+				pobj_sf->pop(REG_R14);
+
+				FreeTempObject(REG_R14,(CClass *)index_stack[sp-2]);
+			}
+			if( isNeedHeapFreeStructureStack[sp-1] )
+			{
+				//mov r14,qword ptr[rsp+offset]     ※スタックフレームを利用
+				pobj_sf->pop(REG_R14);
+
+				FreeTempObject(REG_R14,(CClass *)index_stack[sp-1]);
+			}
+
+		/////////////////////////////////////////////
+		//////   レジスタ資源を復元
+			RESTORE_REGISTER_RESOURCE
+		}////////////////////////////////////////////
+	}
+
+	if(bTwoTerm){
+		if( !pUserProc->RealParams()[1]->IsRef() == false ){
+			//一時参照を破棄
+			pobj_sf->pop();
+		}
+	}
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//戻り値をreg1にセット
+		reg1=pobj_reg->LockReg();
+
+		//mov reg1,r13
+		compiler.codeGenerator.op_mov_RR(reg1,REG_R13);
+	}
+
+	Type temp( pUserProc->ReturnType() );
+	ResolveFormalGenericTypeParameter( temp, leftType, pUserProc );
+
+	sp--;
+	type_stack[sp-1] = temp.GetBasicType();
+	index_stack[sp-1] = temp.GetIndex();
+
+	if( pUserProc->ReturnType().IsStruct() )
+	{
+		//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+		//※後にfreeする必要あり
+		isNeedHeapFreeStructureStack[sp-1] = true;
+	}
+	else
+	{
+		isNeedHeapFreeStructureStack[sp-1] = false;
+	}
+
+	return 1;
+}
+
+void CallCastOperatorProc(int reg,Type &calcType,BOOL bCalcUseHeap,const Type &toType){
+	int type_stack[10];
+	LONG_PTR index_stack[10];
+	bool array_bUseHeap[10];
+	int sp=2;
+	int iRet;
+
+
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		//regを第一項目としてロック
+		pobj_reg=new CRegister(reg);
+		pobj_reg->LockReg();
+
+		if(bCalcUseHeap){
+			//未解放のインスタンスが存在する旨を示す警告
+			compiler.errorMessenger.Output(-105,NULL,cp);
+		}
+
+		//左辺
+		type_stack[0]=calcType.GetBasicType();
+		index_stack[0]=calcType.GetIndex();
+		array_bUseHeap[0]=0;
+		type_stack[1]=toType.GetBasicType();
+		index_stack[1]=toType.GetIndex();
+		array_bUseHeap[1]=0;
+
+		iRet=CallOperatorProc(CALC_AS,toType,type_stack,index_stack,array_bUseHeap,sp);
+
+		pobj_reg->UnlockReg();
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+
+
+	if(iRet==1){
+		//成功したとき
+		calcType.SetType( type_stack[0], index_stack[0] );
+		return;
+	}
+	else if(iRet==-1){
+		//エラーが発行されたとき
+		return;
+	}
+
+	//エラーを発行
+	compiler.errorMessenger.Output(-1,calcType.ToString() + " から " + toType.ToString() + " へ型変換できません。",cp);
+}
+
+//インデクサ（getter）を呼び出す
+void CallIndexerGetterProc(int reg, const Type &classType, const char *ObjectName,char *Parameter,Type &resultType, DWORD dwProcFlags ){
+
+	std::vector<const UserProc *> subs;
+	classType.GetClass().GetDynamicMethods().Enum( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
+		return;
+	}
+
+	const UserProc *pUserProc = subs[0];
+
+	//////////////////////////////////////////////////////
+	/////    レジスタ資源のバックアップ
+	{	BACKUP_REGISTER_RESOURCE
+	//////////////////////////////////////////////////////
+
+		Opcode_CallProc(Parameter,pUserProc,dwProcFlags,ObjectName);
+		resultType = pUserProc->ReturnType();
+
+		//mov reg,rax
+		compiler.codeGenerator.op_mov_RR(reg,REG_RAX);
+
+	/////////////////////////////////////////////
+	//////   レジスタ資源を復元
+		RESTORE_REGISTER_RESOURCE
+	}////////////////////////////////////////////
+
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType, pUserProc );
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/Register.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/Register.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/Register.cpp	(revision 774)
@@ -0,0 +1,318 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+//エラー用
+extern int cp;
+
+
+////////////////////////////
+// レジスタのブロッキング
+////////////////////////////
+
+CBlockReg *pobj_BlockReg;
+
+CBlockReg::CBlockReg(){
+	num=0;
+}
+void CBlockReg::lock(int reg){
+	if(check(reg)){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	array_BlockReg[num++]=reg;
+}
+void CBlockReg::unlock(int reg){
+	int i;
+	for(i=0;i<num;i++){
+		if(array_BlockReg[i]==reg) break;
+	}
+	if(i==num) return;
+
+	num--;
+	for(;i<num;i++){
+		array_BlockReg[i]=array_BlockReg[i+1];
+	}
+}
+BOOL CBlockReg::check(int reg){
+	int i;
+	for(i=0;i<num;i++){
+		if(array_BlockReg[i]==reg) return 1;
+	}
+	return 0;
+}
+void CBlockReg::clear(void){
+	num=0;
+}
+void CBlockReg::backup(){
+	int i;
+
+	for(i=num-1;i>=0;i--){
+		if(IS_XMM_REG(array_BlockReg[i])){
+			//movlpd qword ptr[rsp+offset],xmm_reg	※スタックフレームを利用
+			pobj_sf->push(array_BlockReg[i],sizeof(double));
+		}
+		else{
+			//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+			pobj_sf->push(array_BlockReg[i]);
+		}
+	}
+}
+void CBlockReg::restore(){
+	int i;
+
+	for(i=0;i<num;i++){
+		if(IS_XMM_REG(array_BlockReg[i])){
+			//movlpd xmm_reg,qword ptr[rsp+offset]	※スタックフレームを利用
+			pobj_sf->pop(array_BlockReg[i],sizeof(double));
+		}
+		else{
+			//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
+			pobj_sf->pop(array_BlockReg[i]);
+		}
+	}
+}
+
+
+///////////////////
+// レジスタ管理
+///////////////////
+
+const int CalculationRegister[]={
+	REG_RAX,
+	REG_RCX,
+	REG_RDX,
+	REG_RBX,
+	REG_RSI,
+	REG_RDI,
+	REG_R8,
+	REG_R9,
+	REG_R10
+};
+
+const int CalculationXmmRegister[]={
+	REG_XMM0,
+	REG_XMM1,
+	REG_XMM2,
+	REG_XMM3,
+	/*XMM4、XMM5は演算時に一時的に利用*/
+/*	REG_XMM6,
+	REG_XMM7,
+	REG_XMM8,
+	REG_XMM9,
+	REG_XMM10,
+	REG_XMM11,
+	REG_XMM12,
+	REG_XMM13,
+	REG_XMM14,
+	REG_XMM15		関数呼び出し時のレジスタ保持を未搭載のため、保留*/
+};
+
+CRegister *pobj_reg;
+
+void CRegister::EnumRegister(int *pRegList,int nMaxList,int *array_reg,int *sp,int AnswerReg){
+	int i,i2,sw=0;
+
+	i2=nMaxList-1;
+	for(i=0;i2>=0;i++,i2--){
+		if(AnswerReg==pRegList[i2]){
+			sw=1;
+			i--;
+			continue;
+		}
+
+		if(pobj_BlockReg->check(pRegList[i2])){
+			//レジスタがブロッキングされているとき
+			i--;
+			continue;
+		}
+
+		array_reg[i]=pRegList[i2];
+	}
+
+	if(sw){
+		array_reg[i++]=AnswerReg;
+
+		//エラーチェック
+		if(pobj_BlockReg->check(AnswerReg)) compiler.errorMessenger.Output(300,NULL,cp);
+	}
+
+	*sp=i-1;
+}
+
+CRegister::CRegister(int AnswerReg){
+	/* 例： AnswerReg=REG_RCX	※REG_RCXをスタックの最後尾へセット
+								※r15、r14は一時保存用として利用する
+								※r13は同一関数内の単発処理用の一時保存レジスタとして利用する
+								※r12、r11は配列計算用として利用する
+	array_UseReg[0]=REG_R10
+	array_UseReg[1]=REG_R9
+	array_UseReg[2]=REG_R8
+	array_UseReg[3]=REG_RBX
+	array_UseReg[4]=REG_RDX
+	array_UseReg[5]=REG_RAX
+	array_UseReg[6]=REG_RCX	*/
+
+
+	///////////////////////////////////////////////////////////
+	//array_UseRegに、計算に利用するレジスタリストを作成
+	///////////////////////////////////////////////////////////
+
+	EnumRegister(
+		(int *)CalculationRegister,
+		sizeof(CalculationRegister)/sizeof(int),
+		array_UseReg,
+		&sp_UseReg,
+		AnswerReg);
+
+
+
+	///////////////////////////////////////////////////////////
+	//array_XmmRegに、計算に利用するレジスタリストを作成
+	///////////////////////////////////////////////////////////
+
+	EnumRegister(
+		(int *)CalculationXmmRegister,
+		sizeof(CalculationXmmRegister)/sizeof(int),
+		array_XmmReg,
+		&sp_XmmReg,
+		AnswerReg);
+
+
+	init_sp_reg=sp_UseReg;
+	init_sp_xmm_reg=sp_XmmReg;
+}
+void CRegister::bug_check(){
+	if(init_sp_reg!=sp_UseReg||
+		init_sp_xmm_reg!=sp_XmmReg) compiler.errorMessenger.Output(300,NULL,cp);
+}
+int CRegister::GetNextReg(){
+	if(sp_UseReg<0) return REG_R14;
+	return array_UseReg[sp_UseReg];
+}
+int CRegister::GetLockingReg(){
+	UnlockReg();
+	return LockReg();
+}
+int CRegister::LockReg(){
+	int reg;
+	reg=GetNextReg();
+
+	sp_UseReg--;
+
+	return reg;
+}
+int CRegister::UnlockReg(){
+	sp_UseReg++;
+	return GetNextReg();
+}
+int CRegister::GetNextXmmReg(){
+	if(sp_XmmReg<0) return REG_XMM4;
+	return array_XmmReg[sp_XmmReg];
+}
+int CRegister::GetLockingXmmReg(){
+	UnlockXmmReg();
+	return LockXmmReg();
+}
+int CRegister::LockXmmReg(){
+	int xmm_reg;
+	xmm_reg=GetNextXmmReg();
+
+	sp_XmmReg--;
+
+	return xmm_reg;
+}
+int CRegister::UnlockXmmReg(){
+	sp_XmmReg++;
+	return GetNextXmmReg();
+}
+bool CRegister::IsUsing( int reg ){
+	int i;
+
+	//汎用レジスタを調べる
+	for(i=init_sp_reg;i>sp_UseReg;i--){
+		if( array_UseReg[i] == reg ) return true;
+	}
+
+	//XMMレジスタを調べる
+	for(i=init_sp_xmm_reg;i>sp_XmmReg;i--){
+		if( array_XmmReg[i] == reg ) return true;
+	}
+
+	//ブロックされている場合を考慮
+	if( pobj_BlockReg->check( reg ) ) return true;
+
+	//使用中でないとき
+	return false;
+}
+void CRegister::backup(){
+	int i;
+
+	//汎用レジスタを退避
+	for(i=init_sp_reg;i>sp_UseReg;i--){
+		//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+		pobj_sf->push(array_UseReg[i]);
+	}
+
+	//XMMレジスタを退避
+	for(i=init_sp_xmm_reg;i>sp_XmmReg;i--){
+		//mov qword ptr[rsp+offset],reg     ※スタックフレームを利用
+		pobj_sf->push(array_XmmReg[i],sizeof(_int64));
+	}
+}
+void CRegister::restore(){
+	int i;
+
+	//XMMレジスタを復元
+	if(sp_XmmReg<0) i=0;
+	else i=sp_XmmReg+1;
+	for(;i<=init_sp_xmm_reg;i++){
+		//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(array_XmmReg[i],sizeof(_int64));
+	}
+
+	//汎用レジスタを復元
+	if(sp_UseReg<0) i=0;
+	else i=sp_UseReg+1;
+	for(;i<=init_sp_reg;i++){
+		//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(array_UseReg[i]);
+	}
+}
+
+
+
+////////////////////////
+// その他
+////////////////////////
+
+BOOL IsGeneralReg(int reg){
+	if(REG_RAX<=reg&&reg<=REG_R15) return 1;
+	return 0;
+}
+BOOL IsXmmReg(int reg){
+	if(REG_XMM0<=reg&&reg<=REG_XMM15) return 1;
+	return 0;
+}
+BOOL IsVolatileReg(int reg){
+	if(reg==REG_RAX||
+		reg==REG_RCX||
+		reg==REG_RDX||
+		REG_R8<=reg&&reg<=REG_R11||
+		REG_XMM0<=reg&&reg<=REG_XMM5){
+		//値を保持する必要なし
+		return 1;
+	}
+	else{
+		//値を保持する必要あり
+		return 0;
+	}
+}
+
+void IfR14Push( int reg ){
+	if( reg == REG_R14 ){
+		//mov qword ptr[rsp+offset],r14     ※スタックフレームを利用
+		pobj_sf->push( REG_R14 );
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/amd64_main.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/amd64_main.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/amd64_main.cpp	(revision 774)
@@ -0,0 +1,21 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+BOOL IsSafeReg(int reg){
+	switch(reg){
+		case REG_RBX:
+		case REG_RSI:
+		case REG_RDI:
+		case REG_R12:
+		case REG_R13:
+		case REG_R14:
+		case REG_R15:
+			return 1;
+		default:
+			break;
+	}
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.rc
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.rc	(revision 774)
@@ -0,0 +1,458 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(JPN) DIALOG DISCARDABLE  0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE  0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler(64bit)"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "コンパイル",IDOK,148,208,50,14
+    LTEXT           "出力先:",IDC_STATIC,7,10,23,8
+    EDITTEXT        IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+                    179,14
+    GROUPBOX        "進行状況",IDC_STATIC,7,31,191,45
+    LTEXT           "準備中...",IDC_MESSAGE,13,44,161,8
+    GROUPBOX        "メッセージ リスト",IDC_STATIC,7,83,191,117
+    EDITTEXT        IDC_ERRORLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "エラー",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,13,97,35,10
+    CONTROL         "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,50,97,35,10
+    EDITTEXT        IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE | 
+                    WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    LTEXT           "Version",IDC_STATIC_VERSION,7,214,140,8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(JPN) DIALOG DISCARDABLE  0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE  0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "ブレーク ポイント"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "閉じる",IDCANCEL,165,6,50,14
+    LTEXT           "対象領域:",IDC_STATIC,2,9,30,8
+    LTEXT           "対象スレッド:",IDC_STATIC,2,26,38,8
+    COMBOBOX        IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS | 
+                    TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+                    0,88,215,111
+    CONTROL         "グローバル",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,43,6,47,14
+    CONTROL         "ローカル",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,92,6,47,14
+    LTEXT           "プロシージャ:",IDC_STATIC,2,43,39,8
+    COMBOBOX        IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "システム変数を表示しない",IDC_HIDESYSVAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,117,44,93,10
+    PUSHBUTTON      "ステップ(IN)",IDC_STEPIN,4,64,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+    PUSHBUTTON      "ステップ(OVER)",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(JPN) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    PUSHBUTTON      "コンパイル",IDOK,0,0,37,13
+    EDITTEXT        IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY | 
+                    NOT WS_VISIBLE
+    EDITTEXT        IDC_ERRORLIST,38,14,129,74,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    CONTROL         "ビルド",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,20,37,12
+    CONTROL         "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,34,37,12
+    EDITTEXT        IDC_DEBUGLIST,38,15,179,73,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+                    38,1,293,12
+    LTEXT           "準備中...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+                    WS_EX_TRANSPARENT
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,16,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(ENG) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    PUSHBUTTON      "Compile",IDOK,0,0,37,11
+    EDITTEXT        IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY | 
+                    NOT WS_VISIBLE
+    EDITTEXT        IDC_ERRORLIST,38,13,129,75,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,17,37,10
+    CONTROL         "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,28,37,10
+    EDITTEXT        IDC_DEBUGLIST,38,14,179,74,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+                    38,0,293,12
+    LTEXT           "Waiting...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+                    WS_EX_TRANSPARENT
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,13,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(ENG) DIALOG DISCARDABLE  0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE  0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "Compile",IDOK,148,208,50,14
+    LTEXT           "Output:",IDC_STATIC,7,10,22,8
+    EDITTEXT        IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+                    179,14
+    GROUPBOX        "Advance situation",IDC_STATIC,7,31,191,45
+    LTEXT           "ready...",IDC_MESSAGE,13,44,161,8
+    GROUPBOX        "Message list",IDC_STATIC,7,83,191,117
+    EDITTEXT        IDC_ERRORLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,13,97,30,10
+    CONTROL         "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,50,97,35,10
+    EDITTEXT        IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE | 
+                    WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    LTEXT           "Version 4.00 Global Edition beta1",IDC_STATIC,7,214,98,
+                    8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(ENG) DIALOG DISCARDABLE  0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE  0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "Breakpoint"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "Close",IDCANCEL,165,6,50,14
+    LTEXT           "Level:",IDC_STATIC,2,9,18,8
+    LTEXT           "Thread:",IDC_STATIC,2,26,22,8
+    COMBOBOX        IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS | 
+                    TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+                    0,88,215,111
+    CONTROL         "Global",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,43,6,47,14
+    CONTROL         "Local",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,92,6,47,14
+    LTEXT           "Procedure:",IDC_STATIC,2,43,31,8
+    COMBOBOX        IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "Hide system variables",IDC_HIDESYSVAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,117,44,81,10
+    PUSHBUTTON      "Step In",IDC_STEPIN,4,64,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+    PUSHBUTTON      "Step Over",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(JPN) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "対象スレッド:",IDC_STATIC,5,21,38,8
+    COMBOBOX        IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    LTEXT           "プロシージャ:",IDC_STATIC,5,49,39,8
+    COMBOBOX        IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+    LTEXT           "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+                    WS_EX_STATICEDGE
+    CONTROL         "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT | 
+                    LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+                    WS_EX_ACCEPTFILES
+    LTEXT           "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+IDD_DEBUGGER_TOOLBARBASE DIALOG DISCARDABLE  0, 0, 62, 15
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(ENG) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "Thread:",IDC_STATIC,5,21,22,8
+    COMBOBOX        IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Procedure:",IDC_STATIC,5,49,31,8
+    COMBOBOX        IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+    LTEXT           "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+                    WS_EX_STATICEDGE
+    CONTROL         "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT | 
+                    LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+                    WS_EX_ACCEPTFILES
+    LTEXT           "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    "IDD_MAIN$(JPN)", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 198
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 222
+    END
+
+    "IDD_VARLIST$(JPN)", DIALOG
+    BEGIN
+        BOTTOMMARGIN, 161
+    END
+
+    "IDD_MAIN$(ENG)", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 198
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 222
+    END
+
+    "IDD_VARLIST$(ENG)", DIALOG
+    BEGIN
+        BOTTOMMARGIN, 161
+    END
+
+    IDD_DEBUGGER_TOOLBARBASE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 55
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 8
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN                ICON    DISCARDABLE     "icon1.ico"
+IDI_VARSTRUCT           ICON    DISCARDABLE     "VarStruct.ico"
+IDI_VARDATA             ICON    DISCARDABLE     "VarData.ico"
+IDI_VARSTR              ICON    DISCARDABLE     "VarStr.ico"
+IDI_VARARRAY            ICON    DISCARDABLE     "VarArray.ico"
+IDI_VARPTRSTRUCT        ICON    DISCARDABLE     "VarPtrStruct.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_DEBUGGERTOOLBAR TOOLBAR DISCARDABLE  16, 15
+BEGIN
+    BUTTON      IDC_DEBUG_START
+    BUTTON      IDC_DEBUG_STEPOVER
+    BUTTON      IDC_DEBUG_STEPIN
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_DEBUGGERTOOLBAR     BITMAP  DISCARDABLE     "toolbar_debugger.bmp"
+IDR_DEBUGGERTOOLBAR_DISABLED BITMAP  DISCARDABLE     "toolbar_debugger_disable.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_DEBUGGER_VARLIST_MENU MENU DISCARDABLE 
+BEGIN
+    POPUP "dummy"
+    BEGIN
+        MENUITEM "一般システム変数を表示する",  IDM_SHOW_DEFAULTSYSTEM_VAR
+        MENUITEM "RADシステム変数を表示する",   IDM_SHOW_RAD_VAR
+        MENUITEM "GUID変数を表示する",          IDM_SHOW_GUID_VAR
+    END
+END
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 5,0,0,5
+ PRODUCTVERSION 5,0,0,5
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "041104b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "activebasic.com\0"
+            VALUE "FileDescription", "ActiveBasic x64 Compiler\0"
+            VALUE "FileVersion", "5, 0, 0, 5\0"
+            VALUE "InternalName", "abc\0"
+            VALUE "LegalCopyright", "Copyright (C) 2008 activebasic.com\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "abc.exe\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "ActiveBasic x64 Compiler\0"
+            VALUE "ProductVersion", "5, 0, 0, 5\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x411, 1200
+    END
+END
+
+#endif    // !_MAC
+
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.vcproj
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.vcproj	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/compiler_x64.vcproj	(revision 774)
@@ -0,0 +1,1260 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="compiler_x64"
+	ProjectGUID="{864B921B-423B-4F9E-9E6B-31B15968EDF9}"
+	RootNamespace="BasicCompiler"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)\bin\x64"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\Debug/BasicCompiler.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/GR"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;..\BasicCompiler_Common\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN;_AMD64_;_WIN64"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="1"
+				RuntimeTypeInfo="true"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile=".\Debug/BasicCompiler.pch"
+				AssemblerListingLocation=".\Debug/"
+				ObjectFile=".\Debug/"
+				ProgramDataBaseFileName=".\Debug/"
+				BrowseInformation="0"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+				CallingConvention="0"
+				DisableSpecificWarnings="4103"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG,JPN"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/MACHINE:AMD64 /NXCOMPAT /DYNAMICBASE"
+				AdditionalDependencies="comctl32.lib psapi.lib imagehlp.lib shlwapi.lib"
+				OutputFile="$(OutDir)\abc.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\amd64;..\lib\amd64"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\Debug/BasicCompiler64.pdb"
+				SubSystem="1"
+				StackReserveSize="4194304"
+				TargetMachine="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+				EmbedManifest="true"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(OutDir)/$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)\bin\x64"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\Debug/BasicCompiler.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/GR"
+				Optimization="2"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="1"
+				WholeProgramOptimization="false"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;..\BasicCompiler_Common\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN;_AMD64_;_WIN64"
+				MinimalRebuild="false"
+				ExceptionHandling="1"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="0"
+				RuntimeTypeInfo="true"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile=".\Release/BasicCompiler.pch"
+				AssemblerListingLocation=".\Release/"
+				ObjectFile=".\Release/"
+				ProgramDataBaseFileName=".\Release/"
+				BrowseInformation="0"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="0"
+				CallingConvention="0"
+				DisableSpecificWarnings="4103"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG,JPN"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/MACHINE:AMD64 /NXCOMPAT /DYNAMICBASE"
+				AdditionalDependencies="comctl32.lib psapi.lib imagehlp.lib shlwapi.lib"
+				OutputFile="$(OutDir)\abc.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\amd64;..\lib\amd64"
+				IgnoreDefaultLibraryNames=""
+				GenerateDebugInformation="false"
+				ProgramDatabaseFile=".\Release/BasicCompiler64.pdb"
+				SubSystem="1"
+				TargetMachine="0"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="$(ProjectDir)\manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile="$(OutDir)/$(ProjectName).bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+		/>
+		<ProjectReference
+			ReferencedProjectIdentifier="{87835C33-64C9-4BA5-9B39-608BA5394387}"
+		/>
+	</References>
+	<Files>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath="..\BasicCompiler_Common\BasicCompiler.h"
+				>
+			</File>
+			<File
+				RelativePath="CommandValue.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\common.h"
+				>
+			</File>
+			<File
+				RelativePath=".\MachineFixed.h"
+				>
+			</File>
+			<File
+				RelativePath="Opcode.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\include\option.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\include\ver.h"
+				>
+			</File>
+			<Filter
+				Name="言語対応文字列"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\common_msg_eng.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\common_msg_jpn.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Parts_h"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\NonVolatile.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Common Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\logger.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Compiler Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\CodeGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Compiler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\DataTableGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\ErrorCode.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\LexicalAnalyzer.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Linker.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Messenger.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\ProcedureGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\VtblGenerator.h"
+					>
+				</File>
+				<Filter
+					Name="Language Classes"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\Enum.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\Exception.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\LexicalScope.h"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Debugger Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\BreakPoint.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Debugger.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Configuration.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Program.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+			<File
+				RelativePath=".\compiler_x64.rc"
+				>
+			</File>
+			<File
+				RelativePath="icon1.ico"
+				>
+			</File>
+			<File
+				RelativePath="toolbar_debugger.bmp"
+				>
+			</File>
+			<File
+				RelativePath="VarArray.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarData.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarPtrStruct.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarStr.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarStruct.ico"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+			<Filter
+				Name="x64Compile"
+				>
+				<File
+					RelativePath="Compile_Statement.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="Compile_Var.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="MakePeHdr.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="Register.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="2"
+							BrowseInformation="0"
+						/>
+					</FileConfiguration>
+				</File>
+				<Filter
+					Name="Calculation"
+					>
+					<File
+						RelativePath="Compile_Calc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Calc_PushVar.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Set_Var.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\increment.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Arithmetic.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Logical.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Relation.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_TypeOperation.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Object"
+					>
+					<File
+						RelativePath=".\Compile_Object.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Opcode"
+					>
+					<File
+						RelativePath="amd64_main.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\CodeGenerator.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\stack_frame.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath=".\CLockParameter.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\Compile_CallProc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Func.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_ProcOp.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+								BrowseInformation="0"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\CParameter.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\OperatorProc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								UsePrecompiledHeader="2"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="32及び64共通"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\BasicCompiler.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\calculation.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Compile.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Diagnose.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\error.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\gc.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\hash.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\MakeExe.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\NumOpe_GetType.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Object.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\OldStatement.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Overload.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\RSrcSection.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\StrOperation.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\StrOperation.h"
+					>
+				</File>
+				<Filter
+					Name="Intermediate"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\CommandFormat.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Intermediate_Step1.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Intermediate_Step2.cpp"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Parts"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\NonVolatile.cpp"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Debug（共通）"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\CDebugThreadInfo.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Debug.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\debug.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\DebugMiddleFile.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\DebugSection.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VarList.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\WatchList.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Schedule"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\PESchedule.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\PESchedule.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Variable"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\VariableOpe.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VariableOpe.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\ParamImpl.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Compiler Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\CodeGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\CommonCodeGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Compiler.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\DataTableGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Class.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Const.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Delegate.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Enum.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Procedure.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_TypeDef.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Linker.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Messenger.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\ProcedureGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\VtblGenerator.cpp"
+					>
+				</File>
+				<Filter
+					Name="Language Classes"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\src\Exception.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\src\LexicalScope.cpp"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Program.cpp"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Common Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\BoostSerializationSupport.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+				</File>
+			</Filter>
+			<Filter
+				Name="Debugger Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\BreakPoint.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: branches/egtra/ab5.0/abdev/compiler_x64/increment.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/increment.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/increment.cpp	(revision 774)
@@ -0,0 +1,191 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight)
+{
+	Type varType;
+	if( GetVarType( lpszLeft, varType, false ) )
+	{
+		if( varType.IsObject() )
+		{
+			// オブジェクトが対象だったとき
+			char temporary[8192];
+			char calcStr[32];
+			GetCalcName( idCalc, calcStr );
+			sprintf( temporary, "%s=%s %s %s", lpszLeft, lpszLeft, calcStr, lpszRight );
+			SetEscapeSequenceFormat( temporary );
+			KillStringSpaces( temporary );
+			OpcodeCalc( temporary );
+			return;
+		}
+	}
+
+	///////////////////////////
+	// 変数アドレスを取得
+	///////////////////////////
+
+	RELATIVE_VAR VarRelativeVar;
+	if(!GetVarOffsetReadWrite(
+		lpszLeft,
+		&VarRelativeVar,
+		varType)) return;
+
+	//変数オフセットを一時退避
+	if(IsUse_r11(&VarRelativeVar)){
+		//mov qword ptr[rsp+offset],r11     ※スタックフレームを利用
+		pobj_sf->push(REG_R11);
+	}
+
+
+	///////////////////////////////////
+	// レジスタへ変数の内容をコピー
+	///////////////////////////////////
+
+	int reg;
+	if( varType.IsDouble() ){
+		reg=REG_XMM0;
+		SetXmmReg_DoubleVariable(&VarRelativeVar,reg);
+	}
+	else if( varType.IsSingle() ){
+		reg=REG_XMM0;
+		SetXmmReg_SingleVariable(&VarRelativeVar,reg);
+	}
+	else{
+		reg=REG_RAX;
+		SetReg_WholeVariable(varType,&VarRelativeVar,reg);
+	}
+
+
+	if(varType.IsWhole()&&lstrcmp(lpszRight,"1")==0&&
+		(idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
+			if(idCalc==CALC_ADDITION){
+				//インクリメント
+				compiler.codeGenerator.op_inc(REG_RAX);
+			}
+			else if(idCalc==CALC_SUBTRACTION){
+				//デクリメント
+				compiler.codeGenerator.op_dec(REG_RAX);
+			}
+	}
+	else{
+		//結果を格納しているレジスタをブロッキング
+		pobj_BlockReg->lock(reg);
+
+		//右辺を計算
+		Type calcType;
+		if(reg==REG_RAX) reg=REG_RCX;
+		else reg=REG_RAX;
+		NumOpe(&reg,lpszRight,varType,calcType);
+
+		//レジスタのブロッキングを解除
+		pobj_BlockReg->clear();
+
+
+		if(varType.IsPointer()&&calcType.IsWhole()&&(!calcType.IsPointer())){
+			//左辺がポインタ型、右辺が整数型の場合は、エラーをださないようにする
+			calcType = varType;
+		}
+
+
+		/////////////////////////////////
+		// 右辺、左辺の型チェックを行う
+		/////////////////////////////////
+
+		CheckDifferentType(varType,calcType,0,0);
+
+
+		//レジスタ管理オブジェクトを生成
+		pobj_reg=new CRegister(REG_RAX);
+
+		//左辺用レジスタ
+		if(varType.IsReal())
+			pobj_reg->LockXmmReg();
+		else
+			pobj_reg->LockReg();
+
+		//右辺値レジスタ
+		if(varType.IsDouble())
+		{
+			ChangeTypeToXmm_Double(
+				calcType.GetBasicType(),
+				pobj_reg->LockXmmReg(),
+				pobj_reg->GetNextReg()
+			);
+		}
+		else if(varType.IsSingle())
+		{
+			ChangeTypeToXmm_Single(
+				calcType.GetBasicType(),
+				pobj_reg->LockXmmReg(),
+				pobj_reg->GetNextReg()
+			);
+		}
+		else
+		{
+			ChangeTypeToWhole(
+				calcType,
+				varType,
+				pobj_reg->LockReg(),
+				pobj_reg->GetNextXmmReg()
+			);
+		}
+
+		int type_stack[255],sp;
+		LONG_PTR index_stack[255];
+		type_stack[0]=varType.GetBasicType();
+		type_stack[1]=varType.GetBasicType();
+		index_stack[0]=varType.GetIndex();
+		index_stack[1]=varType.GetIndex();
+		sp=2;
+
+		switch(idCalc){
+			case CALC_XOR:
+			case CALC_OR:
+			case CALC_AND:
+				CalcTwoTerm_Logical(idCalc,type_stack,index_stack,&sp);
+				break;
+			case CALC_SHL:
+			case CALC_SHR:
+				Calc_Shift(idCalc,type_stack,&sp);
+				break;
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp);
+				break;
+			case CALC_MOD:
+				Calc_Mod(type_stack,index_stack,&sp);
+				break;
+			case CALC_QUOTIENT:
+				Calc_Divide(type_stack,&sp,varType.GetBasicType());
+				break;
+			case CALC_INTQUOTIENT:
+				Calc_IntDivide(type_stack,index_stack,&sp);
+				break;
+			case CALC_POWER:
+				Calc_Power(type_stack,&sp);
+				break;
+		}
+
+		//レジスタ管理オブジェクトを解放
+		delete pobj_reg;
+		pobj_reg=0;
+	}
+
+
+	/////////////////////////////////////////////////
+	// rax（実数はxmm0）の内容を変数にコピー
+	/////////////////////////////////////////////////
+
+	//変数オフセットを復元
+	if(IsUse_r11(&VarRelativeVar)){
+		//mov r11,qword ptr[rsp+offset]     ※スタックフレームを利用
+		pobj_sf->pop(REG_R11);
+	}
+
+	SetVariableFromRax(varType,varType.GetBasicType(),&VarRelativeVar);
+}
Index: branches/egtra/ab5.0/abdev/compiler_x64/manifest.xml
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/manifest.xml	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/manifest.xml	(revision 774)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity
+version="1.0.0.0"
+processorArchitecture="amd64"
+name="BasicCompiler64.exe"
+type="win32"
+/>
+<description>Description</description>
+<dependency>
+<dependentAssembly>
+<assemblyIdentity
+type="win32"
+name="Microsoft.Windows.Common-Controls"
+version="6.0.0.0"
+processorArchitecture="amd64"
+publicKeyToken="6595b64144ccf1df"
+language="*"
+/>
+</dependentAssembly>
+</dependency>
+</assembly>
Index: branches/egtra/ab5.0/abdev/compiler_x64/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/resource.h	(revision 774)
@@ -0,0 +1,56 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by compiler_x64.rc
+//
+#define IDD_MAIN                        101
+#define IDD_VARLIST                     103
+#define IDI_MAIN                        108
+#define IDI_VARSTRUCT                   109
+#define IDI_VARDATA                     110
+#define IDI_VARSTR                      111
+#define IDI_VARARRAY                    112
+#define IDI_VARPTRSTRUCT                113
+#define IDD_CLIPMAIN                    114
+#define IDD_DEBUGGER                    115
+#define IDR_DEBUGGERTOOLBAR             117
+#define IDD_DEBUGGER_TOOLBARBASE        120
+#define IDR_DEBUGGER_VARLIST_MENU       122
+#define IDR_DEBUGGERTOOLBAR_DISABLED    125
+#define IDC_EXEPATH                     1000
+#define IDC_PROGRESS                    1001
+#define IDC_ERRORLIST                   1002
+#define IDC_MESSAGE                     1003
+#define IDC_DEBUGLIST                   1005
+#define IDC_SHOWERROR                   1006
+#define IDC_SHOWDEBUG                   1007
+#define IDC_THREADCOMBO                 1014
+#define IDC_VARTREE                     1015
+#define IDC_GLOBAL                      1016
+#define IDC_LOCAL                       1017
+#define IDC_PROCCOMBO                   1018
+#define IDC_HIDESYSVAR                  1019
+#define IDC_STEPIN                      1021
+#define IDC_STEPOVER                    1022
+#define IDC_ESP                         1023
+#define IDC_DUMMYCANCEL                 1024
+#define IDC_TAB1                        1025
+#define IDC_VARPOS                      1029
+#define IDC_WATCHLIST                   1033
+#define IDC_STATIC_VERSION              1034
+#define IDC_DEBUG_START                 40003
+#define IDC_DEBUG_STEPOVER              40004
+#define IDC_DEBUG_STEPIN                40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR      40007
+#define IDM_SHOW_RAD_VAR                40008
+#define IDM_SHOW_GUID_VAR               40009
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        126
+#define _APS_NEXT_COMMAND_VALUE         40010
+#define _APS_NEXT_CONTROL_VALUE         1035
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/compiler_x64/resource_back.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/resource_back.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/resource_back.h	(revision 774)
@@ -0,0 +1,55 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by BasicCompiler.rc
+//
+#define IDD_MAIN                        101
+#define IDD_VARLIST                     103
+#define IDI_MAIN                        108
+#define IDI_VARSTRUCT                   109
+#define IDI_VARDATA                     110
+#define IDI_VARSTR                      111
+#define IDI_VARARRAY                    112
+#define IDI_VARPTRSTRUCT                113
+#define IDD_CLIPMAIN                    114
+#define IDD_DEBUGGER                    115
+#define IDR_DEBUGGERTOOLBAR             117
+#define IDD_DEBUGGER_TOOLBARBASE        120
+#define IDR_DEBUGGER_VARLIST_MENU       122
+#define IDC_EXEPATH                     1000
+#define IDC_PROGRESS                    1001
+#define IDC_ERRORLIST                   1002
+#define IDC_MESSAGE                     1003
+#define IDC_DEBUGLIST                   1005
+#define IDC_SHOWERROR                   1006
+#define IDC_SHOWDEBUG                   1007
+#define IDC_THREADCOMBO                 1014
+#define IDC_VARTREE                     1015
+#define IDC_GLOBAL                      1016
+#define IDC_LOCAL                       1017
+#define IDC_PROCCOMBO                   1018
+#define IDC_HIDESYSVAR                  1019
+#define IDC_STEPIN                      1021
+#define IDC_STEPOVER                    1022
+#define IDC_ESP                         1023
+#define IDC_DUMMYCANCEL                 1024
+#define IDC_TAB1                        1025
+#define IDC_VARPOS                      1029
+#define IDC_WATCHLIST                   1033
+#define IDC_STATIC_VERSION              1034
+#define IDC_DEBUG_START                 40003
+#define IDC_DEBUG_STEPOVER              40004
+#define IDC_DEBUG_STEPIN                40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR      40007
+#define IDM_SHOW_RAD_VAR                40008
+#define IDM_SHOW_GUID_VAR               40009
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        125
+#define _APS_NEXT_COMMAND_VALUE         40010
+#define _APS_NEXT_CONTROL_VALUE         1035
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/compiler_x64/stack_frame.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/stack_frame.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/stack_frame.cpp	(revision 774)
@@ -0,0 +1,125 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+/////////////////////////
+// スタックフレーム管理
+/////////////////////////
+
+StackFrame::StackFrame(){
+	lowest_sp=0;
+	now_sp=0;
+	max_parm_size=0;
+}
+StackFrame::~StackFrame(){
+	//オブジェクト破棄時に不整合がないかをチェック（バグ回避）
+	error_check();
+}
+int StackFrame::GetFrameSize( int localParamSize ){
+	int answer_sp;
+
+	answer_sp=lowest_sp-max_parm_size;
+
+	if(((answer_sp-localParamSize)%0x10)==0){
+		//関数のエントリポイントで128ビット境界ラインに合わせるため
+		return -(answer_sp-0x08);
+	}
+	return -(answer_sp-0x10);
+}
+int StackFrame::GetNowSp(){
+	return now_sp;
+}
+void StackFrame::mov_sp( int reg ){
+	//mov reg,rsp
+	compiler.codeGenerator.op_mov_RR( reg, REG_RSP );
+
+	//add reg,now_sp
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_add_RV( reg, now_sp, Schedule::None, true )
+	);
+}
+int StackFrame::push(int reg){
+	now_sp-=sizeof(_int64);
+	if(lowest_sp>now_sp) lowest_sp=now_sp;
+
+	if(reg==REG_NON) return now_sp;
+
+	//mov qword ptr[rsp+offset],reg
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_mov_MR(sizeof(_int64),reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true)
+	);
+
+	return now_sp;
+}
+void StackFrame::push(int xmm_reg,int varSize){
+	now_sp-=sizeof(_int64);
+	if(lowest_sp>now_sp) lowest_sp=now_sp;
+
+	if(varSize==sizeof(double)){
+		//movlpd qword ptr[rsp+offset],xmm_reg
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movlpd_MR(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	if(varSize==sizeof(float)){
+		//movss dword ptr[rsp+offset],xmm_reg
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+}
+void StackFrame::ref_offset_data( int reg, int sp_offset ){
+	//mov reg,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pertialSchedules.push_back(
+		compiler.codeGenerator.op_mov_RM(sizeof(_int64),reg,REG_RSP,sp_offset,MOD_BASE_DISP32, Schedule::None, true )
+	);
+}
+void StackFrame::ref(int reg){
+	ref_offset_data( reg, now_sp );
+}
+void StackFrame::ref(int xmm_reg,int varSize){
+	if(varSize==sizeof(double)){
+		//movlpd xmm_reg,qword ptr[rsp+offset]
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movlpd_RM(xmm_reg,REG_RSP,now_sp,MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	if(varSize==sizeof(float)){
+		//movss xmm_reg,dword ptr[rsp+offset]
+		pertialSchedules.push_back(
+			compiler.codeGenerator.op_movss_MR( xmm_reg, REG_RSP, now_sp, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+}
+void StackFrame::pop(int reg){
+	if(reg!=REG_NON) ref(reg);
+
+	now_sp+=sizeof(_int64);
+}
+void StackFrame::pop(int xmm_reg,int varSize){
+	ref(xmm_reg,varSize);
+
+	now_sp+=sizeof(_int64);
+}
+void StackFrame::parameter_allocate(int size){
+	if(max_parm_size<size) max_parm_size=size;
+}
+void StackFrame::RunningSchedule( int stackFrameSize ){
+	BOOST_FOREACH( const PertialSchedule *pPertialSchedule, pertialSchedules )
+	{
+		compiler.codeGenerator.opfix_offset( pPertialSchedule, stackFrameSize );
+	}
+}
+
+void StackFrame::error_check(){
+	if(now_sp){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+}
+
+//スタックフレーム管理用オブジェクトポインタ
+StackFrame *pobj_sf;
Index: branches/egtra/ab5.0/abdev/compiler_x64/stdafx.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/stdafx.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/stdafx.cpp	(revision 774)
@@ -0,0 +1,1 @@
+#include "stdafx.h"
Index: branches/egtra/ab5.0/abdev/compiler_x64/stdafx.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x64/stdafx.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x64/stdafx.h	(revision 774)
@@ -0,0 +1,59 @@
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <iomanip>
+#include <ios>
+#include <streambuf>
+#include <sstream>
+#include <algorithm>
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <shlwapi.h>
+#include <tchar.h>
+#include <stdarg.h>
+#include <assert.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+
+#include <jenga/include/jenga.h>
+
+#include <option.h>
+
+#include <abdev/ab_common/include/ab_common.h>
+
+using namespace ActiveBasic::Common::Lexical;
+
+#include "../BasicCompiler_Common/common.h"
+
+#include <Exception.h>
+#include <Enum.h>
+#include <logger.h>
+#include <Configuration.h>
+#include <CodeGenerator.h>
+#include <Messenger.h>
+#include <ErrorCode.h>
+#include <Linker.h>
+#include <Compiler.h>
+#include <Debugger.h>
+#include <Program.h>
+#include <LexicalAnalyzer.h>
+#include <VtblGenerator.h>
+#include <ProcedureGenerator.h>
+#include <DataTableGenerator.h>
+#include <BreakPoint.h>
Index: branches/egtra/ab5.0/abdev/compiler_x86/CParameter.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/CParameter.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/CParameter.cpp	(revision 774)
@@ -0,0 +1,403 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+int ParamImpl::NewTempParameters( const std::string &procName, const Parameters &params, int SecondParmNum ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	///////////////////////////////////////////////////////
+	// 一時オブジェクトをあらかじめスタックに積んでおく
+	///////////////////////////////////////////////////////
+
+	useTempObject = false;
+
+	//一時参照の数
+	nCountOfTempObjects = 0;
+
+	BOOL bEllipse;
+	if(params.size()){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
+		else bEllipse=0;
+	}
+	else bEllipse=0;
+
+	for(int i2=ParmsNum-1;i2>=0;i2--){
+		useTempParameters[i2] = false;
+
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
+				//オブジェクトメンバの第一パラメータのThisポインタ
+				continue;
+			}
+		}
+		if( i2==0||i2==1 ){
+			if( params[i2]->GetVarName() == procName ){
+				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+				continue;
+			}
+		}
+
+		Type dummyType;
+		BOOL bByVal;
+		if(bEllipse){
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
+			bByVal=1;
+		}
+		else{
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
+		}
+
+
+		if( !bByVal ){
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+				continue;
+			}
+
+			if( !GetVarType( Parms[i2], Type(), FALSE ) ){
+				//変数ではないとき
+				Type calcType;
+				bool isNeedHeapFreeStructure;
+				NumOpe( Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure );
+				//↑ここでスタックに積む
+
+				nCountOfTempObjects++;
+
+				if( !calcType.IsStruct() ){
+					//一時参照を作成
+
+					//push esp
+					compiler.codeGenerator.op_push( REG_ESP );
+
+					nCountOfTempObjects++;
+				}
+
+				bool result = CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i2);
+
+				if( result )
+				{
+					useTempParameters[i2] = true;
+					isNeedFreeStructures[i2] = isNeedHeapFreeStructure;
+					useTempObject = true;
+
+					types[i2] = calcType;
+				}
+			}
+		}
+	}
+
+	return nCountOfTempObjects * PTR_SIZE;
+}
+
+void ParamImpl::DeleteTempParameters(){
+	///////////////////////////////////////////////////////
+	// 一時オブジェクトを破棄
+	///////////////////////////////////////////////////////
+	if( !useTempObject ) return;
+
+	for(int i2=ParmsNum-1;i2>=0;i2--){
+		if( useTempParameters[i2] ){
+			if( types[i2].IsStruct() )
+			{
+				// 構造体の一時メモリ
+
+				if( isNeedFreeStructures[i2] )
+				{
+					//メモリを解放する
+
+					//call free
+					extern const UserProc *pSub_free;
+					compiler.codeGenerator.op_call(pSub_free);
+				}
+				else
+				{
+					//pop ... 参照を消す
+					compiler.codeGenerator.op_add_esp( PTR_SIZE );
+				}
+			}
+			else
+			{
+				if( types[i2].Is64() )
+				{
+					//pop ... 参照を消す
+					//pop ... 上位32ビット
+					//pop ... 下位32ビット
+					compiler.codeGenerator.op_add_esp( PTR_SIZE * 3 );
+				}
+				else
+				{
+					//pop ... 参照を消す
+					//pop ... 値を消す
+					compiler.codeGenerator.op_add_esp( PTR_SIZE * 2 );
+				}
+			}
+		}
+	}
+}
+
+void ParamImpl::SetStructParameter( const Type &baseType, const char *expression ){
+	int object_size = baseType.GetClass().GetSize();
+
+	//push object_size
+	compiler.codeGenerator.op_push_V(object_size);
+
+	//call calloc
+	extern const UserProc *pSub_calloc;
+	compiler.codeGenerator.op_call(pSub_calloc);
+
+	//push eax（ここでプッシュされた値が実際にパラメータとして引き渡される）
+	compiler.codeGenerator.op_push(REG_EAX);
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+	Type calcType;
+	bool isNeedHeapFreeStructure;
+	NumOpe( expression,
+		baseType,
+		calcType,
+		&isNeedHeapFreeStructure );
+
+	// ※スタックにある二つのデータ（コピー先、コピー元）の値を必要とする
+	SetStructVariable( baseType, calcType, isNeedHeapFreeStructure );
+}
+
+int ParamImpl::SetParameter( const std::string &procName, const Parameters &params, int SecondParmNum, const UserProc *pUserProc ){
+	if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
+
+	///////////////////////////////////////////////////////////
+	// パラメータをレジスタ及びスタックフレームにセット
+	///////////////////////////////////////////////////////////
+	int i2,i3;
+
+	BOOL bEllipse;
+	if( params.size() ){
+		if(params[params.size()-1]->GetBasicType()==DEF_ELLIPSE) bEllipse=1;
+		else bEllipse=0;
+	}
+	else bEllipse=0;
+
+	BOOL bHas_System_LocalThis=0;
+	if(ParmsNum>=1){
+		if( params[0]->GetVarName() == "_System_LocalThis" ){
+			bHas_System_LocalThis=1;
+		}
+	}
+
+	//戻り値用の変数名を取得
+	const char *lpszVarNameToReturn = (procName[0]==1&&procName[1]==ESC_OPERATOR)?"_System_ReturnValue":procName.c_str();
+
+	//パラメータをレジスタとスタックに格納
+	int ParmSize=0;
+	RELATIVE_VAR RelativeVar;
+	int nCountOfNowTempObjects = 0;
+	for(i2=ParmsNum-1;i2>=0;i2--){
+		if(bEllipse&&i2<=(int)params.size()-2) bEllipse=0;
+
+		if(i2==0){
+			if( params[i2]->GetVarName() == "_System_LocalThis" ){
+				//オブジェクトメンバの第一パラメータのThisポインタ
+				continue;
+			}
+		}
+		if(i2==0||i2==1){
+			if( params[i2]->GetVarName() == lpszVarNameToReturn ){
+				//オブジェクトメンバの第一または第二パラメータの戻り値用オブジェクト
+				continue;
+			}
+		}
+
+		Type dummyType;
+		BOOL bByVal;
+		if(bEllipse){
+			NumOpe_GetType( Parms[i2], Type(), dummyType );
+			bByVal=1;
+		}
+		else{
+			dummyType = *params[i2];
+			bByVal = ( params[i2]->IsRef() == false ) ? TRUE:FALSE;
+
+			// 型パラメータを解決
+			ResolveFormalGenericTypeParameter( dummyType, leftType, pUserProc );
+		}
+
+		if(bByVal==1){
+			//値参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				char temp2[255];
+				sprintf(temp2,"%s関数の第%dパラメータ",procName.c_str(),i2+1);
+				compiler.errorMessenger.Output(19,temp2,cp);
+				continue;
+			}
+
+			if( dummyType.IsStruct() ){
+				SetStructParameter( dummyType, Parms[i2] );
+				goto next;
+			}
+
+			Type calcType;
+			bool isNeedHeapFreeStructure;
+			if( !NumOpe( Parms[i2], dummyType, calcType, &isNeedHeapFreeStructure ) )
+			{
+				break;
+			}
+
+			if( calcType.IsObject() )
+			{
+				if( !dummyType.IsObject()
+					||
+					dummyType.IsObject() &&
+					!dummyType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) )
+				{
+						//キャスト演算子のオーバーロードに対応する
+						CallCastOperatorProc( calcType, isNeedHeapFreeStructure,dummyType );
+				}
+			}
+
+			if(!bEllipse){
+				//型チェック
+				// TODO: _System_ReturnValueが考慮されていない？
+				if(bHas_System_LocalThis) i3=i2-1;
+				else i3=i2;
+				CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i3);
+			}
+
+			if( dummyType.IsDouble() ){
+				ChangeTypeToDouble( calcType.GetBasicType() );
+				ParmSize+=sizeof(long)*2;
+			}
+			else if( dummyType.IsSingle() ){
+				ChangeTypeToSingle( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else if( dummyType.Is64() ){
+				ChangeTypeToInt64( calcType.GetBasicType() );
+				ParmSize+=sizeof(long)*2;
+			}
+			else if( dummyType.IsLong() || dummyType.IsDWord()
+				|| dummyType.IsPointer()
+				|| dummyType.IsObject() || dummyType.IsStruct() ){
+					ChangeTypeToLong( calcType.GetBasicType() );
+					ParmSize+=sizeof(long);
+			}
+			else if( dummyType.IsInteger() || dummyType.IsWord() ){
+				ChangeTypeToInteger( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else if( dummyType.IsSByte() || dummyType.IsByte() || dummyType.IsBoolean() ){
+				ChangeTypeToByte( calcType.GetBasicType() );
+				ParmSize+=sizeof(long);
+			}
+			else{
+				compiler.errorMessenger.Output(300,NULL,cp);
+			}
+		}
+		else{
+			//ポインタ参照
+			if(Parms[i2][0]==1&&Parms[i2][1]==ESC_BYVAL){
+				//ポインタ指定
+
+				Type calcType;
+				if( !NumOpe( Parms[i2]+2, dummyType, calcType) ){
+					break;
+				}
+
+				ChangeTypeToLong( calcType.GetBasicType() );
+
+				dummyType.PtrLevelUp();
+
+				//型チェック
+				if(bHas_System_LocalThis) i3=i2-1;
+				else i3=i2;
+				CheckDifferentType(
+					dummyType,
+					calcType,
+					procName.c_str(),
+					i3);
+			}
+			else{
+				if( useTempParameters[i2] ){
+					//一時オブジェクトをコピー
+
+					if( !types[i2].IsStruct() ){
+						// 一時参照のための領域を考慮する
+						nCountOfNowTempObjects++;
+					}
+
+					nCountOfNowTempObjects++;
+
+					//mov eax, dword ptr[esp+offset]
+					compiler.codeGenerator.op_mov_RM(
+						sizeof(long),
+						REG_EAX,
+						REG_ESP,
+						( ( ParmsNum - i2 - 1 ) + ( nCountOfTempObjects - nCountOfNowTempObjects ) ) * PTR_SIZE,
+						MOD_BASE_DISP32 );
+
+					//push eax
+					compiler.codeGenerator.op_push(REG_EAX);
+				}
+				else{
+					//変数のアドレスを取得
+					Type varType;
+					if(GetVarOffset(
+						false,
+						false,
+						Parms[i2],
+						&RelativeVar,
+						varType)){
+							if( !dummyType.IsAny() ){
+								//型チェックを行う
+								if( dummyType.GetBasicType() == varType.GetBasicType() ){
+									if( dummyType.IsObject() ){
+										if( !dummyType.GetClass().IsEqualsOrSubClass( &varType.GetClass() ) ){
+											compiler.errorMessenger.Output(11,Parms[i2],cp);
+										}
+									}
+									else if( dummyType.IsStruct() ){
+										if( !dummyType.GetClass().IsEquals( &varType.GetClass() ) ){
+											compiler.errorMessenger.Output(11,Parms[i2],cp);
+										}
+									}
+								}
+								else if( (varType.GetBasicType()&FLAG_PTR)
+									&&((varType.GetBasicType()^FLAG_PTR)==dummyType.GetBasicType())){
+									//仮引数がポインタ参照で、実引数が配列の先頭ポインタのとき
+								}
+								else{
+									compiler.errorMessenger.Output(11,Parms[i2],cp);
+								}
+							}
+
+							//変数アドレスをレジスタにセット
+							SetVarPtrToEax(&RelativeVar);
+
+							//push eax
+							compiler.codeGenerator.op_push(REG_EAX);
+					}
+				}
+			}
+
+			ParmSize+=PTR_SIZE;
+		}
+
+next:;
+	}
+
+	return ParmSize;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc.cpp	(revision 774)
@@ -0,0 +1,650 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ChangeTypeToDouble_ToFpuReg(int OldType){
+	//現在のスタックの内容を実数レジスタに保存する
+	//NumOpeの直後専用
+	if(OldType==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else if(OldType==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if(OldType==DEF_LONG){
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if(OldType==DEF_DWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//push 0
+		compiler.codeGenerator.op_push_V(0);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xDF,
+			(char)0x2C,
+			(char)0x24
+		);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+}
+void ChangeTypeToDouble(int OldType){
+	//現在のスタックの内容をdouble型に変換する
+	//NumOpeの直後専用
+	if(OldType==DEF_DOUBLE) return;
+	else if(OldType==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+	}
+	else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+		//64ビット整数型
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+	}
+	else if(IsWholeNumberType(OldType)){
+		//その他整数型
+
+		if(IsSignedType(OldType)){
+			//符号あり
+
+			if(OldType==DEF_INTEGER || (compiler.IsUnicode()&&OldType==DEF_CHAR)){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//movsx eax,ax
+				compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
+
+				//push eax
+				compiler.codeGenerator.op_push(REG_EAX);
+			}
+			else if(OldType==DEF_SBYTE || (compiler.IsUnicode()==false&&OldType==DEF_CHAR)){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//movsx eax,al
+				compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
+
+				//push eax
+				compiler.codeGenerator.op_push(REG_EAX);
+			}
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+		}
+		else{
+			//符号なし
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.PutOld(
+				(char)0xDF,
+				(char)0x2C,
+				(char)0x24
+			);
+		}
+
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+	}
+	else compiler.errorMessenger.Output(9,NULL,cp);
+}
+void ChangeTypeToSingle(int OldType){
+	//現在のスタックの内容をfloat型に変換する
+	//NumOpeの直後専用
+	if(OldType==DEF_SINGLE) return;
+	else if(OldType==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+	}
+	else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+		//64ビット整数型
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+	}
+	else if(IsWholeNumberType(OldType)){
+		//その他整数型
+
+		if(IsSignedType(OldType)){
+			//符号あり
+
+			if(OldType==DEF_INTEGER || (compiler.IsUnicode()&&OldType==DEF_CHAR)){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//movsx eax,ax
+				compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
+
+				//push eax
+				compiler.codeGenerator.op_push(REG_EAX);
+			}
+			else if(OldType==DEF_SBYTE || (compiler.IsUnicode()==false&&OldType==DEF_CHAR)){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//movsx eax,al
+				compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
+
+				//push eax
+				compiler.codeGenerator.op_push(REG_EAX);
+			}
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+		else{
+			//符号なし
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+	}
+	else compiler.errorMessenger.Output(9,NULL,cp);
+}
+
+void ChangeTypeToInt64(int OldType){
+	//現在のスタックの内容をInt64型に変換する
+	//NumOpeの直後専用
+	if(Is64Type(OldType)) return;
+
+	else if(OldType==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+	}
+	else if(OldType==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+	}
+	else if(IsWholeNumberType(OldType)){
+		//その他整数
+
+		if(IsSignedType(OldType)){
+			//符号あり
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//cdq
+			compiler.codeGenerator.op_cdq();
+
+			//push edx
+			compiler.codeGenerator.op_push(REG_EDX);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+		else{
+			//符号なし
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+	}
+	else compiler.errorMessenger.Output(9,NULL,cp);
+}
+void ChangeTypeToLong(int OldType){
+	//現在のスタックの内容をLong型に変換する
+	//NumOpeの直後専用
+	if(OldType==DEF_DOUBLE){
+
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//fistp dword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+	}
+	else if(OldType==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//fistp dword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+	}
+	else if(OldType==DEF_INT64||OldType==DEF_QWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+void ChangeTypeToInteger(int OldType){
+	//現在のスタックの内容をInteger型に変換する
+	if(OldType==DEF_BOOLEAN||
+		OldType==DEF_BYTE||
+		OldType==DEF_WORD||OldType==DEF_INTEGER || (compiler.IsUnicode()&&OldType==DEF_CHAR)) return;
+	else if(OldType==DEF_SBYTE || (compiler.IsUnicode()==false&&OldType==DEF_CHAR)){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//movsx eax,al
+		compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		ChangeTypeToLong(OldType);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//and eax,0000FFFFh
+		compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+void ChangeTypeToByte(int OldType){
+	//現在のスタックの内容をbyte型に変換する
+	if(OldType==DEF_BYTE||OldType==DEF_SBYTE || (compiler.IsUnicode()==false&&OldType==DEF_CHAR)) return;
+
+	ChangeTypeToLong(OldType);
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//and eax,000000FFh
+	compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+}
+
+
+
+
+
+
+
+
+
+void RestoreDefaultRegisterFromStackMemory( int type ){
+	//現在のスタックの内容を実数レジスタに保存する
+	//NumOpeの直後専用
+	if(type==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else if(type==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if( Is64Type( type ) ){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+	}
+	else{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+	}
+}
+
+void SetVariableFromEax( const Type &varType,int CalcType,RELATIVE_VAR *pRelativeVar){
+	/////////////////////////////////////////////////
+	// eaxの内容を変数にコピーするコードを抽出
+	/////////////////////////////////////////////////
+
+	if( varType.IsBoolean() )
+	{
+		//bool
+		SetBooleanVariable(CalcType,pRelativeVar);
+	}
+	else if( varType.IsReal() )
+	{
+		// Double/Single型変数へレジスタの値を代入
+		SetRealVariable(varType.GetBasicType(), CalcType, pRelativeVar);
+	}
+	else if( varType.IsWhole() || varType.IsObject() )
+	{
+		int typeSize = varType.GetSize();
+
+		//整数変数へraxの値を格納する
+		SetWholeVariable( typeSize, CalcType, pRelativeVar );
+	}
+	else{
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+}
+
+void OpcodeCalc( const char *Command ){
+	int i,i2,i3;
+	char variable[VN_SIZE];
+
+
+
+	//////////////////////////////////////
+	// インクリメント・デクリメント
+	//////////////////////////////////////
+
+	for(i=0;;i++){
+		if(Command[i]=='\"'){
+			//ダブルクォートは不正なのでエラー扱い
+			variable[i]=0;
+			compiler.errorMessenger.Output(3,variable,cp);
+			return;
+		}
+
+		if(Command[i]=='('){
+			i2=GetStringInPare(variable+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='['){
+			i2=GetStringInBracket(variable+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='\0'){
+
+			///////////////////////////////////
+			// インクリメント・デクリメント
+			///////////////////////////////////
+
+			if(i>2){
+				if(Command[i-2]=='+'&&Command[i-1]=='+'){
+					//インクリメント
+					variable[i-2]=0;
+					IncDec(CALC_ADDITION,variable,"1");
+					return;
+				}
+				else if(Command[i-2]=='-'&&Command[i-1]=='-'){
+					//デクリメント
+					variable[i-2]=0;
+					IncDec(CALC_SUBTRACTION,variable,"1");
+					return;
+				}
+			}
+
+
+			//先端部分の識別子をエラーキーワードにする
+			for(i=0;;i++){
+				if(!IsVariableChar(Command[i])){
+					variable[i]=0;
+					break;
+				}
+				variable[i]=Command[i];
+			}
+
+			if(GetVarType(variable,Type(),0)){
+				//変数リストに該当したとき
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+			else{
+				if( compiler.GetObjectModule().meta.GetGlobalConsts().IsExistDuplicationKeyName(variable)
+					|| compiler.GetObjectModule().meta.GetGlobalConstMacros().IsExistDuplicationKeyName(variable) )
+				{
+					//定数リストに該当したとき
+					compiler.errorMessenger.Output(1,NULL,cp);
+				}
+				else{
+					//変数リスト、定数リストに該当しないとき
+					compiler.errorMessenger.Output(3,variable,cp);
+				}
+			}
+			return;
+		}
+
+		i2=GetCalcId(Command+i,&i3);
+		if(i2){
+			variable[i]=0;
+
+			if(Command[i]=='=') break;
+
+			if(Command[i+1+i3]=='='){
+				IncDec(i2,variable,Command+i+1+i3+1);
+				return;
+			}
+		}
+
+		variable[i]=Command[i];
+	}
+
+	if(Command[i+1]=='\0'){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+
+	///////////////////////////////////////////////////////////////
+	// インデクサのsetアクセサ（[]=演算子のオーバーロードに対応）
+	///////////////////////////////////////////////////////////////
+
+	char ObjName[VN_SIZE],array_element[VN_SIZE];
+	GetArrayElement(variable,ObjName,array_element);
+	if(array_element[0]){
+		Type varType;
+		if( GetVarType(ObjName,varType,0) && varType.IsObject() ){
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s.%c%c%c",ObjName,1,ESC_OPERATOR,CALC_ARRAY_SET);
+
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s,%s",array_element,Command+i+1);
+
+			int idProc;
+			void *pProc;
+			idProc=GetProc(temporary,(void **)&pProc);
+			if( idProc )
+			{
+				CallProc(
+					idProc,
+					pProc,
+					temporary,
+					temp2,
+					Type(),			// ベースタイプはなし
+					Type()
+				);
+				return;
+			}
+		}
+	}
+
+
+	if( lstrcmpi( variable, "This" ) == 0 ){
+		compiler.errorMessenger.Output(133,NULL,cp);
+		return;
+	}
+
+
+	////////////////////////////////////////
+	// 変数のタイプ型を識別して、演算を行う
+	////////////////////////////////////////
+
+	Type varType;
+
+	//型を識別
+	if( !GetTermTypeOnlyVariable(variable,varType) ){
+
+		// プロパティ用のメソッドを呼び出す
+		if(!CallPropertyMethod( variable, Command+i+1, Type() )){
+			//エラーを表示
+			GetVarType(variable,varType,true);
+		}
+
+		return;
+	}
+
+	RELATIVE_VAR VarRelativeVar;
+	if( varType.IsStruct() ){
+		//代入コピーに備える
+
+		//変数アドレスを取得
+		if(!GetVarOffsetReadWrite(
+			variable,
+			&VarRelativeVar,
+			varType)) return;
+
+		SetVarPtrToEax(&VarRelativeVar);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+
+	//NumOpe...（スタックに答えが格納される）
+	Type calcType;
+	bool isNeedHeapFreeStructure;
+	if( !NumOpe(Command+i+1,varType,calcType,&isNeedHeapFreeStructure) ){
+		return;
+	}
+
+	if( calcType.IsObject() && !calcType.Equals( varType ) ){
+		bool isUpCast = false;
+		if( varType.IsObject() ){
+			if( varType.GetClass().IsEqualsOrSubClass( &calcType.GetClass() ) ){
+				isUpCast = true;
+			}
+		}
+		if( !isUpCast ){
+			//キャスト演算子のオーバーロードに対応する
+			CallCastOperatorProc(calcType,isNeedHeapFreeStructure,varType);
+		}
+	}
+
+	//変数アドレスを取得
+	if( !TermOpeOnlyVariable( variable, varType, VarRelativeVar, true ) )
+	{
+		compiler.errorMessenger.OutputFatalError();
+		return;
+	}
+
+	if(varType.GetBasicType()&FLAG_PTR){
+		compiler.errorMessenger.Output(14,variable,cp);
+		return;
+	}
+
+	if( varType.IsStruct() ){
+		//構造体インスタンスへの代入
+		SetStructVariable(varType,calcType,isNeedHeapFreeStructure);
+		return;
+	}
+
+
+	if( varType.IsObject() && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( calcType ) ){
+		// Blittable型をオブジェクトとして扱う
+		std::vector<const UserProc *> userProcs;
+		compiler.GetObjectModule().meta.GetBlittableTypes().GetClass( calcType ).GetStaticMethods().Enum( "_Create", userProcs );
+		if( userProcs.size() != 1 ){
+			compiler.errorMessenger.OutputFatalError();
+			return;
+		}
+		const UserProc *pUserProc = userProcs[0];
+
+		// call System.[TypeClass]._Create
+		compiler.codeGenerator.op_call( pUserProc );
+
+		// push eax
+		compiler.codeGenerator.op_push( REG_EAX );
+
+		calcType = pUserProc->ReturnType();
+	}
+
+
+	/////////////////////////////////
+	// 右辺、左辺の型チェックを行う
+	/////////////////////////////////
+
+	CheckDifferentType(varType,calcType,0,0);
+
+
+	/////////////////////////////////////////////////
+	// スタックの内容を変数にコピーするコードを抽出
+	/////////////////////////////////////////////////
+
+	//eax、edx:eax、またはst(0)にスタック上のデータを取り出す
+	RestoreDefaultRegisterFromStackMemory( calcType.GetBasicType() );
+
+	SetVariableFromEax(varType,calcType.GetBasicType(),&VarRelativeVar);
+
+
+	// コード生成過程で発生した構造体の一時メモリを破棄する
+	compiler.codeGenerator.op_FreeTempStructure();
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc_PushVar.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc_PushVar.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Calc_PushVar.cpp	(revision 774)
@@ -0,0 +1,218 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar){
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//fld ptr[ecx+offset]
+			compiler.codeGenerator.op_fld_base_offset(type,REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
+		}
+		else{
+			//mov ecx,offset
+			compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
+
+			//fld ptr[ecx]
+			compiler.codeGenerator.op_fld_basereg(type,REG_ECX);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
+		compiler.errorMessenger.Output(300,NULL,cp);
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//fld ptr[ebp+ecx+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_fld_base_offset_ex(type,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//fld ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_fld_base_offset(type,REG_EBP,(int)pRelativeVar->offset, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//fld ptr[ecx]
+		compiler.codeGenerator.op_fld_basereg(type,REG_ECX);
+	}
+}
+void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head)
+{
+	int varSize;
+
+	varSize = type.GetSize();
+
+	if(varSize==sizeof(_int64)){
+		//64ビットの場合はedx:eaxにロード
+		if(reg!=REG_EAX){
+			compiler.errorMessenger.Output(300,NULL,cp);
+			return;
+		}
+
+		//下位32ビットをeaxにロード
+		SetReg_WholeVariable( Type(DEF_LONG),pRelativeVar,REG_EAX);
+
+		//上位32ビットをedxにロード
+		SetReg_WholeVariable( Type(DEF_LONG),pRelativeVar,REG_EDX, true);
+
+		return;
+	}
+
+	int offsetOf64Head = 0;
+	if( is64Head ){
+		offsetOf64Head = sizeof(long);
+	}
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov reg, ptr[ecx+offset]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov reg, ptr[offset]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,0,(int)pRelativeVar->offset + offsetOf64Head,MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov ecx,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov reg, ptr[ebp+ecx+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM_ex(varSize,reg,REG_EBP,REG_ECX,(int)pRelativeVar->offset + offsetOf64Head,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//mov reg, ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(varSize,reg,REG_EBP,(int)pRelativeVar->offset + offsetOf64Head,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		if( is64Head ){
+			//mov reg, ptr[ecx]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,REG_ECX,offsetOf64Head,MOD_BASE_DISP8);
+		}
+		else{
+			//mov reg, ptr[ecx]
+			compiler.codeGenerator.op_mov_RM(varSize,reg,REG_ECX,0,MOD_BASE);
+		}
+	}
+}
+
+
+
+void PushLongVariable(RELATIVE_VAR *pRelativeVar){
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//push dword ptr[ecx+offset]
+			compiler.codeGenerator.op_push_M( REG_ECX, pRelativeVar->offset, Schedule::GlobalVar );
+		}
+		else{
+			//push dword ptr[offset]
+			compiler.codeGenerator.op_push_M( REG_NON, pRelativeVar->offset, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
+		//mov eax,dword ptr[offset]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+
+		if(pRelativeVar->bOffsetOffset){
+			//add eax,ecx
+			compiler.codeGenerator.op_add_RR( REG_EAX, REG_ECX );
+		}
+
+		//push dword ptr[eax]
+		compiler.codeGenerator.op_push_M( REG_EAX );
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV( REG_ECX, pRelativeVar->offset, Schedule::None, true )
+			);
+
+			//push dword ptr[ebp+ecx]
+			compiler.codeGenerator.PutOld(
+				(char)0xFF,
+				(char)0x74,
+				(char)0x0D,
+				(char)0x00
+			);
+		}
+		else{
+			//push dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_push_M( REG_EBP, pRelativeVar->offset, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+		//mov eax,dword ptr[ebp+offset]
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+		);
+
+		if(pRelativeVar->bOffsetOffset){
+			//add eax,ecx
+			compiler.codeGenerator.op_add_RR( REG_EAX, REG_ECX );
+		}
+
+		//push dword ptr[eax]
+		compiler.codeGenerator.op_push_M( REG_EAX );
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+		//push dword ptr[ecx]
+		compiler.codeGenerator.op_push_M( REG_ECX );
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_CallProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_CallProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_CallProc.cpp	(revision 774)
@@ -0,0 +1,594 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+using namespace ActiveBasic::Compiler;
+
+void Call_DebugSys_SaveContext(){
+	//call _System_GetEip
+	extern const UserProc *pSub_System_GetEip;
+	compiler.codeGenerator.op_call(pSub_System_GetEip);
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+	//push ebp
+	compiler.codeGenerator.op_push(REG_EBP);
+
+	//call _DebugSys_SaveContext
+	extern const UserProc *pSub_DebugSys_SaveContext;
+	compiler.codeGenerator.op_call(pSub_DebugSys_SaveContext);
+}
+
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer)
+{
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	////////////////////////
+	// パラメータのセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(lpszParms);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pProcPointer->Params() );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
+
+	//レジスタ、スタックフレームにセット
+	pobj_parameter->SetParameter(variable,pProcPointer->Params() );
+
+
+
+	////////////////////////
+	// call
+	////////////////////////
+	RELATIVE_VAR RelativeVar;
+	GetVarOffsetReadOnly(variable,&RelativeVar,Type());
+	SetVarPtrToEax(&RelativeVar);
+
+	//mov eax,dword ptr[eax]
+	compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+
+	//call eax
+	compiler.codeGenerator.op_call_R( REG_EAX );
+
+
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName )
+{
+	if( pUserProc->IsMacro() ){
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
+			Opcode_Print(Parameter,0);
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
+			Opcode_Input(Parameter);
+			return true;
+		}
+		if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
+			Opcode_Print(Parameter,1);
+			return true;
+		}
+	}
+	if( (dwFlags&PROCFLAG_PERMIT_CONSTRUCTOR) == 0 && pUserProc->IsConstructor() )
+	{
+		// コンストラクタの直接呼出しはエラーとする
+		compiler.errorMessenger.Output(145,NULL,cp);
+		return false;
+	}
+	if( (dwFlags&PROCFLAG_PERMIT_DESTRUCTOR) == 0 && pUserProc->IsDestructor() )
+	{
+		// デストラクタの直接呼出しはエラーとする
+		compiler.errorMessenger.Output(146,NULL,cp);
+		return false;
+	}
+
+	pUserProc->Using();
+
+	bool isStatic = false;
+	const CClass *pobj_c = NULL;
+	const CMethod *pMethod = NULL;
+	Type leftType;
+	bool isFixedClass = false;
+	if( pUserProc->GetParentClassPtr() ){
+		//クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
+		if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0)
+		{
+			if(lstrcmpi(ObjectName,"Super")==0)
+			{
+				//クラスメンバ関数内から基底クラスの呼び出し
+				pobj_c=&compiler.GetCompilingClass().GetSuperClass();
+
+				isFixedClass = true;
+			}
+			else
+			{
+				//"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
+				Type varType;
+				if( GetTermType( ObjectName, varType ) )
+				{
+					if( varType.IsObject() )
+					{
+						pobj_c = &varType.GetClass();
+						leftType = varType;
+					}
+				}
+
+				if( !pobj_c )
+				{
+					pobj_c = compiler.GetObjectModule().meta.FindClassSupportedTypeDef(
+						LexicalAnalyzer::FullNameToSymbol( ObjectName )
+					);
+					if( pobj_c ){
+						isStatic = true;
+					}
+					else{
+						compiler.errorMessenger.Output(300,NULL,cp);
+					}
+				}
+			}
+		}
+		else{
+			if(dwFlags&PROCFLAG_NEW){
+				GetVarType( ObjectName, leftType, false );
+
+				//New演算子によるコンストラクタ呼び出し
+				pobj_c = pUserProc->GetParentClassPtr();
+			}
+			else{
+				//クラスメンバ関数内から同一クラスのメンバ関数の呼び出し
+				pobj_c = &compiler.GetCompilingClass();
+			}
+		}
+
+
+		/////////////////////////////////
+		// メソッド情報を取得
+		/////////////////////////////////
+		pMethod = NULL;
+		if( ! isStatic ) pMethod = pobj_c->GetDynamicMethodOrInterfaceMethod( pUserProc );
+		if( ! pMethod ){
+			//動的メソッドが取得できなかったときは静的メソッドを当たる
+			pMethod = pobj_c->GetStaticMethods().GetMethodPtr( pUserProc );
+			if( !pMethod ){
+				compiler.errorMessenger.Output(300,NULL,cp);
+				return false;
+			}
+
+			//静的メンバ
+			isStatic = true;
+		}
+
+
+		//////////////////////////////
+		// アクセスエラーチェック
+		//////////////////////////////
+
+		if(ObjectName[0]){
+			//外部からの呼び出し
+			if( compiler.IsCompilingClass() && pobj_c == &compiler.GetCompilingClass() )
+			{
+				//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+				if( pMethod->IsNoneAccess() )
+				{
+					compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+					return false;
+				}
+			}
+			else
+			{
+				if( pMethod->IsPrivate()
+					|| pMethod->IsNoneAccess() )
+				{
+					compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+				}
+				if( !pMethod->GetUserProc().GetParentClass().IsEqualsOrSubClass( pobj_c ) && pMethod->IsProtected() )
+				{
+					compiler.errorMessenger.Output(110,pUserProc->GetName(),cp);
+					return false;
+				}
+			}
+		}
+		else{
+			//クラス内部からの呼び出し（継承によるACCESS_NONのみをエラーとする）
+			if( pMethod->IsNoneAccess() ){
+				compiler.errorMessenger.Output(109,pUserProc->GetName(),cp);
+				return false;
+			}
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////
+	// _System_LocalThisのダミーをセット
+	///////////////////////////////////////////////////////////////
+
+	char temporary[VN_SIZE]={0};
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
+		//_System_LocalThis（第一パラメータ）のダミーを作成
+		lstrcpy(temporary,"0,");
+	}
+	if( pUserProc->ReturnType().IsStruct() ){
+		// ※ByRef _System_ReturnValue パラメータのダミーをセット
+		lstrcat(temporary,"0,");
+	}
+
+	if(Parameter[0]=='\0'&&temporary[0])
+		temporary[lstrlen(temporary)-1]=0;
+	else lstrcat(temporary,Parameter);
+
+
+	////////////////////////
+	// パラメータをセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(temporary);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pUserProc->RealParams() );
+
+	// 型パラメータを適用
+	pobj_parameter->SetLeftType( leftType );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	if(pUserProc->IsMacro()){
+		//マクロ関数の場合は、パラメータ省略を考慮する
+		pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
+	}
+
+	//一時オブジェクトを生成
+	int tempSize = pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
+
+	//レジスタ、スタックフレームにセット
+	int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum(), pUserProc );
+
+	if(pUserProc->ReturnType().IsStruct() ){
+		//////////////////////////////////////////////////////
+		// 戻り値に構造体インスタンスを持つ場合
+		// ※ByRef _System_ReturnValue パラメータをセット
+		//////////////////////////////////////////////////////
+
+		int object_size = pUserProc->ReturnType().GetClass().GetSize();
+
+		//push object_size
+		compiler.codeGenerator.op_push_V(object_size);
+
+		//call calloc
+		extern const UserProc *pSub_calloc;
+		compiler.codeGenerator.op_call(pSub_calloc);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		ParmSize += PTR_SIZE;
+	}
+
+
+	if( pUserProc->GetParentClassPtr() && isStatic == false ){
+		//////////////////////////////////////////////////////
+		// メンバ関数の場合
+		// ※_System_LocalThis パラメータをecxにセット
+		//////////////////////////////////////////////////////
+
+		if(ObjectName[0] && (dwFlags&PROCFLAG_NEW)==0){
+			if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+			else{
+				bool isLiteral, isNeedHeapFreeStructure = false;
+				Type baseType( DEF_OBJECT, *pUserProc->GetParentClassPtr() ) , resultType;
+				if( !TermOpe( ObjectName, baseType, resultType, isLiteral, isNeedHeapFreeStructure, NULL, false, !pMethod->IsConst() ) )
+				{
+					return false;
+				}
+				if( !resultType.IsObject() )
+				{
+					compiler.errorMessenger.OutputFatalError();
+				}
+
+				// 実態ポインタをeaxにコピー
+				compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
+			}
+		}
+		else{
+InClassMember:
+			if(dwFlags&PROCFLAG_NEW){
+				//New演算子によるコンストラクタ呼び出しの場合
+
+				//mov ecx,dword ptr[esp+ParmSize]
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ESP, ParmSize + tempSize, MOD_BASE_DISP32 );
+			}
+			else{
+				//Thisポインタをecxにコピー
+				SetThisPtrToReg(REG_ECX);
+			}
+		}
+	}
+
+	if( pUserProc->IsVirtual() && !isFixedClass )
+	{
+		int vtblIndex;
+		if( pobj_c->IsInterface() )
+		{
+			// インターフェイス メソッド呼び出し
+
+			int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
+
+
+			// vtblのポインタを取得
+			//mov edx,dword ptr[ecx+offset_vtbl]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 );
+
+			int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
+
+
+
+			// インターフェイスの場合は更に__thisを取得する
+			//mov ecx,qword ptr[ecx+offset_this]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+			if( vtblMasterListIndex != 0 )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+		}
+		else if( pobj_c->IsComInterface() )
+		{
+			// COMインターフェイス メソッド呼び出し
+
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl1 -> func1
+			//               -> func2
+			//               -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblのポインタを取得
+			//mov edx,dword ptr[ecx]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
+		}
+		else
+		{
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl_master_list -> vtbl1 -> func1
+			//                                   -> func2
+			//                                   -> func3
+			//                          -> vtbl2 -> func1
+			//                                   -> func2
+			//                                   -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( pUserProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblマスターリストのポインタを取得
+			//mov edx,dword ptr[ecx+sizeof(com_vtbl)]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 );
+			
+			// vtblのポインタを取得
+			//mov edx,dword ptr[edx+vtblMasterListIndex]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
+		}
+
+		//push ecx
+		compiler.codeGenerator.op_push(REG_ECX);	
+
+		//call dword ptr[edx+func_index]
+		if( vtblIndex * PTR_SIZE <= 0x7F )
+		{
+			compiler.codeGenerator.PutOld(
+				(char)0xFF,
+				(char)0x52,
+				(char)(vtblIndex*PTR_SIZE)
+			);
+		}
+		else{
+			compiler.codeGenerator.PutOld(
+				(char)0xFF,
+				(char)0x92
+			);
+			compiler.codeGenerator.PutOld( (long)(vtblIndex*PTR_SIZE), Schedule::None );
+		}
+	}
+	else{
+		//通常呼び出し
+
+		if( pUserProc->GetParentClassPtr() && isStatic == false )
+		{
+			//push ecx
+			compiler.codeGenerator.op_push(REG_ECX);
+		}
+
+		//call ProcAddr
+		compiler.codeGenerator.op_call(pUserProc);
+	}
+
+	if(pUserProc->IsCdecl()){
+		//add esp,ParmSize
+		compiler.codeGenerator.op_add_esp(ParmSize);
+	}
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+bool Opcode_CallDllProc( const char *lpszParms, const DllProc *pDllProc )
+{
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc==0 && pDllProc->IsEqualSymbol( LexicalAnalyzer::FullNameToSymbol( "DebugBreak" ) ) )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	////////////////////////
+	// パラメータのセット
+	////////////////////////
+
+	//パラメータオブジェクトを生成
+	ParamImpl *pobj_parameter=0;
+	pobj_parameter=new ParamImpl(lpszParms);
+
+	// デフォルト引数を適用
+	pobj_parameter->ApplyDefaultParameters( pDllProc->Params() );
+
+	//エラーチェック
+	if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
+		//パラメータにエラーがあるときは処理を終える
+		return false;
+	}
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
+
+	//レジスタ、スタックフレームにセット
+	int ParmSize = pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
+
+
+	//動的リンクされたプロシージャの呼び出し
+
+	//call dword ptr[LookupTable]
+	compiler.codeGenerator.op_call( pDllProc );
+
+	if(pDllProc->IsCdecl()){
+		//add esp,ParmSize
+		compiler.codeGenerator.op_add_esp(ParmSize);
+	}
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+
+	return true;
+}
+
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params )
+{
+	extern BOOL bDebugSupportProc;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		Call_DebugSys_SaveContext();
+	}
+
+
+	///////////////////////////////////////////////////////////////
+	// _System_LocalThisのダミーをセット
+	///////////////////////////////////////////////////////////////
+
+	char temporary[VN_SIZE]={0};
+	bool isDynamicCall = false;
+	if( objPtrValueStr && objPtrValueStr[0] ){
+		//_System_LocalThis（第一パラメータ）のダミーを作成
+		lstrcpy(temporary,"0,");
+
+		isDynamicCall = true;
+	}
+	if( dg.ReturnType().IsStruct() ){
+		// ※ByRef _System_ReturnValue パラメータのダミーをセット
+		lstrcat(temporary,"0,");
+	}
+
+	if(params[0]=='\0'&&temporary[0])
+		temporary[lstrlen(temporary)-1]=0;
+	else lstrcat(temporary,params);
+
+
+	const Parameters *pParams = &dg.Params();
+	if( isDynamicCall )
+	{
+		pParams = &dg.GetDynamicParams();
+	}
+
+
+	ParamImpl *pobj_parameter = new ParamImpl( temporary );
+
+	//一時オブジェクトを生成
+	pobj_parameter->NewTempParameters( dg.GetName(), *pParams );
+
+	//レジスタ、スタックフレームにセット
+	int ParmSize = pobj_parameter->SetParameter( dg.GetName(), *pParams );
+
+
+	if( objPtrValueStr && objPtrValueStr[0] )
+	{
+		RELATIVE_VAR RelativeVar;
+		//Constアクセスが不可能なメソッドの場合
+		if( !GetVarOffsetReadWrite( objPtrValueStr, &RelativeVar, Type() ) ){
+			Jenga::Throw( "Opcode_CallDelegate関数内で呼ばれるGetVarOffsetReadWrite関数に失敗" );
+			return;
+		}
+
+		SetVarPtrToEax(&RelativeVar);
+
+		// 参照を実体ポインタにする
+		//mov ecx,dword ptr[eax]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+
+		//push ecx
+		compiler.codeGenerator.op_push(REG_ECX);
+	}
+
+
+	{
+		////////////////////////
+		// call
+		////////////////////////
+		RELATIVE_VAR RelativeVar;
+		GetVarOffsetReadOnly( methodPtrValueStr, &RelativeVar, Type() );
+		SetVarPtrToEax( &RelativeVar );
+
+		//mov eax,dword ptr[eax]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+
+		//call eax
+		compiler.codeGenerator.op_call_R( REG_EAX );
+	}
+
+
+	//一時オブジェクトを破棄
+	pobj_parameter->DeleteTempParameters();
+
+	//パラメータオブジェクトを破棄
+	delete pobj_parameter;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Func.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Func.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Func.cpp	(revision 774)
@@ -0,0 +1,844 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+#include "FunctionValue.h"
+
+void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn );
+
+int GetFunctionFromName(char *FuncName){
+	if( lstrcmpi( FuncName, "CUDbl" ) == 0 )			return FUNC_CUDBL;
+	if( lstrcmpi( FuncName, "Fix" ) == 0 )				return FUNC_FIX;
+	if( lstrcmpi( FuncName, "Len" ) == 0 )				return FUNC_LEN;
+	if( lstrcmpi( FuncName, "AddressOf" ) == 0 )		return FUNC_ADDRESSOF;
+	if( lstrcmpi( FuncName, "SizeOf" ) == 0 )			return FUNC_SIZEOF;
+	if( lstrcmpi( FuncName, "__ClassSizeOf" ) == 0 )			return FUNC_CLASS_SIZEOF;
+	if( lstrcmpi( FuncName, "VarPtr" ) == 0 )			return FUNC_VARPTR;
+	if( lstrcmpi( FuncName, "ObjPtr" ) == 0 )			return FUNC_OBJPTR;
+	if( lstrcmpi( FuncName, "__delegate_dynamicmethod_call" ) == 0 )	return FUNC_DELEGATE_DYNAMICMETHOD_CALL;
+	if( lstrcmpi( FuncName, "__delegate_staticmethod_call" ) == 0 )		return FUNC_DELEGATE_STATICMETHOD_CALL;
+	if( lstrcmpi( FuncName, "_System_GetNowScopeCatchAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS;
+	if( lstrcmpi( FuncName, "_System_GetNowScopeFinallyAddresses" ) == 0 )return FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS;
+	if( lstrcmpi( FuncName, "_System_GetBp" ) == 0 )	return FUNC_SYSTEM_GET_BP;
+	if( lstrcmpi( FuncName, "_System_GetSp" ) == 0 )	return FUNC_SYSTEM_GET_SP;
+	if( lstrcmp( FuncName, "_System_GetComVtbl" ) == 0 )		return FUNC_SYSTEM_GET_COM_VTBL;
+	if( lstrcmp( FuncName, "_System_GetVtblList" ) == 0 )		return FUNC_SYSTEM_GET_VTBL_LIST;
+	if( lstrcmp( FuncName, "_System_GetDefaultConstructor" ) == 0 )	return FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR;
+	if( lstrcmp( FuncName, "_System_GetDestructor" ) == 0 )			return FUNC_SYSTEM_GET_DESTRUCTOR;
+	if( lstrcmpi( FuncName, "GetDouble" ) == 0 )		return FUNC_GETDOUBLE;
+	if( lstrcmpi( FuncName, "GetSingle" ) == 0 )		return FUNC_GETSINGLE;
+	if( lstrcmpi( FuncName, "GetQWord" ) == 0 )			return FUNC_GETQWORD;
+	if( lstrcmpi( FuncName, "GetDWord" ) == 0 )			return FUNC_GETDWORD;
+	if( lstrcmpi( FuncName, "GetWord" ) == 0 )			return FUNC_GETWORD;
+	if( lstrcmpi( FuncName, "GetByte" ) == 0 )			return FUNC_GETBYTE;
+	return 0;
+}
+
+void Opcode_Func_Fix(const char *lpszParms){
+	Type resultType;
+	if( !NumOpe( lpszParms, Type(), resultType ) ){
+		return;
+	}
+
+	if( resultType.IsDouble() ){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//fnstcw word ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x3C,
+			(char)0x24
+		);
+
+		//mov ax,word ptr[esp]
+		compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		//or ah,0Ch
+		compiler.codeGenerator.PutOld(
+			(char)0x80,
+			(char)0xCC,
+			(char)0x0C
+		);
+
+		//mov word ptr[esp-2],ax
+		compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EAX, REG_ESP, -2, MOD_BASE_DISP8 );
+
+		//fldcw word ptr[esp-2]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x6C,
+			(char)0x24,
+			(char)0xFE
+		);
+
+		//fistp dword ptr[esp+4]
+		compiler.codeGenerator.PutOld(
+			(char)0xDB,
+			(char)0x5C,
+			(char)0x24,
+			(char)0x04
+		);
+
+		//fldcw word ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x2C,
+			(char)0x24
+		);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if( resultType.IsSingle() ){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fnstcw word ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x3C,
+			(char)0x24
+		);
+
+		//mov ax,word ptr[esp]
+		compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		//or ah,0Ch
+		compiler.codeGenerator.PutOld(
+			(char)0x80,
+			(char)0xCC,
+			(char)0x0C
+		);
+
+		//mov word ptr[esp-2],ax
+		compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EAX, REG_ESP, -2, MOD_BASE_DISP8 );
+
+		//fldcw word ptr[esp-2]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x6C,
+			(char)0x24,
+			(char)0xFE
+		);
+
+		//fistp dword ptr[esp+4]
+		compiler.codeGenerator.PutOld(
+			(char)0xDB,
+			(char)0x5C,
+			(char)0x24,
+			(char)0x04
+		);
+
+		//fldcw word ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xD9,
+			(char)0x2C,
+			(char)0x24
+		);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if( resultType.Is64() ){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+}
+
+void Opcode_Func_CUDbl(const char *Parameter){
+	Type resultType;
+	if( !NumOpe(Parameter,Type(),resultType) ){
+		return;
+	}
+	ChangeTypeToLong(resultType.GetBasicType());
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//push 0
+	compiler.codeGenerator.op_push_V( 0 );
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+	//fild qword ptr[esp]
+	compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+	//add esp,8
+	compiler.codeGenerator.op_add_esp(8);
+}
+void Opcode_Func_Len(const char *Parameter){
+	BOOL bArrayHead;
+
+	const char *tempParm=Parameter;
+	char temporary[VN_SIZE];
+	char temp2[32];
+	Type type;
+	if( !GetVarType(Parameter,type,0) ){
+		sprintf(temporary,"_System_DummyStr2=%s",Parameter);
+		OpcodeCalc(temporary);
+
+		lstrcpy(temp2,"_System_DummyStr2");
+		tempParm=temp2;
+
+		type.SetType( DEF_OBJECT, compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() );
+	}
+
+	if( type.IsStringClass() ){
+		//Stringオブジェクトの場合
+		sprintf(temporary,"%s.Length",tempParm);
+
+		int reg=REG_RAX;
+		NumOpe(temporary,Type(),Type());
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		return;
+	}
+
+	Subscripts subscripts;
+	RELATIVE_VAR RelativeVar;
+	if(!GetVarOffsetReadOnly(tempParm,&RelativeVar,type,&subscripts)) return;
+
+	if(type.GetBasicType()&FLAG_PTR){
+		type.SetBasicType( type.GetBasicType() & ( ~FLAG_PTR ) );
+
+		bArrayHead=1;
+	}
+	else bArrayHead=0;
+
+	int typeSize = type.GetSize();
+
+	if(bArrayHead) typeSize*=JumpSubScripts(subscripts);
+
+	//mov eax,typeSize
+	compiler.codeGenerator.op_mov_RV( REG_EAX, typeSize );
+}
+
+void _Opcode_Func_AddressOf( const char *methodInstanceName, const UserProc &userProc )
+{
+	if( userProc.IsVirtual() ){
+		///////////////////////////////
+		// 仮想関数の場合
+		// thisポインタをrcxにコピー
+		///////////////////////////////
+
+		const CClass *pobj_c;
+
+		char ObjectName[VN_SIZE];
+		ReferenceKind referenceKind;
+		SplitObjectName( methodInstanceName, ObjectName, referenceKind );
+
+		if(ObjectName[0]){
+			if(lstrcmpi(ObjectName,"Super")==0) goto InClassMember;
+			else{
+				RELATIVE_VAR RelativeVar;
+				Type type;
+				if(!GetVarOffsetReadOnly(ObjectName,&RelativeVar,type)) return;
+				SetVarPtrToEax(&RelativeVar);
+
+				//mov ecx,eax
+				compiler.codeGenerator.op_mov_RR(REG_ECX,REG_EAX);
+
+				//参照タイプが整合しているかをチェック
+				if( !( type.IsObject() && referenceKind == RefDot
+					|| type.IsObjectPtr() && referenceKind == RefPointer ) )
+				{
+					compiler.errorMessenger.Output(104,ObjectName,cp);
+				}
+
+				if(type.IsObjectPtr()){
+					//mov ecx,dword ptr[ecx]
+					compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ECX,0,MOD_BASE);
+				}
+			}
+		}
+		else{
+InClassMember:
+			//自身のオブジェクトのThisポインタをrcxにコピー
+			SetThisPtrToReg(REG_RCX);
+
+			pobj_c = &compiler.GetCompilingClass();
+		}
+
+
+		int vtblIndex;
+		if( pobj_c->IsInterface() )
+		{
+			// インターフェイスメソッド呼び出し
+
+			int offset_vtbl = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__vtbl" );
+
+
+			// vtblのポインタを取得
+			//mov edx,dword ptr[ecx+offset_vtbl]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, offset_vtbl, MOD_BASE_DISP8 );
+
+			int offset_this = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr()->GetMemberOffset( "__this" );
+
+
+
+			// インターフェイスの場合は更に__thisを取得する
+			//mov rcx,qword ptr[rcx+offset_this]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, offset_this, MOD_BASE_DISP8 );
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+			if( vtblMasterListIndex != 0 )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+		}
+		else if( pobj_c->IsComInterface() )
+		{
+			// COMインターフェイス メソッド呼び出し
+
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl1 -> func1
+			//               -> func2
+			//               -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblのポインタを取得
+			//mov edx,dword ptr[ecx]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, 0, MOD_BASE );
+		}
+		else
+		{
+			//仮想関数（オブジェクトメソッド）呼び出し
+			// pObj -> vtbl_master_list -> vtbl1 -> func1
+			//                                   -> func2
+			//                                   -> func3
+			//                          -> vtbl2 -> func1
+			//                                   -> func2
+			//                                   -> func3
+
+			int vtblMasterListIndex;
+			pobj_c->GetVtblMasterListIndexAndVtblIndex( &userProc, vtblMasterListIndex, vtblIndex );
+
+			// vtblマスターリストのポインタを取得
+			//mov edx,dword ptr[ecx+sizeof(com_vtbl)]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_ECX, PTR_SIZE, MOD_BASE_DISP8 );
+			
+			// vtblのポインタを取得
+			//mov edx,dword ptr[edx+vtblMasterListIndex]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EDX, vtblMasterListIndex*PTR_SIZE, MOD_BASE_DISP32 );
+		}
+
+		//mov eax,dword ptr[edx+func_index]
+		if( vtblIndex * PTR_SIZE <= 0x7F )
+		{
+			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,vtblIndex*PTR_SIZE,MOD_BASE_DISP8);
+		}
+		else{
+			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_EDX,vtblIndex*PTR_SIZE,MOD_BASE_DISP32);
+		}
+	}
+	else{
+		//一般の関数
+
+		//mov eax,ProcAddr
+		compiler.codeGenerator.op_addressof( REG_EAX, &userProc );
+	}
+
+	userProc.Using();
+}
+void Opcode_CreateDelegate( const CClass &dgClass, const char *methodInstanceName, const UserProc &userProc )
+{
+	/////////////////////////////////////////////////////////////////
+	// 関数ポインタをpush
+	/////////////////////////////////////////////////////////////////
+
+	//push AddressOf(userProc)
+	_Opcode_Func_AddressOf( methodInstanceName, userProc );
+	compiler.codeGenerator.op_push( REG_EAX );
+
+
+	if( userProc.HasParentClass() && userProc.GetMethod().IsDynamic() )
+	{
+		/////////////////////////////////////////////////////////////////
+		// オブジェクト ポインタをpush
+		/////////////////////////////////////////////////////////////////
+
+		// オブジェクト名を取得
+		char objectName[VN_SIZE];
+		char memberName[VN_SIZE];
+		char *thisPtrName = "This";
+		Type type;
+		if( SplitMemberName( methodInstanceName, objectName, memberName ) )
+		{
+			if( GetVarType( objectName, type, false ) )
+			{
+				thisPtrName = objectName;
+			}
+		}
+
+		// オブジェクト ポインタを取得
+		Opcode_Func_ObjPtr( thisPtrName, type, true );
+
+		//push eax
+		compiler.codeGenerator.op_push( REG_EAX );
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// call _CreateDynamicDelegate/_CreateStaticDelegate
+	/////////////////////////////////////////////////////////////////
+
+	std::vector<const UserProc *> subs;
+	if( userProc.HasParentClass() && userProc.GetMethod().IsDynamic() )
+	{
+		dgClass.GetStaticMethods().Enum( "_CreateDynamicDelegate", subs );
+	}
+	else
+	{
+		dgClass.GetStaticMethods().Enum( "_CreateStaticDelegate", subs );
+	}
+
+	// call _CreateDynamicDelegate
+	compiler.codeGenerator.op_call( subs[0] );
+}
+void Opcode_Func_AddressOf( const char *name, const Type &baseType, bool isCallOn, Type &resultType )
+{
+	extern int cp;
+
+	const Parameters *pBaseParams = NULL;
+	const Type *pBaseReturnType = NULL;
+	if( baseType.IsProcPtr() )
+	{
+		// 左辺で関数ポインタを要求されているとき
+		const ProcPointer *pTempProcPointer = compiler.GetObjectModule().meta.GetProcPointers()[baseType.GetIndex()];
+		pBaseParams = &pTempProcPointer->Params();
+		pBaseReturnType = &pTempProcPointer->ReturnType();
+	}
+	else if( baseType.IsDelegate() )
+	{
+		// 左辺でデリゲートを要求されているとき
+		const Delegate *pTempDelegate = &compiler.GetObjectModule().meta.ToDelegate( baseType.GetClass() );
+		pBaseParams = &pTempDelegate->Params();
+		pBaseReturnType = &pTempDelegate->ReturnType();
+	}
+
+	const UserProc *pUserProc;
+	if( pBaseParams && pBaseReturnType )
+	{
+		//左辺の型にのっとり、オーバーロードを解決
+
+		std::vector<const UserProc *> subs;
+		GetOverloadSubHash( name, subs );
+		if( subs.size() == 0 ){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+
+		//オーバーロードを解決
+		pUserProc=OverloadSolution( name, subs, *pBaseParams, Type(), Type() );
+
+		if( isCallOn )
+		{
+			// コード生成を伴う場合はエラーチェックを行う
+
+			if( baseType.IsDelegate() )
+			{
+				// デリゲート
+				// 共変戻り値、反変引数をサポート
+				if( !(
+					pBaseParams->Equals( pUserProc->Params(), true )
+					&& ( pBaseReturnType->Equals( pUserProc->ReturnType() ) || pBaseReturnType->IsCovariant( pUserProc->ReturnType() ) )
+					) )
+				{
+					compiler.errorMessenger.Output(67, name, cp );
+				}
+			}
+			else
+			{
+				// 関数ポインタ
+				if( !(
+					pBaseParams->Equals( pUserProc->Params() )
+					&& pBaseReturnType->Equals( pUserProc->ReturnType() )
+					) )
+				{
+					compiler.errorMessenger.Output(66, name, cp );
+				}
+			}
+		}
+
+		if(!pUserProc){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+	}
+	else{
+		pUserProc=GetSubHash(name);
+		if(!pUserProc){
+			compiler.errorMessenger.Output(27,name,cp);
+			return;
+		}
+	}
+
+	if( baseType.IsDelegate() )
+	{
+		if( isCallOn )
+		{
+			// デリゲートのとき
+			Opcode_CreateDelegate( baseType.GetClass(), name, *pUserProc );
+		}
+		resultType = baseType;
+	}
+	else
+	{
+		if( isCallOn )
+		{
+			// 関数ポインタのとき
+			_Opcode_Func_AddressOf( name, *pUserProc );
+		}
+		resultType.SetBasicType( DEF_PTR_VOID );
+	}
+}
+void Opcode_Func_SizeOf( const std::string &typeName )
+{
+	Type tempType;
+	if( !compiler.StringToType( typeName, tempType ) ){
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return;
+	}
+
+	//mov eax,size
+	compiler.codeGenerator.op_mov_RV( REG_EAX, compiler.SizeOf( tempType ) );
+}
+void Opcode_Func_ClassSizeOf( const std::string &typeName )
+{
+	Type tempType;
+	if( !compiler.StringToType( typeName, tempType ) ){
+		compiler.errorMessenger.Output(3,typeName,cp);
+		return;
+	}
+
+	if( !tempType.IsObject() )
+	{
+		compiler.errorMessenger.Output(1,typeName,cp);
+		return;
+	}
+
+	//mov eax,size
+	compiler.codeGenerator.op_mov_RV( REG_EAX, tempType.GetClass().GetSize() );
+}
+void Opcode_Func_VarPtr( const char *Parameter, Type &resultType, bool isCallOn )
+{
+	if( isCallOn == false )
+	{
+		// 戻り値の型を取得するだけ
+
+		//変数のアドレスを取得
+		if(!GetVarType( Parameter, resultType, true )) return;
+
+		resultType.PtrLevelUp();
+
+		return;
+	}
+
+	if( lstrcmpi( Parameter, "This" )==0 )
+	{
+		compiler.errorMessenger.Output( 144, "", cp );
+	}
+
+	RELATIVE_VAR RelativeVar;
+
+	//変数のアドレスを取得
+	if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
+
+	int beforeType = resultType.GetBasicType();
+
+	resultType.PtrLevelUp();
+
+	SetVarPtrToEax(&RelativeVar);
+}
+void Opcode_Func_ObjPtr( const char *Parameter, Type &resultType, bool isCallOn ){
+	if( isCallOn == false ){
+		// 戻り値の型を取得するだけ
+
+		//変数のアドレスを取得
+		if(!GetVarType( Parameter, resultType, true )) return;
+
+		resultType.PtrLevelUp();
+
+		return;
+	}
+
+	RELATIVE_VAR RelativeVar;
+
+	//変数のアドレスを取得
+	if(!GetVarOffsetReadOnly( Parameter, &RelativeVar, resultType )) return;
+
+	int beforeType = resultType.GetBasicType();
+
+	resultType.PtrLevelUp();
+
+	SetVarPtrToEax(&RelativeVar);
+
+	if( lstrcmpi( Parameter, "This" )==0 ){
+		// Thisの場合は特別にオブジェクトポインタが返ってくるので、何もせずに抜ける
+	}
+	else if( beforeType == DEF_OBJECT ){
+		//参照をオブジェクトポインタに変更
+
+		//mov eax,dword ptr[eax]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+	}
+	else{
+		compiler.errorMessenger.Output(134,NULL,cp );
+	}
+}
+
+void Opcode_Func_delegate_call( const char *paramsStr, Type &resultType, bool isDynamicCall, bool isCallOn )
+{
+	if( isCallOn )
+	{
+		int i = 0;
+		char methodPtrParamStr[VN_SIZE];
+		i = GetOneParameter( paramsStr, i, methodPtrParamStr );
+
+		char objPtrValueStr[VN_SIZE]="";
+		if( isDynamicCall )
+		{
+			i = GetOneParameter( paramsStr, i, objPtrValueStr );
+		}
+
+		Opcode_CallDelegate( compiler.GetObjectModule().meta.ToDelegate( compiler.GetCompilingClass() ), methodPtrParamStr, objPtrValueStr, paramsStr + i );
+	}
+
+	resultType = compiler.GetCompilingUserProc().ReturnType();
+}
+void Opcode_Func_System_Get_Bp()
+{
+	//mov eax,ebp
+	compiler.codeGenerator.op_mov_RR(REG_EAX,REG_EBP);
+}
+void Opcode_Func_System_Get_Sp()
+{
+	//mov eax,esp
+	compiler.codeGenerator.op_mov_RR(REG_EAX,REG_ESP);
+}
+
+void Opcode_Func_System_GetComVtbl( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	// mov eax,com_vtbl
+	compiler.codeGenerator.op_mov_RV_com_vtbl( REG_EAX, &classType.GetClass() );
+}
+void Opcode_Func_System_GetVtblList( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	// mov eax,com_vtbl
+	compiler.codeGenerator.op_mov_RV_vtbl( REG_EAX, &classType.GetClass() );
+}
+void Opcode_Func_System_GetDefaultConstructor( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	if( classType.GetClass().GetConstructorMethod() )
+	{
+		//mov eax,ProcAddr
+		compiler.codeGenerator.op_addressof( REG_EAX, &classType.GetClass().GetConstructorMethod()->GetUserProc() );
+	}
+	else
+	{
+		// デフォルトコンストラクタを持たない
+
+		//xor eax,eax
+		compiler.codeGenerator.op_zero_reg( REG_EAX );
+	}
+}
+void Opcode_Func_System_GetDestructor( const char *parameter )
+{
+	Type classType;
+	compiler.StringToType( parameter, classType );
+
+	//mov eax,ProcAddr
+	compiler.codeGenerator.op_addressof( REG_EAX, &classType.GetClass().GetDestructorMethod()->GetUserProc() );
+}
+
+void Opcode_Func_GetPtrData(const char *Parameter,const int type){
+	Type tempType;
+	if( !NumOpe(Parameter,Type(),tempType) ){
+		return;
+	}
+	if(!tempType.IsWhole()){
+		compiler.errorMessenger.Output(11,Parameter,cp);
+		return;
+	}
+	ChangeTypeToLong(tempType.GetBasicType());
+
+	if(type==DEF_DOUBLE){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//fld qword ptr[eax]
+		compiler.codeGenerator.PutOld(
+			(char)0xDD,
+			(char)0x00
+		);
+	}
+	else if(type==DEF_SINGLE||type==DEF_DWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov eax,dword ptr[eax]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+	}
+	else if(type==DEF_QWORD){
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+
+		//mov eax,dword ptr[ecx]
+		compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EAX,REG_ECX,0,MOD_BASE);
+
+		//mov edx,dword ptr[ecx+sizeof(long)]
+		compiler.codeGenerator.op_mov_RM(sizeof(long),REG_EDX,REG_ECX,sizeof(long),MOD_BASE_DISP8);
+	}
+	else if(type==DEF_WORD){
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//xor eax,eax
+		compiler.codeGenerator.op_xor_RR(REG_EAX);
+
+		//mov ax,word ptr[ebx]
+		compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBX, 0, MOD_BASE );
+	}
+	else if(type==DEF_BYTE){
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//xor eax,eax
+		compiler.codeGenerator.op_xor_RR(REG_EAX);
+
+		//mov al,byte ptr[ebx]
+		compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBX, 0, MOD_BASE );
+	}
+}
+
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn )
+{
+	switch(FuncNum){
+		case FUNC_FIX:
+			if( isCallOn ) Opcode_Func_Fix(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_CUDBL:
+			if( isCallOn ) Opcode_Func_CUDbl(Parameter);
+			resultType.SetBasicType( DEF_DOUBLE );
+			break;
+		case FUNC_LEN:
+			if( isCallOn ) Opcode_Func_Len(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_ADDRESSOF:
+			Opcode_Func_AddressOf( Parameter, baseType, isCallOn, resultType );
+			break;
+		case FUNC_SIZEOF:
+			if( isCallOn ) Opcode_Func_SizeOf(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_CLASS_SIZEOF:
+			if( isCallOn ) Opcode_Func_ClassSizeOf(Parameter);
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_VARPTR:
+			Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
+			break;
+		case FUNC_OBJPTR:
+			Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
+			break;
+		case FUNC_DELEGATE_DYNAMICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, true, isCallOn );
+			break;
+		case FUNC_DELEGATE_STATICMETHOD_CALL:
+			Opcode_Func_delegate_call( Parameter, resultType, false, isCallOn );
+			break;
+		case FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS:
+			if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeCatchAddress();
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS:
+			if( isCallOn ) Exception::Opcode_Func_System_GetNowScopeFinallyAddress();
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_BP:
+			if( isCallOn ) Opcode_Func_System_Get_Bp();
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_SYSTEM_GET_SP:
+			if( isCallOn ) Opcode_Func_System_Get_Sp();
+			resultType.SetBasicType( DEF_LONG );
+			break;
+		case FUNC_SYSTEM_GET_COM_VTBL:
+			if( isCallOn ) Opcode_Func_System_GetComVtbl( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_VTBL_LIST:
+			if( isCallOn ) Opcode_Func_System_GetVtblList( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR:
+			if( isCallOn ) Opcode_Func_System_GetDefaultConstructor( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+		case FUNC_SYSTEM_GET_DESTRUCTOR:
+			if( isCallOn ) Opcode_Func_System_GetDestructor( Parameter );
+			resultType.SetBasicType( DEF_PTR_VOID );
+			break;
+
+		case FUNC_GETDOUBLE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DOUBLE);
+			resultType.SetBasicType( DEF_DOUBLE );
+			break;
+		case FUNC_GETSINGLE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_SINGLE);
+			resultType.SetBasicType( DEF_SINGLE );
+			break;
+		case FUNC_GETQWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_QWORD);
+			resultType.SetBasicType( DEF_QWORD );
+			break;
+		case FUNC_GETDWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_DWORD);
+			resultType.SetBasicType( DEF_DWORD );
+			break;
+		case FUNC_GETWORD:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_WORD);
+			resultType.SetBasicType( DEF_WORD );
+			break;
+		case FUNC_GETBYTE:
+			if( isCallOn ) Opcode_Func_GetPtrData(Parameter,DEF_BYTE);
+			resultType.SetBasicType( DEF_BYTE );
+			break;
+		default:
+			return false;
+	}
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Object.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Object.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Object.cpp	(revision 774)
@@ -0,0 +1,389 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "opcode.h"
+
+void _call_constructor( const CClass *pobj_c, const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+	////////////////////////////
+	// コンストラクタの呼び出し
+	////////////////////////////
+	
+	//この関数を使用する場合は、
+	//・ebxにオブジェクトの個数
+	//・eaxに先頭ポインタ
+	//をセットしておかなければならない
+
+
+/*	//jnzのジャンプ先番地
+	extern int obp;
+	int jnz_back = obp;*/
+
+	if(bSomeObjects){
+		compiler.errorMessenger.OutputFatalError();
+
+		//push ebx
+		//compiler.codeGenerator.op_push(REG_EBX);
+	}
+
+	// ※ここでプッシュされた値はコンストラクタのthisポインタとなる
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+
+
+	////////////////////////
+	// オーバーロードを解決
+	////////////////////////
+
+	std::vector<const UserProc *> subs;
+	pobj_c->GetDynamicMethods().Enum( pobj_c->GetName().c_str(), subs );
+
+	const UserProc *pUserProc;
+	if( subs.size() > 0 ){
+		//オーバーロードを解決
+		pUserProc=OverloadSolutionWithStrParam(pobj_c->GetName().c_str(),
+			subs,CreateParameter,"");
+
+		if(!pUserProc) return;
+	}
+
+	{
+		// 動的型情報をセットする
+		// obj._System_SetType( _System_TypeBase_Search( fullName ) )
+		subs.clear();
+		pobj_c->GetDynamicMethods().Enum( "_System_SetType", subs );
+		if( subs.size() == 1 ){
+			char temporary[VN_SIZE];
+			sprintf( temporary, "_System_TypeBase_Search(\"%s\"))", pobj_c->GetFullName().c_str() );
+
+			Opcode_CallProc(temporary,
+				subs[0],
+				PROCFLAG_NEW,"");
+		}
+		else{
+			compiler.errorMessenger.OutputFatalError();
+		}
+
+		// インターフェイスを初期化する
+		// TODO: 実装
+	}
+
+	//コンストラクタを呼び出す
+	Opcode_CallProc(CreateParameter,
+		pUserProc,
+		PROCFLAG_NEW | PROCFLAG_PERMIT_CONSTRUCTOR,"");
+
+
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	if(bSomeObjects){
+		/*
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//add eax,TypeSize
+		compiler.codeGenerator.op_add_RV( REG_EAX, ObjectSize );
+
+		//sub ebx,1
+		compiler.codeGenerator.op_sub_RV8(REG_EBX,1);
+
+		//jne ↑
+		compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
+		*/
+	}
+}
+void Operator_New( const CClass &objClass, const char *objectSizeStr, const char *parameter, const Type &baseType )
+{
+	const CClass *pClass = &objClass;
+
+	if( pClass->IsInterface() )
+	{
+		pClass = compiler.GetObjectModule().meta.GetClasses().GetInterfaceInfoClassPtr();
+	}
+
+	int typeSize = pClass->GetSize();
+
+	if(pClass->IsAbstract())
+	{
+		std::string tempMessage;
+		foreach( const CMethod *pMethod, pClass->GetDynamicMethods() ){
+			if(pMethod->IsVirtual()){
+				if(pMethod->IsAbstract()){
+					if( !tempMessage.empty() )
+					{
+						tempMessage += ", ";
+					}
+					tempMessage += pMethod->GetUserProc().GetName();
+				}
+			}
+		}
+
+		// インターフェイスのvtbl
+		foreach( const ::Interface *pInterface, pClass->GetInterfaces() )
+		{
+			foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() ){
+				if(pMethod->IsVirtual()){
+					if(pMethod->IsAbstract()){
+						if( !tempMessage.empty() )
+						{
+							tempMessage += ", ";
+						}
+						tempMessage += pMethod->GetUserProc().GetName();
+					}
+				}
+			}
+		}
+
+		//抽象クラスだったとき
+		compiler.errorMessenger.Output(-1,"\"%s\" は抽象クラスです。インスタンス化することはできません（抽象メソッド … " + tempMessage + "）。",cp);
+	}
+
+	BOOL bSomeObjects=0;
+	if(objectSizeStr[0]){
+		bSomeObjects=1;
+
+		Type tempType;
+		NumOpe(objectSizeStr,Type(),tempType);
+		if( !tempType.IsWhole() ) compiler.errorMessenger.Output(49,NULL,cp);
+		ChangeTypeToLong(tempType.GetBasicType());
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//※添え字上限値であることを考慮
+		//inc eax
+		compiler.codeGenerator.op_inc( REG_EAX );
+
+		//オブジェクトの個数をebxに一時保持
+		//※ebxは関数が呼ばれても不変
+		//mov ebx,eax
+		compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+		//imul eax,size
+		compiler.codeGenerator.op_imul_RV( REG_EAX, typeSize );
+
+		//add eax,OBJECT_HEAD_SIZE
+		compiler.codeGenerator.op_add_RV8( REG_EAX, (char)OBJECT_HEAD_SIZE );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		//オブジェクトの個数をebxに一時保持
+		//※ebxは関数が呼ばれても不変
+		//mov ebx,1
+		compiler.codeGenerator.op_mov_RV( REG_EBX, 1 );
+
+		//push size + OBJECT_HEAD_SIZE
+		compiler.codeGenerator.op_push_V( typeSize + OBJECT_HEAD_SIZE );
+	}
+
+	if( baseType.IsObject() ){
+		// オブジェクト インスタンス
+		// ※DeleteはGCで処理
+
+		//call _System_GC_malloc_ForObject
+		extern const UserProc *pSub_System_GC_malloc_ForObject;
+		compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObject);
+	}
+	else{
+		// オブジェクトポインタ
+		// ※明示的なDeleteが必要
+
+		//call _System_GC_malloc_ForObjectPtr
+		extern const UserProc *pSub_System_GC_malloc_ForObjectPtr;
+		compiler.codeGenerator.op_call(pSub_System_GC_malloc_ForObjectPtr);
+	}
+
+
+	/*
+	確保されたヒープ領域のポインタ（callocの戻り値eax）をpPtrとすると、
+	pPtr[0]=オブジェクトの個数
+	pPtr[1]=オブジェクトのサイズ
+	pPtr[2]=デストラクタの関数ポインタ
+	pPtr[3]=reserve
+	*/
+
+
+	//mov dword ptr[eax],ebx（オブジェクトの個数）
+	compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+	//mov ecx,TypeSize
+	compiler.codeGenerator.op_mov_RV( REG_ECX, typeSize );
+
+	//mov dword ptr[eax],ecx（オブジェクトのサイズ）
+	compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	const CMethod *method = pClass->GetDestructorMethod();
+	if( method == NULL ) return;
+
+	//mov ecx,DestructorProcAddr
+	compiler.codeGenerator.op_addressof( REG_ECX, &method->GetUserProc() );
+
+	//mov dword ptr[eax],ecx（デストラクタの関数ポインタ）
+	compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	// リザーブ領域
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	//仮想関数テーブルを初期化
+	if( pClass->IsExistVirtualFunctions()
+		&& !pClass->IsAbstract() )
+	{
+		// mov ecx,com_vtbl
+		compiler.codeGenerator.op_mov_RV_com_vtbl( REG_ECX, pClass );
+
+		//mov dword ptr[eax],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+
+		// mov rcx,vtblAddress
+		compiler.codeGenerator.op_mov_RV_vtbl( REG_ECX, pClass );
+
+		//mov qword ptr[rax+sizeof(com_vtbl)],rcx
+		compiler.codeGenerator.op_mov_MR(sizeof(long),REG_ECX,REG_EAX,PTR_SIZE,MOD_BASE_DISP8);
+
+		// 仮想関数になるメソッドに使用チェックをつける
+		foreach( const CMethod *pMethod, pClass->GetDynamicMethods() )
+		{
+			if( pMethod->IsVirtual() )
+			{
+				pMethod->GetUserProc().Using();
+			}
+		}
+		foreach( const ::Interface *pInterface, pClass->GetInterfaces() )
+		{
+			foreach( const CMethod *pMethod, pInterface->GetDynamicMethods() )
+			{
+				if( pMethod->IsVirtual() )
+				{
+					pMethod->GetUserProc().Using();
+				}
+			}
+		}
+	}
+
+
+	// ※ここでプッシュされた値はNew演算子の戻り値となる
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+
+	/////////////////////////////////////////////////////////////////////
+
+	////////////////////////////
+	// コンストラクタの呼び出し
+	////////////////////////////
+
+	_call_constructor(pClass,parameter,typeSize,bSomeObjects);
+}
+void OpcodeDelete(const char *Parameter, bool isSweeping){
+	Type tempType;
+	if( !NumOpe(Parameter,Type(),tempType) ){
+		return;
+	}
+	if(!( tempType.IsObjectPtr() || tempType.IsVoidPtr() )) compiler.errorMessenger.Output(122,NULL,cp);
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//sub eax,sizeof(DWORD)*3
+	compiler.codeGenerator.op_sub_RV8( REG_EAX, OBJECT_HEAD_SIZE );
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+
+
+	//mov ebx,dword ptr[eax]（オブジェクトの個数）
+	compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	//mov esi,dword ptr[eax]（オブジェクトのサイズ）
+	compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ESI, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	//mov edx,dword ptr[eax]（デストラクタの関数ポインタ）
+	compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EAX, 0, MOD_BASE );
+
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	// リザーブ領域
+	//add eax,sizeof(long)
+	compiler.codeGenerator.op_add_RV8( REG_EAX, sizeof(long) );
+
+
+	//mov ecx,eax
+	compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
+
+
+	//jnzの番地
+	/*extern int obp;
+	int jnz_back = obp;*/
+
+	//push ecx
+	compiler.codeGenerator.op_push(REG_ECX);
+
+	//push edx
+	compiler.codeGenerator.op_push(REG_EDX);
+
+	//push ecx（Thisポインタ   ※隠れた第一パラメータ）
+	compiler.codeGenerator.op_push(REG_ECX);
+
+	//call edx
+	compiler.codeGenerator.op_call_R( REG_EDX );
+
+	//pop edx
+	compiler.codeGenerator.op_pop(REG_EDX);
+
+	//pop ecx
+	compiler.codeGenerator.op_pop(REG_ECX);
+
+	//add ecx,esi
+	compiler.codeGenerator.op_add_RR( REG_ECX, REG_ESI );
+
+	//sub ebx,1
+	compiler.codeGenerator.op_sub_RV8(REG_EBX,1);
+
+	//jne ↑
+	//compiler.codeGenerator.op_jne( jnz_back-obp, sizeof(long), false, true );
+
+
+	//////////////////////////////////////////
+	// オブジェクトメンバ変数用のメモリを解放
+	//////////////////////////////////////////
+
+	if( isSweeping ){
+		//call _System_GC_free_for_SweepingDelete
+		extern const UserProc *pSub_System_GC_free_for_SweepingDelete;
+		compiler.codeGenerator.op_call(pSub_System_GC_free_for_SweepingDelete);
+	}
+	else{
+		//call free
+		extern const UserProc *pSub_free;
+		compiler.codeGenerator.op_call(pSub_free);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_ProcOp.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_ProcOp.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_ProcOp.cpp	(revision 774)
@@ -0,0 +1,763 @@
+#include "stdafx.h"
+
+#include "Opcode.h"
+
+
+void SystemProc( const UserProc &userProc ){
+	if( userProc.GetName() == "_System_GetEip" ){
+		//mov eax,dword ptr[esp]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_InitDllGlobalVariables" ){
+		////////////////////////////////////////
+		// DLLのグローバル領域をコンパイル
+		////////////////////////////////////////
+
+		if( !compiler.IsDll() ){
+			//ret
+			compiler.codeGenerator.op_ret();
+
+			return;
+		}
+
+		int BackCp;
+		BackCp=cp;
+		cp=-1;
+
+		if( compiler.IsDebug() )
+		{
+			//デバッグ用の変数を定義
+			DebugVariable();
+		}
+
+		//GC用の変数を定義
+		InitGCVariables();
+
+		//_System_StartupProgramの呼び出し
+		extern const UserProc *pSub_System_StartupProgram;
+		compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+
+		//クラスに属する静的メンバを定義
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_InitStaticMember(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+
+		GetGlobalDataForDll();
+
+		cp=BackCp;
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_InitStaticLocalVariables" ){
+		//静的ローカルオブジェクトのコンストラクタ呼び出し
+
+		foreach( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+			if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){
+				//コンストラクタ呼び出し
+				if( pVar->GetType().IsObject() ){
+
+					//エラー用
+					cp=pVar->source_code_address;
+
+					CallConstructor(
+						pVar->GetName().c_str(),
+						pVar->GetSubscripts(),
+						pVar->GetType(),
+						pVar->GetParamStrForConstructor().c_str());
+				}
+			}
+		}
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_System_Call_Destructor_of_GlobalObject" )
+	{
+		compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else if( userProc.GetName() == "_allrem" ){
+		//乗除演算用の特殊関数（64ビット整数対応）
+		BYTE Buffer_allrem[]={
+			0x53,0x57,0x33,0xFF,0x8B,0x44,0x24,0x10,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x0C,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x10,0x89,0x54,0x24,0x0C,0x8B,0x44,0x24,0x18,0x0B,0xC0,0x7D,0x13,0x8B,0x54,0x24,0x14,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x18,0x89,0x54,0x24,0x14,0x0B,0xC0,0x75,0x1B,0x8B,0x4C,0x24,0x14,0x8B,0x44,0x24,0x10,0x33,0xD2,0xF7,0xF1,0x8B,0x44,0x24,0x0C,0xF7,0xF1,0x8B,0xC2,0x33,0xD2,0x4F,0x79,0x4E,0xEB,0x53,0x8B,0xD8,0x8B,0x4C,0x24,0x14,0x8B,0x54,0x24,0x10,0x8B,0x44,0x24,0x0C,0xD1,0xEB,0xD1,0xD9,0xD1,0xEA,0xD1,0xD8,0x0B,0xDB,0x75,0xF4,0xF7,0xF1,0x8B,0xC8,0xF7,0x64,0x24,0x18,0x91,0xF7,0x64,0x24,0x14,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x10,0x77,0x08,0x72,0x0E,0x3B,0x44,0x24,0x0C,0x76,0x08,0x2B,0x44,0x24,0x14,0x1B,0x54,0x24,0x18,0x2B,0x44,0x24,0x0C,0x1B,0x54,0x24,0x10,0x4F,0x79,0x07,0xF7,0xDA,0xF7,0xD8,0x83,0xDA,0x00,0x5F,0x5B,0xC2,0x10,0x00
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_allrem, 178 ) );
+	}
+	else if( userProc.GetName() == "_aullrem" ){
+		//乗除演算用の特殊関数（64ビット整数対応）
+		BYTE Buffer_aullrem[]={
+			0x53,0x8B,0x44,0x24,0x14,0x0B,0xC0,0x75,0x18,0x8B,0x4C,0x24,0x10,0x8B,
+			0x44,0x24,0x0C,0x33,0xD2,0xF7,0xF1,0x8B,0x44,0x24,0x08,0xF7,0xF1,0x8B,
+			0xC2,0x33,0xD2,0xEB,0x50,0x8B,0xC8,0x8B,0x5C,0x24,0x10,0x8B,0x54,0x24,
+			0x0C,0x8B,0x44,0x24,0x08,0xD1,0xE9,0xD1,0xDB,0xD1,0xEA,0xD1,0xD8,0x0B,
+			0xC9,0x75,0xF4,0xF7,0xF3,0x8B,0xC8,0xF7,0x64,0x24,0x14,0x91,0xF7,0x64,
+			0x24,0x10,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x0C,0x77,0x08,0x72,0x0E,
+			0x3B,0x44,0x24,0x08,0x76,0x08,0x2B,0x44,0x24,0x10,0x1B,0x54,0x24,0x14,
+			0x2B,0x44,0x24,0x08,0x1B,0x54,0x24,0x0C,0xF7,0xDA,0xF7,0xD8,0x83,0xDA,
+			0x00,0x5B,0xC2,0x10,0x00
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_aullrem, 117 ) );
+	}
+	else if( userProc.GetName() == "_allmul" ){
+		//乗算用の特殊関数（64ビット整数対応）
+		BYTE Buffer_allmul[]={
+			0x8B,0x44,0x24,0x08,0x8B,0x4C,0x24,0x10,0x0B,0xC8,0x8B,0x4C,0x24,0x0C,0x75,0x09,0x8B,0x44,0x24,0x04,0xF7,0xE1,0xC2,0x10,0x00,0x53,0xF7,0xE1,0x8B,0xD8,0x8B,0x44,0x24,0x08,0xF7,0x64,0x24,0x14,0x03,0xD8,0x8B,0x44,0x24,0x08,0xF7,0xE1,0x03,0xD3,0x5B,0xC2,0x10,0x00
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_allmul, 52 ) );
+	}
+	else if( userProc.GetName() == "_alldiv" ){
+		//除算用の特殊関数（64ビット整数対応）
+		BYTE Buffer_alldiv[]={
+			0x57,0x56,0x53,0x33,0xFF,0x8B,0x44,0x24,0x14,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x10,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x14,0x89,0x54,0x24,0x10,0x8B,0x44,0x24,0x1C,0x0B,0xC0,0x7D,0x14,0x47,0x8B,0x54,0x24,0x18,0xF7,0xD8,0xF7,0xDA,0x83,0xD8,0x00,0x89,0x44,0x24,0x1C,0x89,0x54,0x24,0x18,0x0B,0xC0,0x75,0x18,0x8B,0x4C,0x24,0x18,0x8B,0x44,0x24,0x14,0x33,0xD2,0xF7,0xF1,0x8B,0xD8,0x8B,0x44,0x24,0x10,0xF7,0xF1,0x8B,0xD3,0xEB,0x41,0x8B,0xD8,0x8B,0x4C,0x24,0x18,0x8B,0x54,0x24,0x14,0x8B,0x44,0x24,0x10,0xD1,0xEB,0xD1,0xD9,0xD1,0xEA,0xD1,0xD8,0x0B,0xDB,0x75,0xF4,0xF7,0xF1,0x8B,0xF0,0xF7,0x64,0x24,0x1C,0x8B,0xC8,0x8B,0x44,0x24,0x18,0xF7,0xE6,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x14,0x77,0x08,0x72,0x07,0x3B,0x44,0x24,0x10,0x76,0x01,0x4E,0x33,0xD2,0x8B,0xC6,0x4F,0x75,0x07,0xF7,0xDA,0xF7,0xD8,0x83,0xDA,0x00,0x5B,0x5E,0x5F,0xC2,0x10,0x00
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_alldiv, 170 ) );
+	}
+	else if( userProc.GetName() == "_aulldiv" ){
+		//整数除算用の特殊関数（64ビット整数対応）
+		BYTE Buffer_aulldiv[]={
+			0x53,0x56,0x8B,0x44,0x24,0x18,0x0B,0xC0,0x75,0x18,0x8B,0x4C,0x24,0x14,
+			0x8B,0x44,0x24,0x10,0x33,0xD2,0xF7,0xF1,0x8B,0xD8,0x8B,0x44,0x24,0x0C,
+			0xF7,0xF1,0x8B,0xD3,0xEB,0x41,0x8B,0xC8,0x8B,0x5C,0x24,0x14,0x8B,0x54,
+			0x24,0x10,0x8B,0x44,0x24,0x0C,0xD1,0xE9,0xD1,0xDB,0xD1,0xEA,0xD1,0xD8,
+			0x0B,0xC9,0x75,0xF4,0xF7,0xF3,0x8B,0xF0,0xF7,0x64,0x24,0x18,0x8B,0xC8,
+			0x8B,0x44,0x24,0x14,0xF7,0xE6,0x03,0xD1,0x72,0x0E,0x3B,0x54,0x24,0x10,
+			0x77,0x08,0x72,0x07,0x3B,0x44,0x24,0x0C,0x76,0x01,0x4E,0x33,0xD2,0x8B,
+			0xC6,0x5E,0x5B,0xC2,0x10,0x00
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_aulldiv, 104 ) );
+	}
+	else if( userProc.GetName() == "_allshl" ){
+		//符号あり左ビットシフト用の特殊関数（64ビット整数対応）
+		BYTE Buffer_allshl[]={
+			0x80,0xF9,0x40,0x73,0x15,0x80,0xF9,0x20,0x73,0x06,0x0F,0xA5,0xC2,0xD3,0xE0,0xC3,0x8B,0xD0,0x33,0xC0,0x80,0xE1,0x1F,0xD3,0xE2,0xC3,0x33,0xC0,0x33,0xD2,0xC3
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_allshl, 31 ) );
+	}
+	else if( userProc.GetName() == "_allshr" ){
+		//符号あり右ビットシフト用の特殊関数（64ビット整数対応）
+		BYTE Buffer_allshr[]={
+			0x80,0xF9,0x40,0x73,0x16,0x80,0xF9,0x20,0x73,0x06,0x0F,0xAD,0xD0,0xD3,0xFA,0xC3,0x8B,0xC2,0xC1,0xFA,0x1F,0x80,0xE1,0x1F,0xD3,0xF8,0xC3,0xC1,0xFA,0x1F,0x8B,0xC2,0xC3
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_allshr, 33 ) );
+	}
+	else if( userProc.GetName() == "_aullshr" ){
+		//符号なし右ビットシフト用の特殊関数（64ビット整数対応）
+		BYTE Buffer_aullshr[]={
+			0x80,0xF9,0x40,         //cmp         cl,40h
+			0x73,0x15,              //jae         RETZERO (0040d71a)
+			0x80,0xF9,0x20,         //cmp         cl,20h
+			0x73,0x06,              //jae         MORE32 (0040d710)
+			0x0F,0xAD,0xD0,         //shrd        eax,edx,cl
+			0xD3,0xEA,              //shr         edx,cl
+			0xC3,                   //ret
+			//MORE32:
+			0x8B,0xC2,              //mov         eax,edx
+			0x33,0xD2,              //xor         edx,edx
+			0x80,0xE1,0x1F,         //and         cl,1Fh
+			0xD3,0xE8,              //shr         eax,cl
+			0xC3,                   //ret
+			//RETZERO:
+			0x33,0xC0,              //xor         eax,eax
+			0x33,0xD2,              //xor         edx,edx
+			0xC3                    //ret
+		};
+
+		compiler.codeGenerator.PutOld( NativeCode( (const char *)Buffer_aullshr, 31 ) );
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+void AutoGeneration( const UserProc &userProc){
+	if( userProc.GetName() == "InitializeUserTypes"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_TypeBase" )
+	{
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_System_InitializeUserTypes(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+	}
+	else if( userProc.GetName() == "InitializeUserTypesForBaseType"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_TypeBase" )
+	{
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_System_InitializeUserTypesForBaseType(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+	}
+	else if( userProc.GetName() == "RegisterGlobalRoots"
+		&& userProc.HasParentClass()
+		&& userProc.GetParentClass().GetName() == "_System_CGarbageCollection" )
+	{
+		Compile_AddGlobalRootsForGc();
+	}
+	else if( userProc.GetName() == compiler.GetGlobalAreaProcName() )
+	{
+		////////////////////////////////////////
+		// グローバル領域をコンパイル
+		////////////////////////////////////////
+
+		UserProc::pGlobalProc = &userProc;
+
+		int BackCp = cp;
+		cp=-1;
+
+		//クラスに属する静的メンバを定義
+		ActiveBasic::Compiler::ProcedureGenerator::Generate_InitStaticMember(
+			compiler.GetObjectModule().meta.GetClasses()
+		);
+
+		//グローバル実行領域をコンパイル開始
+		CompileBuffer(0,0);
+
+		//Goto未知ラベルスケジュールが存在したらエラーにする
+		foreach( const GotoLabelSchedule *pGotoLabelSchedule, compiler.codeGenerator.gotoLabelSchedules )
+		{
+			if(pGotoLabelSchedule->GetName().size()>0){
+				compiler.errorMessenger.Output(6,pGotoLabelSchedule->GetName(),pGotoLabelSchedule->GetSourceCodePos());
+			}
+			else{
+				char temporary[255];
+				sprintf(temporary,"%d",pGotoLabelSchedule->GetLineNum());
+				compiler.errorMessenger.Output(6,temporary,pGotoLabelSchedule->GetSourceCodePos());
+			}
+		}
+
+		cp=BackCp;
+	}
+	else if( userProc.HasParentClass()
+		&& userProc.IsCastOperator()
+		&& userProc.ReturnType().IsInterface() )
+	{
+		// インターフェイス型にキャストするためのメソッド
+
+		int vtblMasterListIndex = userProc.GetParentClass().GetVtblMasterListIndex( &userProc.ReturnType().GetClass() );
+
+		char temporary[1024];
+		sprintf( temporary,
+			"Return New %s(ObjPtr( This ),Get_LONG_PTR( (Get_LONG_PTR( ObjPtr(This)+SizeOf(VoidPtr) ) + SizeOf(LONG_PTR)*%d) As VoidPtr ) As VoidPtr )",
+			compiler.TypeToString( userProc.ReturnType() ).c_str(),
+			vtblMasterListIndex
+		);
+		MakeMiddleCode( temporary );
+
+		ChangeOpcode( temporary );
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+
+void _compile_proc(const UserProc *pUserProc)
+{
+	extern char *basbuf;
+	extern HANDLE hHeap;
+	int i3,i4,BaseOffset;
+	char temporary[VN_SIZE];
+
+	if( pUserProc->GetLocalVars().size() ){
+		compiler.errorMessenger.OutputFatalError();
+		return;
+	}
+
+	trace_for_sourcecodestep( "★★★ " << FormatEscapeSequenceStringToDefaultString( pUserProc->GetFullName() ) << "のコンパイルを開始" );
+
+	pUserProc->CompleteCompile();
+
+	extern BOOL bDebugSupportProc;
+	if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0)
+	{
+		if( !compiler.IsDebug() )
+		{
+			return;
+		}
+		bDebugSupportProc=1;
+	}
+	else bDebugSupportProc=0;
+
+	if( pUserProc->GetCodeSize() != 0 || pUserProc->GetNativeCode().GetSize() != 0 )
+	{
+		// 既にコード生成が行われている場合はエラー
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	compiler.StartProcedureCompile( pUserProc );
+
+	if(pUserProc->IsAutoGenerationSystem()){
+		////////////////////
+		// 特殊関数
+		////////////////////
+
+		extern int AllLocalVarSize;
+		AllLocalVarSize=0;
+
+		SystemProc(*pUserProc);
+		return;
+	}
+
+	if( !pUserProc->IsAutoGeneration() )
+	{
+		// 対象のソースコードを含むオブジェクトモジュールのインデックスを指定する
+		// ※テンプレート展開がされている場合、対象のソースコードが現在のオブジェクトモジュールではない場合がある
+		compiler.SetCurrentRelationalObjectModuleIndexForSource( pUserProc->GetSourceCodePosition().GetRelationalObjectModuleIndex() );
+		basbuf = const_cast<char *>(compiler.GetCurrentSource().GetBuffer());
+
+		cp=pUserProc->GetSourceCodePosition().GetPos();
+		for(;;cp++){
+			if(IsCommandDelimitation(basbuf[cp])) break;
+		}
+		cp--;
+	}
+
+	//ローカル変数に関する情報
+	extern int AllLocalVarSize;
+	AllLocalVarSize=0;
+
+	//パラメータ用の変数データを考慮
+	for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
+		Parameter &param = *pUserProc->RealParams()[i3];
+
+		Variable *pVar = new Variable(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( param.GetVarName().c_str() ),
+			param,
+			false,
+			param.IsRef(),
+			"",
+			false
+		);
+
+		if( param.IsArray() ){
+			pVar->SetArray( param.GetSubscripts() );
+		}
+
+		int varSize;
+		if( param.IsRef() == false && param.IsStruct() ){
+			//構造体のByValパラメータ
+			pVar->ThisIsByValStructParameter();
+			varSize=PTR_SIZE;
+		}
+		else{
+			if( param.IsArray() == false ){
+				varSize = pVar->GetMemorySize();
+			}
+			else{
+				varSize=PTR_SIZE;
+			}
+		}
+		AllLocalVarSize+=varSize;
+		pVar->SetOffsetAddress( AllLocalVarSize );
+
+		//レキシカルスコープ情報
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		pUserProc->GetLocalVars().push_back( pVar );
+	}
+
+	//Thisポインタを示すローカルオフセット値をセット
+	extern int LocalVar_ThisPtrOffset;
+	LocalVar_ThisPtrOffset=AllLocalVarSize;
+
+	BaseOffset=AllLocalVarSize;
+
+	//ret用のアドレスを考慮
+	AllLocalVarSize+=sizeof(long);
+
+
+	///////////////////////
+	// ここからコード生成
+
+	//sub esp,AllLocalVarSize（スケジュール）
+	const PertialSchedule *pAllLocalVarPertialSchedule = compiler.codeGenerator.op_sub_esp( 0, true );
+
+	//push ebp
+	compiler.codeGenerator.op_push(REG_EBP);
+
+	//mov ebp,esp
+	compiler.codeGenerator.op_mov_RR( REG_EBP, REG_ESP );
+
+	//push ebx
+	compiler.codeGenerator.op_push(REG_EBX);
+
+	//push esi
+	compiler.codeGenerator.op_push( REG_ESI );
+
+	//push edi
+	compiler.codeGenerator.op_push( REG_EDI );
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//戻り値が存在するとき
+
+		const char *temp = pUserProc->GetName().c_str();
+		if( temp[0]==1&&temp[1]==ESC_OPERATOR ){
+			temp = "_System_ReturnValue";
+		}
+
+		if( pUserProc->ReturnType().IsStruct() ){
+			//戻り値用の構造体（値型）はパラメータで引き渡される
+		}
+		else{
+			if( pUserProc->ReturnType().IsObject() ){
+				sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() );
+			}
+			else{
+				//戻り値用の変数の定義
+				sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, compiler.TypeToString( pUserProc->ReturnType() ).c_str() );
+			}
+
+			OpcodeDim(temporary,0);
+		}
+	}
+
+	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+	compiler.codeGenerator.exitSubCodePositions.clear();
+
+	//ラベル管理オブジェクトを初期化
+	compiler.codeGenerator.gotoLabels.clear();
+
+	//Gotoラベルスケジュール
+	compiler.codeGenerator.gotoLabelSchedules.clear();
+
+	//With情報を初期化
+	extern WithInfos withInfos;
+	withInfos.clear();
+
+	// 重複エラー情報をクリア
+	compiler.errorMessenger.ClearSynonymKeyWords();
+
+	//Continueアドレスを初期化
+	compiler.codeGenerator.ClearContinueArea();
+
+	//レキシカルスコープ情報を初期化
+	compiler.codeGenerator.lexicalScopes.Init( compiler.codeGenerator.GetNativeCodeSize() );
+
+	const PertialSchedule *pEspOffsetPertialSchedule = NULL;
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		//push dword ptr[ebp+(AllLocalVarSize-BaseOffset)]（スケジュール）
+		pEspOffsetPertialSchedule = compiler.codeGenerator.op_push_M( REG_EBP, 0, Schedule::None, true );
+
+		//push dword ptr[ebp]（以前のebp）
+		compiler.codeGenerator.op_push_M( REG_EBP );
+
+		//call _DebugSys_StartProc
+		extern const UserProc *pSub_DebugSys_StartProc;
+		compiler.codeGenerator.op_call(pSub_DebugSys_StartProc);
+	}
+
+	if( compiler.IsCompilingClass() ){
+		if( pUserProc->GetName() == compiler.GetCompilingClass().GetName() ){
+			////////////////////////////////////
+			// コンストラクタをコンパイルするとき
+			////////////////////////////////////
+
+			//コンストラクタのコンパイル開始を通知
+			compiler.GetCompilingClass().NotifyStartConstructorCompile();
+
+			if( compiler.GetCompilingClass().HasSuperClass() )
+			{
+				/* サブクラスコンストラクタをコンパイルしているときは、
+					基底クラスのコンストラクタを呼び出す */
+
+				i3=cp+1;
+				while(IsCommandDelimitation(basbuf[i3])) i3++;
+				for(i4=0;;i3++,i4++){
+					if(!IsVariableChar(basbuf[i3])){
+						temporary[i4]=0;
+						break;
+					}
+					temporary[i4]=basbuf[i3];
+				}
+				if( compiler.GetCompilingClass().GetSuperClass().GetName() == temporary ){
+					//基底クラスのコンストラクタを呼び出す
+					cp=i3;
+					for(i4=0;;cp++,i4++){
+						if(IsCommandDelimitation(basbuf[cp])){
+							temporary[i4]=0;
+							break;
+						}
+						temporary[i4]=basbuf[cp];
+					}
+					if(!(temporary[0]=='('&&temporary[lstrlen(temporary)-1]==')')){
+						compiler.errorMessenger.Output(1,NULL,cp);
+					}
+					RemoveStringPare(temporary);
+
+
+					////////////////////////
+					// オーバーロードを解決
+					////////////////////////
+
+					std::vector<const UserProc *> subs;
+					compiler.GetCompilingClass().GetSuperClass().GetDynamicMethods().Enum( compiler.GetCompilingClass().GetSuperClass().GetName().c_str(), subs );
+
+					const UserProc *pUserProc = NULL;
+					if( subs.size() > 0 )
+					{
+						//オーバーロードを解決
+						pUserProc=OverloadSolutionWithStrParam(  compiler.GetCompilingClass().GetSuperClass().GetName().c_str(),
+							subs,temporary,"");
+					}
+					if( !pUserProc )
+					{
+						compiler.errorMessenger.Output(1,NULL,cp);
+					}
+					else
+					{
+						Type dummyType;
+						CallProc( PROC_DEFAULT
+							, pUserProc
+							, pUserProc->GetName().c_str()
+							, temporary
+							, Type()		// baseTypeはなし
+							, dummyType
+							, true
+							, PROCFLAG_PERMIT_CONSTRUCTOR
+						);
+					}
+				}
+				else{
+					if( compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod() != NULL )
+					{
+						// 基底クラスがデフォルトコンストラクタを保有するとき
+
+						// 基底クラスのコンストラクタを暗黙的に呼び出す
+						Opcode_CallProc("",
+							&compiler.GetCompilingClass().GetSuperClass().GetConstructorMethod()->GetUserProc(),
+							PROCFLAG_PERMIT_CONSTRUCTOR,
+							""
+						);
+					}
+				}
+			}
+		}
+		else if( pUserProc->IsDestructor() ){
+			//デストラクタをコンパイルしたとき
+
+			//デストラクタのコンパイル開始を通知
+			compiler.GetCompilingClass().NotifyStartDestructorCompile();
+		}
+	}
+
+	//////////////////////////////////////////
+	//////////////////////////////////////////
+	////// プロシージャ内をコンパイル ////////
+	if( pUserProc->IsAutoGeneration() ){
+		AutoGeneration( *pUserProc );
+	}
+	else{
+		if(pUserProc->IsMacro()){
+			CompileBuffer(ESC_ENDMACRO,0);
+		}
+		else{
+			if(pUserProc->IsSub()){
+				CompileBuffer(ESC_ENDSUB,0);
+			}
+			else if(pUserProc->IsFunction()){
+				CompileBuffer(ESC_ENDFUNCTION,0);
+			}
+		}
+	}
+	//////////////////////////////////////////
+	//////////////////////////////////////////
+
+	if( compiler.IsCompilingClass() ){
+
+		if( compiler.GetCompilingClass().IsCompilingConstructor() ){
+			// コンストラクタをコンパイルしていたとき
+
+			// コンストラクタのコンパイルが完了したことを通知
+			compiler.GetCompilingClass().NotifyFinishConstructorCompile();
+		}
+		else if( pUserProc->IsDestructor() ){
+			////////////////////////////////////
+			//デストラクタをコンパイルしたとき
+			////////////////////////////////////
+
+			// デストラクタのコンパイルが完了したことを通知
+			compiler.GetCompilingClass().NotifyFinishDestructorCompile();
+
+			if( compiler.GetCompilingClass().HasSuperClass() ){
+				/* サブクラスのデストラクタをコンパイルしているときは、
+					基底クラスのデストラクタを呼び出す */
+
+				const CMethod *method = compiler.GetCompilingClass().GetSuperClass().GetDestructorMethod();
+				if( method ){
+					Opcode_CallProc("",
+						&method->GetUserProc(),
+						PROCFLAG_PERMIT_DESTRUCTOR,
+						""
+					);
+				}
+			}
+		}
+	}
+
+	//push ebp
+	AllLocalVarSize+=sizeof(long);
+
+	//ローカルオブジェクトの解放処理
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	//プロシージャ抜け出しスケジュール（Exit Sub/Function）
+	compiler.codeGenerator.ResolveExitSubSchedule();
+
+	if( compiler.IsDebug() && bDebugSupportProc == 0 )
+	{
+		compiler.codeGenerator.opfix( pEspOffsetPertialSchedule, AllLocalVarSize-BaseOffset-sizeof(long) );
+
+		//call _DebugSys_EndProc
+		extern const UserProc *pSub_DebugSys_EndProc;
+		compiler.codeGenerator.op_call(pSub_DebugSys_EndProc);
+	}
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//戻り値をeax、edxに設定
+		RELATIVE_VAR RelativeVar;
+
+		const char *temp = pUserProc->GetName().c_str();
+		if( temp[0]==1 && temp[1]==ESC_OPERATOR ){
+			temp="_System_ReturnValue";
+		}
+		GetVarOffsetReadWrite(temp,&RelativeVar,Type());
+
+		const Type &returnType = pUserProc->ReturnType();
+		if( returnType.IsObject() || returnType.IsStruct() )
+		{
+			SetVarPtrToEax(&RelativeVar);
+			if( returnType.IsObject() )
+			{
+				//mov eax,dword ptr[eax]
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+			}
+		}
+		else if( returnType.IsReal() )
+		{
+			//fld qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_fld_base_offset( returnType.GetBasicType(), REG_EBP, RelativeVar.offset, Schedule::None, true )
+			);
+		}
+		else if( returnType.Is64() )
+		{
+			//mov eax,dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+
+			//mov edx,dword ptr[ebp+offset+sizeof(long)]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EDX, REG_EBP, RelativeVar.offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else if( returnType.GetSize() == sizeof(long) )
+		{
+			//mov eax,dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else if( returnType.GetSize() == sizeof(short) )
+		{
+			//xor eax,eax（eaxを0に初期化する）
+			compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+			//mov ax,word ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(short), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else if( returnType.GetSize() == sizeof(char) )
+		{
+			//xor eax,eax（eaxを0に初期化する）
+			compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+			//mov al,byte ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(char), REG_EAX, REG_EBP, RelativeVar.offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else
+		{
+			compiler.errorMessenger.OutputFatalError();
+		}
+	}
+
+	//ローカル変数アドレススケジュール
+	foreach( const PertialSchedule *pPertialSchedule, compiler.codeGenerator.localVarPertialSchedules )
+	{
+		compiler.codeGenerator.opfix_offset( pPertialSchedule, AllLocalVarSize );
+	}
+	compiler.codeGenerator.localVarPertialSchedules.clear();
+	foreach( Variable *pVar, pUserProc->GetLocalVars() ){
+		//後にデバッグで利用する
+		pVar->SetOffsetAddress( AllLocalVarSize - pVar->GetOffsetAddress() );
+	}
+
+	//push ebp、ret用のアドレスを考慮
+	AllLocalVarSize-=sizeof(long)*2;
+
+	//ローカル変数用メモリを確保するためのスケジュール（subコマンド）
+	compiler.codeGenerator.opfix( pAllLocalVarPertialSchedule, AllLocalVarSize - BaseOffset );
+
+	//pop edi
+	compiler.codeGenerator.op_pop( REG_EDI );
+
+	//pop esi
+	compiler.codeGenerator.op_pop( REG_ESI );
+
+	//pop ebx
+	compiler.codeGenerator.op_pop(REG_EBX);
+
+	if( compiler.IsDebug() )
+	{
+		//cmp esp,ebp
+		compiler.codeGenerator.op_cmp_RR( REG_ESP, REG_EBP );
+
+		//je 6（次のcallとbreakpointを飛び越す）
+		compiler.codeGenerator.op_je( 6 );
+
+		//call _esp_error
+		extern const UserProc *pSub_esp_error;
+		compiler.codeGenerator.op_call( pSub_esp_error );
+
+		breakpoint;
+	}
+
+	//mov esp,ebp
+	compiler.codeGenerator.op_mov_RR( REG_ESP, REG_EBP );
+
+	//pop ebp
+	compiler.codeGenerator.op_pop(REG_EBP);
+
+	//add esp AllLocalVarSize
+	compiler.codeGenerator.op_add_esp(AllLocalVarSize-BaseOffset);
+
+	if( BaseOffset==0 || pUserProc->IsCdecl() ){
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else{
+		//ret BaseOffset（パラメータ分のスタック領域を解放）
+		compiler.codeGenerator.op_ret( (_int16)BaseOffset );
+	}
+
+	compiler.FinishProcedureCompile();
+
+
+	//ローカル変数のネーム情報は後に解放する
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Set_Var.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Set_Var.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Set_Var.cpp	(revision 774)
@@ -0,0 +1,378 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar){
+	if(pRelativeVar->bOffsetOffset||pRelativeVar->dwKind==VAR_DIRECTMEM) return 1;
+	return 0;
+}
+
+void SetStructVariable( const Type &varType, const Type &calcType, BOOL bUseHeap){
+	if( calcType.IsStruct() ){
+		if( varType.GetClass().IsEquals( &calcType.GetClass() ) ){			//等しい
+
+				//双方のオブジェクト型が一致、または派生・継承関係にあるとき
+				//※コピーを行う
+
+				int object_size = varType.GetClass().GetSize();
+
+				//mov ecx,object_size
+				compiler.codeGenerator.op_mov_RV(REG_ECX,object_size);
+
+				//pop esi
+				compiler.codeGenerator.op_pop(REG_ESI);
+
+				//pop edi
+				compiler.codeGenerator.op_pop(REG_EDI);
+
+				if(bUseHeap){
+					//mov eax,esi
+					compiler.codeGenerator.op_mov_RR(REG_EAX,REG_ESI);
+				}
+
+				//rep movs byte ptr[edi],byte ptr[esi]
+				compiler.codeGenerator.op_rep_movs(sizeof(BYTE));
+
+				if(bUseHeap){
+					//push eax
+					compiler.codeGenerator.op_push(REG_EAX);
+
+					//call free
+					extern const UserProc *pSub_free;
+					compiler.codeGenerator.op_call(pSub_free);
+				}
+
+				return;
+		}
+	}
+
+	compiler.errorMessenger.Output(1,NULL,cp);
+}
+
+
+void SetRealVariable(int VarType,int CalcType,RELATIVE_VAR *pRelativeVar){
+	if( !IsRealNumberType( CalcType ) ){
+		// 実数へ変換
+		// 64bit edx:eax -> st(0)
+		// 32bit     eax -> st(0)
+
+		if( Is64Type( CalcType ) ){
+			//64ビット整数型
+
+			//push edx
+			compiler.codeGenerator.op_push( REG_EDX );
+
+			//push eax
+			compiler.codeGenerator.op_push( REG_EAX );
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//pop
+			compiler.codeGenerator.op_pop( REG_NON );
+
+			//pop
+			compiler.codeGenerator.op_pop( REG_NON );
+		}
+		else{
+			//push eax
+			compiler.codeGenerator.op_push( REG_EAX );
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//pop
+			compiler.codeGenerator.op_pop( REG_NON );
+		}
+	}
+
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//fstp ptr[ecx+offset]
+			compiler.codeGenerator.op_fstp_base_offset(VarType,REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
+		}
+		else{
+			//mov ecx,offset
+			compiler.codeGenerator.op_mov_RV(REG_ECX,(int)pRelativeVar->offset, Schedule::GlobalVar );
+
+			//fstp ptr[ecx]
+			compiler.codeGenerator.op_fstp_basereg(VarType,REG_ECX);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov ecx,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_NON,(int)pRelativeVar->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//fstp ptr[ebp+ecx+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_fstp_base_offset_ex(VarType,REG_EBP,REG_ECX,(int)pRelativeVar->offset,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//fstp ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_fstp_base_offset(VarType,REG_EBP,(int)pRelativeVar->offset, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ecx,qword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_EBP,(int)pRelativeVar->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+directmem:
+		//fstp ptr[ecx]
+		compiler.codeGenerator.op_fstp_basereg(VarType,REG_ECX);
+	}
+}
+
+void SetBooleanVariable(int type,RELATIVE_VAR *pRelative){
+	if(type==DEF_DOUBLE){
+		// TODO: 実装
+		compiler.errorMessenger.OutputFatalError();
+	}
+	else if(type==DEF_SINGLE){
+		// TODO: 実装
+		compiler.errorMessenger.OutputFatalError();
+	}
+	else if(type==DEF_INT64||type==DEF_QWORD){
+		//cmp eax,0
+		compiler.codeGenerator.op_cmp_value(sizeof(long),REG_EAX,0);
+
+		//setne al
+		compiler.codeGenerator.op_setne( REG_EAX );
+
+		//cmp edx,0
+		compiler.codeGenerator.op_cmp_value(sizeof(long),REG_EDX,0);
+
+		//setne cl
+		compiler.codeGenerator.op_setne( REG_ECX );
+
+		//or al,cl
+		compiler.codeGenerator.op_or_RR( sizeof( _int8 ), REG_EAX, REG_ECX );
+	}
+	else{
+		if(!IsWholeNumberType(type)){
+			//不正な型の場合
+			compiler.errorMessenger.Output(9,NULL,cp);
+			return;
+		}
+	}
+
+	//cmp eax,0
+	compiler.codeGenerator.op_cmp_value(Type(type,-1).GetSize(),REG_EAX,0);
+
+	//setne al
+	compiler.codeGenerator.op_setne( REG_EAX );
+
+	SetWholeVariable( sizeof(char), DEF_BYTE, pRelative );
+}
+
+void ExtendTypeTo32(int type,int reg);
+void ExtendTypeTo64(int type){
+	if(Is64Type(type)) return;
+
+	ExtendTypeTo32(type,REG_EAX);
+
+	if(IsSignedType(type)){
+		//cdq
+		compiler.codeGenerator.op_cdq();
+	}
+	else{
+		//xor edx,edx
+		compiler.codeGenerator.op_zero_reg(REG_EDX);
+	}
+}
+void ExtendTypeTo32(int type,int reg){
+	if(type==DEF_INTEGER || (compiler.IsUnicode()&&type==DEF_CHAR)){
+		//movsx reg32,reg16
+		compiler.codeGenerator.op_movsx_R32R16(reg,reg);
+	}
+	else if(type==DEF_WORD){
+		//and reg,0000FFFFh
+		compiler.codeGenerator.op_and_RV(reg,(int)0x0000FFFF);
+	}
+	else if(type==DEF_SBYTE || (compiler.IsUnicode()==false&&type==DEF_CHAR)){
+		//movsx reg32,reg8
+		compiler.codeGenerator.op_movsx_R32R8(reg,reg);
+	}
+	else if(type==DEF_BYTE||type==DEF_BOOLEAN){
+		//and reg,000000FFh
+		compiler.codeGenerator.op_and_RV(reg,(int)0xFF);
+	}
+}
+void ExtendTypeTo16(int type,int reg){
+	if(type==DEF_SBYTE || (compiler.IsUnicode()==false&&type==DEF_CHAR)){
+		//movsx reg16,reg8
+		compiler.codeGenerator.op_movsx_R16R8(reg,reg);
+	}
+	else if(type==DEF_BYTE||type==DEF_BOOLEAN){
+		//and reg,000000FFh
+		compiler.codeGenerator.op_and_RV(reg,(int)0xFF);
+	}
+}
+
+void SetWholeVariable(int varSize,int calcType,RELATIVE_VAR *pRelative){
+	if( IsRealNumberType( calcType ) ){
+		// 実数型から整数型へ変換する
+
+		if( varSize == sizeof(_int64) ){
+			// 64bitへ
+			// st(0) -> edx:eax
+
+			//push
+			//push
+			compiler.codeGenerator.op_sub_esp( PTR_SIZE * 2 );
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop( REG_EAX );
+
+			//pop edx
+			compiler.codeGenerator.op_pop( REG_EDX );
+		}
+		else{
+			// 32bit
+			// st(0) -> eax
+
+			//push
+			compiler.codeGenerator.op_push( REG_NON );
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop( REG_EAX );
+		}
+	}
+	else{
+		//その他の整数
+
+		if(varSize==sizeof(_int64)){
+			//eaxの値を64ビット（edx:eax）に拡張する
+			ExtendTypeTo64(calcType);
+		}
+		else if(varSize==sizeof(long)){
+			//レジスタの値を32ビット（eax）に拡張する
+			ExtendTypeTo32(calcType,REG_EAX);
+		}
+		else if(varSize==sizeof(short)){
+			//レジスタの値を16ビット（ax）に拡張する
+			ExtendTypeTo16(calcType,REG_EAX);
+		}
+		//8ビットは拡張なし
+	}
+
+	if(varSize==sizeof(_int64)){
+		//下位32ビット
+		SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
+
+		//上位32ビット
+
+		//直接参照に切り替え
+		SetVarPtrToEax(pRelative);
+		pRelative->dwKind=VAR_DIRECTMEM;
+
+		//mov ecx,eax
+		compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EAX );
+
+		//add ecx,sizeof(long)
+		compiler.codeGenerator.op_add_RV8( REG_ECX, sizeof(long) );
+
+		//mov eax,edx
+		compiler.codeGenerator.op_mov_RR( REG_EAX, REG_EDX );
+
+		SetWholeVariable(sizeof(long),DEF_LONG,pRelative);
+
+		return;
+	}
+
+	if(pRelative->dwKind==VAR_GLOBAL){
+		if(pRelative->bOffsetOffset){
+			//mov ptr[ecx+offset],eax/ax/al
+			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov ptr[offset],eax/ax/al
+			compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,0,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelative->dwKind==VAR_REFGLOBAL){
+		// 今は使われていない
+		compiler.errorMessenger.OutputFatalError();
+
+		if(pRelative->bOffsetOffset){
+			//add ecx,qword ptr[offset]
+			compiler.codeGenerator.op_add_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov ecx,qword ptr[offset]
+			compiler.codeGenerator.op_mov_RM(varSize,REG_ECX,REG_NON,(int)pRelative->offset,MOD_DISP32, Schedule::GlobalVar );
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_LOCAL){
+		if(pRelative->bOffsetOffset){
+			//mov ptr[ebp+ecx+offset],eax/ax/al
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_MR_ex(varSize,REG_EAX,REG_EBP,REG_ECX,(int)pRelative->offset,USE_OFFSET, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ptr[ebp+offset],eax/ax/al
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelative->dwKind==VAR_REFLOCAL){
+		if(pRelative->bOffsetOffset){
+			//add ecx,ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov ecx,ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM(PTR_SIZE,REG_ECX,REG_EBP,(int)pRelative->offset,MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+
+		goto directmem;
+	}
+	else if(pRelative->dwKind==VAR_DIRECTMEM){
+directmem:
+
+		//mov ptr[ecx],eax/ax/al
+		compiler.codeGenerator.op_mov_MR(varSize,REG_EAX,REG_ECX,0,MOD_BASE);
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Statement.cpp	(revision 774)
@@ -0,0 +1,1440 @@
+#include "stdafx.h"
+
+#include <LexicalScope.h>
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void OpcodeOthers( const char *Command ){
+	int i,i2;
+
+	char leftTerm[8192];
+	int lastParePos = 0;
+	for(i=0;;i++){
+		if(Command[i]=='\"'){
+			//ダブルクォートは不正なのでエラー扱い
+			leftTerm[i]=0;
+			compiler.errorMessenger.Output(3,leftTerm,cp);
+			return;
+		}
+
+		if(Command[i]=='('){
+			lastParePos = i;
+			i2=GetStringInPare(leftTerm+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='['){
+			i2=GetStringInBracket(leftTerm+i,Command+i);
+			i+=i2-1;
+			continue;
+		}
+		if(Command[i]=='\0'){
+			leftTerm[i] = 0;
+			break;
+		}
+
+		if( IsNumCalcMark( Command, i ) ){
+			leftTerm[i] = 0;
+			break;
+		}
+
+		leftTerm[i]=Command[i];
+	}
+	if(!(
+		IsVariableTopChar(leftTerm[0])||
+		leftTerm[0]=='.'||
+		(leftTerm[0]==1&&leftTerm[1]==ESC_PSMEM)
+		)){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+
+	if(Command[i]=='\0' && lastParePos == 0){
+		//////////////////////////////
+		// パラメータ無しのマクロ検索
+		//////////////////////////////
+
+		const UserProc *pUserProc = GetSubHash(Command);
+
+		//GetSubHash内でエラー提示が行われた場合
+		if(pUserProc==(UserProc *)-1) return;
+
+		if(pUserProc==0){
+			char temporary[VN_SIZE];
+			lstrcpy(temporary,Command);
+
+			CharUpper(temporary);
+			pUserProc=GetSubHash(temporary);
+
+			//GetSubHash内でエラー提示が行われた場合
+			if(pUserProc==(UserProc *)-1) return;
+		}
+
+		if(pUserProc){
+			if( !pUserProc->IsMacro() ){
+				compiler.errorMessenger.Output(10,Command,cp);
+			}
+
+			Opcode_CallProc("",pUserProc,0,"");
+
+			return;
+		}
+	}
+	else if(IsNumCalcMark(Command,i)){
+		//代入演算
+		OpcodeCalc(Command);
+		return;
+	}
+
+	Type resultType;
+	bool isLiteral, isNeedHeapFreeStructure = false;
+	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, isNeedHeapFreeStructure, NULL, true );
+	if( result ){
+
+		/////////////////////
+		// 戻り値の処理
+		/////////////////////
+
+		if( resultType.IsReal() ){
+			//fstp st(0)
+			compiler.codeGenerator.PutOld(
+				(char)0xDD,
+				(char)0xD8
+			);
+		}
+		else if( resultType.IsStruct() ){
+			//mov ebx,eax
+			compiler.codeGenerator.op_mov_RR(REG_EBX,REG_EAX);
+
+			FreeTempObject(REG_EBX,&resultType.GetClass());
+		}
+
+		return;
+	}
+
+	// どこにも当てはまらなかったため、失敗
+	compiler.errorMessenger.Output(1,NULL,cp);
+}
+
+void OpcodeIf(char *Parameter){
+	int i,i2;
+	Type tempType;
+
+	for(i=0;;i++){
+		if(Parameter[i]=='\0'){
+			compiler.errorMessenger.Output(21,NULL,cp);
+			return;
+		}
+		if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
+			Parameter[i]=0;
+			break;
+		}
+	}
+
+	const PertialSchedule *pIfPertialSchedule = NULL;
+	bool isNeedHeapFreeStructure;
+	if( NumOpe( Parameter, Type(DEF_BOOLEAN), tempType, &isNeedHeapFreeStructure ) )
+	{
+		if( tempType.IsObject() )
+		{
+			// Boolean型にキャストする
+			Type booleanType( DEF_BOOLEAN );
+			CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+			tempType = booleanType;
+		}
+
+		if( tempType.IsDouble() ){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(double)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (endif、または else まで)
+			pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.IsSingle() ){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(float)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (endif、または else まで)
+			pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.Is64() ){
+			//64ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//cmp ebx,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//jmp (endif、または else までジャンプ)
+			pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+		}
+		else{
+			//32ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//je (endif、または else まで条件ジャンプ)
+			pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+		}
+	}
+
+
+	/////////////////////////
+	// If内をコード化
+	/////////////////////////
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start(
+		compiler.codeGenerator.GetNativeCodeSize(),
+		LexicalScope::SCOPE_TYPE_IF
+	);
+
+	i2=CompileBuffer(ESC_ENDIF,0);
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+
+	if( pIfPertialSchedule == NULL ) return;
+
+	if(i2==ESC_ELSE){
+		//jmp (endifまで)
+		const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
+
+
+		/////////////////////////
+		// Else内をコード化
+		/////////////////////////
+
+		//レキシカルスコープをレベルアップ
+		compiler.codeGenerator.lexicalScopes.Start(
+			compiler.codeGenerator.GetNativeCodeSize(),
+			LexicalScope::SCOPE_TYPE_IF
+		);
+
+		CompileBuffer(ESC_ENDIF,0);
+
+		//レキシカルスコープをレベルダウン
+		compiler.codeGenerator.lexicalScopes.End();
+
+
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+	}
+	else{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
+	}
+}
+
+int GetLabelAddress(char *LabelName,int LineNum){
+	if(LabelName){
+		foreach( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
+		{
+			if( label.name.size() > 0 )
+			{
+				if( label.name == LabelName )
+				{
+					return label.address;
+				}
+			}
+		}
+	}
+	else{
+		foreach( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
+		{
+			if( label.name.size() == 0 )
+			{
+				if( label.line == LineNum )
+				{
+					return label.address;
+				}
+			}
+		}
+	}
+	return -1;
+}
+void OpcodeGoto(char *Parameter){
+	extern HANDLE hHeap;
+	int i,LineNum;
+
+	if(Parameter[0]=='*'){
+		i=GetLabelAddress(Parameter+1,0);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+	else{
+		LineNum=atoi(Parameter);
+		i=GetLabelAddress(0,LineNum);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+}
+void OpcodeWhile(char *Parameter){
+	extern HANDLE hHeap;
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	if(!Parameter[0]) compiler.errorMessenger.Output(10,"While",cp);
+
+	const PertialSchedule *pWhilePertialSchedule = NULL;
+	Type tempType;
+	bool isNeedHeapFreeStructure;
+	if( NumOpe( Parameter, Type(), tempType, &isNeedHeapFreeStructure ) )
+	{
+		if( tempType.IsObject() )
+		{
+			// Boolean型にキャストする
+			Type booleanType( DEF_BOOLEAN );
+			CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+			tempType = booleanType;
+		}
+
+		if( tempType.IsDouble() ){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(double)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.IsSingle() ){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,sizeof(float)+sizeof(long)
+			compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
+
+			//fcompp
+			compiler.codeGenerator.op_fcompp();
+
+			//fnstsw ax
+			compiler.codeGenerator.op_fnstsw_ax();
+
+			//test ah,40h
+			compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+			//jne (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
+		}
+		else if( tempType.Is64() ){
+			//64ビット型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//cmp ebx,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
+
+			//jne
+			const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+			//jmp (Wendまでジャンプ)
+			pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+			compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+		}
+		else{
+			//その他整数型
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//cmp eax,0
+			compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+			//je (Wend まで)
+			pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+		}
+	}
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_WHILE );
+
+	//While内をコンパイル
+	CompileBuffer(0,COM_WEND);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	if( pWhilePertialSchedule )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
+	}
+
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+char szNextVariable[VN_SIZE];
+void OpcodeFor(char *Parameter){
+	extern HANDLE hHeap;
+	int i,i2;
+	char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
+
+	//第１パラメータを取得
+	i=GetOneParameter(Parameter,0,temporary);
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(12,"For",cp);
+		goto ErrorStep;
+	}
+
+	for(i2=0;;i2++){
+		if(temporary[i2]=='='){
+			variable[i2]=0;
+
+			//カウンタ初期化
+			OpcodeCalc(temporary);
+			break;
+		}
+		if(temporary[i2]=='\0'){
+			compiler.errorMessenger.Output(12,"For",cp);
+			goto ErrorStep;
+		}
+		variable[i2]=temporary[i2];
+	}
+
+	//jmp ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	//第２パラメータを取得（to～）
+	i=GetOneParameter(Parameter,i,JudgeNum);
+
+	//第３パラメータを取得（step～）
+	if(Parameter[i]){
+		i=GetOneParameter(Parameter,i,StepNum);
+		if(Parameter[i]) compiler.errorMessenger.Output(12,"For",cp);
+	}
+	else lstrcpy(StepNum,"1");
+
+	//カウンタを増加させる
+	sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
+	OpcodeCalc(temporary);
+
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//増加か減少かを区別する
+	sprintf(temporary,"(%s)>=0",StepNum);
+	NumOpe(temporary,Type(),Type());
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//cmp eax,0
+	compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+	//je [カウンタ減少の場合の判定]
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	//判定（カウンタ増加の場合）
+	sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
+	NumOpe(temporary,Type(),Type());
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//jmp [カウンタ減少の場合の判定を飛び越す]
+	const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//判定（カウンタ減少の場合）
+	sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
+	NumOpe(temporary,Type(),Type());
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//jmpジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+
+	//cmp eax,0
+	compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+ErrorStep:
+
+	//je ...
+	pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+
+	//For内をコンパイル
+	CompileBuffer(0,COM_NEXT);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	if(szNextVariable[0]){
+		if(lstrcmp(szNextVariable,variable)!=0){
+			compiler.errorMessenger.Output(55,szNextVariable,cp);
+		}
+	}
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+void OpcodeForeach( const char *Parameter )
+{
+	Type resultType;
+	char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
+	bool isError = false;
+	std::string elementTypeName;
+
+	//第１パラメータを取得
+	int i = 0;
+	GetCustomToken( variable, Parameter, i, ESC_IN, true );
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(12,"Foreach",cp);
+		isError = true;
+		goto ErrorStep;
+	}
+	i++;
+
+	//第２パラメータを取得（in～）
+	lstrcpy( collectionVar, Parameter + i );
+
+
+	Exception::TryCommand(); //Finallyで_System_ForeachEnumerator.Disposeするため
+
+	//Enumeratorの取得
+	sprintf(temporary,"_System_ForeachEnumerator=%s.GetEnumerator()", collectionVar );
+	OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
+
+	{
+		Type collectionType;
+		if( !NumOpe_GetType( collectionVar, Type(), collectionType ) )
+		{
+			isError = true;
+			goto ErrorStep;
+		}
+
+		Type elementType;
+		if( collectionType.GetClass().IsExpanded() )
+		{
+			// テンプレート展開されたジェネリッククラス
+			elementType = collectionType.GetClass().expandedClassActualTypeParameters[0];
+		}
+		else
+		{
+			// 通常のジェネリッククラス
+			elementType = collectionType.GetActualGenericType(0);
+		}
+
+		elementTypeName = compiler.TypeToString( elementType );
+	}
+
+	if( !GetVarType( variable, resultType, false ) )
+	{
+
+		// 未定義の場合は自動的に定義する
+		sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
+		OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
+	}
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	// MoveNextメソッドを呼び出す
+	NumOpe("_System_ForeachEnumerator.MoveNext()",Type(),Type());
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//cmp eax,0
+	compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+ErrorStep:
+
+	//je ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
+
+	if( !isError )
+	{
+		// Currentプロパティから現在の値を取得
+		sprintf( temporary, "%s=_System_ForeachEnumerator.Current%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() );
+		Compile( temporary );
+	}
+
+	//For内をコンパイル
+	CompileBuffer(0,COM_NEXT);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	if(szNextVariable[0]){
+		if(lstrcmp(szNextVariable,variable)!=0){
+			compiler.errorMessenger.Output(55,szNextVariable,cp);
+		}
+	}
+
+	if( !isError )
+	{
+		//jmp ...
+		compiler.codeGenerator.op_jmp_continue();
+	}
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jeジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Disposeを呼んでTryスコープを終える
+	Exception::FinallyCommand();
+	Compile( "_System_ForeachEnumerator.Dispose()" );
+	Exception::EndTryCommand();
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+
+void OpcodeDo(char *Parameter){
+	extern HANDLE hHeap;
+	int i,i2,i3;
+
+	if(Parameter[0]) compiler.errorMessenger.Output(10,"Do",cp);
+
+	//Continueアドレスのバックアップとセット
+	compiler.codeGenerator.ContinueAreaBegin();
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_DO );
+
+	//Do内をコンパイル
+	CompileBuffer(0,COM_LOOP);
+
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
+
+	const PertialSchedule *pDoPertialSchedule = NULL;
+
+	extern char *basbuf;
+	char temporary[VN_SIZE];
+	for(i=cp-1;;i--){
+		if(IsCommandDelimitation(basbuf[i])){
+			i+=3;
+			if(!(basbuf[i]=='0'||basbuf[i]=='1')){
+				//無条件ループ
+				break;
+			}
+			i3=i;
+
+			for(i+=2,i2=0;;i++,i2++){
+				if(IsCommandDelimitation(basbuf[i])){
+					temporary[i2]=0;
+					break;
+				}
+				temporary[i2]=basbuf[i];
+			}
+
+			Type tempType;
+			bool isNeedHeapFreeStructure;
+			NumOpe( temporary, Type(), tempType, &isNeedHeapFreeStructure );
+
+			if( tempType.IsObject() )
+			{
+				// Boolean型にキャストする
+				Type booleanType( DEF_BOOLEAN );
+				CallCastOperatorProc( tempType, isNeedHeapFreeStructure, booleanType );
+				tempType = booleanType;
+			}
+
+			if( tempType.IsDouble() ){
+				//fld qword ptr[esp]
+				compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+				//push 0
+				compiler.codeGenerator.op_push_V(0);
+
+				//fild dword ptr[esp]
+				compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+				//add esp,sizeof(double)+sizeof(long)
+				compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
+
+				//fcompp
+				compiler.codeGenerator.op_fcompp();
+
+				//fnstsw ax
+				compiler.codeGenerator.op_fnstsw_ax();
+
+				//test ah,40
+				compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+				if(basbuf[i3]=='0'){
+					//While
+
+					//jne 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+				}
+				else if(basbuf[i3]=='1'){
+					//Until
+
+					//je 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
+				}
+			}
+			else if( tempType.IsSingle() ){
+				//fld dword ptr[esp]
+				compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+				//push 0
+				compiler.codeGenerator.op_push_V(0);
+
+				//fild dword ptr[esp]
+				compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+				//add esp,sizeof(float)+sizeof(long)
+				compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
+
+				//fcompp
+				compiler.codeGenerator.op_fcompp();
+
+				//fnstsw ax
+				compiler.codeGenerator.op_fnstsw_ax();
+
+				//test ah,40
+				compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+				if(basbuf[i3]=='0'){
+					//While
+
+					//jne 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+				}
+				else if(basbuf[i3]=='1'){
+					//Until
+
+					//je 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
+				}
+			}
+			else if( tempType.Is64() ){
+				//64ビット型
+
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//pop ebx
+				compiler.codeGenerator.op_pop(REG_EBX);
+
+				//cmp eax,0
+				compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+				//jne
+				const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+				//cmp ebx,0
+				compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
+
+				//jne
+				const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+				if(basbuf[i3]=='0'){
+					//While
+
+					//jmp 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
+
+					compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+					compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+				}
+				else if(basbuf[i3]=='1'){
+					//Until
+
+					//jmp 2（ループを続ける）
+					const PertialSchedule *pTempPertialSchedule3 = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
+
+					compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
+					compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
+
+					//jmp 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
+
+					compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule3 );
+				}
+			}
+			else{
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//cmp eax,0
+				compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
+
+				if(basbuf[i3]=='0'){
+					//While
+
+					//je 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
+				}
+				else if(basbuf[i3]=='1'){
+					//Until
+
+					//jne 5（ループ終了）
+					pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+				}
+			}
+			break;
+		}
+	}
+
+	//jmp ...
+	compiler.codeGenerator.op_jmp_continue();
+
+	if( pDoPertialSchedule )
+	{
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
+	}
+
+	//jmp ...
+	const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	//jmpジャンプ先のオフセット値
+	compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
+
+	//Continueアドレスを復元
+	compiler.codeGenerator.ContinueAreaEnd();
+}
+void OpcodeContinue(void){
+	//jmp ...(Continue addr)
+	compiler.codeGenerator.op_jmp_continue();
+}
+
+void OpcodeExitSub(void){
+	if( compiler.IsGlobalAreaCompiling() ){
+		compiler.errorMessenger.Output(12,"Exit Sub/Function",cp);
+		return;
+	}
+
+	//未解放のローカルオブジェクトのデストラクタを呼び出す
+	compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn();
+
+	//jmp ...(End Sub/Function)
+	compiler.codeGenerator.op_jmp_exitsub();
+}
+
+//Caseスケジュール
+class SelectSchedule
+{
+public:
+	SelectSchedule( int typeSize )
+		: typeSize( typeSize )
+		, nowCaseSchedule( 0 )
+	{
+	}
+
+	PertialSchedules casePertialSchedules;
+	int typeSize;
+	int nowCaseSchedule;
+};
+std::vector<SelectSchedule> selectSchedules;
+
+void OpcodeSelect(const char *lpszParms)
+{
+	extern HANDLE hHeap;
+	extern char *basbuf;
+	int i,i2,i3,sw,NowCaseCp;
+	char temporary[VN_SIZE];
+	
+	Type type1;
+	bool result = NumOpe(lpszParms,Type(), type1 );
+
+	selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
+
+	if( result )
+	{
+		if( selectSchedules.back().typeSize < sizeof(long) ){
+			selectSchedules.back().typeSize = sizeof(long);
+		}
+
+		for(i=cp,sw=0;;i++){
+			if(basbuf[i]=='\0'){
+				selectSchedules.pop_back();
+				compiler.errorMessenger.Output(22,"Select",cp);
+				return;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
+				for(i2=0;;i++){
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
+					if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
+						i2--;
+						if(i2==0) break;
+					}
+				}
+				continue;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
+				if(sw==0){
+					//add esp,CaseTypeSize
+					compiler.codeGenerator.op_add_esp( selectSchedules.back().typeSize );
+				}
+				break;
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
+				NowCaseCp=i;
+
+				i++;
+				while(1){
+					for(i++,i2=0;;i++,i2++){
+						if(basbuf[i]=='\"'){
+							i3=GetStringInQuotation(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='('){
+							i3=GetStringInPare(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+						if(basbuf[i]=='['){
+							i3=GetStringInBracket(temporary+i2,basbuf+i);
+							i+=i3-1;
+							i2+=i3-1;
+							continue;
+						}
+
+						if(IsCommandDelimitation(basbuf[i])){
+							temporary[i2]=0;
+							break;
+						}
+						if(basbuf[i]==','){
+							temporary[i2]=0;
+							break;
+						}
+
+						temporary[i2]=basbuf[i];
+					}
+
+					//エラー用
+					i2=cp;
+					cp=NowCaseCp;
+
+					Type type2;
+					if( !NumOpe(temporary,type1,type2) ){
+						return;
+					}
+
+					cp=i2;
+
+					if(type1.IsObject()){
+						std::vector<const UserProc *> subs;
+						type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
+						if( subs.size() == 0 ){
+							return;
+						}
+
+						Parameters params;
+						params.push_back( new Parameter( "", Type( type2 ) ) );
+
+						//オーバーロードを解決
+						const UserProc *pUserProc = OverloadSolution( "==", subs, params, Type( DEF_BOOLEAN ), type1 );
+
+						delete params[0];
+
+						if(!pUserProc){
+							//エラー
+							return;
+						}
+
+
+						//pop edx
+						compiler.codeGenerator.op_pop(REG_EDX);
+
+						//mov ecx,dword ptr[esp]
+						compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
+
+						//push edx
+						compiler.codeGenerator.op_push(REG_EDX);
+
+						//push ecx
+						compiler.codeGenerator.op_push(REG_ECX);
+
+						//call operator_proc	※ ==演算子
+						compiler.codeGenerator.op_call(pUserProc);
+
+						//test eax,eax
+						compiler.codeGenerator.op_test(REG_EAX,REG_EAX);
+
+						//jne ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_jne( 0, sizeof(long), true )
+						);
+					}
+					else if(type1.IsDouble()){
+						ChangeTypeToDouble(type2.GetBasicType());
+
+						//fld qword ptr[esp]
+						compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+						//add esp,CaseTypeSize
+						compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
+
+						//fld qword ptr[esp]
+						compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+						//fcompp
+						compiler.codeGenerator.op_fcompp();
+
+						//fnstsw ax
+						compiler.codeGenerator.op_fnstsw_ax();
+
+						//test ah,40
+						compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+						//jne ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_jne( 0, sizeof(long), true )
+						);
+					}
+					else if(type1.IsSingle()){
+						ChangeTypeToSingle(type2.GetBasicType());
+
+						//fld dword ptr[esp]
+						compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+						//add esp,CaseTypeSize
+						compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
+
+						//fld dword ptr[esp]
+						compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+						//fcompp
+						compiler.codeGenerator.op_fcompp();
+
+						//fnstsw ax
+						compiler.codeGenerator.op_fnstsw_ax();
+
+						//test ah,40
+						compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+						//jne ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_jne( 0, sizeof(long), true )
+						);
+					}
+					else{
+						//その他整数型
+
+						//pop ebx
+						compiler.codeGenerator.op_pop(REG_EBX);
+
+						//mov eax,dword ptr[esp]
+						compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+						//cmp eax,ebx
+						compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+						//je ...
+						selectSchedules.back().casePertialSchedules.push_back(
+							compiler.codeGenerator.op_je( 0, sizeof(long), true )
+						);
+					}
+
+					if(basbuf[i]!=',') break;
+				}
+			}
+			if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
+				sw=1;
+
+				//jmp ...
+				selectSchedules.back().casePertialSchedules.push_back(
+					compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+				);
+			}
+		}
+	}
+
+	//レキシカルスコープをレベルアップ
+	compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_SELECT );
+
+	//Select Case内をコンパイル
+	CompileBuffer(ESC_ENDSELECT,0);
+
+	//jmp EndSelect
+	selectSchedules.back().casePertialSchedules.push_back(
+		compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+	);
+
+	//最終スケジュール
+	for(i=selectSchedules.back().nowCaseSchedule;i<(int)selectSchedules.back().casePertialSchedules.size();i++){
+		compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[i] );
+	}
+
+	//レキシカルスコープをレベルダウン
+	compiler.codeGenerator.lexicalScopes.End();
+
+	selectSchedules.pop_back();
+}
+void OpcodeCase(char *Parameter){
+	int i;
+
+	if(selectSchedules.back().typeSize==-1){
+		compiler.errorMessenger.Output(30,"Case",cp);
+		return;
+	}
+
+	//jmp EndSelect
+	selectSchedules.back().casePertialSchedules.push_back(
+		compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
+	);
+
+	i=0;
+	while(1){
+		//Caseスケジュール
+		compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[selectSchedules.back().nowCaseSchedule] );
+		selectSchedules.back().nowCaseSchedule++;
+
+		i=JumpOneParameter(Parameter,i);
+		if(Parameter[i]=='\0') break;
+	}
+
+	//add esp,CaseTypeSize
+	compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
+}
+
+void OpcodeGosub(char *Parameter){
+	extern HANDLE hHeap;
+	int i,LineNum;
+
+	if(Parameter[0]=='*'){
+		i=GetLabelAddress(Parameter+1,0);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+	else{
+		LineNum=atoi(Parameter);
+		i=GetLabelAddress(0,LineNum);
+
+		if( i == -1 )
+		{
+			//jmp ...(schedule)
+			compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
+		}
+		else
+		{
+			//jmp ...
+			compiler.codeGenerator.op_jmp(
+				i-compiler.codeGenerator.GetNativeCodeSize(),
+				sizeof(long),
+				false,
+				true
+			);
+		}
+	}
+}
+void OpcodeReturn(char *Parameter){
+	if( compiler.IsGlobalAreaCompiling() ){
+		//Gosub～Returnとして扱う
+
+		//ret
+		compiler.codeGenerator.op_ret();
+	}
+	else{
+		//戻り値をセット
+		if(Parameter[0]){
+			const UserProc &proc = compiler.GetCompilingUserProc();
+
+			const char *temp = "_System_ReturnValue";
+			if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
+			{
+			}
+			else{
+				temp=proc.GetName().c_str();
+			}
+
+			char temporary[VN_SIZE];
+			sprintf(temporary,"%s=%s",temp,Parameter);
+			OpcodeCalc(temporary);
+		}
+
+		//プロシージャを抜け出す（C言語のreturnと同様の処理を行う）
+		OpcodeExitSub();
+	}
+}
+
+
+////////////
+// ポインタ
+
+void OpcodeSetPtrData(char *Parameter,int type){
+	int i;
+	char temporary[VN_SIZE];
+
+	if(Parameter[0]=='('){
+		i=JumpStringInPare(Parameter,1);
+		if(Parameter[i+1]=='\0'){
+			for(i=0;;i++){
+				Parameter[i]=Parameter[i+1];
+				if(Parameter[i]=='\0') break;
+			}
+			Parameter[i-1]=0;
+		}
+	}
+
+	//第１パラメータを取得
+	i=GetOneParameter(Parameter,0,temporary);
+	if(!Parameter[i]){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	Type resultType;
+	if( !NumOpe(temporary,Type(),resultType) ){
+		return;
+	}
+	if(!resultType.IsWhole()){
+		compiler.errorMessenger.Output(11,Parameter,cp);
+		return;
+	}
+
+	ChangeTypeToLong( resultType.GetBasicType() );
+
+	//第２パラメータを取得
+	i=GetOneParameter(Parameter,i,temporary);
+	if(Parameter[i]){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	if( !NumOpe(temporary,Type(),resultType) ){
+		return;
+	}
+
+	if(type==DEF_DOUBLE){
+		ChangeTypeToDouble_ToFpuReg( resultType.GetBasicType() );
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//fstp qword ptr[eax]
+		compiler.codeGenerator.PutOld(
+			(char)0xDD,
+			(char)0x18
+		);
+	}
+	else if(type==DEF_SINGLE){
+		ChangeTypeToSingle( resultType.GetBasicType() );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov dword ptr[eax],ebx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
+	}
+	else if(type==DEF_QWORD){
+		ChangeTypeToInt64( resultType.GetBasicType() );
+
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov dword ptr[eax],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+
+		//mov dword ptr[eax+sizeof(long)],ebx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0x04, MOD_BASE_DISP8 );
+	}
+	else if(type==DEF_DWORD){
+		ChangeTypeToLong( resultType.GetBasicType() );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov dword ptr[eax],ebx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
+	}
+	else if(type==DEF_WORD){
+		ChangeTypeToLong( resultType.GetBasicType() );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov word ptr[eax],bx
+		compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EBX, REG_EAX, 0, MOD_BASE );
+	}
+	else if(type==DEF_BYTE){
+		ChangeTypeToLong( resultType.GetBasicType() );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//mov byte ptr[eax],bl
+		compiler.codeGenerator.op_mov_MR( sizeof(char), REG_EBX, REG_EAX, 0, MOD_BASE );
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Compile_Var.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Compile_Var.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Compile_Var.cpp	(revision 774)
@@ -0,0 +1,1378 @@
+#include "stdafx.h"
+
+#include "Opcode.h"
+
+//変数
+// TODO: xml未完成
+int AllLocalVarSize;
+
+using namespace ActiveBasic::Compiler;
+
+void SetRelativeOffset( Type &resultType, RELATIVE_VAR *pRelativeVar,const char *lpPtrOffset){
+	PushLongVariable(pRelativeVar);
+
+	Type type;
+	NumOpe( lpPtrOffset, Type(), type );
+	if( !type.IsWhole() ){
+		compiler.errorMessenger.Output(46,NULL,cp);
+	}
+	ChangeTypeToLong( type.GetBasicType() );
+
+	//pop ebx
+	compiler.codeGenerator.op_pop(REG_EBX);
+
+	if( resultType.PtrLevel() ){
+		resultType.PtrLevelDown();
+
+		int typeSize = resultType.GetSize();
+		if(typeSize>=2){
+			//imul ebx,i2
+			compiler.codeGenerator.op_imul_RV( REG_EBX, typeSize );
+		}
+	}
+	else{
+		//エラー
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return;
+	}
+
+	//pop ecx
+	compiler.codeGenerator.op_pop(REG_ECX);
+
+	//add ecx,ebx
+	compiler.codeGenerator.op_add_RR( REG_ECX, REG_EBX );
+}
+void SetRelativeOffset( RELATIVE_VAR &relativeVar ){
+	if(relativeVar.dwKind==VAR_DIRECTMEM){
+		//mov ecx,dword ptr[ecx]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, 0, MOD_BASE );
+	}
+	else{
+		//直接参照に切り替え
+		SetVarPtrToEax(&relativeVar);
+		relativeVar.dwKind=VAR_DIRECTMEM;
+
+		//mov ecx,dword ptr[eax]
+		compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+	}
+}
+bool GetArrayOffset(const Subscripts &subscripts,char *array, const Type &type){
+	extern HANDLE hHeap;
+	int i,i2,i3,i4;
+	char temporary[VN_SIZE],*pParm[MAX_PARMS];
+
+	for(i=0,i2=0,i3=0;;i++,i2++){
+		if(array[i]=='('){
+			i4=GetStringInPare(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]=='['){
+			i4=GetStringInBracket(temporary+i2,array+i);
+			i+=i4-1;
+			i2+=i4-1;
+			continue;
+		}
+		if(array[i]==','||array[i]=='\0'){
+			if( i3 >= (int)subscripts.size() )
+			{
+				for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+				return 0;
+			}
+
+			temporary[i2]=0;
+
+			pParm[i3]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
+			lstrcpy(pParm[i3],temporary);
+
+			i3++;
+
+			if(array[i]=='\0'){
+				if( i3 < (int)subscripts.size() )
+				{
+					for(i3--;i3>=0;i3--) HeapDefaultFree(pParm[i3]);
+					return 0;
+				}
+				break;
+			}
+
+			i2=-1;
+			continue;
+		}
+		temporary[i2]=array[i];
+	}
+
+	//push ecx
+	compiler.codeGenerator.op_push(REG_ECX);
+
+	//push 0
+	compiler.codeGenerator.op_push_V(0);
+
+	for(i=i3-1;i>=0;i--){
+		Type tempType;
+		bool isNeedHeapFreeStructure;
+		NumOpe( pParm[i], Type( DEF_LONG ), tempType, &isNeedHeapFreeStructure );
+		if( tempType.IsObject() )
+		{
+			//キャスト演算子のオーバーロードに対応する
+			CallCastOperatorProc(
+				tempType,
+				isNeedHeapFreeStructure, Type(DEF_LONG) );
+			tempType.SetBasicType( DEF_LONG );
+		}
+		ChangeTypeToLong( tempType.GetBasicType() );
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		for( i2=i+1, i4=1; i2<i3; i2++ )
+		{
+			i4*=subscripts[i2]+1;
+		}
+
+		//imul eax,i4
+		compiler.codeGenerator.op_imul_RV( REG_EAX, i4 );
+
+		//add dword ptr[esp],eax
+		compiler.codeGenerator.PutOld(
+			(char)0x01,
+			(char)0x04,
+			(char)0x24
+		);
+
+		HeapDefaultFree(pParm[i]);
+	}
+
+	//pop eax
+	compiler.codeGenerator.op_pop(REG_EAX);
+
+	//imul eax,TypeSize
+	compiler.codeGenerator.op_imul_RV( REG_EAX, type.GetSize() );
+
+	//pop ecx
+	compiler.codeGenerator.op_pop(REG_ECX);
+
+	//add ecx,eax
+	compiler.codeGenerator.op_add_RR( REG_ECX, REG_EAX );
+
+	return 1;
+}
+bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const Type &classType, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess)
+{
+	const CClass &objClass = classType.GetClass();
+
+	//////////////////////////////////////
+	// クラス、配列の構成要素を解析する
+	//////////////////////////////////////
+
+	char VarName[VN_SIZE];		//変数名
+	char array[VN_SIZE];		//第1次配列
+	char lpPtrOffset[VN_SIZE];	//第2次配列
+	char NestMember[VN_SIZE];	//入れ子メンバ
+	ReferenceKind refType;
+	lstrcpy(VarName,member);
+	if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
+
+
+	////////////////////////////
+	// メンバオフセットを取得
+	////////////////////////////
+
+	const Member *pMember = objClass.FindDynamicMember( VarName );
+	if( !pMember )
+	{
+		if(isErrorEnabled) compiler.errorMessenger.Output(103,VarName,cp);
+		return false;
+	}
+
+	int offset = objClass.GetMemberOffset( VarName );
+
+
+	//アクセシビリティをチェック
+	if( compiler.IsCompilingClass() && &objClass == &compiler.GetCompilingClass() ){
+		//同一クラスオブジェクトの場合はプライベートアクセスを容認する
+		if(pMember->IsNoneAccess()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+	}
+	else{
+		if((bPrivateAccess==0&&pMember->IsPrivate())||
+			pMember->IsNoneAccess()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(107,VarName,cp);
+			return false;
+		}
+		else if(bPrivateAccess==0&&pMember->IsProtected()){
+			if(isErrorEnabled) compiler.errorMessenger.Output(108,VarName,cp);
+			return false;
+		}
+	}
+
+	//Const定義の場合は書き込みアクセスを制限する
+	//※コンストラクタをコンパイル中の場合は例外的に許可する
+	if( pMember->IsConst() &&		//定数メンバである
+		isWriteAccess &&							//書き込みアクセスを要求されている
+		objClass.IsCompilingConstructor() == false	//コンストラクタ コンパイル中を除く
+		){
+			//Const定義の変数に書き込みアクセスをしようとした場合
+			compiler.errorMessenger.Output(61,VarName,cp);
+	}
+
+	resultType = pMember->GetType();
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType );
+
+
+	//ポインタ変数の場合
+	if( resultType.IsPointer() ){
+		if( pMember->GetSubscripts().size() == 0 ){
+			lstrcpy(lpPtrOffset,array);
+			array[0]=0;
+		}
+	}
+	else{
+		if(lpPtrOffset[0]){
+			if(isErrorEnabled) compiler.errorMessenger.Output(16,member,cp);
+			return false;
+		}
+	}
+
+	if(offset){
+		//add ecx,offset
+		compiler.codeGenerator.op_add_RV( REG_ECX, offset );
+	}
+
+	if(array[0]){
+		//配列オフセット
+		if(!GetArrayOffset(pMember->GetSubscripts(),array,pMember->GetType())){
+			if(isErrorEnabled) compiler.errorMessenger.Output(14,member,cp);
+			return false;
+		}
+	}
+	else if( pMember->GetSubscripts().size() > 0 ){
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+	}
+
+	if(NestMember[0]){
+		//入れ子構造の場合
+
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			if( refType != RefDot ){
+				if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+				return false;
+			}
+
+			if( resultType.IsObject() ){
+				// 参照内容へのポインタを抽出
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//構造体ポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
+					&& refType != RefDot ){
+						if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+						return false;
+				}
+
+				//直接参照に切り替え
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				lpPtrOffset[0]=0;
+			}
+			else{
+				//pObj->member
+				if( ( resultType.IsObjectPtr() || resultType.IsStructPtr() )
+					&& refType != RefPointer ){
+						if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+						return false;
+				}
+
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_OBJECT,2)
+			|| resultType.GetBasicType() == MAKE_PTR_TYPE(DEF_STRUCT,2)){
+			//構造体ポインタのポインタ型メンバ変数
+
+			if(lpPtrOffset[0]){
+				//ppObj[n]->member
+				if( refType != RefPointer ){
+					if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+					return false;
+				}
+
+				//直接参照に切り替え
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				lpPtrOffset[0]=0;
+
+				//mov ecx,dword ptr[ecx]
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_ECX, 0, MOD_BASE );
+			}
+			else{
+				if(isErrorEnabled) compiler.errorMessenger.Output(104,member,cp);
+				return false;
+			}
+		}
+
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			pMember->GetType(),
+			NestMember,
+			pRelativeVar,
+			resultType,
+			0)) return false;
+	}
+
+	if(lpPtrOffset[0]){
+		SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+	}
+
+	return true;
+}
+
+int LocalVar_ThisPtrOffset;
+void SetThisPtrToReg(int reg){
+	//自身のオブジェクトのThisポインタをregにコピー
+
+	RELATIVE_VAR RelativeVar;
+	RelativeVar.dwKind=VAR_LOCAL;
+	RelativeVar.bOffsetOffset=0;
+	RelativeVar.offset=-LocalVar_ThisPtrOffset;
+
+	SetReg_WholeVariable(Type(DEF_PTR_VOID),&RelativeVar,reg);
+}
+
+bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts ){
+	char variable[VN_SIZE];
+
+	if(NameBuffer[0]=='.'){
+		GetWithName(variable);
+		lstrcat(variable,NameBuffer);
+	}
+	else lstrcpy(variable,NameBuffer);
+
+	// 名前空間を分離
+	char namespaceStr[VN_SIZE]="", simpleName[VN_SIZE];
+	compiler.GetObjectModule().meta.GetNamespaces().SplitNamespace( variable, namespaceStr, simpleName );
+
+	// 先頭オブジェクトまたはクラス名と入れ子メンバに分割
+	ReferenceKind refType;
+	char member[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
+	GetVarFormatString(simpleName,array,lpPtrOffset,member,refType);
+
+	// 名前空間を分離していた場合は結合
+	char VarName[VN_SIZE];
+	if( namespaceStr[0] ){
+		sprintf( VarName, "%s.%s", namespaceStr, simpleName );
+	}
+	else{
+		lstrcpy( VarName, simpleName );
+	}
+
+	const Subscripts *pSubscripts;
+	bool bConst = false;
+
+
+	if( compiler.IsLocalAreaCompiling() ){
+		//////////////////
+		// ローカル変数
+		//////////////////
+
+		const Variable *pVar = compiler.GetCompilingUserProc().GetLocalVars().BackSearch(
+			LexicalAnalyzer::FullNameToSymbol( VarName ),
+			compiler.codeGenerator.lexicalScopes.GetNowLevel()
+		);
+		if( pVar ){
+			//ポインタ変数の場合
+			if( pVar->GetType().IsPointer() ){
+				if( !pVar->IsArray() ){
+					lstrcpy(lpPtrOffset,array);
+					array[0]=0;
+				}
+			}
+			else{
+				if(lpPtrOffset[0]){
+					compiler.errorMessenger.Output(16,variable,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+			}
+
+			pRelativeVar->offset=-pVar->GetOffsetAddress();
+			pRelativeVar->bOffsetOffset=0;
+			if( pVar->IsRef() || pVar->IsByValStructParameter() ){
+				// 参照型
+				pRelativeVar->dwKind = VAR_REFLOCAL;
+			}
+			else pRelativeVar->dwKind=VAR_LOCAL;
+			resultType = pVar->GetType();
+			pSubscripts = &pVar->GetSubscripts();
+			bConst = pVar->IsConst();
+
+
+			/////////////////////////////////////////////////////////
+			// ☆★☆ ジェネリクスサポート ☆★☆
+
+			if( resultType.IsTypeParameter() )
+			{
+				// 型パラメータだったとき
+
+				int ptrLevel = PTR_LEVEL( resultType.GetBasicType() );
+
+				// 制約クラス（指定されていないときはObjectクラス）にセットする
+				resultType.SetBasicType( DEF_OBJECT );
+
+				for( int i=0; i<ptrLevel; i++ )
+				{
+					resultType.PtrLevelUp();
+				}
+			}
+
+			//
+			/////////////////////////////////////////////////////////
+
+			goto ok;
+		}
+	}
+
+	if( compiler.IsCompilingClass() ){
+		//////////////////////
+		// クラスメンバの参照
+		//////////////////////
+
+		if(lstrcmpi(variable,"This")==0){
+			//Thisオブジェクト
+
+			//Thisポインタをecxにコピー
+			SetThisPtrToReg(REG_ECX);
+
+			pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+			resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+			return true;
+		}
+
+		if(memicmp(variable,"This.",5)==0){
+			//Thisオブジェクトのメンバを参照するとき
+			SlideString(variable+5,-5);
+			lstrcpy(VarName,variable);
+		}
+		else{
+			//クラス内の動的メンバを参照するとき（通常）
+
+			if( !compiler.GetCompilingClass().HasDynamicMember( VarName ) )
+			{
+				goto NonClassMember;
+			}
+		}
+
+		//Const修飾子のメソッド内でメンバ書き込みアクセスが発生したとき
+		//（コンストラクタ、デストラクタ内を除く）
+		const CMethod *pMethod = &compiler.GetCompilingUserProc().GetMethod();
+		if( isWriteAccess &&
+			pMethod->IsConst() &&
+			compiler.GetCompilingClass().IsCompilingConstructor() == false &&
+			compiler.GetCompilingClass().IsCompilingDestructor() == false
+			){
+				compiler.errorMessenger.Output(131, NULL, cp );
+		}
+
+		/////////////////////////////
+		// thisポインタをecxにセット
+
+		//Thisポインタをecxにコピー
+		SetThisPtrToReg(REG_ECX);
+
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			Type( DEF_OBJECT, compiler.GetCompilingClass() ),
+			variable,
+			pRelativeVar,
+			resultType,1)) return false;
+		return true;
+	}
+
+NonClassMember:
+
+	{
+		const Variable *pVar;
+
+		//////////////////////////
+		// 静的ローカル変数
+		// ※"Static.Object.Method.Variable"
+		//////////////////////////
+
+		char temporary[VN_SIZE];
+		if( compiler.IsLocalAreaCompiling() ){
+			GetNowStaticVarFullName(VarName,temporary);
+
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temporary ) );
+			if( pVar ){
+				goto GlobalOk;
+			}
+		}
+
+
+		//////////////////////////
+		// クラスの静的メンバ
+		//////////////////////////
+
+		if(member[0]){
+			lstrcpy(temporary,member);
+
+			// TODO: 名前空間を考慮したコードになっていない
+
+			char tempMember[VN_SIZE];
+			char tempArray[VN_SIZE];
+			{
+				ReferenceKind refType;
+				GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember, refType );
+			}
+
+			const TypeDef *pTypeDef = compiler.GetObjectModule().meta.GetTypeDefs().Find(
+				LexicalAnalyzer::FullNameToSymbol( VarName )
+			);
+			if( pTypeDef )
+			{
+				// TypeDef後の型名だったとき
+				lstrcpy( VarName, pTypeDef->GetBaseName().c_str() );
+			}
+
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s.%s",VarName,temporary);
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+			if( pVar ){
+				lstrcpy(member,tempMember);
+				lstrcpy(array,tempArray);
+				goto GlobalOk;
+			}
+		}
+
+		if( compiler.IsCompilingClass() ){
+			//自身のクラスから静的メンバを参照する場合
+			char temp2[VN_SIZE];
+			sprintf(temp2,"%s.%s",compiler.GetCompilingClass().GetName().c_str(),VarName);
+			pVar = compiler.GetObjectModule().meta.GetGlobalVars().Find( LexicalAnalyzer::FullNameToSymbol( temp2 ) );
+			if( pVar ){
+				goto GlobalOk;
+			}
+		}
+
+		/////////////////////
+		// グローバル変数
+		/////////////////////
+
+		pVar = compiler.GetObjectModule().meta.GetGlobalVars().BackSearch(
+			LexicalAnalyzer::FullNameToSymbol( VarName ),
+			compiler.codeGenerator.lexicalScopes.GetNowLevel()
+		);
+		if( pVar ){
+			goto GlobalOk;
+		}
+
+		if(isErrorEnabled) compiler.errorMessenger.Output(3,variable,cp);
+		pRelativeVar->dwKind=NON_VAR;
+		return false;
+
+
+
+GlobalOk:
+		//ポインタ変数の場合
+		if( pVar->GetType().IsPointer() ){
+			if( !pVar->IsArray() ){
+				lstrcpy(lpPtrOffset,array);
+				array[0]=0;
+			}
+		}
+		else{
+			if(lpPtrOffset[0]){
+				compiler.errorMessenger.Output(16,variable,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+		}
+
+		pRelativeVar->offset=pVar->GetOffsetAddress();
+		pRelativeVar->bOffsetOffset=0;
+		if( pVar->IsRef() ){
+			// 参照型
+			pRelativeVar->dwKind = VAR_REFGLOBAL;
+		}
+		else pRelativeVar->dwKind=VAR_GLOBAL;
+		resultType = pVar->GetType();
+		pSubscripts=&pVar->GetSubscripts();
+		bConst = pVar->IsConst();
+	}
+
+
+
+ok:
+
+	if( bConst && isWriteAccess ){
+		//Const定義の変数に書き込みアクセスをしようとした場合
+		if( resultType.IsObject() ){
+			//オブジェクト定数
+			compiler.errorMessenger.Output(130, VarName, cp );
+		}
+		else{
+			//一般のConst変数
+			compiler.errorMessenger.Output(61,VarName,cp);
+		}
+	}
+
+	if( array[0] == 0 && pSubscripts->size() > 0 ){
+		//配列の先頭ポインタを示す場合
+		resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
+
+		if( pResultSubscripts )
+		{
+			(*pResultSubscripts) = *pSubscripts;
+		}
+		return true;
+	}
+
+	if(array[0]||member[0]){
+		//xor ecx,ecx（ecxを0に初期化する）
+		//※ecxは変数ベースアドレスからの相対オフセットを示す
+		compiler.codeGenerator.op_zero_reg(REG_ECX);
+
+		pRelativeVar->bOffsetOffset=1;
+	}
+	if(array[0]){
+		if(!GetArrayOffset(*pSubscripts,array,resultType)){
+			compiler.errorMessenger.Output(14,variable,cp);
+			pRelativeVar->dwKind=NON_VAR;
+			return false;
+		}
+	}
+	if(member[0]){
+		if( resultType.IsObject() || resultType.IsStruct() ){
+			//実態オブジェクトのメンバを参照（obj.member）
+			if( refType != RefDot ){
+				compiler.errorMessenger.Output(104,VarName,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+
+			if( resultType.IsObject() ){
+				// 参照内容へのポインタを抽出
+				SetRelativeOffset( *pRelativeVar );
+			}
+		}
+		else if( resultType.IsObjectPtr() || resultType.IsStructPtr() ){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//pObj[n].member
+				if( refType != RefDot ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+			}
+			else{
+				//pObj->member
+				if( refType != RefPointer ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+
+				SetVarPtrToEax(pRelativeVar);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+				//mov ecx,dword ptr[eax]
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+			}
+		}
+		else if( resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_OBJECT,2) || resultType.GetBasicType()==MAKE_PTR_TYPE(DEF_STRUCT,2)){
+			//ポインタオブジェクトが示すメンバを参照
+			if(lpPtrOffset[0]){
+				//ppObj[n]->member
+				if( refType != RefPointer ){
+					compiler.errorMessenger.Output(104,VarName,cp);
+					pRelativeVar->dwKind=NON_VAR;
+					return false;
+				}
+
+				SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+				pRelativeVar->dwKind=VAR_DIRECTMEM;
+
+
+				SetVarPtrToEax(pRelativeVar);
+
+				//mov ecx,dword ptr[eax]
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
+			}
+			else{
+				compiler.errorMessenger.Output(104,VarName,cp);
+				pRelativeVar->dwKind=NON_VAR;
+				return false;
+			}
+		}
+		else{
+			compiler.errorMessenger.Output(102,VarName,cp);
+			pRelativeVar->dwKind=NON_VAR;
+			return false;
+		}
+
+		Type classType( resultType );
+
+		if(!_member_offset(
+			isErrorEnabled,
+			isWriteAccess,
+			classType,
+			member,pRelativeVar,resultType,0)) return false;
+
+		return true;
+	}
+
+	if(lpPtrOffset[0]){
+		SetRelativeOffset(resultType,pRelativeVar,lpPtrOffset);
+		pRelativeVar->dwKind=VAR_DIRECTMEM;
+	}
+
+	return true;
+}
+
+bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
+	int i2,i3;
+	char temporary[VN_SIZE];
+	char InitBuf[VN_SIZE];
+	lstrcpy( InitBuf, lpszInitBuf );
+
+	if(InitBuf[0]=='['){
+		SlideString(InitBuf+1,-1);
+		InitBuf[lstrlen(InitBuf)-1]=0;
+
+		int typeSize = type.GetSize();
+
+		if( subscripts.size() > 0 ){
+			Subscripts nestSubscripts;
+			for( int i=1; i<(int)subscripts.size(); i++ )
+			{
+				nestSubscripts.push_back( subscripts[i] );
+			}
+
+			typeSize*=JumpSubScripts( nestSubscripts );
+			{
+				int i=0;
+				i2=0;
+				while(1){
+					if( subscripts[0] < i2 ){
+						compiler.errorMessenger.Output(41,0,cp);
+						return 0;
+					}
+					i=GetOneParameter(InitBuf,i,temporary);
+					if(!SetInitGlobalData(
+						offset+i2*typeSize,
+						type,
+						nestSubscripts,
+						temporary)) return false;
+					i2++;
+					if(InitBuf[i]=='\0') break;
+				}
+			}
+			return true;
+		}
+
+		if(type.IsStruct()){
+			const CClass &objClass = type.GetClass();
+
+			int i = 0;
+			foreach( Member *pMember, objClass.GetDynamicMembers() ){
+				if(InitBuf[i]=='\0'){
+					compiler.errorMessenger.Output(41,0,cp);
+					return false;
+				}
+
+				i=GetOneParameter(InitBuf,i,temporary);
+
+				i3=objClass.GetMemberOffset( pMember->GetName().c_str() );
+
+				if(!SetInitGlobalData(offset+i3,
+					pMember->GetType(),
+					pMember->GetSubscripts(),
+					temporary)) return false;
+			}
+			return true;
+		}
+
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+
+	///////////////////////////////////////
+	// 単発式（[]で囲まれていない）
+	///////////////////////////////////////
+
+	if( subscripts.size() > 0 ){
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type calcType;
+
+	if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
+		//動的データだった場合
+		return false;
+	}
+	if( calcType.IsReal() ){
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+	else dbl=(double)i64data;
+
+	//型チェック
+	CheckDifferentType(
+		type,
+		calcType,
+		0,0);
+
+	if( type.IsDouble() ){
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&dbl,
+			sizeof(double)
+		);
+	}
+	else if( type.IsSingle() ){
+		float flt = (float)dbl;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&flt,
+			sizeof(float)
+		);
+	}
+	else if( type.Is64() ){
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&i64data,
+			sizeof(_int64)
+		);
+	}
+	else if( type.IsLong() || type.IsDWord() || type.IsPointer() ){
+		if( type.GetBasicType() == typeOfPtrChar && calcType.GetIndex() == LITERAL_STRING )
+		{
+			//文字列定数のとき
+
+			char *temp;
+			temp=(char *)i64data;
+			i2 = compiler.AddStringToDataTable( temp );
+			HeapDefaultFree(temp);
+
+			//mov eax,DataPos
+			compiler.codeGenerator.op_mov_RV( REG_EAX, i2, Schedule::DataTable );
+
+			//mov dword ptr[offset],eax
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, 0, offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			long l = (long)i64data;
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+				offset,
+				(const char *)&l,
+				sizeof(long)
+			);
+		}
+	}
+	else if( type.IsWord() || type.IsInteger() ){
+		short s = (short)i64data;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&s,
+			sizeof(short)
+		);
+	}
+	else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
+		char c = (char)i64data;
+		compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.Overwrite(
+			offset,
+			(const char *)&c,
+			sizeof(char)
+		);
+	}
+
+	return true;
+}
+bool InitLocalVar(int offset,const Type &type,const Subscripts &subscripts,const char *lpszInitBuf){
+	int i2,i3;
+	char temporary[VN_SIZE];
+	char InitBuf[VN_SIZE];
+	lstrcpy( InitBuf, lpszInitBuf );
+
+	if(InitBuf[0]=='['){
+		SlideString(InitBuf+1,-1);
+		InitBuf[lstrlen(InitBuf)-1]=0;
+
+		int typeSize = type.GetSize();
+
+		if( subscripts.size() > 0 ){
+			Subscripts nestSubscripts;
+			for( int i=1; i<(int)subscripts.size(); i++ )
+			{
+				nestSubscripts.push_back( subscripts[i] );
+			}
+
+			typeSize*=JumpSubScripts( nestSubscripts );
+			{
+				int i=0;
+				i2=0;
+				while(1){
+					if( subscripts[0] < i2 ){
+						compiler.errorMessenger.Output(41,0,cp);
+						return 0;
+					}
+					i=GetOneParameter(InitBuf,i,temporary);
+					if(!InitLocalVar(
+						offset+i2*typeSize,
+						type,
+						nestSubscripts,
+						temporary)) return false;
+					i2++;
+					if(InitBuf[i]=='\0') break;
+				}
+			}
+			return true;
+		}
+
+		if(type.IsStruct()){
+			const CClass &objClass = type.GetClass();
+
+			int i = 0;
+			foreach( Member *pMember, objClass.GetDynamicMembers() ){
+				if(InitBuf[i]=='\0'){
+					compiler.errorMessenger.Output(41,0,cp);
+					return false;
+				}
+
+				i=GetOneParameter(InitBuf,i,temporary);
+
+				i3=objClass.GetMemberOffset( pMember->GetName().c_str() );
+
+				if(!InitLocalVar(offset+i3,
+					pMember->GetType(),
+					pMember->GetSubscripts(),
+					temporary)) return false;
+
+				if(InitBuf[i]=='\0') break;
+			}
+			return true;
+		}
+
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+
+	///////////////////////////////////////
+	// 単発式（[]で囲まれていない）
+	///////////////////////////////////////
+
+	if( subscripts.size() > 0 ){
+		compiler.errorMessenger.Output(41,0,cp);
+		return false;
+	}
+
+	double dbl;
+	_int64 i64data;
+	Type calcType;
+
+	if( !StaticCalculation(false, InitBuf,type.GetBasicType(),&i64data,calcType) ){
+		//動的データだった場合
+		return false;
+	}
+	if( calcType.IsReal() ){
+		memcpy(&dbl,&i64data,sizeof(double));
+		i64data=(_int64)dbl;
+	}
+	else dbl=(double)i64data;
+
+	//型チェック
+	CheckDifferentType(
+		type,
+		calcType,
+		0,0);
+
+	if( type.IsDouble() ){
+		//mov eax,HILONG(dbl)
+		compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(((char *)(&dbl))+4) );
+
+		//mov dword ptr[ebp+offset+sizeof(long)],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
+		);
+
+		//mov eax,LOLONG(dbl)
+		compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(&dbl) );
+
+		//mov dword ptr[ebp+offset],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	else if( type.IsSingle() ){
+		float flt;
+		flt=(float)dbl;
+
+		//mov eax,InitValue
+		compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)&flt );
+
+		//mov dword ptr[ebp+offset],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	else if( type.Is64() ){
+		//mov eax,HILONG(i64data)
+		compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(((char *)(&i64data))+4) );
+
+		//mov dword ptr[ebp+offset+sizeof(long)],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset+sizeof(long), MOD_BASE_DISP32, Schedule::None, true )
+		);
+
+		//mov eax,LOLONG(i64data)
+		compiler.codeGenerator.op_mov_RV( REG_EAX, *(long *)(&i64data) );
+
+		//mov dword ptr[ebp+offset],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	else if( type.IsDWord() || type.IsLong() || type.IsPointer() ){
+		if( type.GetBasicType() == typeOfPtrChar && calcType.GetIndex() == LITERAL_STRING )
+		{
+			//文字列定数のとき
+
+			char *temp;
+			temp=(char *)i64data;
+			i2 = compiler.AddStringToDataTable( temp );
+			HeapDefaultFree(temp);
+
+			//mov eax,DataPos
+			compiler.codeGenerator.op_mov_RV( REG_EAX, i2, Schedule::DataTable );
+		}
+		else{
+			//mov eax,InitValue
+			compiler.codeGenerator.op_mov_RV( REG_EAX, (long)i64data );
+		}
+
+		//mov dword ptr[ebp+offset],eax
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_EBP, offset, MOD_BASE_DISP32, Schedule::None, true )
+		);
+	}
+	else if( type.IsWord() || type.IsInteger() ){
+		//mov word ptr[ebp+offset],InitValue
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV( sizeof(short), REG_EBP, offset, Schedule::None, true, (long)i64data )
+		);
+	}
+	else if( type.IsSByte() || type.IsByte() || type.IsBoolean() ){
+		//mov byte ptr[ebp+offset],InitValue
+		compiler.codeGenerator.localVarPertialSchedules.push_back(
+			compiler.codeGenerator.op_mov_MV( sizeof(char), REG_EBP, offset, Schedule::None, true, (long)i64data )
+		);
+	}
+
+	return true;
+}
+
+void dim( char *VarName, const Subscripts &subscripts, const Type &type,const char *InitBuf,const char *ConstractParameter,DWORD dwFlags){
+	if( compiler.IsGlobalAreaCompiling() ){
+		/////////////////////////
+		// グローバル変数
+		/////////////////////////
+
+		AddGlobalVariable(VarName,subscripts,type,InitBuf,ConstractParameter,dwFlags);
+	}
+	else{
+		/////////////////
+		// ローカル変数
+		/////////////////
+
+		if( compiler.GetCompilingUserProc().GetLocalVars().DuplicateCheck( LexicalAnalyzer::FullNameToSymbol( VarName ), compiler.codeGenerator.lexicalScopes.GetNowLevel() ) ){
+			//２重定義のエラー
+			compiler.errorMessenger.Output(15,VarName,cp);
+			return;
+		}
+
+		bool isConst = ( dwFlags & DIMFLAG_CONST ) ? true:false;
+
+		Variable *pVar = new Variable(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( VarName ),
+			type,
+			isConst,
+			false,
+			ConstractParameter,
+			false
+		);
+
+		if( subscripts.size() > 0 ){
+			//配列あり
+			pVar->SetArray( subscripts );
+		}
+
+		//レキシカルスコープ
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		//エラー用
+		pVar->source_code_address=cp;
+
+		// 変数を追加
+		compiler.GetCompilingUserProc().GetLocalVars().push_back( pVar );
+
+		//アラインメントを考慮
+		if( pVar->GetType().IsStruct() ){
+			int alignment = pVar->GetType().GetClass().GetFixedAlignment();
+
+			if( alignment ){
+				if( AllLocalVarSize % alignment ){
+					AllLocalVarSize += alignment - (AllLocalVarSize % alignment);
+				}
+			}
+
+			if( alignment == PTR_SIZE*2 ){
+				// ポインタに要するサイズよりも一回り大きなアラインメントが指定されているとき
+				// （例:CONTEXT構造体など）
+				// 呼び出し側のオフセットズレを考慮する
+
+				if( 0 == ( compiler.GetCompilingUserProc().RealParams().GetMemorySize() + PTR_SIZE /* ret分 */ ) % alignment ){
+					AllLocalVarSize += PTR_SIZE;
+				}
+			}
+		}
+
+		AllLocalVarSize += pVar->GetMemorySize();
+		pVar->SetOffsetAddress( AllLocalVarSize );
+
+		//レキシカルスコープ
+		pVar->SetScopeLevel( compiler.codeGenerator.lexicalScopes.GetNowLevel() );
+		pVar->SetScopeStartAddress( compiler.codeGenerator.lexicalScopes.GetStartAddress() );
+		pVar->isLiving = true;
+
+		if(InitBuf[0]){
+			//初期代入時のみ、書き込みアクセスを許可する
+			if( isConst ){
+				pVar->ConstOff();
+			}
+
+			int result = 0;
+			if( !pVar->GetType().IsObject() ){
+				result = InitLocalVar(-pVar->GetOffsetAddress(),
+					pVar->GetType(),
+					pVar->GetSubscripts(),
+					InitBuf);
+			}
+
+			if(!result){
+				//動的な式だった場合は代入演算を行う
+				char temporary[8192];
+				sprintf(temporary,"%s=%s",VarName,InitBuf);
+				OpcodeCalc(temporary);
+			}
+
+			if( isConst ){
+				pVar->ConstOn();
+			}
+		}
+		else{
+			//push 0
+			compiler.codeGenerator.op_push_V(0);
+
+			//push VarSize
+			compiler.codeGenerator.op_push_V( pVar->GetMemorySize() );
+
+			//mov eax,ebp
+			compiler.codeGenerator.op_mov_RR( REG_EAX, REG_EBP );
+
+			//add eax,offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV( REG_EAX, -pVar->GetOffsetAddress(), Schedule::None, true )
+			);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+
+			//call FillMemory
+			compiler.codeGenerator.op_call( GetDeclareHash("FillMemory") );
+		}
+	}
+
+	//New呼び出し
+	if( type.IsObject()
+		&& !type.IsInterface() &&  !type.IsComInterface()
+		&&(dwFlags&DIMFLAG_NONCALL_CONSTRACTOR)==0
+		&&InitBuf[0]=='\0')
+	{
+		char objectSize[255];
+		if( subscripts.size() == 0 ){
+			objectSize[0] = 0;
+		}
+		else{
+			if( subscripts.size() > 1 ){
+				compiler.errorMessenger.Output(300,NULL,cp);
+			}
+			sprintf( objectSize, "%d", subscripts[0] );
+		}
+		Operator_New( type.GetClass(), objectSize, ConstractParameter, type );
+
+		//pop eax
+		compiler.codeGenerator.op_pop( REG_EAX );
+
+		RELATIVE_VAR RelativeVar;
+		GetVarOffset( true, false, VarName, &RelativeVar, Type() );
+		if( RelativeVar.dwKind == VAR_DIRECTMEM ){
+			compiler.errorMessenger.OutputFatalError();
+		}
+		SetVariableFromEax( Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetObjectClassPtr() ), DEF_OBJECT, &RelativeVar );
+	}
+}
+
+void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar){
+	if(pRelativeVar->dwKind==VAR_GLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//lea eax,dword ptr[ecx+offset]
+			compiler.codeGenerator.op_lea_RM( REG_EAX, REG_ECX, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov eax,offset
+			compiler.codeGenerator.op_mov_RV( REG_EAX, pRelativeVar->offset, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFGLOBAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov eax,ecx
+			compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
+
+			//add eax,dword ptr[offset]
+			compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+		else{
+			//mov eax,dword ptr[offset]
+			compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_NON, (int)pRelativeVar->offset, MOD_DISP32, Schedule::GlobalVar );
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_LOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//add ecx,offset
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RV( REG_ECX, pRelativeVar->offset, Schedule::None, true )
+			);
+
+			//lea eax,dword ptr[ebp+ecx]
+			compiler.codeGenerator.PutOld(
+				(char)0x8D,
+				(char)0x44,
+				(char)0x0D,
+				(char)0x00
+			);
+		}
+		else{
+			//lea eax,dword ptr[ecx+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_lea_RM( REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_REFLOCAL){
+		if(pRelativeVar->bOffsetOffset){
+			//mov eax,ecx
+			compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
+
+			//add eax,dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_add_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+		else{
+			//mov eax,dword ptr[ebp+offset]
+			compiler.codeGenerator.localVarPertialSchedules.push_back(
+				compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_EBP, pRelativeVar->offset, MOD_BASE_DISP32, Schedule::None, true )
+			);
+		}
+	}
+	else if(pRelativeVar->dwKind==VAR_DIRECTMEM){
+		//mov eax,ecx
+		compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ECX );
+	}
+}
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar)
+{
+	if( reg != REG_EAX ){
+		compiler.errorMessenger.OutputFatalError();
+		//TODO: 未完成
+	}
+	SetVarPtrToEax( pRelativeVar );
+}
+
+bool Compile_AddGlobalRootsForGc()
+{
+	const UserProc *pUserProc_AddGlobalRootPtr = GetClassMethod( "_System_CGarbageCollection", "AddGlobalRootPtr" );
+	if( !pUserProc_AddGlobalRootPtr )
+	{
+		compiler.errorMessenger.Output(3, "_System_CGarbageCollection.AddGlobalRootPtr", -1 );
+		return false;
+	}
+
+	foreach( const Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+		if( pVar->GetType().IsObject() || pVar->GetType().IsPointer() || pVar->GetType().IsStruct() ){
+			// オブジェクトまたはポインタだったとき
+			// ※構造体も含む（暫定対応）
+
+			// 変数領域に要するLONG_PTR単位の個数を引き渡す
+			compiler.codeGenerator.op_push_V( pVar->GetMemorySize()/PTR_SIZE );
+
+
+			/////////////////////////////
+			// ルートポインタを引き渡す
+
+			//mov eax,offset
+			compiler.codeGenerator.op_mov_RV(REG_EAX,(int)pVar->GetOffsetAddress(), Schedule::GlobalVar );
+
+			//push eax
+			compiler.codeGenerator.op_push( REG_EAX );
+
+			//
+			/////////////////////////////
+
+
+			/////////////////////////////
+			// Thisポインタを引き渡す
+
+			SetThisPtrToReg(REG_EAX);
+
+			//push eax
+			compiler.codeGenerator.op_push( REG_EAX );
+
+			//
+			/////////////////////////////
+
+
+			// call AddGlobalRootPtr
+			compiler.codeGenerator.op_call( pUserProc_AddGlobalRootPtr );
+		}
+	}
+
+	return true;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/FunctionValue.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/FunctionValue.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/FunctionValue.h	(revision 774)
@@ -0,0 +1,35 @@
+/* 関数定数 */
+
+//データ型変換
+#define FUNC_CUDBL	0x0210
+#define FUNC_FIX	0x0211
+
+//文字列
+#define FUNC_LEN	0x031D
+
+//メモリ操作
+#define FUNC_VARPTR		0x0591
+#define FUNC_OBJPTR		0x0592
+
+//その他
+#define FUNC_ADDRESSOF		0x0619
+#define FUNC_SIZEOF			0x0620
+#define FUNC_DELEGATE_DYNAMICMETHOD_CALL	0x0621
+#define FUNC_DELEGATE_STATICMETHOD_CALL		0x0622
+#define FUNC_SYSTEM_GET_NOW_SCOPE_CATCH_ADDRESS		0x0623
+#define FUNC_SYSTEM_GET_NOW_SCOPE_FINALLY_ADDRESS	0x0624
+#define FUNC_SYSTEM_GET_BP	0x0625
+#define FUNC_SYSTEM_GET_SP	0x0626
+#define FUNC_SYSTEM_GET_COM_VTBL	0x0627
+#define FUNC_SYSTEM_GET_VTBL_LIST	0x0628
+#define FUNC_SYSTEM_GET_DEFAULT_CONSTRUCTOR		0x0629
+#define FUNC_SYSTEM_GET_DESTRUCTOR				0x062A
+#define FUNC_CLASS_SIZEOF	0x062B
+
+//ポインタ
+#define FUNC_GETDOUBLE		0x0630
+#define FUNC_GETSINGLE		0x0631
+#define FUNC_GETQWORD		0x0632
+#define FUNC_GETDWORD		0x0633
+#define FUNC_GETWORD		0x0634
+#define FUNC_GETBYTE		0x0635
Index: branches/egtra/ab5.0/abdev/compiler_x86/LoopCheck.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/LoopCheck.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/LoopCheck.cpp	(revision 774)
@@ -0,0 +1,5 @@
+/////////////////////////////////////////////////////
+// 循環参照をチェックするためのクラスモジュール
+/////////////////////////////////////////////////////
+
+
Index: branches/egtra/ab5.0/abdev/compiler_x86/MachineFixed.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/MachineFixed.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/MachineFixed.h	(revision 774)
@@ -0,0 +1,39 @@
+#pragma once
+
+
+//未定義の定数情報
+#define IMAGE_FILE_MACHINE_AMD64 0x8664
+
+
+//レジスタを示す定数
+#define REG_NON -1
+#define REG_EAX 0x00	//reg:000
+#define REG_ECX 0x01	//reg:001
+#define REG_EDX 0x02	//reg:010
+#define REG_EBX 0x03	//reg:011
+#define REG_ESP 0x04	//reg:100
+#define REG_EBP 0x05	//reg:101
+#define REG_ESI 0x06	//reg:110
+#define REG_EDI 0x07	//reg:111
+
+#define REG_RAX REG_EAX
+#define REG_RCX REG_ECX
+#define REG_RDX REG_EDX
+#define REG_RBX REG_EBX
+#define REG_RSP REG_ESP
+#define REG_RBP REG_EBP
+#define REG_RSI REG_ESI
+#define REG_RDI REG_EDI
+
+#define REGISTER_OPERAND(reg) (reg&0x07)
+
+
+//Mod（モード）
+#define MOD_BASE		(char)0x00
+#define MOD_DISP32		(char)0xFF
+#define MOD_BASE_DISP8	(char)0x40
+#define MOD_BASE_DISP32	(char)0x80
+#define MOD_REG			(char)0xC0
+
+#define USE_OFFSET 1
+#define NON_OFFSET 0
Index: branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp	(revision 774)
@@ -0,0 +1,1701 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "../BasicCompiler_Common/DebugSection.h"
+#include "Opcode.h"
+
+
+////////////////////////////
+// 特殊関数の構造体ポインタ
+////////////////////////////
+
+// グローバル関数、静的メソッド
+const UserProc
+	*pSub_System_StartupProgram,
+	*pSub_System_GlobalArea,
+	*pSub_DebugSys_StartProc,
+	*pSub_DebugSys_EndProc,
+	*pSub_DebugSys_SaveContext,
+	*pSub_System_GetEip,
+	*pSub_System_InitDllGlobalVariables,
+	*pSub_System_InitStaticLocalVariables,
+	*pSub_System_Call_Destructor_of_GlobalObject,
+	*pSub_System_End,
+	*pSub_pow,
+	*pSub_calloc,
+	*pSub_realloc,
+	*pSub_free,
+	*pSub_System_GC_malloc_ForObject,
+	*pSub_System_GC_malloc_ForObjectPtr,
+	*pSub_System_GC_free_for_SweepingDelete,
+	*pSub_System_AddNeedFreeTempStructure,
+	*pSub_System_FreeTempStructure,
+	*pSubStaticMethod_System_TypeBase_InitializeUserTypes,
+	*pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType,
+
+	*pSub_allrem,
+	*pSub_aullrem,
+	*pSub_allmul,
+	*pSub_alldiv,
+	*pSub_aulldiv,
+	*pSub_allshl,
+	*pSub_allshr,
+	*pSub_aullshr,
+	
+	*pSub_esp_error;
+
+// 動的メソッド
+const UserProc
+	*pUserProc_System_CGarbageCollection_RegisterGlobalRoots;
+
+
+//////////////////////////////
+// 各セクションの位置とサイズ
+int FileSize_CodeSection,
+	FileSize_ExportSection,
+	FileSize_ImportSection,
+	FileSize_DataSection,
+	FileSize_RWSection,
+	FileSize_RSrcSection,
+	FileSize_RelocSection,
+	FileSize_DebugSection;
+int FilePos_CodeSection,
+	FilePos_ExportSection,
+	FilePos_ImportSection,
+	FilePos_DataSection,
+	FilePos_RWSection,
+	FilePos_RSrcSection,
+	FilePos_RelocSection,
+	FilePos_DebugSection;
+int MemSize_CodeSection,
+	MemSize_ExportSection,
+	MemSize_ImportSection,
+	MemSize_DataSection,
+	MemSize_RWSection,
+	MemSize_RSrcSection,
+	MemSize_RelocSection,
+	MemSize_DebugSection;
+int MemPos_CodeSection,
+	MemPos_ExportSection,
+	MemPos_ImportSection,
+	MemPos_DataSection,
+	MemPos_RWSection,
+	MemPos_RSrcSection,
+	MemPos_RelocSection,
+	MemPos_DebugSection;
+int bUse_CodeSection,
+	bUse_ExportSection,
+	bUse_ImportSection,
+	bUse_DataSection,
+	bUse_RWSection,
+	bUse_RSrcSection,
+	bUse_RelocSection,
+	bUse_DebugSection;
+
+
+void MakeExe()
+{
+	extern HWND hMainDlg;
+	extern HWND hOwnerEditor;
+	extern HANDLE hHeap;
+	extern DWORD ImageBase;
+	extern char *basbuf;
+
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],*temp2;
+	HANDLE hFile;
+
+
+	//コードセクションのメモリ上の位置
+	MemPos_CodeSection=		0x1000;
+
+	//データセクションのメモリ上の位置（仮定）
+	MemPos_DataSection=		0x10000000;
+
+
+	//エクスポート セクションを利用するかどうか
+	if( compiler.IsDll() ) bUse_ExportSection=1;
+	else bUse_ExportSection=0;
+
+
+	// 静的リンク
+	compiler.PreStaticLink( compiler.staticLibraries );
+	compiler.StaticLink( compiler.staticLibraries );
+
+	// 依存関係の解決
+	ActiveBasic::Common::Lexical::ResolveErrors resolveErrors;
+	compiler.GetObjectModule().Resolve( resolveErrors );
+	foreach( const ResolveError &resolveError, resolveErrors )
+	{
+		compiler.errorMessenger.Output( ErrorInfo( 13, resolveError.GetTargetItemName(), -1 ) );
+	}
+
+
+	//////////////////
+	// データテーブル
+	if( compiler.IsDebug() ){
+		compiler.GetObjectModule().dataTable.Add( (long)0x00000002 );
+	}
+
+
+	//"メタ情報を解析中..."
+	compiler.messenger.Output( STRING_ANALYZING_META_INFO );
+
+
+	//////////////////////
+	// コード生成前の準備
+	//////////////////////
+
+	// 重複エラー情報をクリア
+	compiler.errorMessenger.ClearSynonymKeyWords();
+
+	//列挙体に関する情報を収集
+	{
+		ActiveBasic::Compiler::LexicalAnalyzer::CollectEnums(
+			compiler.GetCurrentSource().GetBuffer(),
+			compiler.enumInfoCollection
+		);
+
+		// デリゲートからクラスコードを生成
+		std::string tempSource = ActiveBasic::Compiler::LexicalAnalyzer::GenerateEnumsSourceCode(
+			compiler.enumInfoCollection
+		);
+		AddSourceCode( tempSource.c_str() );
+	}
+
+	// 名前空間情報を取得
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectNamespaces(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetNamespaces()
+	);
+
+	// デリゲートに関する情報を収集
+	{
+		ActiveBasic::Compiler::LexicalAnalyzer::CollectDelegates(
+			compiler.GetCurrentSource().GetBuffer(),
+			compiler.GetObjectModule().meta.GetDelegates()
+		);
+		compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
+
+		// デリゲートからクラスコードを生成
+		std::string tempSource = ActiveBasic::Compiler::LexicalAnalyzer::GenerateDelegatesSourceCode(
+			compiler.GetObjectModule().meta.GetDelegates()
+		);
+		AddSourceCode( tempSource.c_str() );
+	}
+
+	//クラス名を取得（詳細情報はCollectClassesで取得）
+	//   CollectProcedures関数の中で参照されるオブジェクト名を事前に取得する。
+	//     ※オブジェクトの内容までは取得しない
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectClassesForNameOnly(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+	//TypeDef情報を収集
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectTypeDefs(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetTypeDefs()
+	);
+
+	/*
+	デリゲートのパラメータを再取得
+	クラス/TypeDefなどの型名前情報がすべて揃ってからでないと
+	型情報に依存するパラメータ情報を取得できないため、ここでの再取得が必要
+	*/
+	ActiveBasic::Compiler::LexicalAnalyzer::RefleshDelegatesParameterAndReturnType(
+		compiler.GetObjectModule().meta.GetDelegates()
+	);
+
+	//定数情報を取得
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectConsts(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetGlobalConsts(),
+		compiler.GetObjectModule().meta.GetGlobalConstMacros()
+	);
+
+	// サブルーチン（ユーザー定義、DLL関数）の識別子、アドレスを取得
+	compiler.SetCompilingClass( NULL );
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectProcedures(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetUserProcs(),
+		compiler.GetObjectModule().meta.GetDllProcs()
+	);
+
+	// クラス情報を取得（※注 - CollectProceduresの後に呼び出す）
+	ActiveBasic::Compiler::LexicalAnalyzer::CollectClasses(
+		compiler.GetCurrentSource().GetBuffer(),
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+	// サブルーチン（ユーザー定義、DLL関数）のイテレータの準備
+	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Init();
+
+
+
+	///////////////////////////
+	// 最低限必要な関数を取得
+	///////////////////////////
+	cp=-1;
+
+	if(pSub_System_StartupProgram=GetSubHash("_System_StartupProgram",1))
+		pSub_System_StartupProgram->Using();
+
+	if(pSub_System_GlobalArea=GetSubHash(compiler.GetGlobalAreaProcName().c_str(),1))
+	{
+		pSub_System_GlobalArea->Using();
+		pSub_System_GlobalArea->ThisIsAutoGenerationProc();
+	}
+
+	if(pSub_DebugSys_StartProc=GetSubHash("_DebugSys_StartProc",1))
+		pSub_DebugSys_StartProc->Using();
+
+	if(pSub_DebugSys_EndProc=GetSubHash("_DebugSys_EndProc",1))
+		pSub_DebugSys_EndProc->Using();
+
+	if(pSub_DebugSys_SaveContext=GetSubHash("_DebugSys_SaveContext",1))
+		pSub_DebugSys_SaveContext->Using();
+
+	if(pSub_System_GetEip=GetSubHash("_System_GetEip",1)){
+		pSub_System_GetEip->Using();
+		pSub_System_GetEip->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_InitDllGlobalVariables=GetSubHash("_System_InitDllGlobalVariables",1)){
+		pSub_System_InitDllGlobalVariables->Using();
+		pSub_System_InitDllGlobalVariables->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_InitStaticLocalVariables=GetSubHash("_System_InitStaticLocalVariables",1)){
+		pSub_System_InitStaticLocalVariables->Using();
+		pSub_System_InitStaticLocalVariables->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_Call_Destructor_of_GlobalObject=GetSubHash("_System_Call_Destructor_of_GlobalObject",1)){
+		pSub_System_Call_Destructor_of_GlobalObject->Using();
+		pSub_System_Call_Destructor_of_GlobalObject->ThisIsAutoGenerationSystemProc();
+	}
+
+	if(pSub_System_End=GetSubHash("_System_End",1)){
+		pSub_System_End->Using();
+	}
+
+	if(pSub_pow=GetSubHash("pow",1))
+		pSub_pow->Using();
+
+	if(pSub_calloc=GetSubHash("calloc",1))
+		pSub_calloc->Using();
+
+	if(pSub_realloc=GetSubHash("realloc",1))
+		pSub_realloc->Using();
+
+	if(pSub_free=GetSubHash("free",1))
+		pSub_free->Using();
+
+	if( pSub_System_GC_malloc_ForObject = GetSubHash( "_System_GC_malloc_ForObject",1 ) )
+		pSub_System_GC_malloc_ForObject->Using();
+
+	if( pSub_System_GC_malloc_ForObjectPtr = GetSubHash( "_System_GC_malloc_ForObjectPtr",1 ) )
+		pSub_System_GC_malloc_ForObjectPtr->Using();
+
+	if( pSub_System_GC_free_for_SweepingDelete = GetSubHash( "_System_GC_free_for_SweepingDelete",1 ) )
+		pSub_System_GC_free_for_SweepingDelete->Using();
+
+	if( pSub_System_AddNeedFreeTempStructure = GetSubHash( "_System_AddNeedFreeTempStructure",1 ) )
+	{
+		pSub_System_AddNeedFreeTempStructure->Using();
+	}
+	if( pSub_System_FreeTempStructure = GetSubHash( "_System_FreeTempStructure",1 ) )
+	{
+		pSub_System_FreeTempStructure->Using();
+	}
+
+	if( pSubStaticMethod_System_TypeBase_InitializeUserTypes = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypes",1 ) ){
+		pSubStaticMethod_System_TypeBase_InitializeUserTypes->Using();
+		pSubStaticMethod_System_TypeBase_InitializeUserTypes->ThisIsAutoGenerationProc();
+	}
+	
+	if( pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType = GetSubHash( "ActiveBasic.Core._System_TypeBase.InitializeUserTypesForBaseType",1 ) ){
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->Using();
+		pSubStaticMethod_System_TypeBase_InitializeUserTypesForBaseType->ThisIsAutoGenerationProc();
+	}
+
+	if( pUserProc_System_CGarbageCollection_RegisterGlobalRoots = GetClassMethod( "_System_CGarbageCollection", "RegisterGlobalRoots" ) ){
+		pUserProc_System_CGarbageCollection_RegisterGlobalRoots->Using();
+		pUserProc_System_CGarbageCollection_RegisterGlobalRoots->ThisIsAutoGenerationProc();
+	}
+
+	pSub_allrem=GetSubHash("_allrem");
+	pSub_allrem->Using();
+	pSub_allrem->ThisIsAutoGenerationSystemProc();
+
+	pSub_aullrem=GetSubHash("_aullrem");
+	pSub_aullrem->Using();
+	pSub_aullrem->ThisIsAutoGenerationSystemProc();
+
+	pSub_allmul=GetSubHash("_allmul");
+	pSub_allmul->Using();
+	pSub_allmul->ThisIsAutoGenerationSystemProc();
+
+	pSub_alldiv=GetSubHash("_alldiv");
+	pSub_alldiv->Using();
+	pSub_alldiv->ThisIsAutoGenerationSystemProc();
+
+	pSub_aulldiv=GetSubHash("_aulldiv");
+	pSub_aulldiv->Using();
+	pSub_aulldiv->ThisIsAutoGenerationSystemProc();
+
+	pSub_allshl=GetSubHash("_allshl");
+	pSub_allshl->Using();
+	pSub_allshl->ThisIsAutoGenerationSystemProc();
+
+	pSub_allshr=GetSubHash("_allshr");
+	pSub_allshr->Using();
+	pSub_allshr->ThisIsAutoGenerationSystemProc();
+
+	pSub_aullshr=GetSubHash("_aullshr");
+	pSub_aullshr->Using();
+	pSub_aullshr->ThisIsAutoGenerationSystemProc();
+
+	pSub_esp_error=GetSubHash("_esp_error");
+	pSub_esp_error->Using();
+
+
+	//リロケーション情報
+	pobj_Reloc=new CReloc();
+
+	//レキシカルスコープ情報を初期化
+	compiler.codeGenerator.lexicalScopes.Init( 0 );
+	//compiler.codeGenerator.lexicalScopes.Init( compiler.codeGenerator.GetNativeCodeSize() );
+
+	// 名前空間が初期化されているかをチェック
+	if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// デバッグコンパイル用のログを生成する
+	/////////////////////////////////////////////////////////////////
+#ifdef _DEBUG
+	{
+		std::ofstream ofs( ( Jenga::Common::Environment::GetAppDir() + "\\middle_code.txt" ).c_str() );
+		ofs << basbuf << std::endl;
+		ofs.close();
+	}
+#endif
+
+
+	//"コンパイル中..."
+	compiler.messenger.Output(STRING_COMPILE_COMPILING);
+
+
+	//////////////////////
+	// グローバル実行領域
+	//////////////////////
+
+	cp=-1;
+	compiler.StartGlobalAreaCompile();
+
+	if( !compiler.IsDll() )
+	{
+		//ラベル管理オブジェクトを初期化
+		compiler.codeGenerator.gotoLabels.clear();
+
+		//Gotoラベルスケジュール
+		compiler.codeGenerator.gotoLabelSchedules.clear();
+
+		//With情報を初期化
+		extern WithInfos withInfos;
+		withInfos.clear();
+
+		//Continueアドレスを初期化
+		compiler.codeGenerator.ClearContinueArea();
+
+		// コード生成対象を選択
+		compiler.codeGenerator.Select( compiler.GetObjectModule().globalNativeCode );
+
+		trace_for_sourcecodestep( "★★★ グローバル領域のコンパイルを開始" );
+
+		if( compiler.IsCore() )
+		{
+			// コアモジュール（basic.sbp）をコンパイルするとき
+
+			//push ebp
+			compiler.codeGenerator.op_push(REG_EBP);
+
+			if( compiler.IsDebug() )
+			{
+				// デバッグ用の変数を定義
+				DebugVariable();
+			}
+
+			// GC用の変数を定義
+			InitGCVariables();
+
+			// _System_StartupProgram の呼び出し
+			compiler.codeGenerator.op_call(pSub_System_StartupProgram);
+		}
+
+		// _System_GlobalArea の呼び出し
+		compiler.codeGenerator.op_call( pSub_System_GlobalArea );
+
+		if( !compiler.IsSll() )
+		{
+			///////////////////////////////////////
+			// グローバル文字列変数の解放処理
+			///////////////////////////////////////
+
+			//call _System_End
+			extern const UserProc *pSub_System_End;
+			compiler.codeGenerator.op_call(pSub_System_End);
+
+
+			//xor eax,eax（eaxを0に初期化する）
+			compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+			//pop ebp
+			compiler.codeGenerator.op_pop(REG_EBP);
+
+			//ret
+			compiler.codeGenerator.op_ret();
+		}
+
+		//グローバル実行領域のコードサイズ
+		extern int GlobalOpBufferSize;
+		GlobalOpBufferSize = compiler.linker.GetNativeCode().GetSize();
+
+		// 名前空間が正しく閉じられているかをチェック
+		if( compiler.GetNamespaceSupporter().GetLivingNamespaceScopes().size() ){
+			compiler.errorMessenger.Output(63,NULL,-1);
+		}
+
+	}
+	else{
+		////////////////
+		// DLLの場合
+		////////////////
+
+	}
+
+
+	StepCompileProgress();
+
+
+	/////////////////////
+	// ローカル実行領域
+	/////////////////////
+
+	//プロシージャをコンパイル開始
+	cp=0;
+	CompileLocal();
+
+	// 終了
+	///////////////////////
+
+	StepCompileProgress();
+
+
+	trace( "コード生成が終了しました。" );
+
+
+	if( compiler.IsSll() )
+	{
+		// 静的リンクライブラリ
+
+		// 外部参照をlibから取り除く
+		ActiveBasic::Common::Environment::SetRemoveExternalMark( true );
+
+		// 格納先ディレクトリを作る
+		Jenga::Common::Path path( program.GetOutputFilePath() );
+		Jenga::Common::Directory dir( path.GetDirPath(), true );
+
+		// 書き込む
+		if( !compiler.GetObjectModule().Write( program.GetOutputFilePath() ) )
+		{
+			MessageBox(0,"XML書き込みに失敗","test",0);
+		}
+		return;
+	}
+
+	if( !compiler.errorMessenger.HasError() )
+	{
+		compiler.messenger.Output( "リンク中..." );
+	}
+
+
+	compiler.linker.Link( compiler.GetObjectModule() );
+
+
+	/////////////////////////////////////////////////////////////////
+	// vtblの構築
+	/////////////////////////////////////////////////////////////////
+
+	ActiveBasic::Compiler::VtblGenerator::GenerateVTablesForAllClasses(
+		compiler.GetObjectModule().meta.GetClasses()
+	);
+
+
+
+	////////////////////////////////
+	// ここで一旦ログを取る
+	////////////////////////////////
+
+	Diagnose();
+
+
+
+	////////////////////////////////
+	// 使用するDLL関数のチェック
+	////////////////////////////////
+	foreach( const Schedule &schedule, compiler.linker.GetNativeCode().GetSchedules() )
+	{
+		if( schedule.GetType() == Schedule::DllProc )
+		{
+			schedule.GetDllProc().Using();
+		}
+	}
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+	{
+		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+		if( !pDllProc->IsUsing() ){
+			continue;
+		}
+
+		//エラーチェック
+		HINSTANCE hLib;
+		hLib=LoadLibrary( pDllProc->GetDllFileName().c_str() );
+		if(!hLib){
+			char temp2[MAX_PATH],temp3[MAX_PATH];
+			_splitpath(program.GetOutputFilePath().c_str(),temp2,temp3,NULL,NULL);
+			lstrcat(temp2,temp3);
+			lstrcpy(temp3,pDllProc->GetDllFileName().c_str());
+			GetFullPath(temp3,temp2);
+			hLib=LoadLibrary(temp3);
+
+			if(!hLib){
+				compiler.errorMessenger.Output(-106,pDllProc->GetDllFileName().c_str(),pDllProc->GetSourceCodePosition().GetPos());
+			}
+		}
+
+		if(hLib){
+			if(!GetProcAddress(hLib,pDllProc->GetAlias().c_str())){
+				FreeLibrary(hLib);
+				compiler.errorMessenger.Output(-107,pDllProc->GetAlias(),pDllProc->GetSourceCodePosition().GetPos());
+			}
+			FreeLibrary(hLib);
+		}
+	}
+
+
+
+	/////////////////////////////
+	// リソースデータを読み込む
+	/////////////////////////////
+	extern char ResourceFileName[MAX_PATH];
+	compiler.resourceManager.Load( ResourceFileName );
+
+
+	//////////////////////////////
+	// エクスポート情報（DLLのみ）
+	//////////////////////////////
+	IMAGE_EXPORT_DIRECTORY ImageExportDirectory;
+	DWORD *lpdwExportAddressTable;
+	DWORD *lpdwExportNamePointerTable;
+	WORD *lpwExportOrdinalTable;
+	char lpExportNames[8192];
+	int ExportNamesLength;
+	int ExportNum;
+	int DllMain_EntryPoint;
+
+	DllMain_EntryPoint=-1;
+	ExportNum=0;
+	ExportNamesLength=0;
+	lpdwExportAddressTable=(DWORD *)HeapAlloc(hHeap,0,1);
+	lpdwExportNamePointerTable=(DWORD *)HeapAlloc(hHeap,0,1);
+	lpwExportOrdinalTable=(WORD *)HeapAlloc(hHeap,0,1);
+
+	if(bUse_ExportSection){
+		_splitpath(program.GetOutputFilePath().c_str(),NULL,NULL,lpExportNames,temporary);
+		lstrcat(lpExportNames,temporary);
+		ExportNamesLength=lstrlen(lpExportNames)+1;
+
+		while(1)
+		{
+			UserProc *pUserProc = NULL;
+
+			//辞書順にサーチ
+			temporary[0]=0;
+			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
+			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			{
+				UserProc *pTempUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+				if(pTempUserProc->IsExport()){
+					if(temporary[0]=='\0'){
+						lstrcpy(temporary,pTempUserProc->GetName().c_str());
+						pUserProc = pTempUserProc;
+					}
+					else{
+						i3=lstrlen(temporary);
+						i4=(int)pTempUserProc->GetName().size();
+						if(i3<i4) i3=i4;
+						if(memcmp(temporary,pTempUserProc->GetName().c_str(),i3)>0){
+							lstrcpy(temporary,pTempUserProc->GetName().c_str());
+							pUserProc = pTempUserProc;
+						}
+					}
+				}
+			}
+			if( pUserProc == NULL )
+			{
+				break;
+			}
+
+			pUserProc->ExportOff();
+
+			if( pUserProc->GetName() == "DllMain" ){
+				DllMain_EntryPoint = pUserProc->GetBeginOpAddress();
+			}
+
+			lpdwExportAddressTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportAddressTable,(ExportNum+1)*sizeof(DWORD));
+			lpdwExportAddressTable[ExportNum] = pUserProc->GetBeginOpAddress();
+
+			lpdwExportNamePointerTable=(DWORD *)HeapReAlloc(hHeap,0,lpdwExportNamePointerTable,(ExportNum+1)*sizeof(DWORD));
+			lpdwExportNamePointerTable[ExportNum]=ExportNamesLength;
+
+			lpwExportOrdinalTable=(WORD *)HeapReAlloc(hHeap,0,lpwExportOrdinalTable,(ExportNum+1)*sizeof(WORD));
+			lpwExportOrdinalTable[ExportNum]=ExportNum;
+
+			lstrcpy(lpExportNames+ExportNamesLength,pUserProc->GetName().c_str());
+			ExportNamesLength+=lstrlen(lpExportNames+ExportNamesLength)+1;
+
+			ExportNum++;
+		}
+		for(i=0;i<ExportNum;i++){
+			lpdwExportNamePointerTable[i]+=
+				sizeof(IMAGE_EXPORT_DIRECTORY)+	//エクスポートディレクトリテーブルを飛び越す
+				ExportNum*sizeof(DWORD)+		//エクスポート アドレス テーブルを飛び越す
+				ExportNum*sizeof(DWORD)+		//エクスポート名ポインタ テーブルを飛び越す
+				ExportNum*sizeof(WORD);			//エクスポート序数テーブルを飛び越す
+		}
+
+		ImageExportDirectory.Characteristics=0;
+		ImageExportDirectory.TimeDateStamp=(DWORD)time(NULL);
+		ImageExportDirectory.MajorVersion=0;
+		ImageExportDirectory.MinorVersion=0;
+		ImageExportDirectory.Name=sizeof(IMAGE_EXPORT_DIRECTORY)+
+			ExportNum*sizeof(DWORD)+	//エクスポート アドレス テーブルを飛び越す
+			ExportNum*sizeof(DWORD)+	//エクスポート名ポインタ テーブルを飛び越す
+			ExportNum*sizeof(WORD);		//エクスポート序数テーブルを飛び越す
+		ImageExportDirectory.Base=1;
+		ImageExportDirectory.NumberOfFunctions=ExportNum;
+		ImageExportDirectory.NumberOfNames=ExportNum;
+		ImageExportDirectory.AddressOfFunctions=sizeof(IMAGE_EXPORT_DIRECTORY);
+		ImageExportDirectory.AddressOfNames=ImageExportDirectory.AddressOfFunctions+ExportNum*sizeof(DWORD);
+		ImageExportDirectory.AddressOfNameOrdinals=ImageExportDirectory.AddressOfNames+ExportNum*sizeof(DWORD);
+	}
+
+
+	/////////////////////
+	//インポートDLL情報
+	/////////////////////
+
+	/*
+	IMAGE_IMPORT_DESCRIPTOR1[size=0x14]	インポートヘッダ
+	IMAGE_IMPORT_DESCRIPTOR2[size=0x14]
+	IMAGE_IMPORT_DESCRIPTOR3[size=0x14]
+	...
+	Dll名1[size=0x10]
+	Dll名2[size=0x10]
+	Dll名3[size=0x10]
+	...
+	ルックアップ テーブル（ヒントを示すRVA）
+	ヒントテーブル
+	インポート アドレス テーブル（ルックアップと同じ内容だが、プログラム実行時に実行アドレスに書き換えられる）
+	*/
+
+	char **ppDllNames=(char **)HeapAlloc(hHeap,0,1);
+
+	int ImportDllNum=0;
+
+	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+	{
+		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+		if( !pDllProc->IsUsing() ){
+			continue;
+		}
+
+		if( pDllProc->GetDllFileName().size() > 16 ){
+			compiler.errorMessenger.Output(7,NULL,cp);
+			break;
+		}
+		for(i2=0;i2<ImportDllNum;i2++){
+			if( pDllProc->GetDllFileName() == ppDllNames[i2] ){
+				break;
+			}
+		}
+		if(i2==ImportDllNum){
+			ppDllNames=(char **)HeapReAlloc(hHeap,0,ppDllNames,(ImportDllNum+1)*sizeof(char **));
+			ppDllNames[ImportDllNum]=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,16);
+			lstrcpy(ppDllNames[ImportDllNum],pDllProc->GetDllFileName().c_str());
+			ImportDllNum++;
+		}
+	}
+
+	//インポート テーブル、及びルックアップ テーブル サイズの計算
+	IMAGE_IMPORT_DESCRIPTOR *pImportTable;
+	int LookupSize;
+	LookupSize=0;
+	pImportTable=(IMAGE_IMPORT_DESCRIPTOR *)HeapAlloc(hHeap,0,(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR));
+	i3=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR);
+	for(i=0;i<ImportDllNum;i++){
+		//インポート テーブル（IMAGE_IMPORT_DESCRIPTOR）
+		pImportTable[i].OriginalFirstThunk=i3+(ImportDllNum*0x10)+LookupSize;
+		pImportTable[i].TimeDateStamp=0;
+		pImportTable[i].ForwarderChain=0;
+		pImportTable[i].Name=i3+i*0x10;
+
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップデータのサイズを追加
+				LookupSize+=sizeof(DWORD);
+			}
+		}
+		LookupSize+=sizeof(DWORD);	//NULL用
+	}
+	memset(&pImportTable[i],0,sizeof(IMAGE_IMPORT_DESCRIPTOR));
+
+	//ルックアップ テーブル、ヒント テーブル
+	DWORD *pLookupTable;
+	pLookupTable=(DWORD *)HeapAlloc(hHeap,0,LookupSize*sizeof(DWORD)+1);
+	char *pHintTable;
+	int HintSize,HintAllocSize;
+	HintSize=0;
+	HintAllocSize=128*2;
+	pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
+	i3+=ImportDllNum*0x10;
+	for(i=0,i5=0;i<ImportDllNum;i++){
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップの位置をセット（後にインポート アドレス テーブルにセットしなおされる）
+				pDllProc->SetLookupAddress( i3+(i5*sizeof(DWORD)) );
+
+				//ルックアップ テーブル
+				pLookupTable[i5++]=i3+LookupSize+HintSize;
+
+				//ヒント テーブル
+				pHintTable[HintSize++]=0;
+				pHintTable[HintSize++]=0;
+				lstrcpy(pHintTable+HintSize,pDllProc->GetAlias().c_str());
+				i4=(int)pDllProc->GetAlias().size();
+				HintSize+=i4+1;
+				if(i4%2==0) pHintTable[HintSize++]=0;
+
+				if(HintAllocSize<HintSize+128){
+					HintAllocSize+=128;
+					pHintTable=(char *)HeapReAlloc(hHeap,0,pHintTable,HintAllocSize);
+				}
+			}
+		}
+		pLookupTable[i5++]=0;
+	}
+
+
+	if( compiler.IsDll() ){
+		//DLLの場合はリロケーション情報を仮生成
+		//※正式な生成は各セクションのメモリ上のサイズが決定してから再度行う。
+		pobj_Reloc->ResetRelocBuffer();
+	}
+
+
+
+	//グローバル変数情報を扱う構造体も初期バッファの有無による配置を行う
+	//（デバッグ情報で利用される）
+	foreach( Variable *pVar, compiler.GetObjectModule().meta.GetGlobalVars() ){
+		if(pVar->GetOffsetAddress()&0x80000000){
+			pVar->SetOffsetAddress(
+				(pVar->GetOffsetAddress()&0x7FFFFFFF)
+				+ compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+			);
+		}
+	}
+
+
+
+	////////////////////////////////////
+	// デバッグセクションを生成
+	////////////////////////////////////
+
+	//デバッグセクションを生成
+	DebugSection *pobj_DebugSection;
+	pobj_DebugSection=new DebugSection();
+	if( compiler.IsDebug() && !compiler.errorMessenger.HasError() )
+	{
+		compiler.messenger.Output( "デバッグ情報を生成しています。" );
+
+		pobj_DebugSection->make( compiler.linker.GetNativeCode().GetSourceLines() );
+
+		compiler.messenger.Output( "デバッグ情報の生成が完了しました。" );
+	}
+
+
+
+	/////////////////////////////////////
+	// 各セクションの位置とサイズを計算
+	/////////////////////////////////////
+
+	//コードセッションのファイル上のサイズ
+	if(compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT)
+	{
+		FileSize_CodeSection =
+			compiler.linker.GetNativeCode().GetSize()
+			+ (FILE_ALIGNMENT-compiler.linker.GetNativeCode().GetSize()%FILE_ALIGNMENT);
+	}
+	else
+	{
+		FileSize_CodeSection = compiler.linker.GetNativeCode().GetSize();
+	}
+	if(FileSize_CodeSection) bUse_CodeSection=1;
+	else bUse_CodeSection=0;
+
+	//エクスポートセクションのファイル上のサイズ
+	i=	sizeof(IMAGE_EXPORT_DIRECTORY)+	//エクスポートディレクトリテーブルを飛び越す
+		ExportNum*sizeof(DWORD)+		//エクスポート アドレス テーブルを飛び越す
+		ExportNum*sizeof(DWORD)+		//エクスポート名ポインタ テーブルを飛び越す
+		ExportNum*sizeof(WORD)+			//エクスポート序数テーブルを飛び越す
+		ExportNamesLength;				//シンボル名バッファ
+	if(bUse_ExportSection){
+		if(i%FILE_ALIGNMENT) FileSize_ExportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		else FileSize_ExportSection=i;
+	}
+	else FileSize_ExportSection=0;
+
+	//インポートセクションのファイル上のサイズ
+	i=(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+		16*ImportDllNum+	//DLL名
+		LookupSize+			//ルックアップテーブル
+		HintSize+			//ヒント名（関数名）テーブル
+		LookupSize;			//インポート アドレス テーブル
+	if(i%FILE_ALIGNMENT) FileSize_ImportSection=i+(FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+	else FileSize_ImportSection=i;
+	bUse_ImportSection=1;	//インポートセクションは必ず存在する
+
+	//データセクションのファイル上のサイズ
+	if(compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT) FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize()+(FILE_ALIGNMENT-compiler.GetObjectModule().dataTable.GetSize()%FILE_ALIGNMENT);
+	else FileSize_DataSection=compiler.GetObjectModule().dataTable.GetSize();
+	if(FileSize_DataSection) bUse_DataSection=1;
+	else bUse_DataSection=0;
+
+	//リライタブルセクションのファイル上のサイズ（グローバル変数の初期情報のみを格納）
+	if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() % FILE_ALIGNMENT )
+	{
+		FileSize_RWSection =
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+			+ (FILE_ALIGNMENT-compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()%FILE_ALIGNMENT);
+	}
+	else{
+		if( compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize() )
+		{
+			FileSize_RWSection = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize();
+		}
+		else FileSize_RWSection=FILE_ALIGNMENT;
+	}
+	bUse_RWSection=1;
+
+	//リソースセクションのファイル上のサイズ
+	char *RSrcSectionBuffer;
+	int RSrcSectionSize;
+	RSrcSectionBuffer=GetRSrcSectionBuffer(&RSrcSectionSize);
+	if(RSrcSectionSize%FILE_ALIGNMENT) FileSize_RSrcSection=RSrcSectionSize+(FILE_ALIGNMENT-RSrcSectionSize%FILE_ALIGNMENT);
+	else FileSize_RSrcSection=RSrcSectionSize;
+	if(FileSize_RSrcSection) bUse_RSrcSection=1;
+	else bUse_RSrcSection=0;
+
+	//リロケーションセクションのファイル上のサイズ
+	if(pobj_Reloc->length%FILE_ALIGNMENT) FileSize_RelocSection=pobj_Reloc->length+(FILE_ALIGNMENT-pobj_Reloc->length%FILE_ALIGNMENT);
+	else FileSize_RelocSection=pobj_Reloc->length;
+	if(FileSize_RelocSection) bUse_RelocSection=1;
+	else bUse_RelocSection=0;
+
+	//デバッグセクションのファイル上のサイズ
+	if(pobj_DebugSection->length%FILE_ALIGNMENT) FileSize_DebugSection=pobj_DebugSection->length+(FILE_ALIGNMENT-pobj_DebugSection->length%FILE_ALIGNMENT);
+	else FileSize_DebugSection=pobj_DebugSection->length;
+	if(FileSize_DebugSection) bUse_DebugSection=1;
+	else bUse_DebugSection=0;
+
+
+	//各セッションのファイル上の位置
+	FilePos_CodeSection=	EXE_HEADER_SIZE;
+	FilePos_ExportSection=	FilePos_CodeSection+
+							FileSize_CodeSection;
+	FilePos_ImportSection=	FilePos_ExportSection+
+							FileSize_ExportSection;
+	FilePos_DataSection=	FilePos_ImportSection+
+							FileSize_ImportSection;
+	FilePos_RWSection=		FilePos_DataSection+
+							FileSize_DataSection;
+	FilePos_RSrcSection=	FilePos_RWSection+
+							FileSize_RWSection;
+	FilePos_RelocSection=	FilePos_RSrcSection+
+							FileSize_RSrcSection;
+	FilePos_DebugSection=	FilePos_RelocSection+
+							FileSize_RelocSection;
+
+
+	//コードセッションのメモリ上のサイズ
+	if(FileSize_CodeSection%MEM_ALIGNMENT) MemSize_CodeSection=FileSize_CodeSection+(MEM_ALIGNMENT-FileSize_CodeSection%MEM_ALIGNMENT);
+	else MemSize_CodeSection=FileSize_CodeSection;
+
+	//エクスポートセクションのメモリ上のサイズ
+	if(FileSize_ExportSection%MEM_ALIGNMENT) MemSize_ExportSection=FileSize_ExportSection+(MEM_ALIGNMENT-FileSize_ExportSection%MEM_ALIGNMENT);
+	else MemSize_ExportSection=FileSize_ExportSection;
+
+	//インポートセクションのメモリ上のサイズ
+	if(FileSize_ImportSection%MEM_ALIGNMENT) MemSize_ImportSection=FileSize_ImportSection+(MEM_ALIGNMENT-FileSize_ImportSection%MEM_ALIGNMENT);
+	else MemSize_ImportSection=FileSize_ImportSection;
+
+	//データセクションのメモリ上のサイズ
+	if(FileSize_DataSection%MEM_ALIGNMENT) MemSize_DataSection=FileSize_DataSection+(MEM_ALIGNMENT-FileSize_DataSection%MEM_ALIGNMENT);
+	else MemSize_DataSection=FileSize_DataSection;
+
+	//リライタブルセクションのメモリ上のサイズ
+	i = compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+		+ compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
+	if(i%MEM_ALIGNMENT) MemSize_RWSection=i+(MEM_ALIGNMENT-i%MEM_ALIGNMENT);
+	else MemSize_RWSection=i;
+
+	//リソースセクションのメモリ上のサイズ
+	if(FileSize_RSrcSection%MEM_ALIGNMENT) MemSize_RSrcSection=FileSize_RSrcSection+(MEM_ALIGNMENT-FileSize_RSrcSection%MEM_ALIGNMENT);
+	else MemSize_RSrcSection=FileSize_RSrcSection;
+
+	//リロケーションセクションのメモリ上のサイズ
+	if(FileSize_RelocSection%MEM_ALIGNMENT) MemSize_RelocSection=FileSize_RelocSection+(MEM_ALIGNMENT-FileSize_RelocSection%MEM_ALIGNMENT);
+	else MemSize_RelocSection=FileSize_RelocSection;
+
+	//デバッグセクションのメモリ上のサイズ
+	if(FileSize_DebugSection%MEM_ALIGNMENT) MemSize_DebugSection=FileSize_DebugSection+(MEM_ALIGNMENT-FileSize_DebugSection%MEM_ALIGNMENT);
+	else MemSize_DebugSection=FileSize_DebugSection;
+
+
+	//各セッションのメモリ上の位置
+	if(bUse_ExportSection)	MemPos_ExportSection=	0x1000+
+													MemSize_CodeSection;
+	else					MemPos_ExportSection=0;
+	if(bUse_ImportSection)	MemPos_ImportSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection;
+	else					MemPos_ImportSection=0;
+	if(bUse_DataSection)	MemPos_DataSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection;
+	else					MemPos_DataSection=0;
+	if(bUse_RWSection)		MemPos_RWSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection;
+	else					MemPos_RWSection=0;
+	if(bUse_RSrcSection)	MemPos_RSrcSection=		0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection;
+	else					MemPos_RSrcSection=0;
+	if(bUse_RelocSection)	MemPos_RelocSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection;
+	else					MemPos_RelocSection=0;
+	if(bUse_DebugSection)	MemPos_DebugSection=	0x1000+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection+
+													MemSize_RelocSection;
+	else					MemPos_DebugSection=0;
+
+
+
+	////////////////////////////
+	// エクスポート情報の再配置
+	////////////////////////////
+	if(bUse_ExportSection){
+		for(i=0;i<ExportNum;i++){
+			lpdwExportAddressTable[i]+=MemPos_CodeSection;
+			lpdwExportNamePointerTable[i]+=MemPos_ExportSection;
+		}
+
+		ImageExportDirectory.Name+=						MemPos_ExportSection;
+		ImageExportDirectory.AddressOfFunctions+=		MemPos_ExportSection;
+		ImageExportDirectory.AddressOfNames+=			MemPos_ExportSection;
+		ImageExportDirectory.AddressOfNameOrdinals+=	MemPos_ExportSection;
+	}
+
+
+	////////////////////////////
+	// インポート情報の再配置
+	////////////////////////////
+	for(i=0,i5=0;i<ImportDllNum;i++){
+		//インポート テーブル（IMAGE_IMPORT_DESCRIPTOR）
+		pImportTable[i].OriginalFirstThunk+=MemPos_ImportSection;
+		pImportTable[i].Name+=MemPos_ImportSection;
+
+		//インポート アドレス テーブル（ルックアップとヒントを飛び越す）
+		pImportTable[i].FirstThunk=pImportTable[i].OriginalFirstThunk+
+			LookupSize+			//ルックアップテーブル
+			HintSize;			//ヒント名（関数名）テーブル
+
+		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
+		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		{
+			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
+
+			if( !pDllProc->IsUsing() ){
+				continue;
+			}
+
+			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+				//ルックアップ テーブル
+				pLookupTable[i5++]+=MemPos_ImportSection;
+			}
+		}
+		i5++;
+	}
+
+
+	////////////////////////////////////////
+	//仮想関数データテーブルスケジュール
+	ActiveBasic::Compiler::VtblGenerator::ActionVtblScheduleForAllClasses(
+		compiler.GetObjectModule().meta.GetClasses(),
+		ImageBase,
+		MemPos_CodeSection,
+		MemPos_DataSection
+	);
+
+
+	if( compiler.IsDll() ){
+		//DLLの場合はリロケーション情報を生成
+		pobj_Reloc->ResetRelocBuffer();
+	}
+
+	compiler.linker.SetDataTable( compiler.GetObjectModule().dataTable );
+
+	compiler.linker.SetImageBase( ImageBase );
+	compiler.linker.ResolveDataTableSchedules( MemPos_DataSection );
+	compiler.linker.ResolveCatchAddressSchedules( MemPos_CodeSection );
+	compiler.linker.ResolveDllProcSchedules( MemPos_CodeSection, MemPos_ImportSection, LookupSize, HintSize );
+	compiler.linker.ResolveUserProcSchedules( MemPos_CodeSection );
+	compiler.linker.ResolveGlobalVarSchedules( MemPos_RWSection );
+	compiler.linker.ResolveVtblSchedule( MemPos_DataSection );
+	compiler.linker.ResolveTypeInfoSchedule( MemPos_DataSection );
+
+
+
+	////////////////////////////////
+	// リソースアドレススケジュール
+	extern DWORD *lpdwRSrcAddrSchedule;
+	extern int RSrcAddrScheduleNum;
+	for(i=0;i<RSrcAddrScheduleNum;i++){
+		*(DWORD *)(RSrcSectionBuffer+lpdwRSrcAddrSchedule[i])+=MemPos_RSrcSection;
+	}
+	HeapDefaultFree(lpdwRSrcAddrSchedule);
+
+
+	//Dosスタブ
+	char *DosStubBuffer;
+	int DosStubSize;
+	hFile=CreateFile(
+		( ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\dosstub.pgm" ).c_str(),
+		GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		MessageBox(hOwnerEditor,"dosstub.pgmの読み込みに失敗","error",MB_OK);
+		goto EndWriteOpcode;
+	}
+	DosStubSize=GetFileSize(hFile,NULL);
+	DosStubBuffer=(char *)HeapAlloc(hHeap,0,DosStubSize);
+	ReadFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+	CloseHandle(hFile);
+
+
+	if( compiler.errorMessenger.HasError() )
+	{
+		goto EndWriteOpcode;
+	}
+
+
+	////////////////////////////
+	// EXEファイルのヘッダ情報
+	////////////////////////////
+
+	IMAGE_DOS_HEADER ImageDosHeader;
+	ImageDosHeader.e_magic=	0x5A4D;
+	ImageDosHeader.e_cblp=	0x0090;
+	ImageDosHeader.e_cp=	0x0003;
+	ImageDosHeader.e_crlc=	0;
+	ImageDosHeader.e_cparhdr=4;
+	ImageDosHeader.e_minalloc=0x0000;
+	ImageDosHeader.e_maxalloc=0xFFFF;
+	ImageDosHeader.e_ss=	0x0000;
+	ImageDosHeader.e_sp=	0x00B8;
+	ImageDosHeader.e_csum=	0x0000;
+	ImageDosHeader.e_ip=	0x0000;
+	ImageDosHeader.e_cs=	0x0000;
+	ImageDosHeader.e_lfarlc=0x0040;
+	ImageDosHeader.e_ovno=	0x0000;
+	ImageDosHeader.e_res[0]=0;
+	ImageDosHeader.e_res[1]=0;
+	ImageDosHeader.e_res[2]=0;
+	ImageDosHeader.e_res[3]=0;
+	ImageDosHeader.e_oemid=	0x0000;
+	ImageDosHeader.e_oeminfo=0x0000;
+	ImageDosHeader.e_res2[0]=0;
+	ImageDosHeader.e_res2[1]=0;
+	ImageDosHeader.e_res2[2]=0;
+	ImageDosHeader.e_res2[3]=0;
+	ImageDosHeader.e_res2[4]=0;
+	ImageDosHeader.e_res2[5]=0;
+	ImageDosHeader.e_res2[6]=0;
+	ImageDosHeader.e_res2[7]=0;
+	ImageDosHeader.e_res2[8]=0;
+	ImageDosHeader.e_res2[9]=0;
+	ImageDosHeader.e_lfanew=0x0100;	//PEヘッダの位置
+
+
+	/////////////////////////////////////////////
+	// PEヘッダ
+	/////////////////////////////////////////////
+
+	IMAGE_NT_HEADERS ImagePeHdr;
+	ImagePeHdr.Signature=IMAGE_NT_SIGNATURE;
+
+	//マシンタイプ
+	ImagePeHdr.FileHeader.Machine=			IMAGE_FILE_MACHINE_I386;
+
+	ImagePeHdr.FileHeader.NumberOfSections=		bUse_CodeSection+
+												bUse_ExportSection+
+												bUse_ImportSection+
+												bUse_DataSection+
+												bUse_RWSection+
+												bUse_RSrcSection+
+												bUse_RelocSection+
+												bUse_DebugSection;	//セクション数
+	ImagePeHdr.FileHeader.TimeDateStamp=		(DWORD)time(NULL);
+	ImagePeHdr.FileHeader.PointerToSymbolTable=	0x00000000;
+	ImagePeHdr.FileHeader.NumberOfSymbols=		0x00000000;
+	ImagePeHdr.FileHeader.SizeOfOptionalHeader=	IMAGE_SIZEOF_NT_OPTIONAL32_HEADER;
+	if( compiler.IsDll() ){
+		ImagePeHdr.FileHeader.Characteristics=	IMAGE_FILE_EXECUTABLE_IMAGE|
+												IMAGE_FILE_32BIT_MACHINE|
+												IMAGE_FILE_LINE_NUMS_STRIPPED|
+												IMAGE_FILE_LOCAL_SYMS_STRIPPED|
+												IMAGE_FILE_DLL;
+	}
+	else{
+		ImagePeHdr.FileHeader.Characteristics=	IMAGE_FILE_EXECUTABLE_IMAGE|
+												IMAGE_FILE_32BIT_MACHINE|
+												IMAGE_FILE_LINE_NUMS_STRIPPED|
+												IMAGE_FILE_LOCAL_SYMS_STRIPPED;
+	}
+
+	ImagePeHdr.OptionalHeader.Magic=				0x010B;
+	ImagePeHdr.OptionalHeader.MajorLinkerVersion=	4;
+	ImagePeHdr.OptionalHeader.MinorLinkerVersion=	0;
+	ImagePeHdr.OptionalHeader.SizeOfCode=			FileSize_CodeSection;	//コードサイズ（.textのセッションサイズ）
+	ImagePeHdr.OptionalHeader.SizeOfInitializedData=FileSize_DataSection;	//データサイズ（.dataのセッションサイズ）
+	ImagePeHdr.OptionalHeader.SizeOfUninitializedData=0;					//未初期化データのサイズ（なし）
+	if( compiler.IsDll() ){
+		if(DllMain_EntryPoint==-1)
+			ImagePeHdr.OptionalHeader.AddressOfEntryPoint=0;
+		else
+			ImagePeHdr.OptionalHeader.AddressOfEntryPoint=MemPos_CodeSection+DllMain_EntryPoint;
+	}
+	else ImagePeHdr.OptionalHeader.AddressOfEntryPoint=	MemPos_CodeSection;
+	ImagePeHdr.OptionalHeader.BaseOfCode=			MemPos_CodeSection;	//.textのアドレス
+	ImagePeHdr.OptionalHeader.BaseOfData=			MemPos_DataSection;	//.dataのアドレス
+
+	ImagePeHdr.OptionalHeader.ImageBase=			ImageBase;		//イメージベース
+	ImagePeHdr.OptionalHeader.SectionAlignment=		MEM_ALIGNMENT;		//セクションアラインメント
+	ImagePeHdr.OptionalHeader.FileAlignment=		FILE_ALIGNMENT;
+	ImagePeHdr.OptionalHeader.MajorOperatingSystemVersion=4;
+	ImagePeHdr.OptionalHeader.MinorOperatingSystemVersion=0;
+	ImagePeHdr.OptionalHeader.MajorImageVersion=	0;
+	ImagePeHdr.OptionalHeader.MinorImageVersion=	0;
+	ImagePeHdr.OptionalHeader.MajorSubsystemVersion=4;
+	ImagePeHdr.OptionalHeader.MinorSubsystemVersion=0;
+	ImagePeHdr.OptionalHeader.Win32VersionValue=	0;
+	ImagePeHdr.OptionalHeader.SizeOfImage=			EXE_HEADER_SIZE+
+													MemSize_CodeSection+
+													MemSize_ExportSection+
+													MemSize_ImportSection+
+													MemSize_DataSection+
+													MemSize_RWSection+
+													MemSize_RSrcSection+
+													MemSize_RelocSection+
+													MemSize_DebugSection;//すべてのイメージサイズ
+	ImagePeHdr.OptionalHeader.SizeOfHeaders=		EXE_HEADER_SIZE;//ヘッダサイズ
+	ImagePeHdr.OptionalHeader.CheckSum=				0;
+	extern unsigned short TypeOfSubSystem;
+	ImagePeHdr.OptionalHeader.Subsystem=			TypeOfSubSystem;
+	ImagePeHdr.OptionalHeader.DllCharacteristics=	0;
+	ImagePeHdr.OptionalHeader.SizeOfStackReserve=	0x00100000;
+	ImagePeHdr.OptionalHeader.SizeOfStackCommit=	0x00001000;
+	ImagePeHdr.OptionalHeader.SizeOfHeapReserve=	0x00100000;
+	ImagePeHdr.OptionalHeader.SizeOfHeapCommit=		0x00001000;
+	ImagePeHdr.OptionalHeader.LoaderFlags=			0;
+	ImagePeHdr.OptionalHeader.NumberOfRvaAndSizes=	IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
+
+	//データ ディクショナリ
+	ImagePeHdr.OptionalHeader.DataDirectory[0].VirtualAddress=MemPos_ExportSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[0].Size=FileSize_ExportSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[1].VirtualAddress=MemPos_ImportSection;//インポートテーブル
+	ImagePeHdr.OptionalHeader.DataDirectory[1].Size=FileSize_ImportSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[2].VirtualAddress=MemPos_RSrcSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[2].Size=RSrcSectionSize;
+	ImagePeHdr.OptionalHeader.DataDirectory[3].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[3].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[4].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[4].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[5].VirtualAddress=MemPos_RelocSection;
+	ImagePeHdr.OptionalHeader.DataDirectory[5].Size=pobj_Reloc->length;
+	ImagePeHdr.OptionalHeader.DataDirectory[6].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[6].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[7].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[7].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[8].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[8].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[9].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[9].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[10].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[10].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[11].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[11].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[12].VirtualAddress=MemPos_ImportSection+
+		(ImportDllNum+1)*sizeof(IMAGE_IMPORT_DESCRIPTOR)+
+		16*ImportDllNum+	//DLL名
+		LookupSize+			//ルックアップテーブル
+		HintSize;			//ヒント名（関数名）テーブル
+	ImagePeHdr.OptionalHeader.DataDirectory[12].Size=LookupSize;
+	ImagePeHdr.OptionalHeader.DataDirectory[13].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[13].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[14].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[14].Size=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[15].VirtualAddress=0;
+	ImagePeHdr.OptionalHeader.DataDirectory[15].Size=0;
+
+
+	//コードセクションヘッダ
+	IMAGE_SECTION_HEADER CodeSectionHeader;
+	memset((char *)CodeSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)CodeSectionHeader.Name,".text");
+	CodeSectionHeader.Misc.VirtualSize=			MemSize_CodeSection;
+	CodeSectionHeader.VirtualAddress=			MemPos_CodeSection;	//開始アドレス
+	CodeSectionHeader.SizeOfRawData=			FileSize_CodeSection;
+	CodeSectionHeader.PointerToRawData=			FilePos_CodeSection;	//ファイル上の開始アドレス
+	CodeSectionHeader.PointerToRelocations=		0;
+	CodeSectionHeader.PointerToLinenumbers=		0;
+	CodeSectionHeader.NumberOfRelocations=		0;
+	CodeSectionHeader.NumberOfLinenumbers=		0;
+	CodeSectionHeader.Characteristics=			IMAGE_SCN_MEM_EXECUTE|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_CNT_CODE;
+
+	//エクスポートセクションヘッダ
+	IMAGE_SECTION_HEADER ExportSectionHeader;
+	memset((char *)ExportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)ExportSectionHeader.Name,".edata");
+	ExportSectionHeader.Misc.VirtualSize=		MemSize_ExportSection;
+	ExportSectionHeader.VirtualAddress=			MemPos_ExportSection;	//開始アドレス
+	ExportSectionHeader.SizeOfRawData=			FileSize_ExportSection;	//サイズ
+	ExportSectionHeader.PointerToRawData=		FilePos_ExportSection;	//ファイル上の開始アドレス
+	ExportSectionHeader.PointerToRelocations=	0;
+	ExportSectionHeader.PointerToLinenumbers=	0;
+	ExportSectionHeader.NumberOfRelocations=	0;
+	ExportSectionHeader.NumberOfLinenumbers=	0;
+	ExportSectionHeader.Characteristics=		IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//インポートセクションヘッダ
+	IMAGE_SECTION_HEADER ImportSectionHeader;
+	memset((char *)ImportSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)ImportSectionHeader.Name,".idata");
+	ImportSectionHeader.Misc.VirtualSize=		MemSize_ImportSection;
+	ImportSectionHeader.VirtualAddress=			MemPos_ImportSection;	//開始アドレス
+	ImportSectionHeader.SizeOfRawData=			FileSize_ImportSection;	//サイズ
+	ImportSectionHeader.PointerToRawData=		FilePos_ImportSection;	//ファイル上の開始アドレス
+	ImportSectionHeader.PointerToRelocations=	0;
+	ImportSectionHeader.PointerToLinenumbers=	0;
+	ImportSectionHeader.NumberOfRelocations=	0;
+	ImportSectionHeader.NumberOfLinenumbers=	0;
+	ImportSectionHeader.Characteristics=		IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//データセクションヘッダ
+	IMAGE_SECTION_HEADER DataSectionHeader;
+	memset((char *)DataSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)DataSectionHeader.Name,".sdata");
+	DataSectionHeader.Misc.VirtualSize=			MemSize_DataSection;
+	DataSectionHeader.VirtualAddress=			MemPos_DataSection;
+	DataSectionHeader.SizeOfRawData=			FileSize_DataSection;
+	DataSectionHeader.PointerToRawData=			FilePos_DataSection;
+	DataSectionHeader.PointerToRelocations=		0;
+	DataSectionHeader.PointerToLinenumbers=		0;
+	DataSectionHeader.NumberOfRelocations=		0;
+	DataSectionHeader.NumberOfLinenumbers=		0;
+	DataSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_MEM_WRITE;
+
+	//リライタブルセクションヘッダ
+	IMAGE_SECTION_HEADER RWSectionHeader;
+	memset((char *)RWSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RWSectionHeader.Name,".data");
+	RWSectionHeader.Misc.VirtualSize=			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+												+ compiler.GetObjectModule().meta.GetGlobalVars().GetAllSize();
+	RWSectionHeader.VirtualAddress=				MemPos_RWSection;
+	RWSectionHeader.SizeOfRawData=				FileSize_RWSection;
+	RWSectionHeader.PointerToRawData=			FilePos_RWSection;
+	RWSectionHeader.PointerToRelocations=		0;
+	RWSectionHeader.PointerToLinenumbers=		0;
+	RWSectionHeader.NumberOfRelocations=		0;
+	RWSectionHeader.NumberOfLinenumbers=		0;
+	RWSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ|
+												IMAGE_SCN_MEM_WRITE;
+
+	//リソースセクションヘッダ
+	IMAGE_SECTION_HEADER RSrcSectionHeader;
+	memset((char *)RSrcSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RSrcSectionHeader.Name,".rsrc");
+	RSrcSectionHeader.Misc.VirtualSize=			RSrcSectionSize;
+	RSrcSectionHeader.VirtualAddress=			MemPos_RSrcSection;
+	RSrcSectionHeader.SizeOfRawData=			FileSize_RSrcSection;
+	RSrcSectionHeader.PointerToRawData=			FilePos_RSrcSection;
+	RSrcSectionHeader.PointerToRelocations=		0;
+	RSrcSectionHeader.PointerToLinenumbers=		0;
+	RSrcSectionHeader.NumberOfRelocations=		0;
+	RSrcSectionHeader.NumberOfLinenumbers=		0;
+	RSrcSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_READ;
+
+	//リロケーションセクションヘッダ
+	IMAGE_SECTION_HEADER RelocSectionHeader;
+	memset((char *)RelocSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)RelocSectionHeader.Name,".reloc");
+	RelocSectionHeader.Misc.VirtualSize=		pobj_Reloc->length;
+	RelocSectionHeader.VirtualAddress=			MemPos_RelocSection;	//開始アドレス
+	RelocSectionHeader.SizeOfRawData=			FileSize_RelocSection;	//サイズ
+	RelocSectionHeader.PointerToRawData=		FilePos_RelocSection;	//ファイル上の開始アドレス
+	RelocSectionHeader.PointerToRelocations=	0;
+	RelocSectionHeader.PointerToLinenumbers=	0;
+	RelocSectionHeader.NumberOfRelocations=		0;
+	RelocSectionHeader.NumberOfLinenumbers=		0;
+	RelocSectionHeader.Characteristics=			IMAGE_SCN_CNT_INITIALIZED_DATA|
+												IMAGE_SCN_MEM_DISCARDABLE|
+												IMAGE_SCN_MEM_READ;
+
+	//デバッグセクションヘッダ
+	IMAGE_SECTION_HEADER DebugSectionHeader;
+	memset((char *)DebugSectionHeader.Name,0,IMAGE_SIZEOF_SHORT_NAME);
+	lstrcpy((char *)DebugSectionHeader.Name,".debug");
+	DebugSectionHeader.Misc.VirtualSize=		pobj_DebugSection->length;
+	DebugSectionHeader.VirtualAddress=			MemPos_DebugSection;	//開始アドレス
+	DebugSectionHeader.SizeOfRawData=			FileSize_DebugSection;	//サイズ
+	DebugSectionHeader.PointerToRawData=		FilePos_DebugSection;	//ファイル上の開始アドレス
+	DebugSectionHeader.PointerToRelocations=	0;
+	DebugSectionHeader.PointerToLinenumbers=	0;
+	DebugSectionHeader.NumberOfRelocations=		0;
+	DebugSectionHeader.NumberOfLinenumbers=		0;
+	DebugSectionHeader.Characteristics=			IMAGE_SCN_MEM_DISCARDABLE|
+												IMAGE_SCN_MEM_READ;
+
+
+	hFile=CreateFile(program.GetOutputFilePath().c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+	if(hFile==INVALID_HANDLE_VALUE){
+		compiler.errorMessenger.Output(53,program.GetOutputFilePath().c_str(),-1);
+		goto EndWriteOpcode;
+	}
+
+	//ヘッダ
+	WriteFile(hFile,(void *)&ImageDosHeader,sizeof(IMAGE_DOS_HEADER),(DWORD *)&i2,NULL);
+	i=i2;
+
+	//Dosスタブ
+	WriteFile(hFile,DosStubBuffer,DosStubSize,(DWORD *)&i2,NULL);
+	i+=i2;
+
+	//0x0100までNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,0x0100-i);
+	WriteFile(hFile,temp2,0x0100-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	//PEヘッダ
+	WriteFile(hFile,&ImagePeHdr,sizeof(IMAGE_NT_HEADERS),(DWORD *)&i2,NULL);
+	i+=i2;
+
+	//コード セクション ヘッダ
+	WriteFile(hFile,&CodeSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+	i+=i2;
+
+	if(bUse_ExportSection){
+		//エクスポート セクション ヘッダ
+		WriteFile(hFile,&ExportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_ImportSection){
+		//インポート セクション ヘッダ
+		WriteFile(hFile,&ImportSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_DataSection){
+		//データ セクション ヘッダ
+		WriteFile(hFile,&DataSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RWSection){
+		//リライタブルセクションヘッダ
+		WriteFile(hFile,&RWSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RSrcSection){
+		//リソースセクションヘッダ
+		WriteFile(hFile,&RSrcSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_RelocSection){
+		//リロケーションセクションヘッダ
+		WriteFile(hFile,&RelocSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+	if(bUse_DebugSection){
+		//デバッグセクションヘッダ
+		WriteFile(hFile,&DebugSectionHeader,sizeof(IMAGE_SECTION_HEADER),(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//EXE_HEADER_SIZEまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,EXE_HEADER_SIZE-i);
+	WriteFile(hFile,temp2,EXE_HEADER_SIZE-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	//コード
+	WriteFile(
+		hFile,
+		compiler.linker.GetNativeCode().GetBuffer(),
+		compiler.linker.GetNativeCode().GetSize(),
+		(DWORD *)&i2,
+		NULL
+	);
+	i+=i2;
+
+	//FilePos_ExportSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ExportSection-i);
+	WriteFile(hFile,temp2,FilePos_ExportSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_ExportSection){
+		//エクスポート ディレクトリ テーブル
+		WriteFile(hFile,&ImageExportDirectory,sizeof(IMAGE_EXPORT_DIRECTORY),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート アドレス テーブル
+		WriteFile(hFile,lpdwExportAddressTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート名ポインタ テーブル
+		WriteFile(hFile,lpdwExportNamePointerTable,ExportNum*sizeof(DWORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//エクスポート序数テーブル
+		WriteFile(hFile,lpwExportOrdinalTable,ExportNum*sizeof(WORD),(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//シンボル名
+		WriteFile(hFile,lpExportNames,ExportNamesLength,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_ImportSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_ImportSection-i);
+	WriteFile(hFile,temp2,FilePos_ImportSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_ImportSection){
+		//インポート ディレクトリ テーブル（Nullディレクトリ テーブルを含む）
+		for(i3=0;i3<(ImportDllNum+1);i3++){
+			WriteFile(hFile,&pImportTable[i3],sizeof(IMAGE_IMPORT_DESCRIPTOR),(DWORD *)&i2,NULL);
+			i+=i2;
+		}
+
+		//DLL名
+		for(i3=0;i3<ImportDllNum;i3++){
+			WriteFile(hFile,ppDllNames[i3],16,(DWORD *)&i2,NULL);
+			i+=i2;
+		}
+
+		//ルックアップ テーブル
+		WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//ヒント テーブル
+		WriteFile(hFile,pHintTable,HintSize,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		//インポート アドレス テーブル
+		WriteFile(hFile,pLookupTable,LookupSize,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_DataSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_DataSection-i);
+	WriteFile(hFile,temp2,FilePos_DataSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_DataSection){
+		//データ テーブル
+		WriteFile(
+			hFile,
+			compiler.linker.GetDataTable().GetPtr(),
+			compiler.linker.GetDataTable().GetSize(),
+			(DWORD *)&i2,
+			NULL
+		);
+		i+=i2;
+	}
+
+	//FilePos_RWSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RWSection-i);
+	WriteFile(hFile,temp2,FilePos_RWSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RWSection){
+		//リライタブル データ テーブル（グローバル変数の初期バッファ）
+
+		char *temp = (char *)calloc( FileSize_RWSection, 1 );
+		memcpy(
+			temp,
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetBuffer(),
+			compiler.GetObjectModule().meta.GetGlobalVars().initAreaBuffer.GetSize()
+		);
+
+		WriteFile(hFile,temp,FileSize_RWSection,(DWORD *)&i2,NULL);
+		i+=i2;
+
+		free( temp );
+	}
+
+	//FilePos_RSrcSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RSrcSection-i);
+	WriteFile(hFile,temp2,FilePos_RSrcSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RSrcSection){
+		//リソースバッファ
+		WriteFile(hFile,RSrcSectionBuffer,RSrcSectionSize,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//FilePos_RelocSectionまでNULLを並べる
+	temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FilePos_RelocSection-i);
+	WriteFile(hFile,temp2,FilePos_RelocSection-i,(DWORD *)&i2,NULL);
+	HeapDefaultFree(temp2);
+	i+=i2;
+
+	if(bUse_RelocSection){
+		//リロケーション情報
+		WriteFile(hFile,pobj_Reloc->buffer,pobj_Reloc->length,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//ファイルアラインメントを考慮
+	if(i%FILE_ALIGNMENT){
+		temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+		HeapDefaultFree(temp2);
+		i+=i2;
+	}
+
+	if(bUse_DebugSection){
+		//デバッグセクション
+		WriteFile(hFile,pobj_DebugSection->buffer,pobj_DebugSection->length,(DWORD *)&i2,NULL);
+		i+=i2;
+	}
+
+	//ファイルアラインメントを考慮
+	if(i%FILE_ALIGNMENT){
+		temp2=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,FILE_ALIGNMENT-i%FILE_ALIGNMENT);
+		WriteFile(hFile,temp2,FILE_ALIGNMENT-i%FILE_ALIGNMENT,(DWORD *)&i2,NULL);
+		HeapDefaultFree(temp2);
+		i+=i2;
+	}
+
+	//書き込み終了
+	CloseHandle(hFile);
+
+
+EndWriteOpcode:
+
+	//Dosスタブ用のメモリを解放
+	HeapDefaultFree(DosStubBuffer);
+
+	//エクスポート テーブル情報を解放
+	HeapDefaultFree(lpdwExportAddressTable);
+	HeapDefaultFree(lpdwExportNamePointerTable);
+	HeapDefaultFree(lpwExportOrdinalTable);
+
+	//インポートDLL情報を解放
+	HeapDefaultFree(pImportTable);
+	for(i=0;i<ImportDllNum;i++)
+		HeapDefaultFree(ppDllNames[i]);
+	HeapDefaultFree(ppDllNames);
+
+	//ルックアップテーブルに関する情報を解放
+	HeapDefaultFree(pLookupTable);
+
+	//ヒントテーブルに関する情報を解放
+	HeapDefaultFree(pHintTable);
+
+	//リソースセクションバッファを解放
+	HeapDefaultFree(RSrcSectionBuffer);
+
+	//デバッグセクションを開放
+	delete pobj_DebugSection;
+
+	//リロケーション情報を解放
+	delete pobj_Reloc;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/NumOpe.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/NumOpe.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/NumOpe.cpp	(revision 774)
@@ -0,0 +1,1320 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+using namespace ActiveBasic::Compiler;
+
+void PushReturnValue( const Type &type )
+{
+	//関数の戻り値をスタックへプッシュする
+	//※この処理内では、esi、ediは使用不可
+
+	if( type.IsObject() || type.IsStruct() )
+	{
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( type.IsDouble() )
+	{
+		//sub esp,8
+		compiler.codeGenerator.op_sub_esp(8);
+
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+	}
+	else if( type.IsSingle() )
+	{
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+	}
+	else if( type.Is64() )
+	{
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( type.IsInteger() || ( compiler.IsUnicode() && type.GetBasicType() == DEF_CHAR ) )
+	{
+		//movsx ebx,ax
+		compiler.codeGenerator.op_movsx_R32R16( REG_EBX, REG_EAX );
+
+		//push ebx
+		compiler.codeGenerator.op_push(REG_EBX);
+	}
+	else if( type.IsSByte() || ( !compiler.IsUnicode() && type.GetBasicType() == DEF_CHAR ) )
+	{
+		//movsx ebx,al
+		compiler.codeGenerator.op_movsx_R32R8( REG_EBX, REG_EAX );
+
+		//push ebx
+		compiler.codeGenerator.op_push(REG_EBX);
+	}
+	else if( type.IsLong() || type.IsDWord() || type.IsWord() || type.IsByte() || type.IsBoolean() || type.IsPointer() )
+	{
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+
+void NewStringObject( const char *str ){
+	///////////////////////////////////////////////////////
+	// lpszTextを元にStringオブジェクトを生成し、
+	// オブジェクトポインタをregに格納する
+	///////////////////////////////////////////////////////
+
+	char *parameter = (char *)malloc( lstrlen( str ) + 32 );
+	sprintf( parameter, "%s%c%c*Char", str, 1, ESC_AS );
+
+	Operator_New( *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr(), "", parameter, Type( DEF_OBJECT, *compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr() ) );
+
+	free( parameter );
+}
+
+void ExtendRegToBigType( int reg, int bigBasicType, int baseBasicType ){
+	if( reg != REG_EAX ){
+		compiler.errorMessenger.OutputFatalError();
+	}
+	switch( Type::GetBasicSize( bigBasicType ) ){
+		case sizeof(_int64):
+			ExtendTypeTo64(baseBasicType);
+			break;
+		case sizeof(long):
+			ExtendTypeTo32(baseBasicType,reg);
+			break;
+		case sizeof(short):
+			ExtendTypeTo16(baseBasicType,reg);
+			break;
+	}
+}
+
+
+
+bool VarToReg( RELATIVE_VAR &relativeVar, const Type &baseType, Type &resultType ){
+	const int useReg = REG_EAX;
+
+	//大きな型への暗黙の変換
+	int bigType = AutoBigCast(baseType.GetBasicType(),resultType.GetBasicType());
+
+	if(resultType.GetBasicType()&FLAG_PTR){
+		//配列ポインタ
+		resultType.SetBasicType( GetPtrType(resultType.GetBasicType()^FLAG_PTR) );
+
+		SetVarPtrToReg(useReg, &relativeVar);
+	}
+	else if( resultType.IsStruct() ){
+		//構造体ポインタをeaxへ格納（構造体は値型）
+		SetVarPtrToReg(useReg, &relativeVar);
+	}
+	else if( resultType.IsReal() ){
+		// 実数
+		SetReg_RealVariable( resultType.GetBasicType(), &relativeVar );
+	}
+	else if( resultType.IsWhole() || resultType.IsObject()){
+		//整数型
+		SetReg_WholeVariable(resultType,&relativeVar,useReg);
+	}
+	else if( resultType.IsStruct() ){
+		//構造体ポインタをUseRegへ格納（構造体は値型）
+		SetVarPtrToReg(useReg,&relativeVar);
+	}
+	else{
+		return false;
+	}
+
+	if( resultType.GetBasicType() != bigType ){
+		// 大きな型へ変換された場合
+		// ※レジスタの値をキャストする
+		ExtendRegToBigType( useReg, bigType, resultType.GetBasicType() );
+
+		resultType.SetBasicType( bigType );
+	}
+
+	return true;
+}
+bool TermMemberOpe( const Type &leftType, bool &isNeedHeapFreeStructure, const Type &baseType, Type &resultType, const char *termFull, const char *termLeft, const char *member, bool &isVariable, RELATIVE_VAR &relativeVar )
+{
+	const CClass &objClass = leftType.GetClass();
+
+	const int useReg = REG_EAX;
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(member,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		if( VarName[0] == '\0' )
+		{
+			classType = leftType;
+
+			if( classType.IsObject() )
+			{
+				// 既にuseRegにオブジェクトポインタが格納されており、それに対するインデクサを呼び出す場合
+				// ※「プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す」場合にここにくる
+
+				//オブジェクトポインタをスタックに入れておく
+				//push useReg
+				compiler.codeGenerator.op_push( useReg );
+			}
+		}
+		else
+		{
+			GetMemberType( leftType, VarName, classType, 0, false );
+
+			if( classType.IsObject() )
+			{
+				// クラス型のメンバに対するインデクサを呼び出す場合
+
+				//オブジェクトポインタをecxにコピー
+				compiler.codeGenerator.op_mov_RR( REG_ECX, useReg );
+
+				RELATIVE_VAR tempRelativeVar;
+				tempRelativeVar.dwKind=VAR_DIRECTMEM;
+
+				if( !_member_offset(
+					true,	//エラー表示あり
+					false,	//読み込み専用
+					leftType,
+					VarName,&tempRelativeVar,classType,0)){
+						return false;
+				}
+
+				// オブジェクトメンバのポインタをeaxにコピー
+				if( !VarToReg( tempRelativeVar, baseType, resultType ) ){
+					compiler.errorMessenger.Output(11,termFull,cp);
+				}
+
+
+				//オブジェクトポインタをスタックに入れておく
+				//push eax
+				compiler.codeGenerator.op_push( REG_EAX );
+			}
+		}
+
+		if( classType.IsObject() )
+		{
+			char objectFullName[VN_SIZE], dummyArrayElements[VN_SIZE];
+			GetArrayElement(termFull,objectFullName,dummyArrayElements);
+
+			CallIndexerGetterProc(/*UseReg,*/classType,objectFullName, ArrayElements,resultType, PROCFLAG_NEW );
+
+			compiler.codeGenerator.op_pop();
+
+			return true;
+		}
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// メンバを検索
+	///////////////////////////////////////////////////////////////////
+	if( GetMemberType( leftType, member, resultType, 0, false ) ){
+		// メンバが見つかったとき
+
+		if( isNeedHeapFreeStructure )
+		{
+			if( !leftType.IsStruct() )
+			{
+				compiler.errorMessenger.OutputFatalError();
+			}
+
+			// 親となる構造体が一時メモリに存在していた場合、後ほど解放する必要がある
+			compiler.codeGenerator.op_AddNeedFreeTempStructure( useReg );
+			isNeedHeapFreeStructure = false;
+		}
+
+		//オブジェクトポインタをecxにコピー
+		compiler.codeGenerator.op_mov_RR( REG_ECX, useReg );
+
+		relativeVar.dwKind=VAR_DIRECTMEM;
+
+		if( !_member_offset(
+			true,	//エラー表示あり
+			false,	//読み込み専用
+			leftType,
+			member,&relativeVar,resultType,0)){
+				return false;
+		}
+
+		// 変数として扱う
+		isVariable = true;
+
+		return true;
+	}
+
+
+	///////////////////////////////////////////////////////////////////
+	// 動的メソッドを検索
+	///////////////////////////////////////////////////////////////////
+	std::vector<const UserProc *> userProcs;
+
+	char methodName[VN_SIZE], lpPtrOffset[VN_SIZE], parameter[VN_SIZE], dummy[1];
+	ReferenceKind refType;
+	PareOrBracket pareOrBracket = None;
+	lstrcpy( methodName, member );
+	GetVarFormatString( methodName, parameter, lpPtrOffset, dummy, refType, &pareOrBracket );
+
+	objClass.EnumDynamicMethodsOrInterfaceMethods( methodName, userProcs );
+	if(userProcs.size()){
+		//オーバーロードを解決
+		const UserProc *pUserProc = OverloadSolutionWithStrParam(termFull,userProcs,parameter,termLeft);
+
+		if( pUserProc )
+		{
+			if(
+				pUserProc->Params().size() == 0				// 仮引数の個数は0
+				&& parameter[0]								// 実引数は1つ以上
+				&& pUserProc->ReturnType().IsObject()		// 戻り値がクラス型の場合
+				&& pareOrBracket == Bracket )				// 実引数は[]で囲まれている
+			{
+				// プロパティ値として返ってきたオブジェクトインスタンスのインデクサを呼び出す
+
+				// まずはプロパティ値を取得
+				bool dummyIsVariable;
+				RELATIVE_VAR dummyRelativeVar;
+				TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull, termLeft, methodName, dummyIsVariable, dummyRelativeVar );
+
+				// 戻り値のオブジェクトインスタンスのインデクサを呼び出す
+				char temporary[VN_SIZE], temp2[VN_SIZE];
+				sprintf( temporary, "[%s]", parameter );
+				sprintf( temp2, "%s.%s", termLeft, methodName );
+				Type classType = resultType;
+				return TermMemberOpe( classType, isNeedHeapFreeStructure, baseType, resultType, termFull, temp2, temporary, isVariable, relativeVar );
+			}
+
+			resultType = pUserProc->ReturnType();
+
+			{
+				//オブジェクトポインタをスタックに入れておく
+				//push reg
+				compiler.codeGenerator.op_push( useReg );
+
+				if( !Opcode_CallProc(parameter,pUserProc,PROCFLAG_NEW,termLeft) ){
+
+					return false;
+				}
+
+				compiler.codeGenerator.op_pop();
+
+				/////////////////////
+				// 戻り値の処理
+				/////////////////////
+
+				//大きな型への暗黙の変換
+				int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+				if( resultType.GetBasicType() != bigType ){
+					// 大きな型へ変換された場合
+					// ※レジスタの値をキャストする
+					ExtendRegToBigType( REG_EAX, bigType, resultType.GetBasicType() );
+
+					resultType.SetBasicType( bigType );
+				}
+
+				//SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
+
+				// 型パラメータを解決
+				ResolveFormalGenericTypeParameter( resultType, leftType, pUserProc );
+			}
+			
+			return true;
+		}
+	}
+	else if( pareOrBracket == Pare )
+	{
+		// 関数ポインタ
+		compiler.errorMessenger.OutputFatalError();
+
+		///////////////////////////////////////////////////////////////////
+		// メンバを検索
+		///////////////////////////////////////////////////////////////////
+		if( GetMemberType( leftType, methodName, resultType, 0, false ) ){
+			// メンバが見つかったとき
+		}
+	}
+
+	compiler.errorMessenger.OutputFatalError();
+
+	return false;
+}
+bool _TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool &isNeedHeapFreeStructure, bool *pIsClassName, bool isProcedureCallOnly, bool &isVariable, RELATIVE_VAR &relativeVar, bool isWriteAccess )
+{
+	char parameter[VN_SIZE];
+
+	// Withを解決
+	char termFull[VN_SIZE];
+	if(term[0]=='.'){
+		GetWithName(termFull);
+		lstrcat(termFull,term);
+	}
+	else lstrcpy(termFull,term);
+
+	char termLeft[VN_SIZE];
+	lstrcpy(termLeft,termFull);
+
+	// パース
+	char member[VN_SIZE];
+	ReferenceKind refType;
+	if( SplitMemberName( termFull, termLeft, member, refType ) ){
+		///////////////////////////////////////////////////////////////////
+		// オブジェクトとメンバに分解できるとき
+		// termLeft.member
+		///////////////////////////////////////////////////////////////////
+
+		isLiteral = false;
+
+		// オブジェクト側の型を取得
+		bool isClassName = false;
+		Type leftType;
+		if( GetTermType( termLeft, Type(), leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					compiler.GetObjectModule().meta.GetBlittableTypes().Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+			}
+		}
+
+		if( !TermOpe( termLeft, baseType, leftType, isLiteral, isNeedHeapFreeStructure, &isClassName ) ){
+			goto globalArea;
+		}
+
+		if( isClassName ){
+			// 静的メンバ/メソッドの場合
+			goto globalArea;
+		}
+
+		if( !leftType.HasMember() ){
+			// メンバを持たない型の場合
+			if( isProcedureCallOnly )
+			{
+				compiler.errorMessenger.Output(1,NULL,cp);
+			}
+			return false;
+		}
+
+		return TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull, termLeft, member, isVariable, relativeVar );
+	}
+globalArea:
+
+
+	//////////////////////////////////////////////
+	// クラス名かどうかをチェック（静的メンバ用）
+	//////////////////////////////////////////////
+
+	if( pIsClassName ){
+		if( compiler.GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( termFull ) ) ){
+			*pIsClassName = true;
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// グローバル属性エリア
+	/////////////////////////////////////////////////////////////////
+
+	const int useReg = REG_EAX;
+
+
+	if(lstrcmpi(termFull,"This")==0 && isProcedureCallOnly == false ){
+		if( !compiler.IsCompilingClass() )
+		{
+			compiler.errorMessenger.Output(142,NULL,cp);
+			return false;
+		}
+
+		//Thisオブジェクト
+		resultType.SetType( DEF_OBJECT, &compiler.GetCompilingClass() );
+
+		SetThisPtrToReg( useReg );
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	//////////////////////////////////////
+	// 関数（DLL、ユーザー定義、組み込み）
+	//////////////////////////////////////
+	char procName[VN_SIZE];
+	char temporary[8192];
+
+	int i2=GetCallProcName(termFull,procName);
+	if(termFull[i2]=='('){
+		int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
+
+		void *pInfo;
+		int idProc=GetProc(procName,(void **)&pInfo);
+
+		if(idProc)
+		{
+			if(termFull[i2+1+i4+1]!='\0')
+			{
+				//閉じカッコ")"に続く文字がNULLでないとき
+				compiler.errorMessenger.Output(42,NULL,cp);
+			}
+
+
+			{
+				////////////////
+				// 呼び出し
+				////////////////
+
+				CallProc(idProc,pInfo,procName,parameter, baseType,resultType);
+
+
+				/////////////////////
+				// 戻り値の処理
+				/////////////////////
+
+				//大きな型への暗黙の変換
+				int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+				/*
+				※後でNumOpe内でプッシュする
+				//スタックへプッシュ
+				PushReturnValue( resultType.GetBasicType() );
+				*/
+
+				if( resultType.GetBasicType() != bigType ){
+					// 大きな型へ変換された場合
+					// ※レジスタの値をキャストする
+					ExtendRegToBigType( useReg, bigType, resultType.GetBasicType() );
+
+					resultType.SetBasicType( bigType );
+				}
+
+				//SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
+			}
+
+
+			if(resultType.IsStruct())
+			{
+				//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+				//※後にfreeする必要あり
+				// TODO: 解放はGCに任せる
+				isNeedHeapFreeStructure = true;
+			}
+
+			isLiteral = false;
+
+			return true;
+		}
+
+		ConstMacro *pConstMacro = compiler.GetObjectModule().meta.GetGlobalConstMacros().Find(
+			ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( procName )
+		);
+		if( pConstMacro )
+		{
+			if( ActiveBasic::Compiler::LexicalAnalyzer::ConstMacroToExpression( *pConstMacro, parameter, temporary ) )
+			{
+				/////////////////////////
+				// マクロ関数
+				/////////////////////////
+
+				//閉じカッコ")"に続く文字がNULLでないときはエラーにする
+				if(termFull[i2+1+i4+1]!='\0') compiler.errorMessenger.Output(42,NULL,cp);
+
+				//マクロ関数の場合
+				NumOpe(useReg, temporary,Type(),resultType);
+
+				if(!IS_LITERAL(resultType.GetIndex())){
+					//リテラル値ではなかったとき
+					isLiteral = false;
+				}
+
+				return true;
+			}
+		}
+	}
+	else if( isProcedureCallOnly ){
+		// 関数呼び出し以外は受け付けない
+		return false;
+	}
+
+
+	////////////////////////////////
+	// インデクサ（getアクセサ）
+	////////////////////////////////
+
+	char VarName[VN_SIZE],ArrayElements[VN_SIZE];
+	GetArrayElement(termFull,VarName,ArrayElements);
+	if(ArrayElements[0]){
+		Type classType;
+		GetVarType(VarName,classType,false);
+		if( classType.IsObject() )
+		{
+			CallIndexerGetterProc(/*UseReg,*/classType,VarName, ArrayElements,resultType);
+
+			isLiteral = false;
+
+			return true;
+		}
+	}
+
+
+	////////////////////////////////
+	// 変数
+	////////////////////////////////
+
+	if(GetVarOffset(
+		false,	//エラー表示なし
+		isWriteAccess,
+		termFull,
+		&relativeVar,resultType)){
+		//////////
+		// 変数
+		//////////
+
+		// 変数として扱う
+		isVariable = true;
+
+		isLiteral = false;
+
+		return true;
+	}
+
+
+	/////////////////////////////////
+	// プロパティ用のメソッド
+	/////////////////////////////////
+
+	//配列要素を排除
+	GetArrayElement(termFull,VarName,ArrayElements);
+
+	if(GetSubHash(VarName,0)){
+
+		{
+			CallPropertyMethod(termFull,NULL,resultType);
+
+			//大きな型への暗黙の変換
+			int bigType = AutoBigCast(baseType.GetBasicType(), resultType.GetBasicType() );
+
+			if( resultType.GetBasicType() != bigType ){
+				// 大きな型へ変換された場合
+				// ※レジスタの値をキャストする
+				ExtendRegToBigType( REG_EAX, bigType, resultType.GetBasicType() );
+
+				resultType.SetBasicType( bigType );
+			}
+
+			//SetUseRegFromRax(resultType.GetBasicType(),UseReg,XmmReg);
+		}
+
+
+		if(resultType.IsStruct())
+		{
+			//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+			//※後にfreeする必要あり
+			// TODO: 解放はGCに任せる
+			isNeedHeapFreeStructure = true;
+		}
+
+		isLiteral = false;
+
+		return true;
+	}
+
+	if( isProcedureCallOnly )
+	{
+		compiler.errorMessenger.Output(3, termFull, cp );
+	}
+
+	return false;
+}
+
+bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool &isNeedHeapFreeStructure, bool *pIsClassName, bool isProcedureCallOnly, bool isWriteAccess )
+{
+	RELATIVE_VAR relativeVar;
+	bool isVariable = false;
+	bool result = _TermOpe( term, baseType, resultType, isLiteral, isNeedHeapFreeStructure, pIsClassName, isProcedureCallOnly, isVariable, relativeVar, isWriteAccess );
+
+	if( isVariable )
+	{
+		// 変数の場合はeaxに変数ポインタを格納する
+		if( !VarToReg( relativeVar, baseType, resultType ) ){
+			compiler.errorMessenger.Output(11,term,cp);
+		}
+	}
+
+	return result;
+}
+bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess )
+{
+	bool isLiteral, isVariable = false, isNeedHeapFreeStructure = false;
+	bool result = _TermOpe( term, Type(), resultType, isLiteral, isNeedHeapFreeStructure, NULL, false, isVariable, relativeVar, isWriteAccess );
+
+	if( !isVariable )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	return result;
+}
+
+
+bool NumOpe( int reg,
+			const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			bool *pbIsNeedHeapFreeStructure ){
+
+	if( !NumOpe( expression, baseType, resultType, pbIsNeedHeapFreeStructure ) )
+	{
+		return false;
+	}
+
+	if( reg != REG_EAX ){
+		// TODO: 未実装
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	if( resultType.IsReal() ){
+		//fld ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp( resultType.GetBasicType() );
+
+		//add esp,size
+		compiler.codeGenerator.op_add_esp( resultType.GetBasicSize() );
+	}
+	else{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		if( resultType.Is64() ){
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+	}
+	return true;
+}
+bool NumOpe( const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			bool *pbIsNeedHeapFreeStructure )
+{
+	int i,i2,i3;
+	char temporary[1024],temp2[1024];
+
+	if(expression[0]=='\0'){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		return false;
+	}
+
+	if( !baseType.IsNull() && expression[0] == '[' ){
+		// リテラル配列の場合
+
+		int dataTableOffset;
+		if( !ActiveBasic::Compiler::DataTableGenerator::MakeLiteralArrayBuffer( compiler.GetObjectModule().dataTable, expression, baseType, dataTableOffset ) )
+		{
+			return false;
+		}
+
+		//mov eax,i2
+		compiler.codeGenerator.op_mov_RV(REG_EAX,dataTableOffset, Schedule::DataTable );
+
+		resultType = baseType;
+
+		//push eax
+		compiler.codeGenerator.op_push( REG_EAX );
+
+		return true;
+	}
+
+	bool isLiteralCalculation;
+	if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
+	{
+		if( isLiteralCalculation )
+		{
+			//右辺値が数値の定数式の場合
+			_int64 i64data;
+			StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
+
+			if( resultType.GetBasicSize() == sizeof(_int64) ){
+				//64ビット（符号有り整数/実数）
+
+				//push HILONG(i64data)
+				compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
+
+				//push LOLONG(i64data)
+				compiler.codeGenerator.op_push_V(*(long *)(&i64data));
+			}
+			else if( resultType.IsSingle() ){
+				//single実数
+
+				double dbl;
+				memcpy(&dbl,&i64data,sizeof(_int64));
+
+				float flt;
+				flt=(float)dbl;
+				long l;
+				memcpy(&l,&flt,sizeof(long));
+
+				//push flt
+				compiler.codeGenerator.op_push_V(l);
+			}
+			else{
+				//整数（符号有り/無し）
+
+				long l = (long)i64data;
+
+				if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
+				if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
+
+				//push term
+				compiler.codeGenerator.op_push_V(l);
+			}
+			return true;
+		}
+	}
+
+	if(expression[0]==1 )
+	{
+		if( expression[1]==ESC_NEW ){
+			//New演算子（オブジェクト生成）
+
+			if( !Operator_New( expression+2, baseType, resultType ) ){
+				return false;
+			}
+
+			return true;
+		}
+		else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
+		{
+			// 静的領域にオブジェクトを作る
+
+			// 静的領域にオブジェクトを生成
+			int dataTableOffset;
+			if( !ActiveBasic::Compiler::DataTableGenerator::MakeConstObjectToProcessStaticBuffer( compiler.GetObjectModule().dataTable, expression + 2, resultType, dataTableOffset ) )
+			{
+				return false;
+			}
+
+			// push value
+			compiler.codeGenerator.op_push_V( dataTableOffset, Schedule::DataTable );
+
+			return true;
+		}
+	}
+
+
+	/////////////////////////////////
+	// 式要素を逆ポーランド式で取得
+	/////////////////////////////////
+
+	char *values[255];
+	long calc[255];
+	long stack[255];
+	int pnum;
+	if(!GetNumOpeElements(expression,&pnum,values,calc,stack)){
+		for(i=0;i<pnum;i++){
+			if(values[i]) HeapDefaultFree(values[i]);
+		}
+		return false;
+	}
+
+
+	BOOL bError;
+	bError=0;
+
+	//リテラル値のみの計算かどうかを判別するためのフラグ
+	BOOL bLiteralCalculation=1;
+
+	double dbl;
+	int sp;
+	int type_stack[255];
+	bool isNothing_stack[255];
+	LONG_PTR index_stack[255];
+	bool isNeedHeapFreeStructureStack[255];
+	_int64 i64data;
+	for(i=0,sp=0;i<pnum;i++){
+		int idCalc;
+		idCalc=calc[i]%100;
+
+		if(idCalc){
+			if( sp>=2 && type_stack[sp-2]==DEF_OBJECT )
+			{
+				if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& index_stack[sp-1] == index_stack[sp-2]
+					|| isNothing_stack[sp-2] ){
+						// 同一の型、またはNothingに対するAsはAs演算子を呼び出さない
+				}
+				else if( idCalc == CALC_AS
+					&& type_stack[sp-1] == ( DEF_OBJECT | FLAG_CAST )
+					&& ( ((CClass *)index_stack[sp-1])->IsEqualsOrSubClass( (CClass *)index_stack[sp-2] ) || ((CClass *)index_stack[sp-2])->IsEqualsOrSubClass( (CClass *)index_stack[sp-1] )
+					)){
+						// ダウンキャストを許可する
+				}
+				else{
+					//オーバーロードされたオペレータを呼び出す
+					i2=CallOperatorProc(idCalc,baseType,type_stack,index_stack,isNeedHeapFreeStructureStack,sp);
+					if(i2==0){
+						if(idCalc==CALC_EQUAL) lstrcpy(temp2,"==");
+						else GetCalcName(idCalc,temp2);
+						sprintf(temporary,"Operator %s",temp2);
+						compiler.errorMessenger.Output(27,temporary,cp);
+						goto error;
+					}
+					else if(i2==-1) goto error;
+
+					continue;
+				}
+			}
+
+			if(!CheckCalcType(idCalc,type_stack,sp)) goto error;
+		}
+
+		switch(idCalc){
+			//数値
+			case 0:
+				index_stack[sp]=-1;
+				isNothing_stack[sp] = false;
+				isNeedHeapFreeStructureStack[sp] = false;
+
+				char *term;
+				term=values[i];
+
+				if( calc[i+1]%100 == CALC_AS ){
+					// As演算子の右辺値
+					//型名
+					if( compiler.StringToType( term, resultType ) ){
+						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
+					}
+					else{
+						compiler.errorMessenger.Output(3, term, cp );
+						goto error;
+					}
+
+					type_stack[sp] = resultType.GetBasicType();
+					index_stack[sp] = resultType.GetIndex();
+					sp++;
+
+					break;
+				}
+
+				if( (term[0]=='e'||term[0]=='E')
+					&& (term[1]=='x'||term[1]=='X')
+					&& term[2]=='\"'
+					|| term[0] == '\"' )
+				{
+					bool isEx = true;
+					if( term[0] == '\"' )
+					{
+						isEx = false;
+					}
+
+					if( isEx )
+					{
+						// 拡張版リテラル文字列（エスケープシーケンス可能）
+						if(!RemoveStringQuotes(term+2)){
+							compiler.errorMessenger.Output(43,NULL,cp);
+							goto error;
+						}
+						i3=FormatString_EscapeSequence(term+2);
+						term+=2;
+					}
+					else
+					{
+						// 通常文字列
+						if(!RemoveStringQuotes(term)){
+							compiler.errorMessenger.Output(43,NULL,cp);
+							goto error;
+						}
+						i3=lstrlen(term);
+					}
+
+					if( !baseType.IsPointer() )
+					{
+						//要求タイプがオブジェクト、または未定のとき
+
+						//String型オブジェクトを生成
+						i2 = ActiveBasic::Compiler::DataTableGenerator::MakeConstStringObjectToProcessStaticBuffer( compiler.GetObjectModule().dataTable, term );
+
+						// push value
+						compiler.codeGenerator.op_push_V( i2, Schedule::DataTable );
+
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+						bLiteralCalculation=0;
+
+						sp++;
+						break;
+					}
+StrLiteral:
+					type_stack[sp]=typeOfPtrChar;
+					bLiteralCalculation=0;
+
+					i2 = compiler.AddStringToDataTable( std::string( term, i3 ) );
+
+					//push DataSize
+					compiler.codeGenerator.op_push_V( i2, Schedule::DataTable );
+				}
+				else if(IsVariableTopChar(term[0])||
+					term[0]=='*'||
+					(term[0]=='.'&&IsVariableTopChar(term[1]))){
+					//////////////////
+					// 何らかの識別子
+
+					bool isLiteral;
+					if( TermOpe( term, baseType, resultType, isLiteral, isNeedHeapFreeStructureStack[sp] ) ){
+						if(resultType.IsNull()){
+							//戻り値が存在しないとき
+							for(i2=0;;i2++){
+								if(term[i2]=='('||term[i2]=='\0'){
+									term[i2]=0;
+									break;
+								}
+							}
+							compiler.errorMessenger.Output(38,term,cp);
+
+							goto error;
+						}
+
+						type_stack[sp] = resultType.GetBasicType();
+						index_stack[sp] = resultType.GetIndex();
+
+						if( !isLiteral ){
+							bLiteralCalculation=0;
+						}
+
+						if( resultType.GetBasicType() & FLAG_CAST ){
+							// 型名のみ
+							compiler.errorMessenger.OutputFatalError();
+						}
+						else{
+							if( resultType.IsReal() ){
+								//sub esp,size
+								//fstp ptr[esp]
+								compiler.codeGenerator.op_fstp_push( resultType );
+							}
+							else{
+								if( resultType.Is64() ){
+									//push edx
+									compiler.codeGenerator.op_push( REG_EDX );
+								}
+								else{
+									ExtendTypeTo32( resultType.GetBasicType(), REG_EAX );
+								}
+
+								//push eax
+								compiler.codeGenerator.op_push( REG_EAX );
+							}
+						}
+
+						sp++;
+						break;
+					}
+
+
+					// Nothing
+					if( lstrcmp( term, "Nothing" ) == 0 ){
+						isNothing_stack[sp] = true;
+
+						if( baseType.IsObject() ){
+							type_stack[sp] = DEF_OBJECT;
+							index_stack[sp] = baseType.GetIndex();
+						}
+						else{
+							type_stack[sp] = baseType.GetBasicType();
+							index_stack[sp] = baseType.GetIndex();
+						}
+
+						bLiteralCalculation = 0;
+
+						//push 0
+						compiler.codeGenerator.op_push_V( 0 );
+
+						sp++;
+						break;
+					}
+
+
+					//////////////
+					// 定数の場合
+					//////////////
+
+					i3 = compiler.GetObjectModule().meta.GetGlobalConsts().GetBasicType(
+						ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+					);
+					if(i3){
+						if( compiler.GetObjectModule().meta.GetGlobalConsts().IsStringPtr( ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term ), compiler.IsUnicode() ) ){
+							//リテラル文字列
+
+							if( baseType.IsObject() || baseType.IsNull() )
+							{
+								//要求タイプがオブジェクト、または未定のとき
+
+								//String型オブジェクトを生成
+								NewStringObject(term);
+
+								type_stack[sp]=DEF_OBJECT;
+								index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+								bLiteralCalculation=0;
+
+								sp++;
+								break;
+							}
+
+							double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							memcpy(&i64data,&dbl,sizeof(double));
+
+							//バイト数
+							i3=lstrlen((char *)i64data);
+
+							memcpy(term,(char *)i64data,i3);
+							term[i3]=0;
+							goto StrLiteral;
+						}
+
+						type_stack[sp]=i3;
+						if(IsRealNumberType(i3)){
+							//実数
+							double dbl = compiler.GetObjectModule().meta.GetGlobalConsts().GetDoubleData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							memcpy(&i64data,&dbl,sizeof(double));
+							goto Literal;
+						}
+						else if(IsWholeNumberType(i3)){
+							//整数
+							i64data = compiler.GetObjectModule().meta.GetGlobalConsts().GetWholeData(
+								ActiveBasic::Compiler::LexicalAnalyzer::FullNameToSymbol( term )
+							);
+							goto Literal;
+						}
+						else{
+							compiler.errorMessenger.Output(300,NULL,cp);
+							goto error;
+						}
+					}
+
+
+					//該当する識別子が見当たらないときはエラー扱いにする
+					bError=1;
+					compiler.errorMessenger.Output(3,term,cp);
+					type_stack[sp]=DEF_DOUBLE;
+				}
+				else{
+					//リテラル値
+					type_stack[sp]=GetLiteralValue(term,&i64data,baseType.GetBasicType());
+Literal:
+					if(type_stack[sp]==DEF_INT64||
+						type_stack[sp]==DEF_QWORD||
+						type_stack[sp]==DEF_DOUBLE){
+						//64ビット（符号有り整数/実数）
+
+						//push HILONG(dbl)
+						compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
+
+						//push LOLONG(dbl)
+						compiler.codeGenerator.op_push_V(*(long *)(&i64data));
+					}
+					else if(type_stack[sp]==DEF_SINGLE){
+						//single実数
+
+						float flt;
+						memcpy(&dbl,&i64data,sizeof(double));
+						flt=(float)dbl;
+						memcpy(&i3,&flt,sizeof(long));
+
+						//push term
+						compiler.codeGenerator.op_push_V(i3);
+					}
+					else{
+						//その他
+
+						//push term
+						compiler.codeGenerator.op_push_V((long)i64data);
+
+						if((long)i64data==0) index_stack[sp]=LITERAL_NULL;
+					}
+
+
+					//リテラル値の種類
+					if(Is64Type(type_stack[sp])==0&&IsRealNumberType(type_stack[sp])==0){
+						//整数（符号有り/無し）
+
+						index_stack[sp]=GetLiteralIndex(i64data);
+					}
+				}
+				sp++;
+				break;
+
+			//論理演算子
+			case CALC_XOR:
+				//value[sp-2] xor= value[sp-1]
+				//xor演算
+				if(!Calc_Xor(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_OR:
+				//value[sp-2] or= value[sp-1]
+				//or演算
+				if(!Calc_Or(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_AND:
+				//value[sp-2] and= value[sp-1]
+				//and演算
+				if(!Calc_And(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_NOT:
+				//value[sp-1]=Not value[sp-1]
+				//NOT演算子
+				if(!Calc_Not(type_stack,sp)) goto error;
+				break;
+
+			//比較演算子
+			case CALC_PE:
+				//value[sp-2]<=value[sp-1]
+				if(!Calc_Relation_PE(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_QE:
+				//value[sp-2]>=value[sp-1]
+				if(!Calc_Relation_QE(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_P:
+				//value[sp-2]<value[sp-1]
+				if(!Calc_Relation_P(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_Q:
+				//value[sp-2]>value[sp-1]
+				if(!Calc_Relation_Q(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_NOTEQUAL:
+				//value[sp-2]<>value[sp-1]
+				if(!Calc_Relation_NotEqual(type_stack,&sp)) goto error;
+				break;
+			case CALC_EQUAL:
+				//value[sp-2]=value[sp-1]
+				if(!Calc_Relation_Equal(type_stack,&sp)) goto error;
+				break;
+
+			//ビットシフト
+			case CALC_SHL:
+				//value[sp-2]=value[sp-2]<<value[sp-1]
+				if(!Calc_SHL(type_stack,&sp)) goto error;
+				break;
+			case CALC_SHR:
+				//value[sp-2]=value[sp-2]>>value[sp-1]
+				if(!Calc_SHR(type_stack,&sp)) goto error;
+				break;
+
+			//算術演算
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				if(!CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp)) goto error;
+				break;
+
+			case CALC_MOD:
+				//value[sp-2]%=value[sp-1]
+				//剰余演算
+				if(!Calc_Mod(type_stack,&sp)) goto error;
+				break;
+			case CALC_QUOTIENT:
+				//value[sp-2]/=value[sp-1];
+				//除算
+				if(!Calc_Divide(type_stack,&sp,baseType.GetBasicType())) goto error;
+				break;
+			case CALC_INTQUOTIENT:
+				//value[sp-2]/=value[sp-1]
+				//整数除算
+				if(!Calc_IntDivide(type_stack,index_stack,&sp)) goto error;
+				break;
+			case CALC_MINUSMARK:
+				//value[sp-1]=-value[sp-1]
+				//符号反転
+				if(!Calc_MinusMark(type_stack,sp)) goto error;
+				index_stack[sp-1]=-1;
+				break;
+			case CALC_POWER:
+				//べき乗演算（浮動小数点演算のみ）
+				if(!Calc_Power(type_stack,&sp)) goto error;
+				break;
+			case CALC_AS:
+				//キャスト
+				if(!Calc_Cast(type_stack,index_stack,&sp)) goto error;
+				break;
+
+			case CALC_BYVAL:
+				//ポインタ型→参照型
+				if( PTR_LEVEL( type_stack[sp-1] ) <= 0 ){
+					//ポインタ型ではないとき
+					compiler.errorMessenger.Output( 1, NULL, cp );
+					goto error;
+				}
+
+				type_stack[sp-1] = PTR_LEVEL_DOWN( type_stack[sp-1] );
+
+				break;
+
+			default:
+				compiler.errorMessenger.Output(300,NULL,cp);
+				goto error;
+		}
+	}
+
+	if(bError) goto error;
+
+	if(sp!=1){
+		compiler.errorMessenger.Output(1,NULL,cp);
+		goto error;
+	}
+
+	if(bLiteralCalculation){
+		//右辺値が数値の定数式の場合
+		compiler.errorMessenger.OutputFatalError();
+	}
+	else{
+		//右辺値が数値の定数式ではないとき
+		if(IS_LITERAL(index_stack[0])) index_stack[0]=-1;
+	}
+
+	if(pbIsNeedHeapFreeStructure)
+	{
+		*pbIsNeedHeapFreeStructure = isNeedHeapFreeStructureStack[0];
+	}
+
+	resultType.SetType( type_stack[0], index_stack[0] );
+
+	bool isSuccessful = true;
+	goto finish;
+
+
+error:
+	isSuccessful = false;
+	goto finish;
+
+
+finish:
+
+	for(i=0;i<pnum;i++){
+		if(values[i]) HeapDefaultFree(values[i]);
+	}
+
+	// 強制終了を防ぐためのダミー（原因不明）
+	if( lstrcmp( expression, "-1/t" ) == 0 )
+	{
+	}
+
+	return isSuccessful;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Arithmetic.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Arithmetic.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Arithmetic.cpp	(revision 774)
@@ -0,0 +1,1459 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void GetStackData_ToRegister(int *type,int sp){
+	/*NumOpeポーランドのスタック蓄積による演算内容（2つのデータ）を
+		レジスタedx:eax、ecx:ebxに取得する*/
+
+	if(type[sp-1]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+	}
+	else if(type[sp-1]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+	}
+	else{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		if(IsSignedType(type[sp-1])){
+			//符号拡張
+			//edx:eax ← eax
+				
+			//cdq
+			compiler.codeGenerator.op_cdq();
+		}
+		else{
+			//ビット拡張
+			//edx:eax ← eax
+
+			//xor edx,edx
+			compiler.codeGenerator.op_zero_reg(REG_EDX);
+		}
+
+		//mov ebx,eax
+		compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+		//mov ecx,edx
+		compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
+	}
+
+	//第1項を64ビットに対応させる
+	if(type[sp-2]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+	}
+	else if(type[sp-2]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//fistp qword ptr[esp]
+		compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+	}
+	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+	}
+	else{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		if(IsSignedType(type[sp-2])){
+			//符号拡張
+			//edx:eax ← eax
+				
+			//cdq
+			compiler.codeGenerator.op_cdq();
+		}
+		else{
+			//ビット拡張
+			//edx:eax ← eax
+
+			//xor edx,edx
+			compiler.codeGenerator.op_zero_reg(REG_EDX);
+		}
+	}
+}
+
+void FormatStackData_To64bit(int *type,int sp){
+	//NumOpeポーランドのスタック蓄積による演算内容（2つのデータ）を64ビット整数型にする
+
+	GetStackData_ToRegister(type,sp);
+
+	//push ecx
+	compiler.codeGenerator.op_push(REG_ECX);
+
+	//push ebx
+	compiler.codeGenerator.op_push(REG_EBX);
+
+	//push edx
+	compiler.codeGenerator.op_push(REG_EDX);
+
+	//push eax
+	compiler.codeGenerator.op_push(REG_EAX);
+}
+
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer){
+	/*	value[sp-2] = value[sp-2] + value[sp-1]
+		value[sp-2] = value[sp-2] - value[sp-1]
+		value[sp-2] = value[sp-2] * value[sp-1]		*/
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type[sp-2],index_stack[sp-2],type[sp-1],index_stack[sp-1]);
+
+	if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+		type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+		/////////////
+		// 実数演算
+		/////////////
+
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//64ビット整数値
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		if(Type(type[sp-2],-1).GetSize()==sizeof(_int64)){
+			if(AnswerType==DEF_SINGLE){
+				//add esp,4
+				compiler.codeGenerator.op_add_esp(4);
+			}
+		}
+		else{
+			if(AnswerType==DEF_DOUBLE){
+				//sub esp,4
+				compiler.codeGenerator.op_sub_esp(4);
+			}
+		}
+
+		if(idCalc==CALC_ADDITION){
+			//faddp st(1),st
+			compiler.codeGenerator.PutOld(
+				(char)0xDE,
+				(char)0xC1
+			);
+		}
+		else if(idCalc==CALC_SUBTRACTION){
+			//fsubrp st(1),st
+			compiler.codeGenerator.PutOld(
+				(char)0xDE,
+				(char)0xE1
+			);
+		}
+		else if(idCalc==CALC_PRODUCT){
+			//fmulp st(1),st
+			compiler.codeGenerator.PutOld(
+				(char)0xDE,
+				(char)0xC9
+			);
+		}
+
+		if(AnswerType==DEF_DOUBLE){
+			//fstp qword ptr[esp]
+			compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+		}
+		else{
+			//fstp dword ptr[esp]
+			compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+		}
+	}
+	else if(Is64Type(type[sp-2])||Is64Type(type[sp-1])){
+		//////////////////////
+		// 64ビット整数演算
+		//////////////////////
+
+		if(idCalc==CALC_PRODUCT){
+			if(!((type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD)&&
+				(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD))){
+				//2つの項のどちらかが64ビット整数でないとき
+				FormatStackData_To64bit(type,sp);
+			}
+
+			//call _allmul
+			extern const UserProc *pSub_allmul;
+			compiler.codeGenerator.op_call(pSub_allmul);
+
+			//push edx
+			compiler.codeGenerator.op_push(REG_EDX);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+		else{
+			if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+				//第2項が64ビット整数値のとき
+
+				//pop ebx
+				compiler.codeGenerator.op_pop(REG_EBX);
+
+				//pop ecx
+				compiler.codeGenerator.op_pop(REG_ECX);
+			}
+			else{
+				//第2項がその他整数値のとき
+
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				if(IsSignedType(type[sp-1])){
+					//符号拡張
+					//edx:eax ← eax
+					
+					//cdq
+					compiler.codeGenerator.op_cdq();
+				}
+				else{
+					//ビット拡張
+					//edx:eax ← eax
+
+					//xor edx,edx
+					compiler.codeGenerator.op_zero_reg(REG_EDX);
+				}
+
+				//mov ebx,eax
+				compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+				//mov ecx,edx
+				compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
+			}
+
+			if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+				//第1項が64ビット整数値のとき
+
+				if(idCalc==CALC_ADDITION){
+					//add dword ptr[esp],ebx
+					compiler.codeGenerator.PutOld(
+						(char)0x01,
+						(char)0x1C,
+						(char)0x24
+					);
+
+					//adc dword ptr[esp+sizeof(long)],ecx
+					compiler.codeGenerator.PutOld(
+						(char)0x11,
+						(char)0x4C,
+						(char)0x24,
+						(char)0x04
+					);
+				}
+				else if(idCalc==CALC_SUBTRACTION){
+					//sub dword ptr[esp],ebx
+					compiler.codeGenerator.PutOld(
+						(char)0x29,
+						(char)0x1C,
+						(char)0x24
+					);
+
+					//sbb dword ptr[esp+sizeof(long)],ecx
+					compiler.codeGenerator.PutOld(
+						(char)0x19,
+						(char)0x4C,
+						(char)0x24,
+						(char)0x04
+					);
+				}
+			}
+			else{
+				//第1項がその他整数値のとき
+
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				if(IsSignedType(type[sp-2])){
+					//符号拡張
+					//edx:eax ← eax
+
+					//cdq
+					compiler.codeGenerator.op_cdq();
+				}
+				else{
+					//ビット拡張
+					//edx:eax ← eax
+
+					//xor edx,edx
+					compiler.codeGenerator.op_zero_reg(REG_EDX);
+				}
+
+				if(idCalc==CALC_ADDITION){
+					//add ebx,eax
+					compiler.codeGenerator.op_add_RR( REG_EBX, REG_EAX );
+
+					//adc ecx,edx
+					compiler.codeGenerator.op_adc_RR( REG_ECX, REG_EDX );
+				}
+				else if(idCalc==CALC_SUBTRACTION){
+					//sub ebx,eax
+					compiler.codeGenerator.op_sub_RR( REG_EBX, REG_EAX );
+
+					//sbb ecx,edx
+					compiler.codeGenerator.op_sub_RR( REG_ECX, REG_EDX );
+				}
+
+				//push ecx
+				compiler.codeGenerator.op_push(REG_ECX);
+
+				//push ebx
+				compiler.codeGenerator.op_push(REG_EBX);
+			}
+		}
+	}
+	else{
+		//////////////////////////
+		//32ビット以下の整数演算
+		//////////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		if(idCalc==CALC_ADDITION){
+			//add eax,ebx
+			compiler.codeGenerator.op_add_RR( REG_EAX, REG_EBX );
+		}
+		else if(idCalc==CALC_SUBTRACTION){
+			//sub eax,ebx
+			compiler.codeGenerator.op_sub_RR( REG_EAX, REG_EBX );
+		}
+		else if(idCalc==CALC_PRODUCT){
+			//imul eax,ebx（64ビット演算ではないので、符号を考慮しない）
+			compiler.codeGenerator.op_imul_RR( REG_EAX, REG_EBX );
+		}
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type[sp-1]=AnswerType;
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_Mod(int *type,int *pStackPointer){
+	//value[sp-2]%=value[sp-1]
+	//剰余演算
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD||
+		type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		////////////////
+		// 64ビット演算
+		////////////////
+
+		//第2項を64ビットに対応させる
+		FormatStackData_To64bit(type,sp);
+
+		if(IsSignedType(type[sp-2])==0&&IsSignedType(type[sp-1])==0){
+			//符号なし演算
+
+			//call _aullrem
+			extern const UserProc *pSub_aullrem;
+			compiler.codeGenerator.op_call(pSub_aullrem);
+		}
+		else{
+			//符号あり演算
+
+			//call _allrem
+			extern const UserProc *pSub_allrem;
+			compiler.codeGenerator.op_call(pSub_allrem);
+		}
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		sp--;
+		if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+		else type[sp-1]=DEF_INT64;
+	}
+	else{
+		////////////////
+		// 32ビット演算
+		////////////////
+
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		if(type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD){
+			//xor edx,edx
+			compiler.codeGenerator.op_zero_reg(REG_EDX);
+
+			//div ebx (eax=eax/ebx...edx)
+			compiler.codeGenerator.op_div_R( REG_EBX );
+		}
+		else{
+			//cdq
+			compiler.codeGenerator.op_cdq();
+
+			//idiv ebx (eax=eax/ebx...edx)
+			compiler.codeGenerator.op_idiv_R( REG_EBX );
+		}
+
+		//mov dword ptr[esp],edx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EDX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+		type[sp-1]=DEF_LONG;
+	}
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType){
+	//value[sp-2]/=value[sp-1];
+	//除算
+
+	int sp;
+	sp=*pStackPointer;
+
+	///////////////////////
+	// 浮動小数点演算のみ
+	///////////////////////
+
+	int AnswerType;
+	if(type[sp-2]==DEF_DOUBLE||type[sp-1]==DEF_DOUBLE||BaseType==DEF_DOUBLE) AnswerType=DEF_DOUBLE;
+	else AnswerType=DEF_SINGLE;
+
+	if(type[sp-1]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else if(type[sp-1]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		//64ビット整数値
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else if(type[sp-1]==DEF_DWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//push 0
+		compiler.codeGenerator.op_push_V(0);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else{
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+
+	if(type[sp-2]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+	}
+	else if(type[sp-2]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+	}
+	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		//64ビット整数値
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+	}
+	else if(type[sp-2]==DEF_DWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//push 0
+		compiler.codeGenerator.op_push_V(0);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+	}
+	else{	//Long
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+	}
+                                                            //↓ここだけ例外DWord
+	if(Type(type[sp-2],-1).GetSize()==sizeof(_int64)||type[sp-2]==DEF_DWORD){
+		if(AnswerType==DEF_SINGLE){
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+	}
+	else{
+		if(AnswerType==DEF_DOUBLE){
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+		}
+	}
+
+	//fdivrp st(1),st
+	compiler.codeGenerator.PutOld(
+		(char)0xDE,
+		(char)0xF1
+	);
+
+	sp--;
+	if(AnswerType==DEF_DOUBLE){
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+
+		type[sp-1]=DEF_DOUBLE;
+	}
+	else{
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+
+		type[sp-1]=DEF_SINGLE;
+	}
+
+	*pStackPointer=sp;
+
+	return 1;
+}
+
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]/=value[sp-1]
+	//除算（整数）
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD||
+		type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		////////////////
+		// 64ビット演算
+		////////////////
+
+		//2つの項を64ビットに対応させる
+		FormatStackData_To64bit(type,sp);
+
+		if(IsSignedType(type[sp-2])==0&&IsSignedType(type[sp-1])==0){
+			//符号なし演算
+
+			//call _aulldiv
+			extern const UserProc *pSub_aulldiv;
+			compiler.codeGenerator.op_call(pSub_aulldiv);
+		}
+		else{
+			//符号あり演算
+
+			//call _alldiv
+			extern const UserProc *pSub_alldiv;
+			compiler.codeGenerator.op_call(pSub_alldiv);
+		}
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		sp--;
+		if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+		else type[sp-1]=DEF_INT64;
+	}
+	else{
+		////////////////
+		// 32ビット演算
+		////////////////
+
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		if((type[sp-2]==DEF_DWORD&&type[sp-1]==DEF_DWORD)||
+			(IS_POSITIVE_LITERAL(index_stack[sp-2])&&type[sp-1]==DEF_DWORD)||
+			(type[sp-2]==DEF_DWORD&&IS_POSITIVE_LITERAL(index_stack[sp-1]))){
+			//xor edx,edx
+			compiler.codeGenerator.op_zero_reg(REG_EDX);
+
+			//div ebx (eax=eax/ebx...edx)
+			compiler.codeGenerator.op_div_R( REG_EBX );
+		}
+		else{
+			//cdq
+			compiler.codeGenerator.op_cdq();
+
+			//idiv ebx (eax=eax/ebx...edx)
+			compiler.codeGenerator.op_idiv_R( REG_EBX );
+		}
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+
+		//整数以外の型だったときはLong型にする
+		if(!IsWholeNumberType(type[sp-1])) type[sp-1]=DEF_LONG;
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_MinusMark(int *type,int sp){
+	//value[sp-1]=-value[sp-1]
+	//符号反転
+
+	if(type[sp-1]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//push -1
+		compiler.codeGenerator.op_push_V(-1);
+
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//fmulp st(1),st
+		compiler.codeGenerator.PutOld(
+			(char)0xDE,
+			(char)0xC9
+		);
+
+		//fstp qword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+	}
+	else if(type[sp-1]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//push -1
+		compiler.codeGenerator.op_push_V(-1);
+
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+
+		//fmulp st(1),st
+		compiler.codeGenerator.PutOld(
+			(char)0xDE,
+			(char)0xC9
+		);
+
+		//fstp dword ptr[esp]
+		compiler.codeGenerator.op_fstp_basereg( DEF_SINGLE, REG_ESP );
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//neg eax
+		compiler.codeGenerator.op_neg( REG_EAX );
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+
+		//adc edx,0
+		compiler.codeGenerator.op_adc_RV8(REG_EDX,0);
+
+		//neg edx
+		compiler.codeGenerator.op_neg( REG_EDX );
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		type[sp-1]=DEF_INT64;	//QWordはInt64へ
+	}
+	else if(IsWholeNumberType(type[sp-1])){
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//imul eax,-1
+		compiler.codeGenerator.op_imul_RV8( REG_EAX, -1 );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		type[sp-1]=GetSignedType(type[sp-1]);
+	}
+
+	return 1;
+}
+
+BOOL Calc_Power(int *type,int *pStackPointer){
+	//べき乗（実数演算のみ）
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-1]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else if(type[sp-1]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		//64ビット整数値
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+		//add esp,8
+		compiler.codeGenerator.op_add_esp(8);
+	}
+	else{
+		//32ビット整数値
+
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//add esp,4
+		compiler.codeGenerator.op_add_esp(4);
+	}
+
+	if(type[sp-2]==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+	}
+	else if(type[sp-2]==DEF_SINGLE){
+		//fld dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+	}
+	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		//64ビット整数値
+
+		//fild qword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+	}
+	else{
+		//32ビット整数値
+
+		//fild dword ptr[esp]
+		compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+	}
+
+	//sub esp,8
+	compiler.codeGenerator.op_sub_esp(8);
+
+	//fstp qword ptr[esp]
+	compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+
+	//fstp qword ptr[esp+8]
+	compiler.codeGenerator.op_fstp_base_offset(DEF_DOUBLE,REG_ESP,8);
+
+	//call pow
+	extern const UserProc *pSub_pow;
+	compiler.codeGenerator.op_call(pSub_pow);
+
+	//sub esp,8
+	compiler.codeGenerator.op_sub_esp(8);
+
+	//fstp qword ptr[esp]
+	compiler.codeGenerator.op_fstp_basereg( DEF_DOUBLE, REG_ESP );
+
+	sp--;
+	type[sp-1]=DEF_DOUBLE;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//キャスト
+
+	int sp;
+	sp=*pStackPointer;
+
+	int castBasicType = type[sp-1];
+	if((castBasicType&FLAG_CAST)==0){
+		compiler.errorMessenger.Output(47,NULL,cp);
+		return 0;
+	}
+	castBasicType = castBasicType&(~FLAG_CAST);
+
+	Type oldType( type[sp-2], index_stack[sp-2] );
+	Type castType( castBasicType, index_stack[sp-1] );
+
+	if( castType.IsPointer() )
+	{
+		ChangeTypeToLong( oldType.GetBasicType() );
+	}
+	else if( castType.IsReal() )
+	{
+		if( castType.IsDouble() )
+		{
+			ChangeTypeToDouble( oldType.GetBasicType() );
+		}
+		else if( castType.IsSingle() )
+		{
+			ChangeTypeToSingle( oldType.GetBasicType() );
+		}
+	}
+	else
+	{
+		ChangeTypeToWhole( oldType, castType );
+	}
+
+	type[sp-2] = castType.GetBasicType();
+	index_stack[sp-2] = castType.GetIndex();
+
+	sp--;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_SHL(int *type,int *pStackPointer){
+	//左ビットシフト
+	//value[sp-2]=value[sp-2]<<value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		////////////////
+		// 64ビット演算
+		////////////////
+
+		//2項目は32ビット整数として利用
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+
+		//第1項を64ビットに対応させる
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else{
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			if(IsSignedType(type[sp-2])){
+				//符号拡張
+				//edx:eax ← eax
+					
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+		}
+
+		//call _allshl
+		extern const UserProc *pSub_allshl;
+		compiler.codeGenerator.op_call(pSub_allshl);
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		sp--;
+	}
+	else{
+		////////////////
+		// 32ビット演算
+		////////////////
+
+		//2項目は32ビット整数として利用
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//shl eax,cl
+		compiler.codeGenerator.PutOld(
+			(char)0xD3,
+			(char)0xE0
+		);
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+
+		//32ビット型にする
+		if(IsSignedType(type[sp-1])) type[sp-1]=DEF_LONG;
+		else type[sp-1]=DEF_DWORD;
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_SHR(int *type,int *pStackPointer){
+	//右ビットシフト
+	//value[sp-2]=value[sp-2]>>value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+		////////////////
+		// 64ビット演算
+		////////////////
+
+		//2項目は32ビット整数として利用
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+
+		//第1項を64ビットに対応させる
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else{
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			if(IsSignedType(type[sp-2])){
+				//符号拡張
+				//edx:eax ← eax
+
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+		}
+
+		if(type[sp-2]==DEF_QWORD){
+			//符号なし演算
+
+			//call _aullshr
+			extern const UserProc *pSub_aullshr;
+			compiler.codeGenerator.op_call(pSub_aullshr);
+		}
+		else{
+			//符号あり演算
+
+			//call _allshr
+			extern const UserProc *pSub_allshr;
+			compiler.codeGenerator.op_call(pSub_allshr);
+		}
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+
+		sp--;
+	}
+	else{
+		////////////////
+		// 32ビット演算
+		////////////////
+
+		//2項目は32ビット整数として利用
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		if(type[sp-2]==DEF_DWORD){
+			//shr eax,cl
+			compiler.codeGenerator.PutOld(
+				(char)0xD3,
+				(char)0xE8
+			);
+		}
+		else{
+			//sar eax,cl
+			compiler.codeGenerator.PutOld(
+				(char)0xD3,
+				(char)0xF8
+			);
+		}
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+
+		//整数以外の型だったときはLong型にする
+		if(!IsWholeNumberType(type[sp-1])) type[sp-1]=DEF_LONG;
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Logical.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Logical.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Logical.cpp	(revision 774)
@@ -0,0 +1,506 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2] xor= value[sp-1]
+	//xor演算
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//いずれかの項が実数のとき
+		compiler.errorMessenger.Output(45,"xor",cp);
+		return 0;
+	}
+
+	if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+		type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		//第2項を64ビットに対応させる
+		if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//第2項が64ビット整数値のとき
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else{
+			//第2項がその他整数値のとき
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			if(IsSignedType(type[sp-1])){
+				//符号拡張
+				//edx:eax ← eax
+				
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//mov ebx,eax
+			compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+			//mov ecx,edx
+			compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
+		}
+
+		if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//第1項が64ビット整数値のとき
+
+			//xor dword ptr[esp],ebx
+			compiler.codeGenerator.PutOld(
+				(char)0x31,
+				(char)0x1C,
+				(char)0x24
+			);
+
+			//xor dword ptr[esp+sizeof(long)],ecx
+			compiler.codeGenerator.PutOld(
+				(char)0x31,
+				(char)0x4C,
+				(char)0x24,
+				(char)0x04
+			);
+		}
+		else{
+			//第1項がその他整数値のとき
+			if(IsSignedType(type[sp-2])){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//符号拡張
+				//edx:eax ← eax
+
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//xor ebx,eax
+			compiler.codeGenerator.op_xor_RR( REG_EBX, REG_EAX );
+
+			//xor ecx,edx
+			compiler.codeGenerator.op_xor_RR( REG_ECX, REG_EDX );
+
+			//push ecx
+			compiler.codeGenerator.op_push(REG_ECX);
+
+			//push ebx
+			compiler.codeGenerator.op_push(REG_EBX);
+		}
+
+		sp--;
+		if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+		else type[sp-1]=DEF_INT64;
+	}
+	else{
+		////////////////////
+		// 整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//xor eax,ebx
+		compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+		type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2] or= value[sp-1]
+	//or演算
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//いずれかの項が実数のとき
+		compiler.errorMessenger.Output(45,"or",cp);
+		return 0;
+	}
+
+	if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+		type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		//第2項を64ビットに対応させる
+		if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//第2項が64ビット整数値のとき
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else{
+			//第2項が32ビット整数値のとき
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			if(IsSignedType(type[sp-1])){
+				//符号拡張
+				//edx:eax ← eax
+				
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//mov ebx,eax
+			compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+			//mov ecx,edx
+			compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
+		}
+
+		if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//第1項が64ビット整数値のとき
+
+			//or dword ptr[esp],ebx
+			compiler.codeGenerator.PutOld(
+				(char)0x09,
+				(char)0x1C,
+				(char)0x24
+			);
+
+			//or dword ptr[esp+sizeof(long)],ecx
+			compiler.codeGenerator.PutOld(
+				(char)0x09,
+				(char)0x4C,
+				(char)0x24,
+				(char)0x04
+			);
+		}
+		else{
+			//第1項が32ビット整数値のとき
+			if(IsSignedType(type[sp-2])){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//符号拡張
+				//edx:eax ← eax
+
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//or ebx,eax
+			compiler.codeGenerator.op_or_RR( sizeof(long), REG_EBX, REG_EAX );
+
+			//or ecx,edx
+			compiler.codeGenerator.op_or_RR( sizeof(long), REG_ECX, REG_EDX );
+
+			//push ecx
+			compiler.codeGenerator.op_push(REG_ECX);
+
+			//push ebx
+			compiler.codeGenerator.op_push(REG_EBX);
+		}
+
+		sp--;
+		if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+		else type[sp-1]=DEF_INT64;
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//or eax,ebx
+		compiler.codeGenerator.op_or_RR( sizeof(long), REG_EAX, REG_EBX );
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+		type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2] and= value[sp-1]
+	//and演算
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
+		//いずれかの項が実数のとき
+		compiler.errorMessenger.Output(45,"and",cp);
+		return 0;
+	}
+
+	if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+		type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		//第2項を64ビットに対応させる
+		if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//第2項が64ビット整数値のとき
+
+			//pop ebx
+			compiler.codeGenerator.op_pop(REG_EBX);
+
+			//pop ecx
+			compiler.codeGenerator.op_pop(REG_ECX);
+		}
+		else{
+			//第2項が32ビット整数値のとき
+
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			if(IsSignedType(type[sp-1])){
+				//符号拡張
+				//edx:eax ← eax
+				
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//mov ebx,eax
+			compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
+
+			//mov ecx,edx
+			compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
+		}
+
+		if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//第1項が64ビット整数値のとき
+
+			//and dword ptr[esp],ebx
+			compiler.codeGenerator.PutOld(
+				(char)0x21,
+				(char)0x1C,
+				(char)0x24
+			);
+
+			//and dword ptr[esp+sizeof(long)],ecx
+			compiler.codeGenerator.PutOld(
+				(char)0x21,
+				(char)0x4C,
+				(char)0x24,
+				(char)0x04
+			);
+		}
+		else{
+			//第1項が32ビット整数値のとき
+			if(IsSignedType(type[sp-2])){
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//符号拡張
+				//edx:eax ← eax
+
+				//cdq
+				compiler.codeGenerator.op_cdq();
+			}
+			else{
+				//pop eax
+				compiler.codeGenerator.op_pop(REG_EAX);
+
+				//ビット拡張
+				//edx:eax ← eax
+
+				//xor edx,edx
+				compiler.codeGenerator.op_zero_reg(REG_EDX);
+			}
+
+			//and ebx,eax
+			compiler.codeGenerator.op_and_RR( REG_EBX, REG_EAX );
+
+			//and ecx,edx
+			compiler.codeGenerator.op_and_RR( REG_ECX, REG_EDX );
+
+			//push ecx
+			compiler.codeGenerator.op_push(REG_ECX);
+
+			//push ebx
+			compiler.codeGenerator.op_push(REG_EBX);
+		}
+
+		sp--;
+		if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
+		else type[sp-1]=DEF_INT64;
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//and eax,ebx
+		compiler.codeGenerator.op_and_RR( REG_EAX, REG_EBX );
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+
+		sp--;
+		type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
+	}
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Not(int *type,int sp){
+	//value[sp-1]=Not value[sp-1]
+	//NOT演算子
+
+	if(IsRealNumberType(type[sp-1])){
+		//実数のとき
+		compiler.errorMessenger.Output(45,"Not",cp);
+		return 0;
+	}
+
+	if( type[sp - 1] == DEF_BOOLEAN ){
+		//pop eax
+		compiler.codeGenerator.op_pop( REG_EAX );
+
+		//cmp eax,0
+		compiler.codeGenerator.op_cmp_value(Type(type[sp-1]).GetSize(),REG_EAX,0);
+
+		//setne al
+		compiler.codeGenerator.op_setne( REG_EAX );
+
+		//and eax,000000FFh
+		compiler.codeGenerator.op_and_RV(REG_EAX,(int)0xFF);
+
+		//neg
+		compiler.codeGenerator.op_neg( REG_EAX );
+
+		//sbb eax, eax
+		compiler.codeGenerator.op_sbb_RR( REG_EAX, REG_EAX );
+
+		//add eax, 1
+		compiler.codeGenerator.op_add_RV8( REG_EAX, 1 );
+
+		//push eax
+		compiler.codeGenerator.op_push( REG_EAX );
+	}
+	else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		//not dword ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xF7,
+			(char)0x14,
+			(char)0x24
+		);
+
+		//not dword ptr[esp+4]
+		compiler.codeGenerator.PutOld(
+			(char)0xF7,
+			(char)0x54,
+			(char)0x24,
+			(char)0x04
+		);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//not dword ptr[esp]
+		compiler.codeGenerator.PutOld(
+			(char)0xF7,
+			(char)0x14,
+			(char)0x24
+		);
+	}
+
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Relation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Relation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_Relation.cpp	(revision 774)
@@ -0,0 +1,1208 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void AutoExtendToBigType( int *type_stack,int sp, int reg1, int reg2 ){
+	/*
+	int bigSize = GetTypeSize( type_stack[sp-1], -1 );
+	if( bigSize != GetTypeSize( type_stack[sp-2], -1 ) ){
+		int extReg = reg2;
+		int oldType = type_stack[sp-2];
+		if( bigSize < GetTypeSize( type_stack[sp-2], -1 ) ){
+			bigSize = GetTypeSize( type_stack[sp-2], -1 );
+			extReg = reg1;
+			oldType = type_stack[sp-1];
+		}
+		if( bigSize == 2 ){
+			ExtendTypeTo16( oldType, extReg );
+		}
+		else if( bigSize == 4 ){
+			ExtendTypeTo32( oldType, extReg );
+		}
+		else{
+			compiler.errorMessenger.OutputFatalError();
+		}
+	}*/
+}
+
+
+BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]<=value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(AnswerType)){
+		//////////////
+		// 実数演算
+		//////////////
+
+		if(type_stack[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type_stack[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type_stack[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,41h
+		compiler.codeGenerator.op_test_ah( (char)0x41 );
+
+		//jne 5
+		compiler.codeGenerator.PutOld(
+			(char)0x75,
+			(char)0x02
+		);
+
+		//xor ecx,ecx（ecxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_ECX);
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(Is64Type(AnswerType)){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 <= 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type_stack,sp);
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		const PertialSchedule *pFalsePertialSchedule1;
+		if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+			//符号なし演算
+
+			//ja FalseSchedule1（偽へジャンプ）
+			pFalsePertialSchedule1 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+		}
+		else{
+			//符号あり演算
+
+			//jg FalseSchedule1（偽へジャンプ）
+			pFalsePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
+		}
+
+		const PertialSchedule *pTruePertialSchedule;
+		if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+			//符号なし演算
+
+			//jb TrueSchedule（真へジャンプ）
+			pTruePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+		}
+		else{
+			//符号あり演算
+
+			//jl TrueSchedule（真へジャンプ）
+			pTruePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
+		}
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//ja FalseSchedule2（偽へジャンプ）
+		const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+
+		//TrueScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//jmp 2（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 2 );
+
+		//FalseScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		if(IsSignedType(type_stack[sp-2])==0&&IsSignedType(type_stack[sp-1])==0){
+			//符号なし演算
+
+			//jbe 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jbe( 2 );
+		}
+		else{
+			//符号あり演算
+
+			//jle 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jle( 2 );
+		}
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type_stack[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Relation_QE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]>=value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(AnswerType)){
+		//浮動小数点演算
+		if(type_stack[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type_stack[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type_stack[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,1
+		compiler.codeGenerator.op_test_ah( (char)0x01 );
+
+		//je 2（次のxorを飛び越す）
+		compiler.codeGenerator.op_je( 2 );
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(Is64Type(AnswerType)){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 >= 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type_stack,sp);
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		const PertialSchedule *pFalsePertialSchedule1;
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jl FalseSchedule1（偽へジャンプ）
+			pFalsePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
+		}
+		else{
+			//符号なし演算
+
+			//jb FalseSchedule1（偽へジャンプ）
+			pFalsePertialSchedule1 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+		}
+
+		const PertialSchedule *pTruePertialSchedule;
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jg TrueSchedule（真へジャンプ）
+			pTruePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
+		}
+		else{
+			//符号なし演算
+
+			//ja TrueSchedule（真へジャンプ）
+			pTruePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+		}
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//jb FalseSchedule2（偽へジャンプ）
+		const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+
+		//TrueScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//jmp 2（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 2 );
+
+		//FalseScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jge 2（次のxorを飛び越す）符号有り
+			compiler.codeGenerator.op_jge( 2 );
+		}
+		else{
+			//符号なし演算
+
+			//jae 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jae( 2 );
+		}
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type_stack[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Relation_P(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]<value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(AnswerType)){
+		//////////////
+		// 実数演算
+		//////////////
+
+		if(type_stack[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type_stack[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type_stack[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{
+			//その他整数型
+
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,01h
+		compiler.codeGenerator.op_test_ah( (char)0x01 );
+
+		//jne 2
+		compiler.codeGenerator.op_jne( 2 );
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(Is64Type(AnswerType)){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 < 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type_stack,sp);
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		const PertialSchedule *pTruePertialSchedule1;
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jl TrueSchedule1（真へジャンプ）
+			pTruePertialSchedule1 = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
+		}
+		else{
+			//符号なし演算
+
+			//jb TrueSchedule1（真へジャンプ）
+			pTruePertialSchedule1 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+		}
+
+		const PertialSchedule *pFalsePertialSchedule;
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jg FalseSchedule（偽へジャンプ）
+			pFalsePertialSchedule = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
+		}
+		else{
+			//符号なし演算
+
+			//ja FalseSchedule（偽へジャンプ）
+			pFalsePertialSchedule = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+		}
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//jb TrueSchedule2（真へジャンプ）
+		const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+
+		//FalseScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//jmp 5（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 5 );
+
+		//TrueScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		///////////////////
+		//32ビット整数演算
+		///////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		if(IsSignedType(AnswerType)){
+			//符号あり演算
+
+			//jl 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jl( 2 );
+		}
+		else{
+			//符号なし演算
+
+			//jb 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jb( 2 );
+		}
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type_stack[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Relation_Q(int *type_stack,LONG_PTR *index_stack,int *pStackPointer){
+	//value[sp-2]>value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	int AnswerType;
+	AnswerType=NeutralizationType(type_stack[sp-2],index_stack[sp-2],type_stack[sp-1],index_stack[sp-1]);
+
+	if(IsRealNumberType(AnswerType)){
+		//////////////
+		// 実数演算
+		//////////////
+
+		if(type_stack[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type_stack[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-1]==DEF_INT64||type_stack[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type_stack[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type_stack[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type_stack[sp-2]==DEF_INT64||type_stack[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,41
+		compiler.codeGenerator.op_test_ah( (char)0x41 );
+
+		//je 2（次のxorを飛び越す）
+		compiler.codeGenerator.op_je( 2 );
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(Is64Type(AnswerType)){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 > 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type_stack,sp);
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		const PertialSchedule *pTruePertialSchedule1;
+		if(IsSignedType(AnswerType)){
+			//符号有り
+
+			//jg TrueSchedule1（真へジャンプ）
+			pTruePertialSchedule1 = compiler.codeGenerator.op_jg( 0, sizeof(char), true );
+		}
+		else{
+			//符号無し
+
+			//ja TrueSchedule1（真へジャンプ）
+			pTruePertialSchedule1 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+		}
+
+		const PertialSchedule *pFalsePertialSchedule;
+		if(IsSignedType(AnswerType)){
+			//符号有り
+
+			//jl FalseSchedule（偽へジャンプ）
+			pFalsePertialSchedule = compiler.codeGenerator.op_jl( 0, sizeof(char), true );
+		}
+		else{
+			//符号無し
+
+			//jb FalseSchedule（偽へジャンプ）
+			pFalsePertialSchedule = compiler.codeGenerator.op_jb( 0, sizeof(char), true );
+		}
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//ja TrueSchedule2（真へジャンプ）
+		const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_ja( 0, sizeof(char), true );
+
+		//FalseScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//jmp 5（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 5 );
+
+		//TrueScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type_stack, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		if(IsSignedType(AnswerType)){
+			//jg 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_jg( 2 );
+		}
+		else{
+			//ja 2（次のxorを飛び越す）
+			compiler.codeGenerator.op_ja( 2 );
+		}
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type_stack[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Relation_NotEqual(int *type,int *pStackPointer){
+	//value[sp-2]<>value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+		type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+		//////////////
+		// 実数演算
+		//////////////
+
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,40
+		compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+		//je 2
+		compiler.codeGenerator.op_je( 2 );
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+		type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 <> 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type,sp);
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//jne TrueSchedule1（真へジャンプ）
+		const PertialSchedule *pTruePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		//jne TrueSchedule2（真へジャンプ）
+		const PertialSchedule *pTruePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//jmp 5（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 5 );
+
+		//TrueScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pTruePertialSchedule2 );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//xor eax,ebx
+		compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
+
+		//je 5（次のmovを飛び越す）
+		compiler.codeGenerator.op_je( 5 );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
+
+BOOL Calc_Relation_Equal(int *type,int *pStackPointer){
+	//value[sp-2]=value[sp-1]
+
+	int sp;
+	sp=*pStackPointer;
+
+	if(type[sp-2]==DEF_DOUBLE||type[sp-2]==DEF_SINGLE||
+		type[sp-1]==DEF_DOUBLE||type[sp-1]==DEF_SINGLE){
+		//////////////
+		// 実数演算
+		//////////////
+
+		if(type[sp-1]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if(type[sp-1]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+
+		if(type[sp-2]==DEF_DOUBLE){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if(type[sp-2]==DEF_SINGLE){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+		}
+		else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
+			//64ビット整数値
+
+			//fild qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_INT64);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else{	//Long、DWord
+			//fild dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
+		}
+
+		//fcompp
+		compiler.codeGenerator.op_fcompp();
+
+		//fnstsw ax
+		compiler.codeGenerator.op_fnstsw_ax();
+
+		//mov ecx,1
+		compiler.codeGenerator.op_mov_RV( REG_ECX, 1 );
+
+		//test ah,40
+		compiler.codeGenerator.op_test_ah( (char)0x40 );
+
+		//jne 2（次のxorを飛び越す）
+		compiler.codeGenerator.op_jne( 2 );
+
+		//xor ecx,ecx
+		compiler.codeGenerator.op_xor_RR( REG_ECX );
+
+		//mov dword ptr[esp],ecx
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_ESP, 0, MOD_BASE );
+	}
+	else if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
+		type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
+		////////////////////
+		// 64ビット整数演算
+		////////////////////
+
+		// 第1項 == 第2項
+
+		//第1項 edx:eax
+		//第2項 ecx:ebx
+		GetStackData_ToRegister(type,sp);
+
+		//cmp eax,ebx
+		compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
+
+		//jne FalseSchedule1（偽へジャンプ）
+		const PertialSchedule *pFalsePertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+		//cmp edx,ecx
+		compiler.codeGenerator.op_cmp_RR( REG_EDX, REG_ECX );
+
+		//jne FalseSchedule2（偽へジャンプ）
+		const PertialSchedule *pFalsePertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//jmp 2（演算終了位置へジャンプ）
+		compiler.codeGenerator.op_jmp( 2 );
+
+		//FalseScheduleのジャンプ先の設定
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule1 );
+		compiler.codeGenerator.opfix_JmpPertialSchedule( pFalsePertialSchedule2 );
+
+		//xor eax,eax（eaxを0にする）
+		compiler.codeGenerator.op_zero_reg(REG_EAX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		////////////////////
+		// 32ビット整数演算
+		////////////////////
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop ebx
+		compiler.codeGenerator.op_pop(REG_EBX);
+
+		// どちらかのサイズが足りない場合は自動拡張する
+		AutoExtendToBigType( type, sp, REG_EAX, REG_EBX );
+
+		//sub esp,4
+		compiler.codeGenerator.op_sub_esp(4);
+
+		//xor eax,ebx
+		compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
+
+		//je 4（次のxorとjmpを飛び越す）
+		compiler.codeGenerator.op_je( 4 );
+
+		//xor eax,eax
+		compiler.codeGenerator.op_xor_RR( REG_EAX );
+
+		//jmp 5
+		compiler.codeGenerator.op_jmp( 5 );
+
+		//mov eax,1
+		compiler.codeGenerator.op_mov_RV( REG_EAX, 1 );
+
+		//mov dword ptr[esp],eax
+		compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
+	}
+
+	sp--;
+	type[sp-1]=DEF_BOOLEAN;
+
+	*pStackPointer=sp;
+	return 1;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_TypeOperation.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_TypeOperation.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/NumOpe_TypeOperation.cpp	(revision 774)
@@ -0,0 +1,224 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void ExtendStackTo32( const Type &oldType );
+
+void ExtendStackTo64( const Type &oldType )
+{
+	if( oldType.Is64() )
+	{
+		return;
+	}
+
+	//32ビットに拡張
+	ExtendStackTo32( oldType );
+
+	//64ビットに拡張
+	if( oldType.IsSigned() )
+	{
+		//符号あり
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//cdq
+		compiler.codeGenerator.op_cdq();
+
+		//push edx
+		compiler.codeGenerator.op_push(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else{
+		//符号なし
+
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//push 0
+		compiler.codeGenerator.op_push_V(0);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+void ExtendStackTo32( const Type &oldType )
+{
+	if( oldType.GetSize() == sizeof(long) )
+	{
+		return;
+	}
+
+	if( oldType.Is64() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsInteger() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//movsx eax,ax
+		compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsWord() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//and eax,0000FFFFh
+		compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsSByte() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//movsx eax,al
+		compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsByte() || oldType.IsBoolean() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//and eax,000000FFh
+		compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+void ExtendStackTo16( const Type &oldType ){
+	if( oldType.Is64() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsSByte() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//movsx eax,al
+		compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+	else if( oldType.IsByte() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//and eax,000000FFh
+		compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+void ExtendStackTo8( const Type &oldType )
+{
+	if( oldType.Is64() )
+	{
+		//pop eax
+		compiler.codeGenerator.op_pop(REG_EAX);
+
+		//pop edx
+		compiler.codeGenerator.op_pop(REG_EDX);
+
+		//push eax
+		compiler.codeGenerator.op_push(REG_EAX);
+	}
+}
+
+
+void ChangeTypeToWhole( const Type &oldType, const Type &newType ){
+	if( oldType.IsDouble() )
+	{
+		if( newType.Is64() )
+		{
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+		}
+		else{
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+	}
+	else if( oldType.IsSingle() )
+	{
+		if( newType.Is64() )
+		{
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+
+			//fistp qword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
+		}
+		else{
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
+
+			//fistp dword ptr[esp]
+			compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
+		}
+	}
+	else{
+		//整数から整数へ変換
+
+		if( newType.Is64() )
+		{
+			ExtendStackTo64( oldType );
+		}
+		else if( newType.GetSize()==sizeof(long)){
+			ExtendStackTo32( oldType );
+		}
+		else if( newType.GetSize()==sizeof(short)){
+			ExtendStackTo16( oldType );
+		}
+		else if( newType.GetSize()==sizeof(char)){
+			ExtendStackTo8( oldType );
+		}
+	}
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/Opcode.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/Opcode.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/Opcode.h	(revision 774)
@@ -0,0 +1,256 @@
+#pragma once
+
+#include "MachineFixed.h"
+
+
+//変数の種類
+#define NON_VAR				0
+#define VAR_GLOBAL			1	// Global Variable
+#define VAR_REFGLOBAL		2	// Global Refference Variable
+#define VAR_LOCAL			3	// Local Variable
+#define VAR_REFLOCAL		4	// Local Refference Variable
+#define VAR_DIRECTMEM		5	// Direct memory
+
+
+extern int cp;
+
+#define breakpoint compiler.codeGenerator.PutOld( (char)0xCC );
+
+
+//プロシージャ
+struct PROCEDURE{
+	char name[255];
+	int address;
+	int types[MAX_PARMS];
+	_int8 ByVal[MAX_PARMS];
+	BOOL ReturnType;
+};
+
+//With情報
+struct WithInfo
+{
+	std::string name;
+	int sourceCodePos;
+
+	WithInfo( const std::string &name, int sourceCodePos )
+		: name( name )
+		, sourceCodePos( sourceCodePos )
+	{
+	}
+};
+typedef std::vector<WithInfo> WithInfos;
+
+
+//RSrcSection.cpp
+char *GetRSrcSectionBuffer(int *pLen);
+
+//Compile.cpp
+void Compile( const char *source );
+void ChangeOpcode(char *Command);
+void GetGlobalDataForDll(void);
+DWORD CompileBuffer(char Return_Sequence,WORD Return_Command);
+
+//Compile_Calc.cpp
+void ChangeTypeToDouble_ToFpuReg(int OldType);
+void ChangeTypeToDouble(int OldType);
+void ChangeTypeToSingle(int OldType);
+void ChangeTypeToInt64(int OldType);
+void ChangeTypeToLong(int OldType);
+void ChangeTypeToInteger(int OldType);
+void ChangeTypeToByte(int OldType);
+void SetVariableFromEax( const Type &varType, int CalcType,RELATIVE_VAR *pRelativeVar);
+void OpcodeCalc( const char *Command );
+
+//NumOpe.cpp
+void PushReturnValue( const Type &type );
+bool TermOpeOnlyVariable( const char *term, Type &resultType, RELATIVE_VAR &relativeVar, bool isWriteAccess );
+bool TermOpe(
+			 const char *term,
+			 const Type &baseType,
+			 Type &resultType,
+			 bool &isLiteral,
+			 bool &isNeedHeapFreeStructure,
+			 bool *pIsClassName = NULL,
+			 bool isProcedureCallOnly = false,
+			 bool isWriteAccess = false );
+bool NumOpe( int reg,
+			const char *expression,
+			const Type &baseType,
+			Type &resultType,
+			bool *pbIsNeedHeapFreeStructure = NULL );
+bool NumOpe( const char *Command,
+		   const Type &baseType,
+		   Type &resultType,
+		   bool *pbIsNeedHeapFreeStructure = NULL );
+
+//NumOpe_Arithmetic.cpp
+void GetStackData_ToRegister(int *type,int sp);
+BOOL CalcTwoTerm_Arithmetic(int idCalc,int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Mod(int *type,int *pStackPointer);
+BOOL Calc_Divide(int *type,int *pStackPointer,int BaseType);
+BOOL Calc_IntDivide(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_MinusMark(int *type,int sp);
+BOOL Calc_Power(int *type,int *pStackPointer);
+BOOL Calc_Cast(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_SHL(int *type,int *pStackPointer);
+BOOL Calc_SHR(int *type,int *pStackPointer);
+
+//NumOpe_Logical.cpp
+BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Not(int *type,int sp);
+
+//NumOpe_Relation.cpp
+BOOL Calc_Relation_PE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_QE(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_P(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_Q(int *type_stack,LONG_PTR *index_stack,int *pStackPointer);
+BOOL Calc_Relation_NotEqual(int *type,int *pStackPointer);
+BOOL Calc_Relation_Equal(int *type,int *pStackPointer);
+
+//NumOpe_TypeOperation.cpp
+void ExtendStackTo64( const Type &oldType );
+void ChangeTypeToWhole( const Type &oldType, const Type &newType );
+
+//Compile_Set_Var.cpp
+BOOL IsUse_ecx(RELATIVE_VAR *pRelativeVar);
+void SetStructVariable( const Type &varType, const Type &calcType, BOOL bUseHeap);
+void SetRealVariable(int VarType, int CalcType, RELATIVE_VAR *pRelativeVar);
+void SetWholeVariable( int varSize,int calcType, RELATIVE_VAR *pRelative );
+
+void SetDoubleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetSingleVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetInt64Variable(int type,RELATIVE_VAR *pRelative);
+void SetDWordVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetLongVariable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void Set16Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void Set8Variable(int type,DWORD VarKind,DWORD offset,BOOL bOffsetOffset);
+void SetBooleanVariable(int type,RELATIVE_VAR *pRelative);
+void ExtendTypeTo64(int type);
+void ExtendTypeTo32(int type,int reg);
+void ExtendTypeTo16(int type,int reg);
+
+//increment.cpp
+void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight);
+
+//calc2.cpp
+#define EXP_TYPE_NUMBER	1
+#define EXP_TYPE_EAX	2
+#define EXP_TYPE_FPU	3
+#define EXP_TYPE_VAR	4
+int NumOpEx(char *Command,double *pDbl,DWORD *pdwType,RELATIVE_VAR *pRelativeVar);
+
+//SetVar.cpp
+BOOL SetVariable(DWORD dwVarType,RELATIVE_VAR *pVarRelativeVar,
+				 DWORD dwExpType,DWORD dwType,void *data);
+
+//Compile_Calc_PushVar.cpp
+void SetReg_RealVariable(int type,RELATIVE_VAR *pRelativeVar);
+void SetReg_WholeVariable( const Type &type, RELATIVE_VAR *pRelativeVar,int reg, bool is64Head = false);
+void PushLongVariable(RELATIVE_VAR *pRelativeVar);
+
+//Compile_Object.cpp
+void Operator_New( const CClass &classObj, const char *objectSizeStr, const char *parameter, const Type &baseType );
+void OpcodeDelete(const char *Parameter, bool isSweeping);
+
+//Compile_Var.cpp
+void SetRelativeOffset( RELATIVE_VAR &relativeVar );
+bool _member_offset(bool isErrorEnabled, bool isWriteAccess, const Type &classType, const char *member, RELATIVE_VAR *pRelativeVar, Type &resultType, BOOL bPrivateAccess);
+void SetThisPtrToReg(int reg);
+bool GetVarOffset(bool isErrorEnabled,bool isWriteAccess,const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType, Subscripts *pResultSubscripts = NULL );
+bool SetInitGlobalData(int offset,const Type &type,const Subscripts &subscripts,const char *InitBuf);
+#define DIMFLAG_INITDEBUGVAR			1
+#define DIMFLAG_NONCALL_CONSTRACTOR		2
+#define DIMFLAG_STATIC					4
+#define DIMFLAG_CONST					8
+void dim( char *VarName, const Subscripts &subscripts, const Type &type, const char *InitBuf,const char *ConstractParameter,DWORD dwFlags);
+void SetVarPtrToEax(RELATIVE_VAR *pRelativeVar);
+void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar);
+bool Compile_AddGlobalRootsForGc();
+
+//ParamImpl.cpp
+class ParamImpl{
+	char *Parms[255];
+	Types types;
+	int ParmsNum;
+
+	Type leftType;
+	Type returnType;
+
+	//一時オブジェクト管理用
+	bool useTempObject;
+	bool useTempParameters[255];
+	bool isNeedFreeStructures[255];
+	int nCountOfTempObjects;
+
+public:
+	ParamImpl(const char *buffer);
+	ParamImpl(const Parameters &params);
+	~ParamImpl();
+	void SetLeftType( const Type &type )
+	{
+		this->leftType = type;
+	}
+	void SetReturnType( const Type &returnType );
+
+private:
+	bool EvaluateOverloadScore( int level, const Parameters &targetParms, const Type &targetResultType, const Type &leftType, const UserProc &userProc, bool &isErrored );
+public:
+	const UserProc *_OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType );
+	const UserProc *OverloadSolution( const char *name, std::vector<const UserProc *> &subs, const Type &leftType, bool isEnabledReturnType = false );
+
+	void ApplyDefaultParameters( const Parameters &params );
+	bool ErrorCheck( const std::string &procName, const Parameters &params, int SecondParmNum = -1 );
+	void MacroParameterSupport( const Parameters &params );
+	void SetStructParameter( const Type &baseType, const char *expression );
+	int SetParameter( const std::string &procName, const Parameters &params, int SecondParmNum = -1, const UserProc *pUserProc = NULL );
+
+	//一時オブジェクトパラメータの生成と破棄
+	int NewTempParameters( const std::string &procName, const Parameters &params, int SecondParmNum = -1 );
+	void DeleteTempParameters();
+};
+
+//Compile_CallProc.cpp
+#define PROCFLAG_NEW				1
+#define PROCFLAG_PERMIT_CONSTRUCTOR	2
+#define PROCFLAG_PERMIT_DESTRUCTOR	4
+bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer);
+bool Opcode_CallProc(const char *Parameter,const UserProc *pUserProc,DWORD dwFlags,const char *ObjectName );
+bool Opcode_CallDllProc( const char *lpszParms, const DllProc *pDllProc );
+void Opcode_CallDelegate( const Delegate &dg, const char *methodPtrValueStr, const char *objPtrValueStr, const char *params );
+
+//Compile_ProcOp.cpp
+void _compile_proc(const UserProc *pUserProc);
+
+//Compile_Func.cpp
+int GetFunctionFromName(char *FuncName);
+bool Opcode_CallFunc( const char *Parameter, const int FuncNum, const Type &baseType, Type &resultType, bool isCallOn = true );
+
+//OperatorProc.cpp
+void FreeTempObject(int reg,const CClass *pobj_c);
+int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp);
+void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType);
+void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags = 0 );
+
+//Compile_Statement.cpp
+void OpcodeOthers( const char *Command );
+void OpcodeIf(char *Parameter);
+void OpcodeGoto(char *Parameter);
+void OpcodeWhile(char *Parameter);
+void OpcodeFor(char *Parameter);
+void OpcodeForeach( const char *Parameter );
+void OpcodeDo(char *Parameter);
+void OpcodeContinue(void);
+void OpcodeExitSub(void);
+void OpcodeSelect(const char *lpszParms);
+void OpcodeCase(char *Parameter);
+void OpcodeGosub(char *Parameter);
+void OpcodeReturn(char *Parameter);
+void OpcodeSetPtrData(char *Parameter,int type);
+
+
+
+
+//op32_main.cpp
+BOOL IsSafeReg(int reg);
Index: branches/egtra/ab5.0/abdev/compiler_x86/OperatorProc.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/OperatorProc.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/OperatorProc.cpp	(revision 774)
@@ -0,0 +1,276 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void FreeTempObject(int reg,const CClass *pobj_c){
+	if(!IsSafeReg(reg)) compiler.errorMessenger.Output(300,NULL,cp);
+
+	const CMethod *method = pobj_c->GetDestructorMethod();
+	if( method ){
+		//push reg
+		compiler.codeGenerator.op_push(reg);
+
+		//call DestructorProcAddr
+		compiler.codeGenerator.op_call( &method->GetUserProc() );
+	}
+
+	//push reg
+	compiler.codeGenerator.op_push(reg);
+
+	//call free
+	extern const UserProc *pSub_free;
+	compiler.codeGenerator.op_call(pSub_free);
+}
+
+int CallOperatorProc(int idCalc, const Type &baseType, int *type_stack, LONG_PTR *index_stack,bool isNeedHeapFreeStructureStack[],int &sp)
+{
+	Type leftType( type_stack[sp-2], index_stack[sp-2] );
+	Type rightType( type_stack[sp-1] & (~FLAG_CAST), index_stack[sp-1] );
+
+	//オーバーロードされたオペレータ関数を呼び出す
+	const CClass *pobj_c = &leftType.GetClass();
+
+	std::vector<const UserProc *> subs;
+	pobj_c->GetDynamicMethods().Enum( idCalc, subs );
+	if( subs.size() == 0 ){
+		return 0;
+	}
+
+
+	//項の数
+	BOOL bTwoTerm=1;
+	if(idCalc==CALC_AS) bTwoTerm=0;
+
+
+	/////////////////////////////////////////////
+	// オーバーロード解決用のパラメータを設定
+	/////////////////////////////////////////////
+
+	Parameters params;
+
+	if(bTwoTerm){
+		params.push_back( new Parameter( "", rightType ) );
+	}
+
+	//オーバーロードを解決
+	char temporary[255];
+	if(idCalc==CALC_EQUAL) lstrcpy(temporary,"==");
+	else GetCalcName(idCalc,temporary);
+	const UserProc *pUserProc = OverloadSolution( temporary, subs, params, baseType, leftType );
+
+	if(!pUserProc){
+		if(bTwoTerm){
+			delete params[0];
+		}
+		return -1;
+	}
+	else{
+		//オーバーロードされていないが、パラメータ個数が一致しないとき
+		if(params.size()!=pUserProc->Params().size()){
+			if(bTwoTerm){
+				delete params[0];
+			}
+			return -1;
+		}
+	}
+
+	for(int i=0;i<(int)params.size();i++){
+		CheckDifferentType(
+			*pUserProc->Params()[i],
+			*params[i],
+			NULL,
+			i);
+	}
+
+	if(bTwoTerm){
+		delete params[0];
+	}
+
+	int right_side_size = rightType.GetSize();
+
+	if(bTwoTerm){
+		if( pUserProc->RealParams()[1]->IsStruct() &&pUserProc->RealParams()[1]->IsRef() == false ){
+			//一時オブジェクトはメソッド内で破棄される
+			isNeedHeapFreeStructureStack[sp-1] = false;
+		}
+	}
+
+
+	if( pUserProc->ReturnType().IsStruct() ){
+		//////////////////////////////////////////////////////
+		// 戻り値に構造体インスタンスを持つ場合
+		// ※ByRef _System_ReturnValue パラメータ用領域を取得
+		//////////////////////////////////////////////////////
+
+		int object_size = pUserProc->ReturnType().GetClass().GetSize();
+
+		//push object_size
+		compiler.codeGenerator.op_push_V(object_size);
+
+		//call calloc
+		extern const UserProc *pSub_calloc;
+		compiler.codeGenerator.op_call(pSub_calloc);
+
+		//mov ebx,eax
+		compiler.codeGenerator.op_mov_RR(REG_EBX,REG_EAX);
+	}
+
+
+	//2つの項を取り出す
+	if(bTwoTerm){
+		if(right_side_size==sizeof(_int64)){
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else{
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+		}
+	}
+
+	//pop ecx
+	compiler.codeGenerator.op_pop(REG_ECX);
+
+
+	//ヒープ解放用に退避
+	if(isNeedHeapFreeStructureStack[sp-1]){
+		//mov esi,eax
+		compiler.codeGenerator.op_mov_RR(REG_ESI,REG_EAX);
+	}
+	if(isNeedHeapFreeStructureStack[sp-2]){
+		//mov edi,ecx
+		compiler.codeGenerator.op_mov_RR(REG_EDI,REG_ECX);
+	}
+
+
+
+	if(bTwoTerm){
+		if(right_side_size==sizeof(_int64)){
+			//push edx
+			compiler.codeGenerator.op_push(REG_EDX);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+		else{
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+
+		if( pUserProc->RealParams()[1]->IsRef() ){
+			//一時参照を作成
+
+			//mov eax,esp
+			compiler.codeGenerator.op_mov_RR( REG_EAX, REG_ESP );
+
+			//push eax
+			compiler.codeGenerator.op_push( REG_EAX );
+		}
+	}
+
+	if( pUserProc->ReturnType().IsStruct() ){
+		//push ebx
+		compiler.codeGenerator.op_push(REG_EBX);
+	}
+
+	//push ecx
+	compiler.codeGenerator.op_push(REG_ECX);
+
+	//call operator_proc
+	compiler.codeGenerator.op_call(pUserProc);
+
+	if(bTwoTerm){
+		if( pUserProc->RealParams()[1]->IsRef() ){
+			//一時参照を破棄
+			compiler.codeGenerator.op_pop( REG_NON );
+		}
+	}
+
+	if( !pUserProc->ReturnType().IsNull() ){
+		//スタックへプッシュ
+		PushReturnValue( pUserProc->ReturnType() );
+	}
+
+	if(isNeedHeapFreeStructureStack[sp-1]){
+		FreeTempObject(REG_ESI,(CClass *)index_stack[sp-1]);
+	}
+	if(isNeedHeapFreeStructureStack[sp-2]){
+		FreeTempObject(REG_EDI,(CClass *)index_stack[sp-2]);
+	}
+
+	Type temp( pUserProc->ReturnType() );
+	ResolveFormalGenericTypeParameter( temp, leftType, pUserProc );
+
+	sp--;
+	type_stack[sp-1] = temp.GetBasicType();
+	index_stack[sp-1] = temp.GetIndex();
+
+	if( pUserProc->ReturnType().IsStruct() )
+	{
+		//構造体が戻ったときはヒープ領域にインスタンスが格納されている
+		//※後にfreeする必要あり
+		isNeedHeapFreeStructureStack[sp-1] = true;
+	}
+	else
+	{
+		isNeedHeapFreeStructureStack[sp-1] = false;
+	}
+
+	return 1;
+}
+
+void CallCastOperatorProc(Type &calcType,BOOL bCalcUseHeap,const Type &toType){
+	int type_stack[10];
+	LONG_PTR index_stack[10];
+	bool array_bUseHeap[10];
+	int sp=2;
+
+	if(bCalcUseHeap){
+		//未解放のインスタンスが存在する旨を示す警告
+		compiler.errorMessenger.Output(-105,NULL,cp);
+	}
+
+	//左辺
+	type_stack[0]=calcType.GetBasicType();
+	index_stack[0]=calcType.GetIndex();
+	array_bUseHeap[0]=0;
+	type_stack[1]=toType.GetBasicType();
+	index_stack[1]=toType.GetIndex();
+	array_bUseHeap[1]=0;
+
+	int iRet = CallOperatorProc(CALC_AS,toType,type_stack,index_stack,array_bUseHeap,sp);
+
+	if(iRet==1){
+		//成功したとき
+		calcType.SetType( type_stack[0], index_stack[0] );
+		return;
+	}
+	else if(iRet==-1){
+		//エラーが発行されたとき
+		return;
+	}
+
+	//エラーを発行
+	compiler.errorMessenger.Output(-1,calcType.ToString() + " から " + toType.ToString() + " へ型変換できません。",cp);
+}
+void CallIndexerGetterProc( const Type &classType, const char *ObjectName, char *Parameter,Type &resultType, DWORD dwProcFlags ){
+	std::vector<const UserProc *> subs;
+	classType.GetClass().GetDynamicMethods().Enum( CALC_ARRAY_GET, subs );
+	if( subs.size() == 0 ){
+		return;
+	}
+
+	const UserProc *pUserProc = subs[0];
+
+	Opcode_CallProc(Parameter,pUserProc,dwProcFlags,ObjectName);
+	resultType = pUserProc->ReturnType();
+
+	// 型パラメータを解決
+	ResolveFormalGenericTypeParameter( resultType, classType, pUserProc );
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/commandvalue.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/commandvalue.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/commandvalue.h	(revision 774)
@@ -0,0 +1,102 @@
+/* 命令語定数 */
+
+//条件、分岐、繰り返し
+#define COM_DO		0x1021
+/* 0x22は「"」なので使用不可 */
+#define COM_GOTO	0x1023
+#define COM_GOSUB	0x1024
+#define COM_LOOP	0x1026
+#define COM_RETURN	0x1027
+/* 0x28は「(」なので使用不可 */
+/* 0x29は「)」なので使用不可 */
+#define COM_FOR		0x1031
+#define COM_NEXT	0x1032
+#define COM_WHILE	0x1036
+#define COM_WEND	0x1037
+#define COM_FOREACH	0x1038
+
+//データ操作
+#define COM_DIM		0x1062
+#define COM_LET		0x1066
+#define COM_DELETE	0x1068
+#define COM_SWEEPINGDELETE	0x1069
+
+//その他
+#define COM_DEBUG		0x1073
+
+//ポインタ
+#define COM_SETDOUBLE		0x10C1
+#define COM_SETSINGLE		0x10C2
+#define COM_SETQWORD		0x10C3
+#define COM_SETDWORD		0x10C4
+#define COM_SETWORD			0x10C5
+#define COM_SETBYTE			0x10C6
+
+
+
+///////////////////////////////////
+// 以下はProjectEditorで使用される
+
+//入出力コマンド
+#define COM_PRINT		0x1150
+#define COM_INPUT		0x1151
+#define COM_OPEN		0x1152
+#define COM_CLOSE		0x1153
+#define COM_FIELD		0x1154
+#define COM_WRITE		0x1155
+
+//条件、分岐、繰り返し
+#define COM_IF			0x1160
+#define COM_SELECT		0x1161
+
+//ファイル操作
+#define COM_CHDIR		0x1170
+#define COM_KILL		0x1171
+#define COM_MKDIR		0x1172
+#define COM_GET			0x1173
+#define COM_PUT			0x1174
+
+//グラフィックス
+#define COM_CIRCLE		0x1180
+#define COM_LINE		0x1181
+#define COM_PAINT		0x1182
+#define COM_PSET		0x1183
+
+//データ操作
+#define COM_CONST		0x1190
+#define COM_TYPEDEF		0x1191
+
+//クラス関連
+#define COM_CLASS		0x1195
+#define COM_PRIVATE		0x1196
+#define COM_PUBLIC		0x1197
+#define COM_INHERITS	0x1198
+#define COM_PROTECTED	0x1199
+#define COM_INTERFACE	0x119A
+
+//その他
+#define COM_BEEP		0x11A0
+#define COM_CLS			0x11A1
+#define COM_COLOR		0x11A2
+#define COM_DECLARE		0x11A4
+#define COM_DEF			0x11A5
+#define COM_END			0x11A6
+#define COM_FUNCTION	0x11A7
+#define COM_LOCATE		0x11A8
+#define COM_RANDOMIZE	0x11A9
+#define COM_REM			0x11AA
+#define COM_SLEEP		0x11AB
+#define COM_SUB			0x11AC
+#define COM_TYPE		0x11AD
+#define COM_VIRTUAL		0x11AE
+#define COM_OVERRIDE	0x11AF
+#define COM_WITH		0x11B0
+#define COM_ENUM		0x11B1
+#define COM_ABSTRACT	0x11B2
+#define COM_NAMESPACE	0x11B3
+#define COM_TRY			0x11B4
+
+//ウィンドウ制御
+#define COM_DELWND		0x11C0
+#define COM_MSGBOX		0x11C1
+#define COM_WINDOW		0x11C2
Index: branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.rc
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.rc	(revision 774)
@@ -0,0 +1,458 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE MOVEABLE PURE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(JPN) DIALOG DISCARDABLE  0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE  0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler(32bit)"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "コンパイル",IDOK,148,208,50,14
+    LTEXT           "出力先:",IDC_STATIC,7,10,23,8
+    EDITTEXT        IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+                    179,14
+    GROUPBOX        "進行状況",IDC_STATIC,7,31,191,45
+    LTEXT           "準備中...",IDC_MESSAGE,13,44,161,8
+    GROUPBOX        "メッセージ リスト",IDC_STATIC,7,83,191,117
+    EDITTEXT        IDC_ERRORLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "エラー",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,13,97,35,10
+    CONTROL         "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,50,97,35,10
+    EDITTEXT        IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE | 
+                    WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    LTEXT           "Version",IDC_STATIC_VERSION,7,214,140,8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(JPN) DIALOG DISCARDABLE  0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE  0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "ブレーク ポイント"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "閉じる",IDCANCEL,165,6,50,14
+    LTEXT           "対象領域:",IDC_STATIC,2,9,30,8
+    LTEXT           "対象スレッド:",IDC_STATIC,2,26,38,8
+    COMBOBOX        IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS | 
+                    TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+                    0,88,215,111
+    CONTROL         "グローバル",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,43,6,47,14
+    CONTROL         "ローカル",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,92,6,47,14
+    LTEXT           "プロシージャ:",IDC_STATIC,2,43,39,8
+    COMBOBOX        IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "システム変数を表示しない",IDC_HIDESYSVAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,117,44,93,10
+    PUSHBUTTON      "ステップ(IN)",IDC_STEPIN,4,64,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+    PUSHBUTTON      "ステップ(OVER)",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(JPN) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    PUSHBUTTON      "コンパイル",IDOK,0,0,37,13
+    EDITTEXT        IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY | 
+                    NOT WS_VISIBLE
+    EDITTEXT        IDC_ERRORLIST,38,14,129,74,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    CONTROL         "ビルド",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,20,37,12
+    CONTROL         "デバッグ",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,34,37,12
+    EDITTEXT        IDC_DEBUGLIST,38,15,179,73,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+                    38,1,293,12
+    LTEXT           "準備中...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+                    WS_EX_TRANSPARENT
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,16,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_CLIPMAIN$(ENG) DIALOGEX 0, 0, 332, 88
+#else
+IDD_CLIPMAIN DIALOGEX 0, 0, 332, 88
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    PUSHBUTTON      "Compile",IDOK,0,0,37,11
+    EDITTEXT        IDC_EXEPATH,285,57,24,12,ES_AUTOHSCROLL | ES_READONLY | 
+                    NOT WS_VISIBLE
+    EDITTEXT        IDC_ERRORLIST,38,13,129,75,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,17,37,10
+    CONTROL         "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,0,28,37,10
+    EDITTEXT        IDC_DEBUGLIST,38,14,179,74,ES_MULTILINE | ES_AUTOVSCROLL | 
+                    ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",PBS_SMOOTH,
+                    38,0,293,12
+    LTEXT           "Waiting...",IDC_MESSAGE,286,47,24,8,NOT WS_VISIBLE,
+                    WS_EX_TRANSPARENT
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,13,39,1
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_MAIN$(ENG) DIALOG DISCARDABLE  0, 0, 205, 229
+#else
+IDD_MAIN DIALOG DISCARDABLE  0, 0, 205, 229
+#endif
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic Compiler&Debugger"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "Compile",IDOK,148,208,50,14
+    LTEXT           "Output:",IDC_STATIC,7,10,22,8
+    EDITTEXT        IDC_EXEPATH,34,7,164,14,ES_AUTOHSCROLL
+    CONTROL         "Progress1",IDC_PROGRESS,"msctls_progress32",0x0,13,56,
+                    179,14
+    GROUPBOX        "Advance situation",IDC_STATIC,7,31,191,45
+    LTEXT           "ready...",IDC_MESSAGE,13,44,161,8
+    GROUPBOX        "Message list",IDC_STATIC,7,83,191,117
+    EDITTEXT        IDC_ERRORLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_DISABLED | 
+                    WS_VSCROLL | WS_HSCROLL
+    CONTROL         "Error",IDC_SHOWERROR,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,13,97,30,10
+    CONTROL         "Debug",IDC_SHOWDEBUG,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,50,97,35,10
+    EDITTEXT        IDC_DEBUGLIST,13,113,179,80,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | NOT WS_VISIBLE | 
+                    WS_DISABLED | WS_VSCROLL | WS_HSCROLL
+    LTEXT           "Version 4.00 Global Edition beta1",IDC_STATIC,7,214,98,
+                    8
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_VARLIST$(ENG) DIALOG DISCARDABLE  0, 0, 215, 199
+#else
+IDD_VARLIST DIALOG DISCARDABLE  0, 0, 215, 199
+#endif
+STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "Breakpoint"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "Close",IDCANCEL,165,6,50,14
+    LTEXT           "Level:",IDC_STATIC,2,9,18,8
+    LTEXT           "Thread:",IDC_STATIC,2,26,22,8
+    COMBOBOX        IDC_THREADCOMBO,43,24,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Tree1",IDC_VARTREE,"SysTreeView32",TVS_HASBUTTONS | 
+                    TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP,
+                    0,88,215,111
+    CONTROL         "Global",IDC_GLOBAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,43,6,47,14
+    CONTROL         "Local",IDC_LOCAL,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,92,6,47,14
+    LTEXT           "Procedure:",IDC_STATIC,2,43,31,8
+    COMBOBOX        IDC_PROCCOMBO,43,40,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "Hide system variables",IDC_HIDESYSVAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,117,44,81,10
+    PUSHBUTTON      "Step In",IDC_STEPIN,4,64,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,59,215,1
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,81,215,1
+    PUSHBUTTON      "Step Over",IDC_STEPOVER,57,64,50,14
+END
+#endif
+
+#if defined(APSTUDIO_INVOKED) || defined(JPN)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(JPN) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "対象スレッド:",IDC_STATIC,5,21,38,8
+    COMBOBOX        IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    LTEXT           "プロシージャ:",IDC_STATIC,5,49,39,8
+    COMBOBOX        IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+    LTEXT           "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+                    WS_EX_STATICEDGE
+    CONTROL         "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT | 
+                    LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+                    WS_EX_ACCEPTFILES
+    LTEXT           "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+IDD_DEBUGGER_TOOLBARBASE DIALOG DISCARDABLE  0, 0, 62, 15
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+#if defined(APSTUDIO_INVOKED) || defined(ENG)
+#if defined(APSTUDIO_INVOKED)
+IDD_DEBUGGER$(ENG) DIALOGEX 0, 0, 291, 148
+#else
+IDD_DEBUGGER DIALOGEX 0, 0, 291, 148
+#endif
+STYLE WS_CHILD
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "Thread:",IDC_STATIC,5,21,22,8
+    COMBOBOX        IDC_THREADCOMBO,5,30,69,100,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    LTEXT           "Procedure:",IDC_STATIC,5,49,31,8
+    COMBOBOX        IDC_PROCCOMBO,5,58,69,116,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,0,15,99,1
+    LTEXT           "dummy",IDC_VARPOS,98,0,35,41,NOT WS_VISIBLE,
+                    WS_EX_STATICEDGE
+    CONTROL         "List2",IDC_WATCHLIST,"SysListView32",LVS_REPORT | 
+                    LVS_EDITLABELS | WS_BORDER | WS_TABSTOP,171,9,60,50,
+                    WS_EX_ACCEPTFILES
+    LTEXT           "コマンド",IDC_STATIC,3,3,23,8
+END
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO MOVEABLE PURE 
+BEGIN
+    "IDD_MAIN$(JPN)", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 198
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 222
+    END
+
+    "IDD_VARLIST$(JPN)", DIALOG
+    BEGIN
+        BOTTOMMARGIN, 161
+    END
+
+    "IDD_MAIN$(ENG)", DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 198
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 222
+    END
+
+    "IDD_VARLIST$(ENG)", DIALOG
+    BEGIN
+        BOTTOMMARGIN, 161
+    END
+
+    IDD_DEBUGGER_TOOLBARBASE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 55
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 8
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN                ICON    DISCARDABLE     "icon1.ico"
+IDI_VARSTRUCT           ICON    DISCARDABLE     "VarStruct.ico"
+IDI_VARDATA             ICON    DISCARDABLE     "VarData.ico"
+IDI_VARSTR              ICON    DISCARDABLE     "VarStr.ico"
+IDI_VARARRAY            ICON    DISCARDABLE     "VarArray.ico"
+IDI_VARPTRSTRUCT        ICON    DISCARDABLE     "VarPtrStruct.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_DEBUGGERTOOLBAR TOOLBAR MOVEABLE PURE  16, 15
+BEGIN
+    BUTTON      IDC_DEBUG_START
+    BUTTON      IDC_DEBUG_STEPOVER
+    BUTTON      IDC_DEBUG_STEPIN
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_DEBUGGERTOOLBAR     BITMAP  MOVEABLE PURE   "toolbar_debugger.bmp"
+IDR_DEBUGGERTOOLBAR_DISABLED BITMAP  MOVEABLE PURE   "toolbar_debugger_disable.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_DEBUGGER_VARLIST_MENU MENU DISCARDABLE 
+BEGIN
+    POPUP "dummy"
+    BEGIN
+        MENUITEM "一般システム変数を表示する",  IDM_SHOW_DEFAULTSYSTEM_VAR
+        MENUITEM "RADシステム変数を表示する",   IDM_SHOW_RAD_VAR
+        MENUITEM "GUID変数を表示する",          IDM_SHOW_GUID_VAR
+    END
+END
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 5,0,0,5
+ PRODUCTVERSION 5,0,0,5
+ FILEFLAGSMASK 0x17L
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "041104b0"
+        BEGIN
+            VALUE "Comments", "\0"
+            VALUE "CompanyName", "activebasic.com\0"
+            VALUE "FileDescription", "ActiveBasic x86 Compiler\0"
+            VALUE "FileVersion", "5, 0, 0, 5\0"
+            VALUE "InternalName", "abc\0"
+            VALUE "LegalCopyright", "Copyright (C) 2008 activebasic.com\0"
+            VALUE "LegalTrademarks", "\0"
+            VALUE "OriginalFilename", "abc.exe\0"
+            VALUE "PrivateBuild", "\0"
+            VALUE "ProductName", "ActiveBasic x86 Compiler\0"
+            VALUE "ProductVersion", "5, 0, 0, 5\0"
+            VALUE "SpecialBuild", "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x411, 1200
+    END
+END
+
+#endif    // !_MAC
+
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.vcproj
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.vcproj	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/compiler_x86.vcproj	(revision 774)
@@ -0,0 +1,1479 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="compiler_x86"
+	ProjectGUID="{11F0E9AB-EAEC-4616-A9DD-838073342CBB}"
+	RootNamespace="compiler_x86"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)\bin\x86"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\Debug/BasicCompiler.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;..\BasicCompiler_Common\include"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;JPN"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile=".\Debug/BasicCompiler.pch"
+				AssemblerListingLocation=".\Debug/"
+				ObjectFile=".\Debug/"
+				ProgramDataBaseFileName=".\Debug/"
+				BrowseInformation="0"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG,JPN"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NXCOMPAT /DYNAMICBASE"
+				AdditionalDependencies="comctl32.lib psapi.lib imagehlp.lib shlwapi.lib"
+				OutputFile="$(OutDir)\abc.exe"
+				LinkIncremental="2"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				GenerateDebugInformation="true"
+				ProgramDatabaseFile=".\Debug/BasicCompiler32.pdb"
+				SubSystem="1"
+				StackReserveSize="4194304"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile=".\Debug/BasicCompiler.bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\build\$(ConfigurationName)\bin\x86"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="1"
+				TypeLibraryName=".\Release/BasicCompiler.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				InlineFunctionExpansion="2"
+				FavorSizeOrSpeed="1"
+				AdditionalIncludeDirectories="..\..\;..\..\cpplibs\boost;..\BasicCompiler_Common\include"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;JPN"
+				StringPooling="false"
+				RuntimeLibrary="0"
+				EnableFunctionLevelLinking="false"
+				RuntimeTypeInfo="true"
+				UsePrecompiledHeader="2"
+				PrecompiledHeaderFile=".\Release/BasicCompiler.pch"
+				AssemblerListingLocation=".\Release/"
+				ObjectFile=".\Release/"
+				ProgramDataBaseFileName=".\Release/"
+				BrowseInformation="0"
+				BrowseInformationFile=".\Release/"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG,JPN"
+				Culture="1041"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalOptions="/NXCOMPAT /DYNAMICBASE /SAFESEH"
+				AdditionalDependencies="comctl32.lib psapi.lib imagehlp.lib shlwapi.lib"
+				OutputFile="$(OutDir)\abc.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				AdditionalLibraryDirectories="..\..\jenga\lib\x86;..\lib\x86"
+				ProgramDatabaseFile=".\Release/BasicCompiler32.pdb"
+				SubSystem="1"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+				AdditionalManifestFiles="manifest.xml"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+				SuppressStartupBanner="true"
+				OutputFile=".\Release/BasicCompiler.bsc"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCWebDeploymentTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+			RelativePathToProject="..\jenga\projects\jenga\jenga.vcproj"
+		/>
+		<ProjectReference
+			ReferencedProjectIdentifier="{87835C33-64C9-4BA5-9B39-608BA5394387}"
+			RelativePathToProject=".\ab_common\ab_common.vcproj"
+		/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+			>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+			<Filter
+				Name="32及び64共通"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\BasicCompiler.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\calculation.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Compile.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Diagnose.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\error.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\gc.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\hash.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\MakeExe.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\NumOpe_GetType.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Object.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\OldStatement.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\Overload.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\RSrcSection.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\StrOperation.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\StrOperation.h"
+					>
+				</File>
+				<Filter
+					Name="Intermediate"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\CommandFormat.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Intermediate_Step1.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Intermediate_Step2.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Parts"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\NonVolatile.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Debug（共通）"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\CDebugThreadInfo.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Debug.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\debug.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\DebugMiddleFile.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\DebugSection.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VarList.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\WatchList.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								ObjectFile="$(IntDir)\$(InputName)1.obj"
+								XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc"
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Schedule"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\PESchedule.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\PESchedule.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Variable"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\VariableOpe.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\VariableOpe.h"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\ParamImpl.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\Subroutine.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="x86Compiler"
+				>
+				<File
+					RelativePath="Compile_Statement.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="Compile_Var.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<File
+					RelativePath="MakePeHdr.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							PreprocessorDefinitions=""
+						/>
+					</FileConfiguration>
+				</File>
+				<Filter
+					Name="Calculation"
+					>
+					<File
+						RelativePath="Compile_Calc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Calc_PushVar.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Set_Var.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="increment.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Arithmetic.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Logical.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_Relation.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="NumOpe_TypeOperation.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Object"
+					>
+					<File
+						RelativePath="Compile_Object.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+				<Filter
+					Name="Opcode"
+					>
+					<File
+						RelativePath="op32_main.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath=".\x86CodeGenerator.cpp"
+						>
+					</File>
+				</Filter>
+				<Filter
+					Name="Procedure"
+					>
+					<File
+						RelativePath="Compile_CallProc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_Func.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="Compile_ProcOp.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="CParameter.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+					<File
+						RelativePath="OperatorProc.cpp"
+						>
+						<FileConfiguration
+							Name="Debug|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+						<FileConfiguration
+							Name="Release|Win32"
+							>
+							<Tool
+								Name="VCCLCompilerTool"
+								PreprocessorDefinitions=""
+							/>
+						</FileConfiguration>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Common Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\BoostSerializationSupport.cpp"
+					>
+					<FileConfiguration
+						Name="Debug|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+					<FileConfiguration
+						Name="Release|Win32"
+						>
+						<Tool
+							Name="VCCLCompilerTool"
+							UsePrecompiledHeader="0"
+						/>
+					</FileConfiguration>
+				</File>
+			</Filter>
+			<Filter
+				Name="Compiler Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\CodeGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\CommonCodeGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Compiler.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\DataTableGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Class.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Const.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Delegate.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Enum.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_Procedure.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\LexicalAnalyzer_TypeDef.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Linker.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Messenger.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\ProcedureGenerator.cpp"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\VtblGenerator.cpp"
+					>
+				</File>
+				<Filter
+					Name="Langauge Classes"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\src\Exception.cpp"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\src\LexicalScope.cpp"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\Program.cpp"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Debugger Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\src\BreakPoint.cpp"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl"
+			>
+			<File
+				RelativePath="..\BasicCompiler_Common\BasicCompiler.h"
+				>
+			</File>
+			<File
+				RelativePath="CommandValue.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\common.h"
+				>
+			</File>
+			<File
+				RelativePath=".\MachineFixed.h"
+				>
+			</File>
+			<File
+				RelativePath="Opcode.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\include\option.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath="..\BasicCompiler_Common\include\ver.h"
+				>
+			</File>
+			<Filter
+				Name="言語対応文字列"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\common_msg_eng.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\common_msg_jpn.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Parts_h"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\NonVolatile.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Common Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\logger.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Compiler Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\CodeGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Compiler.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\DataTableGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\ErrorCode.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\LexicalAnalyzer.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Linker.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Messenger.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\ProcedureGenerator.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\VtblGenerator.h"
+					>
+				</File>
+				<Filter
+					Name="Language Classes"
+					>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\Enum.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\Exception.h"
+						>
+					</File>
+					<File
+						RelativePath="..\BasicCompiler_Common\include\LexicalScope.h"
+						>
+					</File>
+				</Filter>
+			</Filter>
+			<Filter
+				Name="Application Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Configuration.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Program.h"
+					>
+				</File>
+			</Filter>
+			<Filter
+				Name="Debugger Classes"
+				>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\BreakPoint.h"
+					>
+				</File>
+				<File
+					RelativePath="..\BasicCompiler_Common\include\Debugger.h"
+					>
+				</File>
+			</Filter>
+		</Filter>
+		<Filter
+			Name="Resource Files"
+			Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+			>
+			<File
+				RelativePath=".\compiler_x86.rc"
+				>
+			</File>
+			<File
+				RelativePath="icon1.ico"
+				>
+			</File>
+			<File
+				RelativePath="toolbar_debugger.bmp"
+				>
+			</File>
+			<File
+				RelativePath="toolbar_debugger_disable.bmp"
+				>
+			</File>
+			<File
+				RelativePath="VarArray.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarData.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarPtrStruct.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarStr.ico"
+				>
+			</File>
+			<File
+				RelativePath="VarStruct.ico"
+				>
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: branches/egtra/ab5.0/abdev/compiler_x86/increment.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/increment.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/increment.cpp	(revision 774)
@@ -0,0 +1,220 @@
+#include "stdafx.h"
+
+#include <Compiler.h>
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+void IncDec(int idCalc, const char *lpszLeft, const char *lpszRight)
+{
+	Type varType;
+	if( GetVarType( lpszLeft, varType, false ) )
+	{
+		if( varType.IsObject() )
+		{
+			// オブジェクトが対象だったとき
+			char temporary[8192];
+			char calcStr[32];
+			GetCalcName( idCalc, calcStr );
+			sprintf( temporary, "%s=%s %s %s", lpszLeft, lpszLeft, calcStr, lpszRight );
+			SetEscapeSequenceFormat( temporary );
+			KillStringSpaces( temporary );
+			OpcodeCalc( temporary );
+			return;
+		}
+	}
+
+	///////////////////////////
+	// 変数アドレスを取得
+	///////////////////////////
+	RELATIVE_VAR VarRelativeVar;
+	if(!GetVarOffsetReadWrite(
+		lpszLeft,
+		&VarRelativeVar,
+		varType)) return;
+
+	if(IsUse_ecx(&VarRelativeVar)){
+		//push ecx
+		compiler.codeGenerator.op_push(REG_ECX);
+	}
+
+
+	///////////////////////////////////
+	// レジスタへ変数の内容をコピー
+	///////////////////////////////////
+
+	if( varType.IsReal() ){
+		//実数
+		SetReg_RealVariable(varType.GetBasicType(),&VarRelativeVar);
+	}
+	else{
+		//整数
+		SetReg_WholeVariable(varType,&VarRelativeVar,REG_EAX);
+	}
+
+	
+	if(varType.IsWhole()&&lstrcmp(lpszRight,"1")==0&&
+		(idCalc==CALC_ADDITION||idCalc==CALC_SUBTRACTION)){
+		////////////////////////////////////////////
+		// 整数型のインクリメント・デクリメント
+		////////////////////////////////////////////
+
+		if( varType.Is64() ){
+			if(idCalc==CALC_ADDITION){
+				//64ビット インクリメント
+
+				//add eax,1
+				compiler.codeGenerator.op_add_RV8(REG_EAX,1);
+
+				//adc edx,0
+				compiler.codeGenerator.op_adc_RV8(REG_EDX,0);
+			}
+			else if(idCalc==CALC_SUBTRACTION){
+				//64ビット デクリメント
+
+				//sub eax,1
+				compiler.codeGenerator.op_sub_RV8(REG_EAX,1);
+
+				//sbb edx,0
+				compiler.codeGenerator.op_sbb_RV8(REG_EDX,0);
+			}
+		}
+		else{
+			if(idCalc==CALC_ADDITION){
+				//インクリメント
+				compiler.codeGenerator.op_inc(REG_EAX);
+			}
+			else if(idCalc==CALC_SUBTRACTION){
+				//デクリメント
+				compiler.codeGenerator.op_dec(REG_EAX);
+			}
+		}
+	}
+	else{
+		//変数オフセットを一時退避
+		//push ecx
+		compiler.codeGenerator.op_push(REG_ECX);
+
+		if( varType.IsDouble() ){
+			//sub esp,8
+			compiler.codeGenerator.op_sub_esp(8);
+
+			//fstp qword ptr[esp]
+			compiler.codeGenerator.op_fstp_basereg(varType.GetBasicType(),REG_ESP);
+		}
+		else if( varType.IsSingle() ){
+			//sub esp,4
+			compiler.codeGenerator.op_sub_esp(4);
+
+			//fstp dword ptr[esp]
+			compiler.codeGenerator.op_fstp_basereg(varType.GetBasicType(),REG_ESP);
+		}
+		else if( varType.Is64() ){
+			//push edx
+			compiler.codeGenerator.op_push(REG_EDX);
+
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+		else{
+			//push eax
+			compiler.codeGenerator.op_push(REG_EAX);
+		}
+
+		Type calcType;
+		if( !NumOpe(lpszRight,varType,calcType) ){
+			return;
+		}
+
+		if( varType.IsDouble() )		ChangeTypeToDouble(calcType.GetBasicType());
+		else if( varType.IsSingle() )	ChangeTypeToSingle(calcType.GetBasicType());
+		else ChangeTypeToWhole( calcType, varType );
+
+		int type_stack[255],sp;
+		LONG_PTR index_stack[255];
+		type_stack[0]=varType.GetBasicType();
+		type_stack[1]=varType.GetBasicType();
+		index_stack[0]=varType.GetIndex();
+		index_stack[1]=varType.GetIndex();
+		sp=2;
+
+		switch(idCalc){
+			case CALC_XOR:
+				Calc_Xor(type_stack,index_stack,&sp);
+				break;
+			case CALC_OR:
+				Calc_Or(type_stack,index_stack,&sp);
+				break;
+			case CALC_AND:
+				Calc_And(type_stack,index_stack,&sp);
+				break;
+			case CALC_SHL:
+				Calc_SHL(type_stack,&sp);
+				break;
+			case CALC_SHR:
+				Calc_SHR(type_stack,&sp);
+				break;
+			case CALC_ADDITION:
+			case CALC_SUBTRACTION:
+			case CALC_PRODUCT:
+				CalcTwoTerm_Arithmetic(idCalc,type_stack,index_stack,&sp);
+				break;
+			case CALC_MOD:
+				Calc_Mod(type_stack,&sp);
+				break;
+			case CALC_QUOTIENT:
+				Calc_Divide(type_stack,&sp,varType.GetBasicType());
+				break;
+			case CALC_INTQUOTIENT:
+				Calc_IntDivide(type_stack,index_stack,&sp);
+				break;
+			case CALC_POWER:
+				Calc_Power(type_stack,&sp);
+				break;
+		}
+
+
+		if( varType.IsDouble() ){
+			//fld qword ptr[esp]
+			compiler.codeGenerator.op_fld_basereg(varType.GetBasicType(),REG_ESP);
+
+			//add esp,8
+			compiler.codeGenerator.op_add_esp(8);
+		}
+		else if( varType.IsSingle() ){
+			//fld dword ptr[esp]
+			compiler.codeGenerator.op_fld_basereg(varType.GetBasicType(),REG_ESP);
+
+			//add esp,4
+			compiler.codeGenerator.op_add_esp(4);
+		}
+		else if( varType.Is64() ){
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+
+			//pop edx
+			compiler.codeGenerator.op_pop(REG_EDX);
+		}
+		else{
+			//pop eax
+			compiler.codeGenerator.op_pop(REG_EAX);
+		}
+
+
+		//変数オフセットを復元
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+	}
+
+
+	/////////////////////////////////////////////////
+	// レジスタの内容を変数にコピー
+	/////////////////////////////////////////////////
+
+	if(IsUse_ecx(&VarRelativeVar)){
+		//pop ecx
+		compiler.codeGenerator.op_pop(REG_ECX);
+	}
+
+	SetVariableFromEax(varType,varType.GetBasicType(),&VarRelativeVar);
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/manifest.xml
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/manifest.xml	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/manifest.xml	(revision 774)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+<assemblyIdentity
+version="1.0.0.0"
+processorArchitecture="x86"
+name="Microsoft.Winweb.BasicCompiler.exe"
+type="win32"
+/>
+<description>Description</description>
+<dependency>
+<dependentAssembly>
+<assemblyIdentity
+type="win32"
+name="Microsoft.Windows.Common-Controls"
+version="6.0.0.0"
+processorArchitecture="x86"
+publicKeyToken="6595b64144ccf1df"
+language="*"
+/>
+</dependentAssembly>
+</dependency>
+</assembly>
Index: branches/egtra/ab5.0/abdev/compiler_x86/op32_main.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/op32_main.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/op32_main.cpp	(revision 774)
@@ -0,0 +1,11 @@
+#include "stdafx.h"
+
+#include "../BasicCompiler_Common/common.h"
+#include "Opcode.h"
+
+
+
+BOOL IsSafeReg(int reg){
+	if(reg==REG_EBX||reg==REG_ESI||reg==REG_EDI) return 1;
+	return 0;
+}
Index: branches/egtra/ab5.0/abdev/compiler_x86/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/resource.h	(revision 774)
@@ -0,0 +1,56 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by compiler_x86.rc
+//
+#define IDD_MAIN                        101
+#define IDD_VARLIST                     103
+#define IDI_MAIN                        108
+#define IDI_VARSTRUCT                   109
+#define IDI_VARDATA                     110
+#define IDI_VARSTR                      111
+#define IDI_VARARRAY                    112
+#define IDI_VARPTRSTRUCT                113
+#define IDD_CLIPMAIN                    114
+#define IDD_DEBUGGER                    115
+#define IDR_DEBUGGERTOOLBAR             117
+#define IDD_DEBUGGER_TOOLBARBASE        120
+#define IDR_DEBUGGER_VARLIST_MENU       122
+#define IDR_DEBUGGERTOOLBAR_DISABLED    125
+#define IDC_EXEPATH                     1000
+#define IDC_PROGRESS                    1001
+#define IDC_ERRORLIST                   1002
+#define IDC_MESSAGE                     1003
+#define IDC_DEBUGLIST                   1005
+#define IDC_SHOWERROR                   1006
+#define IDC_SHOWDEBUG                   1007
+#define IDC_THREADCOMBO                 1014
+#define IDC_VARTREE                     1015
+#define IDC_GLOBAL                      1016
+#define IDC_LOCAL                       1017
+#define IDC_PROCCOMBO                   1018
+#define IDC_HIDESYSVAR                  1019
+#define IDC_STEPIN                      1021
+#define IDC_STEPOVER                    1022
+#define IDC_ESP                         1023
+#define IDC_DUMMYCANCEL                 1024
+#define IDC_TAB1                        1025
+#define IDC_VARPOS                      1029
+#define IDC_WATCHLIST                   1033
+#define IDC_STATIC_VERSION              1034
+#define IDC_DEBUG_START                 40003
+#define IDC_DEBUG_STEPOVER              40004
+#define IDC_DEBUG_STEPIN                40005
+#define IDM_SHOW_DEFAULTSYSTEM_VAR      40007
+#define IDM_SHOW_RAD_VAR                40008
+#define IDM_SHOW_GUID_VAR               40009
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        126
+#define _APS_NEXT_COMMAND_VALUE         40010
+#define _APS_NEXT_CONTROL_VALUE         1035
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/compiler_x86/stdafx.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/stdafx.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/stdafx.cpp	(revision 774)
@@ -0,0 +1,1 @@
+#include "stdafx.h"
Index: branches/egtra/ab5.0/abdev/compiler_x86/stdafx.h
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/stdafx.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/stdafx.h	(revision 774)
@@ -0,0 +1,59 @@
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+#include <iomanip>
+#include <ios>
+#include <streambuf>
+#include <sstream>
+#include <algorithm>
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <shlwapi.h>
+#include <tchar.h>
+#include <stdarg.h>
+#include <assert.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+
+#include <jenga/include/jenga.h>
+
+#include <option.h>
+
+#include <abdev/ab_common/include/ab_common.h>
+
+using namespace ActiveBasic::Common::Lexical;
+
+#include "../BasicCompiler_Common/common.h"
+
+#include <Exception.h>
+#include <Enum.h>
+#include <logger.h>
+#include <Configuration.h>
+#include <CodeGenerator.h>
+#include <Messenger.h>
+#include <ErrorCode.h>
+#include <Linker.h>
+#include <Compiler.h>
+#include <Debugger.h>
+#include <Program.h>
+#include <LexicalAnalyzer.h>
+#include <VtblGenerator.h>
+#include <ProcedureGenerator.h>
+#include <DataTableGenerator.h>
+#include <BreakPoint.h>
Index: branches/egtra/ab5.0/abdev/compiler_x86/x86CodeGenerator.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/compiler_x86/x86CodeGenerator.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/compiler_x86/x86CodeGenerator.cpp	(revision 774)
@@ -0,0 +1,1337 @@
+#include "stdafx.h"
+
+
+
+/////////////////////////////////////////////////
+// ModR/Mバイト、SIBバイト、ディスプレースメント
+/////////////////////////////////////////////////
+
+//スケール
+#define SCALE_NON	(char)0x00
+#define SCALE_2		(char)0x40
+#define SCALE_4		(char)0x80
+#define SCALE_8		(char)0xC0
+
+//インデックスなし
+#define INDEX_NON	0x04
+
+const PertialSchedule * CodeGenerator::set_mod_rm_sib_disp(char mod,int reg,int scale,int index_reg,int base_reg,long disp, Schedule::Type scheduleType, bool isPertialSchedule )
+{
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	// エラーチェック
+	if( ! ( mod == MOD_BASE
+		|| mod == MOD_DISP32
+		|| mod == MOD_BASE_DISP8
+		|| mod == MOD_BASE_DISP32
+		|| mod == MOD_REG ) )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+	if( isPertialSchedule && !( mod == MOD_DISP32 || mod == MOD_BASE_DISP32 ) )
+	{
+		compiler.errorMessenger.OutputFatalError();
+	}
+
+	if(mod==MOD_DISP32){
+		//ModR/Mバイト
+		pNativeCode->Put( (char)(REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(0x04)) );
+
+		base_reg=0x05;
+		index_reg=INDEX_NON;
+	}
+	else{
+		//ModR/Mバイト
+		pNativeCode->Put( (char)(mod | REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(base_reg)) );
+	}
+
+
+	//レジスタモードの場合は、ここで終了
+	if(mod==MOD_REG) return pPertialSchedule;
+
+
+	if(REGISTER_OPERAND(base_reg)==0x04||mod==MOD_DISP32){
+		//////////////////////
+		// SIBバイトを使う
+		//////////////////////
+
+		pNativeCode->Put( (char)(scale| REGISTER_OPERAND(index_reg)<<3 | REGISTER_OPERAND(base_reg)) );
+	}
+
+	//ディスプレースメントを必要としない場合は、ここで終了
+	if(mod==MOD_BASE) return pPertialSchedule;
+
+
+	//////////////////////////
+	// ディスプレースメント
+	//////////////////////////
+
+	if(mod==MOD_BASE_DISP8)
+	{
+		pNativeCode->Put( (char)disp );
+	}
+	else
+	{
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+
+		this->PutWithSchedule( disp, scheduleType );
+	}
+
+	return pPertialSchedule;
+}
+
+
+
+void CodeGenerator::__op_format(char op_prefix,char opcode,int reg){
+	//命令プリフィックス
+	if(op_prefix)
+	{
+		pNativeCode->Put( op_prefix );
+	}
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(opcode|REGISTER_OPERAND(reg)) );
+}
+const PertialSchedule *CodeGenerator::__op_format(char op_prefix,char opcode1,char opcode2,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//命令プリフィックス
+	if(op_prefix)
+	{
+		pNativeCode->Put( op_prefix );
+	}
+
+	//オペコード
+	pNativeCode->Put( opcode1 );
+	if(opcode2)
+	{
+		pNativeCode->Put( opcode2 );
+	}
+
+	//ModR/M, SIB, disp
+	return set_mod_rm_sib_disp(mod,reg,SCALE_NON,INDEX_NON,base_reg,offset, scheduleType, isPertialSchedule );
+}
+
+
+
+///////////////////
+// mov関連
+///////////////////
+
+const PertialSchedule *CodeGenerator::op_mov_MV( int op_size, int base_reg, long offset, Schedule::Type offsetScheduleType, bool isPertialSchedule, long value, Schedule::Type valueScheduleType )
+{
+	//mov ptr[base_reg+offset],value
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if( op_size == sizeof(char) )
+	{
+		pNativeCode->Put( (char)0xC6 );
+		pNativeCode->Put( (char)(0x80|REGISTER_OPERAND(base_reg)) );
+
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, offsetScheduleType );
+
+		pNativeCode->Put( (char)value );
+	}
+	else if( op_size == sizeof(short) )
+	{
+		pNativeCode->Put( (char)0x66 );
+		pNativeCode->Put( (char)0xC7 );
+		pNativeCode->Put( (char)(0x80|REGISTER_OPERAND(base_reg)) );
+
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, offsetScheduleType );
+
+		pNativeCode->Put( (short)value );
+	}
+	else if( op_size == sizeof(long) )
+	{
+		pNativeCode->Put( (char)0xC7 );
+		pNativeCode->Put( (char)(0x80|REGISTER_OPERAND(base_reg)) );
+
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, offsetScheduleType );
+
+		this->PutWithSchedule( value, valueScheduleType );
+	}
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_mov_RV(int reg,long offset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg,value
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	const PertialSchedule *pPertialSchedule = NULL;
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( offset, scheduleType );
+
+	return pPertialSchedule;
+}
+void CodeGenerator::op_mov_RR(int reg1,int reg2){
+	//mov reg1,reg2
+
+	if(reg1==reg2) return;
+
+	//1000 1011 11xx xbbb
+	pNativeCode->Put( (char)0x8B );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+const PertialSchedule *CodeGenerator::op_mov_RM(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg32,dword ptr[base_reg+offset]
+	//mov reg16,word ptr[base_reg+offset]
+	//mov reg8,byte ptr[base_reg+offset]
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x8A;
+	else opcode=(char)0x8B;
+
+	return __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_mov_RM_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov reg32,dword ptr[base_reg1+base_reg2+offset]
+	//mov reg16,word ptr[base_reg1+base_reg2+offset]
+	//mov reg8,byte ptr[base_reg1+base_reg2+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_ESP){
+		//SIBバイトのindex部にespは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_ESP;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x8A );
+	else pNativeCode->Put( (char)0x8B );
+
+	if(bUseOffset){
+		///////////////////////////
+		// オフセット値を使う
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x84| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		///////////////////////////
+		// オフセット値を使わない
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x04| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_mov_MR(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov dword ptr[base_reg+offset],reg32
+	//mov word ptr[base_reg+offset],reg16
+	//mov byte ptr[base_reg+offset],reg8
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x88;
+	else opcode=(char)0x89;
+
+	return __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+const PertialSchedule *CodeGenerator::op_mov_MR_ex(int op_size,int reg,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//mov dword ptr[base_reg1+base_reg2+offset],reg32
+	//mov word ptr[base_reg1+base_reg2+offset],reg16
+	//mov byte ptr[base_reg1+base_reg2+offset],reg8
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_ESP){
+		//SIBバイトのindex部にrspは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_ESP;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x88 );
+	else pNativeCode->Put( (char)0x89 );
+
+	if(bUseOffset==USE_OFFSET){
+		//////////////////////////
+		//オフセット値を使う
+		//////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x84| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		//////////////////////////
+		//オフセット値を使わない
+		//////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x04| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+	return pPertialSchedule;
+}
+
+
+
+
+////////////////////////////////
+// movsx関連
+////////////////////////////////
+
+void CodeGenerator::op_movsx_R32R16(int reg32,int reg16){
+	//movsx reg32,reg16
+
+	if( reg16 == REG_NON )
+	{
+		reg16 = reg32;
+	}
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x0F;
+	char opcode2=(char)0xBF;
+
+	__op_format(op_prefix,opcode,opcode2,reg32,reg16,0,MOD_REG);
+}
+void CodeGenerator::op_movsx_R32R8(int reg32,int reg8){
+	//movsx reg32,reg8
+
+	if( reg8 == REG_NON )
+	{
+		reg8 = reg32;
+	}
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x0F;
+	char opcode2=(char)0xBE;
+
+	__op_format(op_prefix,opcode,opcode2,reg32,reg8,0,MOD_REG);
+}
+void CodeGenerator::op_movsx_R16R8(int reg16,int reg8){
+	//movsx reg16,reg8
+
+	if( reg8 == REG_NON )
+	{
+		reg8 = reg16;
+	}
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode=(char)0x0F;
+	char opcode2=(char)0xBE;
+
+	__op_format(op_prefix,opcode,opcode2,reg16,reg8,0,MOD_REG);
+}
+
+
+
+//////////////////////////////////
+// lea関連
+//////////////////////////////////
+
+const PertialSchedule *CodeGenerator::op_lea_RM( int reg, int base_reg, long offset, char mod, Schedule::Type scheduleType, bool isPertialSchedule )
+{
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x8D;
+
+	return __op_format( op_prefix, opcode, 0, reg, base_reg, offset, mod, scheduleType, isPertialSchedule );
+}
+
+
+
+//////////////////////////////////
+// インクリメント・デクリメント
+//////////////////////////////////
+
+void CodeGenerator::op_inc(int reg){
+	//inc reg
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0xFF;
+
+	__op_format(op_prefix,opcode,0,0,reg,0,MOD_REG);
+}
+void CodeGenerator::op_dec(int reg){
+	//dec reg
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0xFF;
+
+	__op_format(op_prefix,opcode,0,0x01,reg,0,MOD_REG);
+}
+
+
+
+/////////////////////
+// add関連
+/////////////////////
+
+void CodeGenerator::op_add_RV8(int reg,char cValue){
+	//add reg,value8
+
+	pNativeCode->Put( (char)0x83 );
+	pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
+	pNativeCode->Put( cValue );
+}
+const PertialSchedule *CodeGenerator::op_add_RV( int reg, long offset, Schedule::Type scheduleType, bool isPertialSchedule )
+{
+	// add reg,offset
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if( reg == REG_EAX )
+	{
+		// eaxのみ特殊
+		pNativeCode->Put( (char)0x05 );
+	}
+	else
+	{
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)(0xC0|REGISTER_OPERAND(reg)) );
+	}
+
+	// オフセット値
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( offset, scheduleType );
+
+	return pPertialSchedule;
+}
+void CodeGenerator::op_add_RR( int reg1, int reg2 )
+{
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode = (char)0x03;
+
+	__op_format(op_prefix,opcode,0,reg1,reg2,0,MOD_REG);
+}
+const PertialSchedule *CodeGenerator::op_add_RM(int op_size,int reg,int base_reg,int offset,char mod, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//add reg32,dword ptr[base_reg+offset]
+	//add reg16,word ptr[base_reg+offset]
+	//add reg8,byte ptr[base_reg+offset]
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+	if(op_size==sizeof(short)) op_prefix=(char)0x66;
+
+	//オペコード
+	char opcode;
+	if(op_size==sizeof(char)) opcode=(char)0x02;
+	else opcode=(char)0x03;
+
+	return __op_format(op_prefix,opcode,0,reg,base_reg,offset,mod, scheduleType, isPertialSchedule );
+}
+void CodeGenerator::op_adc_RV8(int reg,char cValue){
+	//adc reg,value8
+
+	pNativeCode->Put( (char)0x83 );
+	pNativeCode->Put( (char)(0xD0|REGISTER_OPERAND(reg)) );
+	pNativeCode->Put( cValue );
+}
+void CodeGenerator::op_adc_RR( int reg1, int reg2 )
+{
+	// adc reg1, reg2
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode = (char)0x13;
+
+	__op_format( op_prefix, opcode, 0, reg1, reg2, 0, MOD_REG );
+}
+
+
+/////////////////////
+// sub関連
+/////////////////////
+
+void CodeGenerator::op_sub_RV8(int reg,char cValue){
+	//sub reg,value8
+
+	pNativeCode->Put( (char)0x83 );
+	pNativeCode->Put( (char)(0xE8|REGISTER_OPERAND(reg)) );
+	pNativeCode->Put( cValue );
+}
+void CodeGenerator::op_sub_RR( int reg1, int reg2 )
+{
+	// sub reg1, reg2
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode = (char)0x2B;
+
+	__op_format( op_prefix, opcode, 0, reg1, reg2, 0, MOD_REG );
+}
+void CodeGenerator::op_sbb_RV8(int reg,char cValue){
+	//sbb reg,value8
+
+	pNativeCode->Put( (char)0x83 );
+	pNativeCode->Put( (char)(0xD8|REGISTER_OPERAND(reg)) );
+	pNativeCode->Put( cValue );
+}
+void CodeGenerator::op_sbb_RR( int reg1, int reg2 ){
+	//sbb reg1,reg2
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode = (char)0x1B;
+
+	__op_format( op_prefix, opcode, 0, reg1, reg2, 0, MOD_REG );
+}
+
+
+
+////////////////////////
+// imul関連
+////////////////////////
+
+void CodeGenerator::op_imul_RR(int reg1,int reg2){
+	//imul reg1,reg2
+
+	//命令プリフィックス
+	char op_prefix = (char)0x0F;
+
+	//オペコード
+	char opcode = (char)0xAF;
+
+	__op_format( op_prefix, opcode, 0, reg1, reg2, 0, MOD_REG );
+}
+
+void CodeGenerator::op_imul_RV(int reg,long i32data){
+	//imul reg,i32data
+
+	if(-128<=i32data&&i32data<=127){
+		//オペコード
+		pNativeCode->Put( (char)0x6B );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+
+		//値
+		pNativeCode->Put( (char)i32data );
+	}
+	else{
+		//オペコード
+		pNativeCode->Put( (char)0x69 );
+
+		//レジスタ
+		pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+
+		//値
+		pNativeCode->Put( i32data );
+	}
+}
+void CodeGenerator::op_imul_RV8(int reg,char cValue)
+{
+	//オペコード
+	pNativeCode->Put( (char)0x6B );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg)<<3 | REGISTER_OPERAND(reg)) );
+
+	//値
+	pNativeCode->Put( cValue );
+}
+
+
+
+//////////////////////
+// div関連
+//////////////////////
+
+void CodeGenerator::op_div_R( int reg )
+{
+	//div reg (eax=eax/reg...edx)
+	__op_format( (char)0xF7, (char)0xF0, reg );
+}
+void CodeGenerator::op_idiv_R( int reg )
+{
+	//idiv reg (eax=eax/reg...edx)
+	__op_format( (char)0xF7, (char)0xF8, reg );
+}
+
+
+
+//////////////////////
+// and関連
+//////////////////////
+
+void CodeGenerator::op_and_RV(int reg,long value){
+	//and reg,value
+
+	if(reg==REG_RAX){
+		//eaxのみ特殊
+
+		// [8bit rex] 0010 0101 [32bit offset]
+		pNativeCode->Put( (char)0x25 );
+		pNativeCode->Put( value );
+	}
+	else{
+		//16ビット演算の命令プリフィックス
+		char op_prefix=0;
+
+		//オペコード
+		char opcode=(char)0x81;
+
+		__op_format(op_prefix,opcode,0,0,reg,value,MOD_REG);
+	}
+}
+
+void CodeGenerator::op_and_RR( int reg1, int reg2 )
+{
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x23;
+
+	__op_format(op_prefix,opcode,0,reg1,reg2,0,MOD_REG);
+}
+
+void CodeGenerator::op_or_RR( int op_size, int reg1, int reg2 ){
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x0A );
+	else pNativeCode->Put( (char)0x0B );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+
+void CodeGenerator::op_xor_RR( int reg1, int reg2 ){
+	// xor reg1, reg2
+
+	if( reg2 == REG_NON )
+	{
+		reg2 = reg1;
+	}
+
+	//16ビット演算の命令プリフィックス
+	char op_prefix=0;
+
+	//オペコード
+	char opcode=(char)0x33;
+
+	__op_format(op_prefix,opcode,0,reg1,reg2,0,MOD_REG);
+}
+
+
+
+void CodeGenerator::op_neg( int reg ){
+	//neg reg
+
+	//命令プリフィックス
+	char op_prefix = (char)0xF7;
+
+	//オペコード
+	char opcode = (char)0xD8;
+
+	__op_format( op_prefix, opcode, reg );
+}
+
+
+
+///////////////////////
+// 64ビット関連
+///////////////////////
+
+void CodeGenerator::op_cdq(){
+	//cdq
+	pNativeCode->Put( (char)0x99 );
+}
+
+
+
+/////////////////////
+// ストリング関係
+/////////////////////
+
+void CodeGenerator::op_rep_movs(int op_size){
+	if(op_size==sizeof(BYTE)){
+		//rep movs byte ptr[edi],byte ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0xA4 );
+	}
+	else if(op_size==sizeof(short)){
+		//rep movs word ptr[edi],word ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0x66 );
+		pNativeCode->Put( (char)0xA5 );
+	}
+	else if(op_size==sizeof(long)){
+		//rep movs dword ptr[edi],dword ptr[esi]
+		pNativeCode->Put( (char)0xF3 );
+		pNativeCode->Put( (char)0xA5 );
+	}
+}
+
+
+
+
+//////////////////////////
+// スタック関連
+//////////////////////////
+
+void CodeGenerator::op_push(int reg){
+	//push reg
+
+	if( reg == REG_NON ){
+		op_sub_esp( PTR_SIZE );
+		return;
+	}
+
+	//オペコード、レジスタ
+	__op_format(0,(char)0x50,reg);
+}
+void CodeGenerator::op_push_V(long data, Schedule::Type scheduleType ){
+	//スタックにリテラル値をプッシュ
+	if(-128<=data&&data<=127 && scheduleType == Schedule::None ){
+		//push 8ビット値
+		pNativeCode->Put( (char)0x6A );
+		pNativeCode->Put( (char)data );
+	}
+	else{
+		//push 32ビット値
+		pNativeCode->Put( (char)0x68 );
+		this->PutWithSchedule( data, scheduleType );
+	}
+}
+void CodeGenerator::op_push_M( int base_reg )
+{
+	if( base_reg == REG_EBP )
+	{
+		op_push_M( base_reg, 0 );
+	}
+	else
+	{
+		// push dword ptr[base_reg]
+		__op_format( (char)0xFF, (char)0x30, base_reg );
+	}
+}
+const PertialSchedule *CodeGenerator::op_push_M( int base_reg, long offset, Schedule::Type scheduleType, bool isPertialSchedule )
+{
+	const PertialSchedule *pPertialSchedule = NULL;
+	if( base_reg == REG_NON )
+	{
+		// push dword ptr[offset]
+		pPertialSchedule = __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, 0, offset, MOD_DISP32, scheduleType, isPertialSchedule );
+	}
+	else
+	{
+		// push dword ptr[base_reg+offset]
+		pPertialSchedule = __op_format( 0, (char)0xFF, 0, /*opcode->*/0x06, base_reg, offset, MOD_BASE_DISP32, scheduleType, isPertialSchedule );
+	}
+	return pPertialSchedule;
+}
+void CodeGenerator::op_pop(int reg){
+	//pop reg
+
+	if( reg == REG_NON ){
+		op_add_esp( PTR_SIZE );
+		return;
+	}
+
+	//オペコード、レジスタ
+	__op_format(0,(char)0x58,reg);
+}
+void CodeGenerator::op_add_esp(long num){
+	//スタックポインタの加算（pop方向）
+
+	//add esp,num
+	if(0xFFFFFF80&num){
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)0xC4 );
+		pNativeCode->Put( num );
+	}
+	else{
+		//「128 > num > -127」の場合
+		pNativeCode->Put( (char)0x83 );
+		pNativeCode->Put( (char)0xC4 );
+		pNativeCode->Put( (char)num );
+	}
+}
+const PertialSchedule *CodeGenerator::op_sub_esp( long num, bool isPertialSchedule ){
+	//スタックポインタの減算（push方向）
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	//sub esp,num
+	if( (0xFFFFFF80&num) != 0 || isPertialSchedule ){
+		pNativeCode->Put( (char)0x81 );
+		pNativeCode->Put( (char)0xEC );
+
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		pNativeCode->Put( num );
+	}
+	else{
+		//「128 > num > -127」の場合
+		pNativeCode->Put( (char)0x83 );
+		pNativeCode->Put( (char)0xEC );
+		pNativeCode->Put( (char)num );
+	}
+
+	return pPertialSchedule;
+}
+
+
+
+/////////////////////
+// cmp関連
+/////////////////////
+void CodeGenerator::op_cmp_RR( int reg1, int reg2 ){
+	//cmp reg1,reg2
+	__op_format( (char)0, (char)0x3B, 0, reg1, reg2, 0, MOD_REG );
+}
+void CodeGenerator::op_cmp_value(int op_size,int reg,char byte_data){
+	//cmp reg,byte_data
+
+	if(op_size==sizeof(char)&&reg==REG_EAX){
+		//alレジスタの場合は特殊
+		pNativeCode->Put( (char)0x3C );
+
+		//8ビット値
+		pNativeCode->Put( byte_data );
+
+		return;
+	}
+
+	//16ビット演算のプリフィックス
+	if(op_size==sizeof(short)) pNativeCode->Put( (char)0x66 );
+
+	//オペコード
+	if(op_size==sizeof(char)) pNativeCode->Put( (char)0x80 );
+	else pNativeCode->Put( (char)0x83 );
+
+	//レジスタ
+	pNativeCode->Put( (char)(0xF8| REGISTER_OPERAND(reg)) );
+
+	//8ビット値
+	pNativeCode->Put( byte_data );
+}
+void CodeGenerator::op_setne( int reg ){
+	//オペコード
+	pNativeCode->Put( (char)0x0F );
+	pNativeCode->Put( (char)0x95 );
+
+	//レジスタ
+	pNativeCode->Put( (char)( 0xC0 | REGISTER_OPERAND(reg) ) );
+}
+
+
+
+////////////////////
+// test関連
+////////////////////
+
+void CodeGenerator::op_test(int reg1,int reg2){
+	//test reg1,reg2
+
+	//1000 0101 11rr rbbb
+	pNativeCode->Put( (char)0x85 );
+	pNativeCode->Put( (char)(0xC0| REGISTER_OPERAND(reg1)<<3 | REGISTER_OPERAND(reg2)) );
+}
+void CodeGenerator::op_test_ah( char cValue )
+{
+	pNativeCode->Put( (char)0xF6 );
+	pNativeCode->Put( (char)0xC4 );
+	pNativeCode->Put( cValue );
+}
+
+
+
+//////////////////////////////
+// 浮動小数点関連
+//////////////////////////////
+
+void CodeGenerator::op_fld_ptr_esp(int type){
+	//スタックポインタが示すバッファのデータを浮動小数点レジスタへロード
+
+	if(type==DEF_DOUBLE){
+		//fld qword ptr[esp]
+		pNativeCode->Put( (char)0xDD );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_SINGLE){
+		//fld dword ptr[esp]
+		pNativeCode->Put( (char)0xD9 );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_INT64){
+		//fild qword ptr[esp]
+		pNativeCode->Put( (char)0xDF );
+		pNativeCode->Put( (char)0x2C );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(type==DEF_LONG){
+		//fild dword ptr[esp]
+		pNativeCode->Put( (char)0xDB );
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+}
+void CodeGenerator::op_fld_basereg(int type,int base_reg){
+	//fld ptr[reg]
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(base_reg==REG_ESP){
+		pNativeCode->Put( (char)0x04 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(base_reg==REG_EBP){
+		pNativeCode->Put( (char)0x45 );
+		pNativeCode->Put( (char)0x00 );
+	}
+	else{
+		pNativeCode->Put( (char)REGISTER_OPERAND(base_reg) );
+	}
+}
+const PertialSchedule *CodeGenerator::op_fld_base_offset(int type,int base_reg,long offset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//fld ptr[reg+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	//オペコード、レジスタ
+	if(base_reg==REG_ESP){
+		pNativeCode->Put( (char)0x84 );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else{
+		pNativeCode->Put( (char)(0x80|REGISTER_OPERAND(base_reg)) );
+	}
+
+	//オフセット値
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( offset, scheduleType );
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_fld_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//fld ptr[base_reg1+base_reg2+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_ESP){
+		//SIBバイトのindex部にespは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_ESP;
+	}
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	int reg=0;
+	if(bUseOffset){
+		///////////////////////////
+		// オフセット値を使う
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x84| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		///////////////////////////
+		// オフセット値を使わない
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x04| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+
+	return pPertialSchedule;
+}
+void CodeGenerator::op_fstp_basereg(int type,int base_reg){
+	//fstp ptr[reg]
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	if(base_reg==REG_ESP){
+		pNativeCode->Put( (char)0x1C );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else if(base_reg==REG_EBP){
+		pNativeCode->Put( (char)0x5D );
+		pNativeCode->Put( (char)0x00 );
+	}
+	else{
+		pNativeCode->Put( (char)(0x18|REGISTER_OPERAND(base_reg)) );
+	}
+}
+const PertialSchedule *CodeGenerator::op_fstp_base_offset(int type,int base_reg,long offset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//fstp ptr[reg+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	//オペコード、レジスタ
+	if(base_reg==REG_ESP){
+		pNativeCode->Put( (char)0x9C );
+		pNativeCode->Put( (char)0x24 );
+	}
+	else{
+		pNativeCode->Put( (char)(0x98|REGISTER_OPERAND(base_reg)) );
+	}
+
+	//オフセット値
+	if( isPertialSchedule )
+	{
+		pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+		pPertialSchedule = pertialSchedules.back();
+	}
+	this->PutWithSchedule( offset, scheduleType );
+
+	return pPertialSchedule;
+}
+const PertialSchedule *CodeGenerator::op_fstp_base_offset_ex(int type,int base_reg1,int base_reg2,long offset,BOOL bUseOffset, Schedule::Type scheduleType, bool isPertialSchedule ){
+	//fstp ptr[base_reg1+base_reg2+offset]
+	const PertialSchedule *pPertialSchedule = NULL;
+
+	if(base_reg1==REG_ESP){
+		//SIBバイトのindex部にespは指定できない
+		base_reg1=base_reg2;
+		base_reg2=REG_ESP;
+	}
+
+	//オペコード
+	if(type==DEF_DOUBLE)		pNativeCode->Put( (char)0xDD );
+	else if(type==DEF_SINGLE)	pNativeCode->Put( (char)0xD9 );
+	else compiler.errorMessenger.Output(300,NULL,cp);
+
+	int reg=0;
+	if(bUseOffset){
+		///////////////////////////
+		// オフセット値を使う
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x9C| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+
+		//オフセット値
+		if( isPertialSchedule )
+		{
+			pertialSchedules.push_back( new PertialSchedule( pNativeCode->GetSize(), sizeof(long) ) );
+			pPertialSchedule = pertialSchedules.back();
+		}
+		this->PutWithSchedule( offset, scheduleType );
+	}
+	else{
+		///////////////////////////
+		// オフセット値を使わない
+		///////////////////////////
+
+		//レジスタ
+		pNativeCode->Put( (char)(0x1C| REGISTER_OPERAND(reg)<<3) );
+
+		//ベースレジスタ
+		pNativeCode->Put( (char)(REGISTER_OPERAND(base_reg1)<<3 | REGISTER_OPERAND(base_reg2)) );
+	}
+
+	return pPertialSchedule;
+}
+void CodeGenerator::op_fistp_ptr_esp( int typeSize ){
+	if( typeSize == sizeof(_int64) ){
+		//64bit
+
+		//fistp qword ptr[esp]
+		fpu_cast();
+		pNativeCode->Put( (char)0xDF );
+		pNativeCode->Put( (char)0x3C );
+		pNativeCode->Put( (char)0x24 );
+		fpu_cast_end();
+	}
+	else if( typeSize == sizeof(long) ){
+		//32bit
+
+		//fistp dword ptr[esp]
+		fpu_cast();
+		pNativeCode->Put( (char)0xDB );
+		pNativeCode->Put( (char)0x1C );
+		pNativeCode->Put( (char)0x24 );
+		fpu_cast_end();
+	}
+	else{
+		compiler.errorMessenger.OutputFatalError();
+	}
+}
+void CodeGenerator::op_fstp_push( Type &type ){
+	//sub esp,size
+	op_sub_esp( type.GetBasicSize() );
+
+	op_fstp_basereg( type.GetBasicType(), REG_ESP );
+}
+void CodeGenerator::op_fcompp(){
+	// fcompp
+	pNativeCode->Put( (char)0xDE );
+	pNativeCode->Put( (char)0xD9 );
+}
+void CodeGenerator::op_fnstsw_ax()
+{
+	// fnstsw ax
+	pNativeCode->Put( (char)0xDF );
+	pNativeCode->Put( (char)0xE0 );
+}
+
+
+
+//////////////////////////////
+// レジスタ関連
+//////////////////////////////
+
+void CodeGenerator::op_zero_reg(int reg){
+	//レジスタに0をセット
+
+	op_xor_RR( reg );
+}
+
+void CodeGenerator::fpu_cast(){
+	///////////////////////
+	// FPUの切り捨て設定
+	///////////////////////
+
+	//sub esp,16
+	op_sub_esp(16);
+
+	//mov dword ptr[esp+4],eax
+	pNativeCode->Put( (char)0x89 );
+	pNativeCode->Put( (char)0x44 );
+	pNativeCode->Put( (char)0x24 );
+	pNativeCode->Put( (char)0x04 );
+
+	//fnstcw word ptr[esp]
+	pNativeCode->Put( (char)0xD9 );
+	pNativeCode->Put( (char)0x3C );
+	pNativeCode->Put( (char)0x24 );
+
+	//mov ax,word ptr[esp]
+	pNativeCode->Put( (char)0x66 );
+	pNativeCode->Put( (char)0x8B );
+	pNativeCode->Put( (char)0x04 );
+	pNativeCode->Put( (char)0x24 );
+
+	//or ah,0Ch
+	pNativeCode->Put( (char)0x80 );
+	pNativeCode->Put( (char)0xCC );
+	pNativeCode->Put( (char)0x0C );
+
+	//mov word ptr[esp+2],ax
+	pNativeCode->Put( (char)0x66 );
+	pNativeCode->Put( (char)0x89 );
+	pNativeCode->Put( (char)0x44 );
+	pNativeCode->Put( (char)0x24 );
+	pNativeCode->Put( (char)0x02 );
+
+	//fldcw word ptr[esp+2]
+	pNativeCode->Put( (char)0xD9 );
+	pNativeCode->Put( (char)0x6C );
+	pNativeCode->Put( (char)0x24 );
+	pNativeCode->Put( (char)0x02 );
+
+	//mov eax,dword ptr[esp+4]
+	pNativeCode->Put( (char)0x8B );
+	pNativeCode->Put( (char)0x44 );
+	pNativeCode->Put( (char)0x24 );
+	pNativeCode->Put( (char)0x04 );
+
+	//add esp,16
+	op_add_esp(16);
+}
+void CodeGenerator::fpu_cast_end(){
+	//sub esp,16
+	op_sub_esp(16);
+
+	//fldcw word ptr[esp]
+	pNativeCode->Put( (char)0xD9 );
+	pNativeCode->Put( (char)0x2C );
+	pNativeCode->Put( (char)0x24 );
+
+	//add esp,16
+	op_add_esp(16);
+}
+
+
+/////////////////////////////
+// 関数呼び出し
+/////////////////////////////
+
+void CodeGenerator::op_call_R( int reg )
+{
+	// call reg
+	pNativeCode->Put( (char)0xFF );
+	pNativeCode->Put( (char)(0xD0|REGISTER_OPERAND(reg)) );
+}
+void CodeGenerator::op_call(const UserProc *pUserProc){
+	pNativeCode->Put( (char)0xE8 );
+	pNativeCode->PutUserProcSchedule( pUserProc, true );
+}
+void CodeGenerator::op_call( const DllProc *pDllProc )
+{
+	pNativeCode->Put( (char)0xFF );
+	pNativeCode->Put( (char)0x15 );
+	pNativeCode->PutDllProcSchedule( pDllProc );
+}
+void CodeGenerator::op_ret(){
+	pNativeCode->Put( (char)0xC3 );
+}
+void CodeGenerator::op_ret( short stackFrameSize )
+{
+	pNativeCode->Put( (char)0xC2 );
+	pNativeCode->Put( stackFrameSize );
+}
+void CodeGenerator::op_addressof( int reg, const UserProc *pUserProc )
+{
+	//mov reg,userProcAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutUserProcSchedule( pUserProc, false );
+}
+void CodeGenerator::op_mov_RV_com_vtbl( int reg, const CClass *pClass )
+{
+	// mov reg,vtblAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutComVtblSchedule( pClass );
+}
+void CodeGenerator::op_mov_RV_vtbl( int reg, const CClass *pClass )
+{
+	// mov reg,vtblAddress
+
+	//オペコード、レジスタ
+	pNativeCode->Put( (char)(0xB8|REGISTER_OPERAND(reg)) );
+
+	//DISP32
+	pNativeCode->PutVtblSchedule( pClass );
+}
Index: branches/egtra/ab5.0/abdev/icon_res/StdAfx.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/StdAfx.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/StdAfx.cpp	(revision 774)
@@ -0,0 +1,8 @@
+// stdafx.cpp : 標準インクルードファイルを含むソース ファイル
+//              icon_res.pch 生成されるプリコンパイル済ヘッダー
+//              stdafx.obj 生成されるプリコンパイル済タイプ情報
+
+#include "stdafx.h"
+
+// TODO: STDAFX.H に含まれていて、このファイルに記述されていない
+// ヘッダーファイルを追加してください。
Index: branches/egtra/ab5.0/abdev/icon_res/StdAfx.h
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/StdAfx.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/StdAfx.h	(revision 774)
@@ -0,0 +1,24 @@
+// stdafx.h : 標準のシステム インクルード ファイル、
+//            または参照回数が多く、かつあまり変更されない
+//            プロジェクト専用のインクルード ファイルを記述します。
+//
+
+#if !defined(AFX_STDAFX_H__359C4D68_7507_4291_84FE_5004032BABD8__INCLUDED_)
+#define AFX_STDAFX_H__359C4D68_7507_4291_84FE_5004032BABD8__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+
+// この位置にヘッダーを挿入してください
+#define WIN32_LEAN_AND_MEAN		// Windows ヘッダーから殆ど使用されないスタッフを除外します
+
+#include <windows.h>
+
+// TODO: プログラムで必要なヘッダー参照を追加してください。
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。
+
+#endif // !defined(AFX_STDAFX_H__359C4D68_7507_4291_84FE_5004032BABD8__INCLUDED_)
Index: branches/egtra/ab5.0/abdev/icon_res/icon_res.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/icon_res.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/icon_res.cpp	(revision 774)
@@ -0,0 +1,13 @@
+// icon_res.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
+//
+
+#include "stdafx.h"
+
+BOOL APIENTRY DllMain( HANDLE hModule, 
+                       DWORD  ul_reason_for_call, 
+                       LPVOID lpReserved
+					 )
+{
+    return TRUE;
+}
+
Index: branches/egtra/ab5.0/abdev/icon_res/icon_res.dsp
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/icon_res.dsp	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/icon_res.dsp	(revision 774)
@@ -0,0 +1,291 @@
+# Microsoft Developer Studio Project File - Name="icon_res" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** 編集しないでください **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=icon_res - Win32 TheText_Release
+!MESSAGE これは有効なﾒｲｸﾌｧｲﾙではありません。 このﾌﾟﾛｼﾞｪｸﾄをﾋﾞﾙﾄﾞするためには NMAKE を使用してください。
+!MESSAGE [ﾒｲｸﾌｧｲﾙのｴｸｽﾎﾟｰﾄ] ｺﾏﾝﾄﾞを使用して実行してください
+!MESSAGE 
+!MESSAGE NMAKE /f "icon_res.mak".
+!MESSAGE 
+!MESSAGE NMAKE の実行時に構成を指定できます
+!MESSAGE ｺﾏﾝﾄﾞ ﾗｲﾝ上でﾏｸﾛの設定を定義します。例:
+!MESSAGE 
+!MESSAGE NMAKE /f "icon_res.mak" CFG="icon_res - Win32 TheText_Release"
+!MESSAGE 
+!MESSAGE 選択可能なﾋﾞﾙﾄﾞ ﾓｰﾄﾞ:
+!MESSAGE 
+!MESSAGE "icon_res - Win32 TheText_Release" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE "icon_res - Win32 AB_Release" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "icon_res - Win32 TheText_Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "icon_res___Win32_TheText_Release0"
+# PROP BASE Intermediate_Dir "icon_res___Win32_TheText_Release0"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "icon_res___Win32_TheText_Release0"
+# PROP Intermediate_Dir "icon_res___Win32_TheText_Release0"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ICON_RES_EXPORTS" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ICON_RES_EXPORTS" /Yu"stdafx.h" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG" /d "THETEXT"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../TheText/SubOperation/icon_res.dll"
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../TheText/SubOperation/icon_res.dll"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy D:\BasicProject\TheText\SubOperation\icon_res.dll D:\BasicProject\TheText_Standard\SubOperation\icon_res.dll
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "icon_res - Win32 AB_Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "icon_res___Win32_AB_Release0"
+# PROP BASE Intermediate_Dir "icon_res___Win32_AB_Release0"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "icon_res___Win32_AB_Release0"
+# PROP Intermediate_Dir "icon_res___Win32_AB_Release0"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ICON_RES_EXPORTS" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ICON_RES_EXPORTS" /Yu"stdafx.h" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG" /d "ACTIVEBASIC"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../TheText/SubOperation/icon_res.dll"
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../ActiveBasic/SubOperation/icon_res.dll"
+
+!ENDIF 
+
+# Begin Target
+
+# Name "icon_res - Win32 TheText_Release"
+# Name "icon_res - Win32 AB_Release"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\icon_res.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_res.rc
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+# ADD BASE CPP /Yc"stdafx.h"
+# ADD CPP /Yc"stdafx.h"
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\StdAfx.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\icon_ab\attach.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\BreakPoint.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\breakpoint_flag.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\community_find.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\community_forum.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\community_forum_secret.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\community_main.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\community_private_msg.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\DebugRun.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_allsave.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_alpha_big.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_alpha_small.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_half.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_hiragana.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_katakana.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_conv_multi.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_copy.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_cut.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\menu_debugcompile.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_find.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_help.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_new.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_open.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_option.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_paste.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_preview.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_print.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_redo.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\menu_releasecompile.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_rightturn.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\menu_run.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_save.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_stringcount.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_topmost.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon\menu_undo.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\Pause.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\StepIn.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\StepOver.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\StepToCursor.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon_ab\Stop.ico
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\ReadMe.txt
+# End Source File
+# End Target
+# End Project
Index: branches/egtra/ab5.0/abdev/icon_res/icon_res.dsw
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/icon_res.dsw	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/icon_res.dsw	(revision 774)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# 警告: このﾜｰｸｽﾍﾟｰｽ ﾌｧｲﾙ を編集または削除しないでください!
+
+###############################################################################
+
+Project: "icon_res"=.\icon_res.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: branches/egtra/ab5.0/abdev/icon_res/icon_res.rc
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/icon_res.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/icon_res.rc	(revision 774)
@@ -0,0 +1,129 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ALLSAVE             ICON    DISCARDABLE     "icon\\menu_allsave.ico"
+IDI_COPY                ICON    DISCARDABLE     "icon\\menu_copy.ico"
+IDI_CUT                 ICON    DISCARDABLE     "icon\\menu_cut.ico"
+IDI_FIND                ICON    DISCARDABLE     "icon\\menu_find.ico"
+IDI_NEW                 ICON    DISCARDABLE     "icon\\menu_new.ico"
+IDI_OPEN                ICON    DISCARDABLE     "icon\\menu_open.ico"
+IDI_PASTE               ICON    DISCARDABLE     "icon\\menu_paste.ico"
+IDI_REDO                ICON    DISCARDABLE     "icon\\menu_redo.ico"
+IDI_SAVE                ICON    DISCARDABLE     "icon\\menu_save.ico"
+IDI_UNDO                ICON    DISCARDABLE     "icon\\menu_undo.ico"
+IDI_PRINT               ICON    DISCARDABLE     "icon\\menu_print.ico"
+IDI_PREVIEW             ICON    DISCARDABLE     "icon\\menu_preview.ico"
+IDI_TOPMOST             ICON    DISCARDABLE     "icon\\menu_topmost.ico"
+IDI_OPTION              ICON    DISCARDABLE     "icon\\menu_option.ico"
+IDI_RIGHTTURN           ICON    DISCARDABLE     "icon\\menu_rightturn.ico"
+IDI_HELP                ICON    DISCARDABLE     "icon\\menu_help.ico"
+#if defined(APSTUDIO_INVOKED) || defined(ACTIVEBASIC)
+#if defined(APSTUDIO_INVOKED)
+IDI_RELEASERUN$(ACTIVEBASIC) ICON    DISCARDABLE     "icon_ab\\menu_run.ico"
+#else
+IDI_RELEASERUN          ICON    DISCARDABLE     "icon_ab\\menu_run.ico"
+#endif
+#endif
+#if defined(APSTUDIO_INVOKED) || defined(ACTIVEBASIC)
+#if defined(APSTUDIO_INVOKED)
+IDI_DEBUGCOMPILE$(ACTIVEBASIC) ICON    DISCARDABLE     "icon_ab\\menu_debugcompile.ico"
+#else
+IDI_DEBUGCOMPILE        ICON    DISCARDABLE     "icon_ab\\menu_debugcompile.ico"
+#endif
+#endif
+#if defined(APSTUDIO_INVOKED) || defined(ACTIVEBASIC)
+#if defined(APSTUDIO_INVOKED)
+IDI_RELEASECOMPILE$(ACTIVEBASIC) ICON    DISCARDABLE     "icon_ab\\menu_releasecompile.ico"
+#else
+IDI_RELEASECOMPILE      ICON    DISCARDABLE     "icon_ab\\menu_releasecompile.ico"
+#endif
+#endif
+IDI_CONV_MULTI          ICON    DISCARDABLE     "icon\\menu_conv_multi.ico"
+IDI_CONV_ALPHA_BIG      ICON    DISCARDABLE     "icon\\menu_conv_alpha_big.ico"
+IDI_CONV_ALPHA_SMALL    ICON    DISCARDABLE     "icon\\menu_conv_alpha_small.ico"
+IDI_CONV_HALF           ICON    DISCARDABLE     "icon\\menu_conv_half.ico"
+IDI_CONV_HIRAGANA       ICON    DISCARDABLE     "icon\\menu_conv_hiragana.ico"
+IDI_CONV_KATAKANA       ICON    DISCARDABLE     "icon\\menu_conv_katakana.ico"
+IDI_STRINGCOUNT         ICON    DISCARDABLE     "icon\\menu_stringcount.ico"
+IDI_BREAKPOINT          ICON    DISCARDABLE     "icon_ab\\BreakPoint.ico"
+IDI_DEBUGRUN            ICON    DISCARDABLE     "icon_ab\\DebugRun.ico"
+IDI_DEBUGPAUSE          ICON    DISCARDABLE     "icon_ab\\Pause.ico"
+IDI_STEPIN              ICON    DISCARDABLE     "icon_ab\\StepIn.ico"
+IDI_STEPOVER            ICON    DISCARDABLE     "icon_ab\\StepOver.ico"
+IDI_STEPTOCURSOR        ICON    DISCARDABLE     "icon_ab\\StepToCursor.ico"
+IDI_DEBUGSTOP           ICON    DISCARDABLE     "icon_ab\\Stop.ico"
+IDI_ATTACH              ICON    DISCARDABLE     "icon_ab\\attach.ico"
+IDI_COMMUNITY_PRIVATEMSG ICON    DISCARDABLE     "icon_ab\\community_private_msg.ico"
+IDI_COMMUNITY_FIND      ICON    DISCARDABLE     "icon_ab\\community_find.ico"
+IDI_COMMUNITY_FORUM     ICON    DISCARDABLE     "icon_ab\\community_forum.ico"
+IDI_COMMUNITY_MAIN      ICON    DISCARDABLE     "icon_ab\\community_main.ico"
+IDI_COMMUNITY_FORUM_SECRET ICON    DISCARDABLE     "icon_ab\\community_forum_secret.ico"
+IDI_BREAKPOINT_FLAG     ICON    DISCARDABLE     "icon_ab\\breakpoint_flag.ico"
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/icon_res/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/icon_res/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/icon_res/resource.h	(revision 774)
@@ -0,0 +1,55 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by icon_res.rc
+//
+#define IDI_ALLSAVE                     101
+#define IDI_COPY                        102
+#define IDI_CUT                         103
+#define IDI_FIND                        104
+#define IDI_NEW                         105
+#define IDI_OPEN                        106
+#define IDI_PASTE                       107
+#define IDI_REDO                        108
+#define IDI_SAVE                        109
+#define IDI_UNDO                        110
+#define IDI_PRINT                       111
+#define IDI_PREVIEW                     112
+#define IDI_TOPMOST                     113
+#define IDI_OPTION                      115
+#define IDI_RIGHTTURN                   116
+#define IDI_HELP                        117
+#define IDI_RELEASERUN                  118
+#define IDI_DEBUGCOMPILE                119
+#define IDI_RELEASECOMPILE              120
+#define IDI_CONV_MULTI                  121
+#define IDI_CONV_ALPHA_BIG              122
+#define IDI_CONV_ALPHA_SMALL            123
+#define IDI_CONV_HALF                   124
+#define IDI_CONV_HIRAGANA               125
+#define IDI_CONV_KATAKANA               126
+#define IDI_STRINGCOUNT                 127
+#define IDI_BREAKPOINT                  128
+#define IDI_DEBUGRUN                    129
+#define IDI_DEBUGPAUSE                  130
+#define IDI_STEPIN                      131
+#define IDI_STEPOVER                    132
+#define IDI_STEPTOCURSOR                133
+#define IDI_DEBUGSTOP                   134
+#define IDI_ATTACH                      136
+#define IDI_COMMUNITY_PRIVATEMSG        137
+#define IDI_COMMUNITY_FIND              138
+#define IDI_COMMUNITY_FORUM             139
+#define IDI_COMMUNITY_MAIN              140
+#define IDI_COMMUNITY_FORUM_SECRET      141
+#define IDI_BREAKPOINT_FLAG             142
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        143
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/res/res.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/res/res.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/res/res.cpp	(revision 774)
@@ -0,0 +1,15 @@
+#include <windows.h>
+
+BOOL WINAPI DllMain(HANDLE hDLL,DWORD dwReason,LPVOID lpReserved){
+	switch(dwReason){
+		case DLL_PROCESS_ATTACH:
+			break;
+		case DLL_PROCESS_DETACH:
+			break;
+		case DLL_THREAD_ATTACH:
+		case DLL_THREAD_DETACH:
+		default:
+			break;
+	}
+	return TRUE;
+}
Index: branches/egtra/ab5.0/abdev/res/res.dsp
===================================================================
--- branches/egtra/ab5.0/abdev/res/res.dsp	(revision 774)
+++ branches/egtra/ab5.0/abdev/res/res.dsp	(revision 774)
@@ -0,0 +1,314 @@
+# Microsoft Developer Studio Project File - Name="res" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** 編集しないでください **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=res - Win32 Debug
+!MESSAGE これは有効なﾒｲｸﾌｧｲﾙではありません。 このﾌﾟﾛｼﾞｪｸﾄをﾋﾞﾙﾄﾞするためには NMAKE を使用してください。
+!MESSAGE [ﾒｲｸﾌｧｲﾙのｴｸｽﾎﾟｰﾄ] ｺﾏﾝﾄﾞを使用して実行してください
+!MESSAGE 
+!MESSAGE NMAKE /f "res.mak".
+!MESSAGE 
+!MESSAGE NMAKE の実行時に構成を指定できます
+!MESSAGE ｺﾏﾝﾄﾞ ﾗｲﾝ上でﾏｸﾛの設定を定義します。例:
+!MESSAGE 
+!MESSAGE NMAKE /f "res.mak" CFG="res - Win32 Debug"
+!MESSAGE 
+!MESSAGE 選択可能なﾋﾞﾙﾄﾞ ﾓｰﾄﾞ:
+!MESSAGE 
+!MESSAGE "res - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE "res - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "res - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../ActiveBasic/SubOperation/res.dll"
+
+!ELSEIF  "$(CFG)" == "res - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "res - Win32 Release"
+# Name "res - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\res.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\res.rc
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\base_directx.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_dosprompt.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_non.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_prompt.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_window.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\BasicProgram.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\BreakPoint.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_arrow_to_right.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_fill.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_pen.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\DebugCompile.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\DebugRun.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_bmp.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_icon.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\folder_close.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\folder_open.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\html_general_parameter.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\html_parameter.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ico00001.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ico00002.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\icon1.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_private_function.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_private_variable.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_public_function.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_public_variable.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\menu.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_abp.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_html.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_icon.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_project.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_sbp.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\newfile_text.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\pair_statement.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\Pause.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\Procedure.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\program_folder.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\StepIn.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\StepOver.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\StepToCursor.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ToolbarIcon_Debugger\Stop.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\TextDocument.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\TOOLBAR1.BMP
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar2.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_basic_disabled.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_debugger.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_icon.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_standard.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_standard_disabled.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Window.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\zoomin.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\zoomout.ico
+# End Source File
+# End Group
+# End Target
+# End Project
Index: branches/egtra/ab5.0/abdev/res/res.dsw
===================================================================
--- branches/egtra/ab5.0/abdev/res/res.dsw	(revision 774)
+++ branches/egtra/ab5.0/abdev/res/res.dsw	(revision 774)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# 警告: このﾜｰｸｽﾍﾟｰｽ ﾌｧｲﾙ を編集または削除しないでください!
+
+###############################################################################
+
+Project: "res"=.\res.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: branches/egtra/ab5.0/abdev/res/res.rc
===================================================================
--- branches/egtra/ab5.0/abdev/res/res.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/res/res.rc	(revision 774)
@@ -0,0 +1,1912 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_MAINMENU MENU 
+BEGIN
+    POPUP "ファイル(&F)"
+    BEGIN
+        MENUITEM "新規作成(&N)\tCtrl+N",            IDM_NEW
+        MENUITEM "ファイルを開く(&O)\tCtrl+O",         IDM_OPEN
+        MENUITEM "ファイルを閉じる(&C)\tCtrl+W",        IDM_CLOSE
+        MENUITEM SEPARATOR
+        MENUITEM "プロジェクトを開く（&P)",               IDM_PROJECT_OPEN
+        MENUITEM "プロジェクトの保存(&Q)",               IDM_PROJECT_SAVE
+        MENUITEM "プロジェクトを閉じる（&R)",              IDM_PROJECT_CLOSE
+        MENUITEM "プロジェクト フォルダを開く(&F)",          IDM_PROJECT_FOLDER_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "上書き保存(&S)\tCtrl+S",           IDM_SAVE
+        MENUITEM "名前を付けて保存(&A)",                IDM_NEWSAVE
+        MENUITEM "文字コードを指定して保存(&D)",            IDM_CODE_SAVE
+        MENUITEM "すべて保存(&V)",                   IDM_ALLSAVE
+        MENUITEM SEPARATOR
+        MENUITEM "ページ設定(&U)",                   IDM_PAGESET
+        MENUITEM "プレビュー(&R)",                   IDM_PREVIEW
+        MENUITEM "印刷(&P)",                      IDM_PRINTOUT
+        MENUITEM SEPARATOR
+        POPUP "FileHistory"
+        BEGIN
+            MENUITEM "dummy",                       ID_MENUITEM40167
+        END
+        POPUP "ProjectHistory"
+        BEGIN
+            MENUITEM "dummy",                       ID_MENUITEM40168
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "終了(&X)",                      IDM_EXIT
+    END
+    POPUP "編集(&E)"
+    BEGIN
+        MENUITEM "元に戻す(&U)\tCtrl+Z",            IDM_UNDO
+        MENUITEM "やり直し(&R)\tCtrl+Y",            IDM_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "切り取り(&T)\tCtrl+X",            IDM_CUT
+        MENUITEM "コピー(&C)\tCtrl+C",             IDM_COPY
+        MENUITEM "貼り付け(&P)\tCtrl+V",            IDM_PASTE
+        MENUITEM "削除(&D)\tDel",                 IDM_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "すべて選択(&A)\tCtrl+A",           IDM_ALLSELECT
+        MENUITEM SEPARATOR
+        MENUITEM "検索(&F)\tCtrl+F",              IDM_FIND
+        MENUITEM "置換(&S)\tCtrl+H",              IDM_PERMUTATION
+        MENUITEM SEPARATOR
+        POPUP "文字列の変換"
+        BEGIN
+            MENUITEM "アルファベット大文字 → アルファベット小文字(&A)", IDM_CONV_ALPHA_SMALL
+            MENUITEM "アルファベット小文字 → アルファベット大文字(&L)", IDM_CONV_ALPHA_BIG
+            MENUITEM SEPARATOR
+            MENUITEM "全角 → 半角(&H)",                 IDM_CONV_HALF
+            MENUITEM "半角 → 全角(&M)",                 IDM_CONV_MULTI
+            MENUITEM "全角ひらがな → 全角カタカナ(&K)",         IDM_CONV_KATAKANA
+            MENUITEM "全角カタカナ → 全角ひらがな(&R)",         IDM_CONV_HIRAGANA
+            MENUITEM SEPARATOR
+            MENUITEM "TAB → 空白(&S)",                IDM_CONV_SPACE
+            MENUITEM "空白 → TAB(&T)",                IDM_CONV_TAB
+            MENUITEM SEPARATOR
+            MENUITEM "インデントの自動調整(&I)",              IDM_CODEFORMAT
+        END
+    END
+    POPUP "表示(&V)"
+    BEGIN
+        MENUITEM "プロジェクト ビュー(&V)",              IDM_PROJECTVIEW
+        MENUITEM "プロジェクト オプション(&P)",            IDM_PROJECT_OPTION
+        MENUITEM SEPARATOR
+        MENUITEM "常に手前に表示(&T)",                 IDM_TOPMOST
+        MENUITEM SEPARATOR
+        MENUITEM "オプション(&O)",                   IDM_SET
+    END
+    POPUP "リリース(&B)"
+    BEGIN
+        MENUITEM "リリース ビルド(&B)\tF6",            IDM_RELEASECOMPILE
+        MENUITEM "実行(&R)",                      IDM_RELEASERUN
+    END
+    POPUP "デバッグ(&D)"
+    BEGIN
+        MENUITEM "プロセスへアタッチ(&A)",               IDM_ATTACH
+        MENUITEM SEPARATOR
+        MENUITEM "デバッグ ビルド(&D)\tF7",            IDM_DEBUGCOMPILE
+        MENUITEM "デバッグ実行(&R)\tF5",              IDM_DEBUG
+        MENUITEM SEPARATOR
+        MENUITEM "ブレークポイントの設置/解除(&B)\tF9",      IDM_BREAKPOINT
+        MENUITEM "ステップ イン(&I)\tF11",            IDM_STEP_IN, GRAYED
+        MENUITEM "ステップ オーバー(&O)\tF10",          IDM_STEP_OVER, GRAYED
+        MENUITEM "カーソル行まで実行(&C)\tCtrl+F11",     IDM_STEP_CURSOR, GRAYED
+        MENUITEM SEPARATOR
+        MENUITEM "一時中断(&P)",                    IDM_DEBUG_PAUSE, GRAYED
+        MENUITEM "デバッグを中止(&S)",                 IDM_DEBUG_STOP, GRAYED
+    END
+    POPUP "コミュニティ(&C)"
+    BEGIN
+        MENUITEM "コミュニティを表示(&C)",               IDM_COMMUNITY
+        MENUITEM "コミュニティ内を検索(&S)",              IDM_COMMU_SEARCH
+        MENUITEM "プライベート メッセージを読む(&M)",         IDM_COMMU_PM
+        MENUITEM SEPARATOR
+        POPUP "フォーラムへ移動(&F)"
+        BEGIN
+            MENUITEM "プログラミング質問版(&P)",              ID_COMMU_FORUM1
+            MENUITEM "実践コードモジュール(&C)",              ID_COMMU_FORUM2
+            MENUITEM "アナウンス(D)",                    ID_COMMU_FORUM3
+            MENUITEM SEPARATOR
+            MENUITEM "バグ報告(&B)",                    ID_COMMU_FORUM4
+            MENUITEM "仕様提案(&S)",                    ID_COMMU_FORUM5
+            MENUITEM SEPARATOR
+            MENUITEM "ライブラリ開発(Members)(&L)",        ID_COMMU_FORUM6
+            MENUITEM SEPARATOR
+            MENUITEM "要望＆お問い合わせ(&N)",               ID_COMMU_FORUM7
+            MENUITEM "雑談所(&F)",                     ID_COMMU_FORUM8
+        END
+    END
+    POPUP "ヘルプ(&H)"
+    BEGIN
+        MENUITEM "トピック(&T)\tF1",                IDM_TOPIC
+        MENUITEM SEPARATOR
+        POPUP "ホームページを表示(&H)"
+        BEGIN
+            MENUITEM "activebasic.com(&H)",         IDM_AB_WEBSITE
+            MENUITEM "最新版をダウンロード(&D)",              IDM_ACTBDL
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "バージョン情報(&A)",                 IDM_ABOUT
+    END
+END
+
+IDR_EDITMENU MENU 
+BEGIN
+    POPUP "EditMenu"
+    BEGIN
+        MENUITEM "元に戻す(&U)",                    IDM_UNDO
+        MENUITEM "やり直し(&R)",                    IDM_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "切り取り(&T)",                    IDM_CUT
+        MENUITEM "コピー(&C)",                     IDM_COPY
+        MENUITEM "貼り付け(&P)",                    IDM_PASTE
+        MENUITEM "削除(&D)",                      IDM_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "すべて選択(&A)",                   IDM_ALLSELECT
+    END
+END
+
+IDR_REBARMENU MENU 
+BEGIN
+    POPUP "RebarMenu"
+    BEGIN
+        MENUITEM "ドキュメント セレクト(&S)",             IDM_DOCSELECTBAND
+        MENUITEM "スタンダード(&T)",                  IDM_STANDARDBAND
+        MENUITEM "リリース ビルド(&B)",                IDM_RELEASEBAND
+        MENUITEM "デバッガ(&D)",                    IDM_DEBUGBAND
+        MENUITEM "プラットフォーム セレクト(&P)",           IDM_SELECTCOMPILERBAND
+        MENUITEM "Web検索(&W)",                   IDM_BANDMENU_WEB_SEARCH
+        MENUITEM SEPARATOR
+        MENUITEM "ツールバーを固定する(&F)",              IDM_NOGRIPPER
+        MENUITEM SEPARATOR
+        MENUITEM "リセット(&R)",                    IDM_RESET_REBAR
+    END
+END
+
+IDR_PROJECTVIEW_FILETREEMENU MENU 
+BEGIN
+    POPUP "FileTreeRoot"
+    BEGIN
+        MENUITEM "ファイルを挿入(&I)",                 IDM_FILETREE_INSERT
+    END
+    POPUP "FileTree"
+    BEGIN
+        MENUITEM "開く(&O)",                      IDM_FILETREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "プロジェクトから削除(&D)",              IDM_FILETREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "プロパティ(&P)",                   IDM_FILETREE_PROPERTY
+    END
+END
+
+IDR_PROJECTVIEW_MATERIALTREEMENU MENU 
+BEGIN
+    POPUP "BitmapRoot"
+    BEGIN
+        MENUITEM "ビットマップを挿入(&I)",               IDM_MATERIALTREE_INSERTBITMAP
+    END
+    POPUP "BitmapTree"
+    BEGIN
+        MENUITEM "削除(&D)",                      IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                   IDM_MENUTREE_RENAMEID
+    END
+    POPUP "CursorRoot"
+    BEGIN
+        MENUITEM "カーソルを挿入(&I)",                 IDM_MATERIALTREE_INSERTCURSOR
+    END
+    POPUP "CursorTree"
+    BEGIN
+        MENUITEM "削除(&D)",                      IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                   IDM_MENUTREE_RENAMEID
+    END
+    POPUP "IconRoot"
+    BEGIN
+        MENUITEM "アイコンを挿入(&I)",                 IDM_MATERIALTREE_INSERTICON
+    END
+    POPUP "IconTree"
+    BEGIN
+        MENUITEM "開く（&O)",                      IDM_MATERIALTREE_OPEN
+        MENUITEM "メインに設定(&M)",                  IDM_MATERIALTREE_ICON_SETMAIN
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                      IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                   IDM_MENUTREE_RENAMEID
+    END
+    POPUP "MenuRoot"
+    BEGIN
+        MENUITEM "メニューを挿入(&I)",                 IDM_MATERIALTREE_INSERTMENU
+    END
+    POPUP "MenuTree"
+    BEGIN
+        MENUITEM "開く(&O)",                      IDM_MATERIALTREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                      IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "メニューIDを変更(&E)",               IDM_MENUTREE_RENAMEID
+    END
+    POPUP "WindowRoot"
+    BEGIN
+        MENUITEM "ウィンドウを挿入（&I)",                IDM_MATERIALTREE_INSERTWINDOW
+    END
+    POPUP "WindowTree"
+    BEGIN
+        MENUITEM "開く(&O)",                      IDM_MATERIALTREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                      IDM_MATERIALTREE_DELETE
+    END
+END
+
+IDR_RADCONTEXTMENU MENU 
+BEGIN
+    POPUP "Window"
+    BEGIN
+        MENUITEM "イベント コード(&C)",                IDM_RAD_WINDOW_EVENTCODE
+        MENUITEM "メニューによるイベント(&M)",             IDM_RAD_WINDOW_MENUEVENTCODE
+    END
+    POPUP "Item"
+    BEGIN
+        MENUITEM "イベント コード(&C)",                IDM_RAD_WINDOW_EVENTCODE
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                      IDM_RAD_ITEM_DELETE
+    END
+END
+
+IDR_PROJECTVIEW_PROCEDURETREEMENU MENU 
+BEGIN
+    MENUITEM "ProcedureTreeRoot",           65535
+    POPUP "ProcedureTree"
+    BEGIN
+        MENUITEM "表示する(&S)",                    IDM_PROCEDURETREE_SHOW
+    END
+END
+
+IDR_TABMENU MENU 
+BEGIN
+    POPUP "tabmenu"
+    BEGIN
+        POPUP "タブの色(&L)"
+        BEGIN
+            MENUITEM "灰色(&G)",                      IDM_GRAY
+            MENUITEM "白(&W)",                       IDM_WHITE
+            MENUITEM "赤(&R)",                       IDM_RED
+            MENUITEM "緑(&E)",                       IDM_GREEN
+            MENUITEM "青(&B)",                       IDM_BLUE
+            MENUITEM "黄色(&Y)",                      IDM_YELLOW
+            MENUITEM SEPARATOR
+            MENUITEM "ユーザー設定(&U)",                  IDM_USER_COLOR
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "保存(&S)",                      IDM_SAVE
+        MENUITEM "閉じる(&C)",                     IDM_CLOSE
+        MENUITEM "このウィンドウ以外をすべて閉じる(&A)",        IDM_ALLCLOSE_OMIT_MYSELF
+        MENUITEM SEPARATOR
+        MENUITEM "絶対パスをコピー(&P)",                IDM_PATH_COPY
+        MENUITEM "フォルダを開く(&F)",                 IDM_FOLDER_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "ファイルを削除(&D)",                 IDM_DELETE_FILE
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_ACCELERATOR1 ACCELERATORS 
+BEGIN
+    "Y",            IDM_ACCEL_REDO,         VIRTKEY, CONTROL, NOINVERT
+    "Z",            IDM_ACCEL_REDO,         VIRTKEY, SHIFT, CONTROL, NOINVERT
+    "Z",            IDM_ACCEL_UNDO,         VIRTKEY, CONTROL, NOINVERT
+    "A",            IDM_ALLSELECT,          VIRTKEY, CONTROL, NOINVERT
+    VK_F9,          IDM_BREAKPOINT,         VIRTKEY, NOINVERT
+    "W",            IDM_CLOSE,              VIRTKEY, CONTROL, NOINVERT
+    "C",            IDM_COPY,               VIRTKEY, CONTROL, NOINVERT
+    "X",            IDM_CUT,                VIRTKEY, CONTROL, NOINVERT
+    VK_F5,          IDM_DEBUG,              VIRTKEY, NOINVERT
+    VK_F7,          IDM_DEBUGCOMPILE,       VIRTKEY, NOINVERT
+    "F",            IDM_FIND,               VIRTKEY, CONTROL, NOINVERT
+    "N",            IDM_NEW,                VIRTKEY, CONTROL, NOINVERT
+    "O",            IDM_OPEN,               VIRTKEY, CONTROL, NOINVERT
+    "V",            IDM_PASTE,              VIRTKEY, CONTROL, NOINVERT
+    "H",            IDM_PERMUTATION,        VIRTKEY, CONTROL, NOINVERT
+    VK_F6,          IDM_RELEASECOMPILE,     VIRTKEY, NOINVERT
+    "S",            IDM_SAVE,               VIRTKEY, CONTROL, NOINVERT
+    VK_F11,         IDM_STEP_CURSOR,        VIRTKEY, CONTROL, NOINVERT
+    VK_F11,         IDM_STEP_IN,            VIRTKEY, NOINVERT
+    VK_F10,         IDM_STEP_OVER,          VIRTKEY, NOINVERT
+    VK_F1,          IDM_TOPIC,              VIRTKEY, NOINVERT
+    "R",            IDM_PERMUTATION,        VIRTKEY, CONTROL, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_STANDARDTOOLBAR TOOLBAR  16, 15
+BEGIN
+    BUTTON      IDM_NEW
+    BUTTON      IDM_OPEN
+    BUTTON      IDM_SAVE
+    BUTTON      IDM_ALLSAVE
+    BUTTON      IDM_CUT
+    BUTTON      IDM_COPY
+    BUTTON      IDM_PASTE
+    BUTTON      IDM_UNDO
+    BUTTON      IDM_REDO
+    BUTTON      IDM_FIND
+END
+
+IDR_DEBUGGERTOOLBAR TOOLBAR  16, 15
+BEGIN
+    BUTTON      IDM_DEBUG
+    BUTTON      IDM_DEBUGCOMPILE
+    BUTTON      IDM_RELEASECOMPILE
+END
+
+IDR_CONTROL TOOLBAR  16, 15
+BEGIN
+    BUTTON      IDC_TOOL_MOUSE
+    BUTTON      IDC_TOOL_STATIC
+    BUTTON      IDC_TOOL_EDIT
+    BUTTON      IDC_TOOL_GROUPBOX
+    BUTTON      IDC_TOOL_COMBOBOX
+    BUTTON      IDC_TOOL_LISTBOX
+    BUTTON      IDC_TOOL_BUTTON
+    BUTTON      IDC_TOOL_CHECKBOX
+    BUTTON      IDC_TOOL_RADIOBUTTON
+    BUTTON      IDC_TOOL_LISTVIEW
+    BUTTON      IDC_TOOL_TREEVIEW
+    BUTTON      IDC_TOOL_HSCROLLBAR
+    BUTTON      IDC_TOOL_VSCROLLBAR
+    BUTTON      IDC_TOOL_UPDOWN
+    BUTTON      IDC_TOOL_IMAGEBOX
+    BUTTON      IDC_TOOL_TRACKBAR
+    BUTTON      IDC_TOOL_PROGRESSBAR
+    BUTTON      ID_BUTTON40097
+END
+
+IDR_ICONTOOLBAR TOOLBAR  16, 15
+BEGIN
+    BUTTON      IDC_TOOL_SELECT
+    BUTTON      IDC_TOOL_PEN
+    BUTTON      IDC_TOOL_LINE
+    BUTTON      IDC_TOOL_FILL
+    BUTTON      IDC_TOOL_RECTANGLE
+    BUTTON      IDC_TOOL_FILLRECT
+    BUTTON      IDC_TOOL_FILLRECT2
+    BUTTON      IDC_TOOL_ELLIPSE
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_STANDARDTOOLBAR     BITMAP                  "toolbar_standard.bmp"
+IDR_DEBUGGERTOOLBAR     BITMAP                  "toolbar2.bmp"
+IDB_BASE_NORMAL         BITMAP                  "base_window.bmp"
+IDB_BASE_PROMPT         BITMAP                  "base_prompt.bmp"
+IDB_RADIOBUTTON         BITMAP                  "radiobutton.bmp"
+IDB_TITLE_BUTTON_CLOSE  BITMAP                  "title_button_close.bmp"
+IDR_CONTROL             BITMAP                  "toolbar_control.bmp"
+IDB_TITLE               BITMAP                  "title.bmp"
+IDB_PARAMHINT_QUESTION  BITMAP                  "ParamHint_Question.bmp"
+IDB_PARAMHINT_QUESTION2 BITMAP                  "ParamHint_Question2.bmp"
+IDR_ICONTOOLBAR         BITMAP                  "toolbar_icon.bmp"
+IDB_BASE_DOSPROMPT      BITMAP                  "base_dosprompt.bmp"
+IDB_BASE_NON            BITMAP                  "base_non.bmp"
+IDB_BASE_DIRECTX        BITMAP                  "base_directx.bmp"
+IDR_STANDARDTOOLBAR_DISABLED BITMAP                  "toolbar_standard_disabled.bmp"
+IDR_DEBUGGERTOOLBAR_DISABLED BITMAP                  "toolbar_basic_disabled.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUT DIALOGEX 0, 0, 239, 236
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ActiveBasic のバージョン情報"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    DEFPUSHBUTTON   "閉じる",IDCANCEL,182,215,50,14
+    ICON            IDI_MAIN,IDC_STATIC,29,21,20,20
+    LTEXT           "Copyright(C) 1999-2008 activebasic.com",IDC_STATIC,28,56,120,8
+    LTEXT           "ActiveBasic",IDC_STATIC_NAME,52,24,127,8
+    LTEXT           "Version",IDC_STATIC_VERSION,52,36,112,8
+    GROUPBOX        "ablibに関する情報",IDC_STATIC,7,82,225,123
+    LTEXT           "  ActiveBasicに付属する標準ライブラリは、開発者グループに属するライブラリ開発チームの皆様によって開発が進められています。",IDC_STATIC,13,96,213,19
+    EDITTEXT        IDC_DEV_GROUP,13,119,213,69,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL
+    GROUPBOX        "IDEのバージョン情報",IDC_STATIC,7,7,225,67
+    LTEXT           "※順不同",IDC_STATIC,14,192,58,8
+END
+
+IDD_FIND DIALOGEX 0, 0, 235, 89
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "検索"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    LTEXT           "文字列(&N):",IDC_STATIC,7,11,32,8
+    COMBOBOX        IDC_FINDSTR,44,7,121,64,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "大文字小文字を区別する(&C)",IDC_ISBIGSMALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,34,140,10
+    CONTROL         "単語単位(&W)",IDC_ISWORDUNIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,48,140,10
+    CONTROL         "正規表現(&E)",IDC_REGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,62,140,10
+    DEFPUSHBUTTON   "次を検索(&F)",IDOK,178,7,50,14
+    PUSHBUTTON      "すべて検索(&A)",IDC_FINDALL,178,23,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,178,68,50,14
+END
+
+IDD_FINDALL DIALOG  0, 0, 186, 93
+STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "検索結果"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "該当を表示(&S)",IDC_SHOWITEM,2,2,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,55,2,50,14
+    LISTBOX         IDC_FINDLIST,0,17,186,76,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_OPTION_WHOLE DIALOGEX 0, 0, 231, 182
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "全般"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    LTEXT           "拡張子をもとに、ファイルの関連付けを行います。",IDC_STATIC,73,45,151,33
+    LTEXT           "-",IDC_STATIC,61,45,8,8
+    CONTROL         "プロジェクトをコンパイルする時に保存確認をする",IDC_SAVECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,221,10
+    CONTROL         "ドキュメントを保存したときにタブを先頭に再配置する",IDC_SAVE_TAB_TO_HEAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,23,221,10
+    PUSHBUTTON      "関連付け",IDC_LINKFILE,7,41,50,14
+END
+
+IDD_PERMUTATION DIALOG  0, 0, 267, 111
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "置換"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "検索する文字列(&N):",IDC_STATIC,7,10,57,8
+    LTEXT           "置換後の文字列(&P):",IDC_STATIC,7,27,59,8
+    COMBOBOX        IDC_FINDSTR,68,7,134,69,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_PERMUTATIONSTR,68,25,134,70,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "大文字小文字を区別する(&C)",IDC_ISBIGSMALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,53,98,10
+    CONTROL         "単語単位(&W)",IDC_ISWORDUNIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,67,53,10
+    CONTROL         "正規表現(&E)",IDC_REGEXP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,81,52,10
+    DEFPUSHBUTTON   "次を検索(&F)",IDC_FIND,210,7,50,14,WS_GROUP
+    PUSHBUTTON      "次を置換(&R)",IDC_PERMUTATIONNEXT,210,24,50,14
+    PUSHBUTTON      "すべて置換(&A)",IDC_PERMUTATIONALL,210,41,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,210,90,50,14
+END
+
+IDD_NEWFILE DIALOGEX 0, 0, 282, 166
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規作成"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CONTROL         "List1",IDC_FILETYPELIST,"SysListView32",LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,91,17,184,92
+    DEFPUSHBUTTON   "OK",IDOK,171,145,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,225,145,50,14
+    CONTROL         "プロジェクトへ追加",IDC_ADDTOPROJECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,93,148,70,10
+    EDITTEXT        IDC_FILENAME,127,125,148,14,ES_AUTOHSCROLL
+    LTEXT           "ファイル名:",IDC_STATIC_FILENAME,91,128,32,8
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,116,268,1
+    CONTROL         "Tree1",IDC_CATEGORY_TREE,"SysTreeView32",TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,17,81,92
+    LTEXT           "カテゴリ",IDC_STATIC,7,7,83,8
+    LTEXT           "ドキュメント タイプ",IDC_STATIC,91,7,185,8
+END
+
+IDD_OPTION_EDITOR DIALOG  0, 0, 251, 258
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "エディタ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "コーディング サポート",IDC_STATIC,7,66,237,80
+    GROUPBOX        "全般",IDC_STATIC,7,7,237,53
+    LTEXT           "タブ サイズ:",IDC_STATIC_TABSIZE,13,44,35,8
+    LTEXT           "フォント:",IDC_STATIC_SETFONT,13,23,24,8
+    LTEXT           "ヒント フォント:",IDC_STATIC_HINTFONT,118,180,42,8,WS_DISABLED
+    LTEXT           "行前までのステートメントに対応させる",IDC_STATIC_PAIRSTATEMENT,63,129,111,8
+    GROUPBOX        "パラメータ ヒント",IDC_STATIC,7,154,237,51
+    GROUPBOX        "検索・置換",IDC_STATIC,7,213,237,38
+    PUSHBUTTON      "font",IDC_SETFONT,69,19,50,14
+    EDITTEXT        IDC_TABSIZE,69,40,25,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "ルーラーを表示する(&R)",IDC_RULER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,18,83,10
+    CONTROL         "行番号を表示する(&L)",IDC_LINENUMBER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,30,77,10
+    CONTROL         "カーソル行を強調表示する(&C)",IDC_CARETLINE_BACKGROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,137,42,103,10
+    CONTROL         "自動インデント(&I)",IDC_ISAUTOINDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,77,65,10
+    CONTROL         "貼り付け時にインデント調整を行う(&P)",IDC_PASTEINDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,89,122,10
+    CONTROL         "メンバ補完を有効にする(&M)",IDC_COMPLEMENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,101,95,10
+    CONTROL         "ペア ステートメント補完を有効にする(&S)",IDC_PAIRSTATEMENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,113,131,10
+    EDITTEXT        IDC_BACKNUM,37,125,23,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "表示する(&H)",IDC_PARAMHINT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,166,51,10
+    CONTROL         "ポップアップ(&O)",IDC_POPUP,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,35,180,61,10
+    CONTROL         "ステータス バー(&B)",IDC_STATUSBAR,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,35,192,71,10
+    PUSHBUTTON      "hintfont",IDC_HINTFONT,170,176,50,14,WS_DISABLED
+    CONTROL         "アプリケーション終了時に検索・置換文字列を保存する(&V)",IDC_SAVE_FINDSTR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,230,183,10
+END
+
+IDD_OPTION_TOOLBAR DIALOG  0, 0, 187, 93
+STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "ツールバー"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "リセット(&R)",IDC_RESETTOOLBAR,19,24,50,14
+END
+
+IDD_NEWPROJECT_PAGE1 DIALOGEX 0, 0, 310, 177
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ1 （プロジェクトを作成）"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    CONTROL         138,IDC_IMAGE_WINDOW,"Static",SS_BITMAP,7,7,73,64
+    CONTROL         139,IDC_IMAGE_PROMPT,"Static",SS_BITMAP | NOT WS_VISIBLE,18,15,73,64
+    LTEXT           "Static",IDC_HELPTEXT_OFBASE,30,141,273,29,0,WS_EX_STATICEDGE
+    LTEXT           "プロジェクト名(&N):",IDC_STATIC,99,11,52,8
+    LTEXT           "ディレクトリ(&D):",IDC_STATIC,107,28,44,8
+    GROUPBOX        "アプリケーション タイプ",IDC_STATIC,95,45,131,90
+    LTEXT           "説明:",IDC_STATIC,7,141,23,27
+    EDITTEXT        IDC_PROJECTNAME,153,7,69,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_DIRPATH,153,25,107,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "参照(&B)",IDC_PATHBROWSE,271,25,32,14
+    CONTROL         "EXE - ノーマル ウィンドウ ベース",IDC_EXE_WINDOWBASE,"Button",BS_AUTORADIOBUTTON,102,56,112,10
+    CONTROL         "EXE - N88プロンプト ベース",IDC_EXE_PROMPTBASE,"Button",BS_AUTORADIOBUTTON,102,67,98,10
+    CONTROL         "EXE - DOSプロンプト ベース",IDC_EXE_DOSPROMPTBASE,"Button",BS_AUTORADIOBUTTON,102,78,99,10
+    CONTROL         "EXE - ベースなし",IDC_EXE_NOBASE,"Button",BS_AUTORADIOBUTTON,102,89,67,10
+    CONTROL         "EXE - DirectX対応アプリケーション",IDC_EXE_DIRECTX,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,102,100,119,10
+    CONTROL         "DLL - プロシージャ ライブラリ",IDC_DLL,"Button",BS_AUTORADIOBUTTON,102,111,103,10
+    CONTROL         """Hello world!"" 表示",IDC_SHOWHELLOWORLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,230,56,73,10
+    CONTROL         266,IDC_IMAGE_DOSPROMPT,"Static",SS_BITMAP | NOT WS_VISIBLE,7,23,73,64
+    CONTROL         267,IDC_IMAGE_NON,"Static",SS_BITMAP | NOT WS_VISIBLE,18,31,73,64
+    CONTROL         268,IDC_IMAGE_DIRECTX,"Static",SS_BITMAP | NOT WS_VISIBLE,7,39,73,64
+    CONTROL         "LIB - 静的リンク ライブラリ",IDC_SLL,"Button",BS_AUTORADIOBUTTON,102,122,95,10
+END
+
+IDD_NEWPROJECT_PAGE3 DIALOG  0, 0, 310, 177
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ3 （プロジェクト情報の確認）"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    EDITTEXT        IDC_PROJECTINFO,7,7,296,163,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | WS_VSCROLL | WS_HSCROLL
+END
+
+IDD_PROJECT_FILEPROPERTY DIALOGEX 0, 0, 230, 77
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_TOOLWINDOW
+CAPTION "Source File プロパティ"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "使用ファイル:",IDC_STATIC,7,10,47,8
+    LTEXT           "定義:",IDC_STATIC,7,30,47,8
+    LTEXT           "最終更新日時:",IDC_STATIC,7,50,47,8
+    LTEXT           "形式:",IDC_STATIC,7,62,47,8
+    LTEXT           "time",IDC_UPDATE_TIME,55,50,168,8
+    LTEXT           "type",IDC_FILETYPE,55,62,168,8
+    EDITTEXT        IDC_USING_FILE,55,7,168,14,ES_AUTOHSCROLL | ES_READONLY
+    EDITTEXT        IDC_DEFINED_FILE,55,25,168,14,ES_AUTOHSCROLL | ES_READONLY
+END
+
+IDD_RAD_CTRLBUTTONS DIALOG  0, 0, 88, 90
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+IDD_PROJECT_NEWWINDOW DIALOGEX 0, 0, 171, 153
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規ウィンドウ"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "ウィンドウ名:",IDC_STATIC,13,11,47,8
+    LTEXT           "ハンドル:",IDC_STATIC,13,54,47,8
+    LTEXT           "プロシージャ:",IDC_STATIC,13,71,47,8
+    GROUPBOX        "詳細",IDC_STATIC,7,33,101,56
+    GROUPBOX        "タイプ",IDC_STATIC,7,99,157,47
+    EDITTEXT        IDC_WINDOWNAME,60,6,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_WINDOWHANDLE,60,48,40,14,ES_AUTOHSCROLL | ES_READONLY
+    EDITTEXT        IDC_WINDOWPROC,60,66,40,14,ES_AUTOHSCROLL | ES_READONLY
+    CONTROL         "通常ウィンドウ",IDC_DEFWINDOW,"Button",BS_AUTORADIOBUTTON,13,111,149,10
+    CONTROL         "ダイアログ テンプレート（モーダル）",IDC_MODALDLG,"Button",BS_AUTORADIOBUTTON,13,122,149,10
+    CONTROL         "ダイアログ テンプレート（モードレス）",IDC_MODELESSDLG,"Button",BS_AUTORADIOBUTTON,13,133,149,10
+    DEFPUSHBUTTON   "作成",IDOK,114,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,114,24,50,14
+END
+
+IDD_RAD_PROP_WINDOW DIALOGEX 0, 0, 87, 484
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ウィンドウ プロパティ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_STATIC,3,59,81,8
+    LTEXT           "フォント:",IDC_STATIC,3,91,33,8
+    LTEXT           "背景:",IDC_STATIC,3,110,21,8
+    LTEXT           "ハンドル:",IDC_STATIC_HANDLE,3,42,33,8
+    LTEXT           "Handle",IDC_HANDLE,36,42,44,8
+    LTEXT           "識別名:",IDC_STATIC,3,18,81,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,187,85,219
+    LTEXT           "メニュー:",IDC_STATIC,4,128,80,8
+    GROUPBOX        "タイプ",IDC_STATIC,0,412,86,48
+    EDITTEXT        IDC_WINDOWNAME,1,28,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEWINDOW,68,27,18,14
+    EDITTEXT        IDC_CAPTION,1,69,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,68,18,14
+    PUSHBUTTON      "",IDC_SETFONT,36,88,50,14
+    COMBOBOX        IDC_WINDOWMENU,1,138,84,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_WINDOWSTYLE,4,199,80,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BORDERSTYLE,4,213,80,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "タイトルバー",IDC_STYLE_CAPTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,231,80,10
+    CONTROL         "システムメニュー",IDC_STYLE_SYSMENU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,242,80,10
+    CONTROL         "最小化ボタン",IDC_STYLE_MINIMIZEBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,253,80,10
+    CONTROL         "最大化ボタン",IDC_STYLE_MAXIMIZEBOX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,264,80,10
+    CONTROL         "最小化",IDC_STYLE_MINIMIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,282,80,10
+    CONTROL         "最大化",IDC_STYLE_MAXIMIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,293,80,10
+    CONTROL         "水平スクロールバー",IDC_STYLE_HSCROLLBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,311,80,10
+    CONTROL         "垂直スクロールバー",IDC_STYLE_VSCROLLBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,322,80,10
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,340,80,10
+    CONTROL         "兄弟ウィンドウをクリップ",IDC_STYLE_CLIPSIBLINGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,351,80,10
+    CONTROL         "子ウィンドウをクリップ",IDC_STYLE_CLIPCHILDREN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,362,78,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,373,80,10
+    PUSHBUTTON      "拡張スタイルを設定",IDC_EXSTYLE,4,389,78,13
+    CONTROL         "通常ウィンドウ",IDC_DEFWINDOW,"Button",BS_AUTORADIOBUTTON,4,424,80,10
+    CONTROL         "モーダル ダイアログ",IDC_MODALDLG,"Button",BS_AUTORADIOBUTTON,4,435,80,10
+    CONTROL         "モードレス ダイアログ",IDC_MODELESSDLG,"Button",BS_AUTORADIOBUTTON,4,446,78,10
+    LTEXT           "アイコン:",IDC_STATIC_ICON,4,155,80,8
+    COMBOBOX        IDC_ICONRES,1,165,84,75,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BGCOLOR,24,107,61,150,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_RAD_PROP_BUTTON DIALOGEX 0, 0, 87, 293
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- Button プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,212
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,208,80,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,237,80,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,63,8
+    LTEXT           "ID:",IDC_STATIC,3,15,63,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    CONTROL         "標準のボタン",IDC_BS_DEFPUSHBUTTON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,136,80,10
+    CONTROL         "オーナー描画",IDC_BS_OWNERDRAW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,147,80,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,158,80,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,169,80,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,180,80,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,191,80,10
+    COMBOBOX        IDC_BS_HPOS,11,217,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,246,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,266,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_WINDOW_RENAME DIALOGEX 0, 0, 180, 99
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "識別設定"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "ウィンドウ名:",IDC_STATIC,13,11,47,8
+    LTEXT           "ハンドル:",IDC_STATIC,13,53,47,8
+    LTEXT           "プロシージャ:",IDC_STATIC,13,70,47,8
+    GROUPBOX        "詳細",IDC_STATIC,7,33,107,56
+    EDITTEXT        IDC_WINDOWNAME,66,6,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_WINDOWHANDLE,66,48,40,14,ES_AUTOHSCROLL | ES_READONLY
+    EDITTEXT        IDC_WINDOWPROC,66,65,40,14,ES_AUTOHSCROLL | ES_READONLY
+    DEFPUSHBUTTON   "OK",IDOK,126,6,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,126,23,50,14
+END
+
+IDD_RAD_EVENTCODE DIALOGEX 0, 0, 283, 205
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "イベント処理"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "",IDC_PROCEDURENAME,7,167,205,31,0,WS_EX_STATICEDGE
+    LTEXT           "プロシージャ",IDC_STATIC,7,156,83,8
+    CONTROL         "List1",IDC_EVENTLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,7,269,133
+    CONTROL         "Default",IDC_DEFAULT,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE,159,143,37,10
+    CONTROL         "Menu",IDC_MENU,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE,199,143,37,10
+    CONTROL         "MMSYS",IDC_MMSYS,"Button",BS_AUTORADIOBUTTON | BS_PUSHLIKE,238,143,37,10
+    DEFPUSHBUTTON   "コーディング",IDOK,225,167,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,225,184,50,14
+END
+
+IDD_RAD_PROP_ITEM_RENAMEID DIALOGEX 0, 0, 165, 45
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ID名を変更"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    EDITTEXT        IDC_IDNAME,20,7,78,14,ES_AUTOHSCROLL
+    LTEXT           "ID:",IDC_STATIC,7,11,8,8
+    DEFPUSHBUTTON   "OK",IDOK,107,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,107,24,50,14
+END
+
+IDD_RAD_PROP_WINDOW_EXSTYLE DIALOGEX 0, 0, 199, 127
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張スタイル"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CONTROL         "最前面ウィンドウ",IDC_EXSTYLE_TOPMOST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,131,10
+    CONTROL         "ドラッグ＆ドロップを許可",IDC_EXSTYLE_ACCEPTFILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,18,131,10
+    CONTROL         "透過ウィンドウ",IDC_EXSTYLE_TRANSPARENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,29,131,10
+    CONTROL         "ツールウィンドウ",IDC_EXSTYLE_TOOLWINDOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,40,131,10
+    CONTROL         "クライアント境界線",IDC_EXSTYLE_CLIENTEDGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,58,131,10
+    CONTROL         "スタティック境界線",IDC_EXSTYLE_STATICEDGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,69,131,10
+    CONTROL         "親ウィンドウに通知しない",IDC_EXSTYLE_NOPARENTNOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,87,131,10
+    CONTROL         "コンテキスト ヘルプ",IDC_EXSTYLE_CONTEXTHELP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,98,131,10
+    CONTROL         "Tabキーによる子ウィンドウの移動を許可",IDC_EXSTYLE_CONTROLPARENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,109,191,10
+    DEFPUSHBUTTON   "OK",IDOK,142,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,142,24,50,14
+END
+
+IDD_RAD_PROP_ITEM_EXSTYLE DIALOGEX 0, 0, 187, 77
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張スタイル"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CONTROL         "ドラッグ＆ドロップを許可",IDC_EXSTYLE_ACCEPTFILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,119,10
+    CONTROL         "透過ウィンドウ",IDC_EXSTYLE_TRANSPARENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,119,10
+    CONTROL         "モーダル フレーム",IDC_EXSTYLE_DLGMODALFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,119,10
+    CONTROL         "クライアント境界線",IDC_EXSTYLE_CLIENTEDGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,48,119,10
+    CONTROL         "スタティック境界線",IDC_EXSTYLE_STATICEDGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,59,119,10
+    DEFPUSHBUTTON   "OK",IDOK,130,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,130,24,50,14
+END
+
+IDD_RAD_PROP_EDIT DIALOGEX 0, 0, 87, 368
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 400, 0, 0x80
+BEGIN
+    CTEXT           "- Edit プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,285
+    LTEXT           "テキストの配置:",IDC_STATIC,4,304,80,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,63,8
+    LTEXT           "ID:",IDC_STATIC,3,15,63,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    CONTROL         "複数行",IDC_ES_MULTILINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,136,80,10
+    CONTROL         "番号",IDC_ES_NUMBER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,147,80,10
+    CONTROL         "水平スクロール バー",IDC_STYLE_HSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,165,77,10
+    CONTROL         "水平オート スクロール",IDC_ES_AUTOHSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,176,81,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,187,77,10
+    CONTROL         "垂直オート スクロール",IDC_ES_AUTOVSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,198,81,10
+    CONTROL         "パスワード",IDC_ES_PASSWORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,216,80,10
+    CONTROL         "常に選択を表示",IDC_ES_NOHIDESEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,227,80,10
+    CONTROL         "OEM変換",IDC_ES_OEMCONVERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,238,80,10
+    CONTROL         "改行を許可",IDC_ES_WANTRETURN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,249,80,10
+    CONTROL         "大文字変換",IDC_ES_UPPERCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,267,80,10
+    CONTROL         "小文字変換",IDC_ES_LOWERCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,278,80,10
+    CONTROL         "読み取り専用",IDC_ES_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,289,80,10
+    COMBOBOX        IDC_ES_TEXTPOS,11,315,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,338,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_STATIC DIALOGEX 0, 0, 87, 233
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- Static プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,153
+    LTEXT           "テキストの配置:",IDC_STATIC,4,173,80,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,81,8
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    CONTROL         "プリフィックスなし",IDC_SS_NOPREFIX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,136,80,10
+    CONTROL         "折り返しなし",IDC_SS_LEFTNOWORDWRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,147,80,10
+    CONTROL         "通知",IDC_SS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,158,80,10
+    COMBOBOX        IDC_SS_TEXTPOS,11,184,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,207,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_CHECKBOX DIALOGEX 0, 0, 87, 320
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- CheckBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,240
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,237,80,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,266,80,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,63,8
+    LTEXT           "ID:",IDC_STATIC,3,15,63,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    CONTROL         "自動チェック",IDC_BS_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,136,80,10
+    CONTROL         "3 ステート",IDC_BS_3STATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,147,80,10
+    CONTROL         "プッシュ ボタン型",IDC_BS_PUSHLIKE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,158,80,10
+    CONTROL         "左揃えテキスト",IDC_BS_LEFTTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,169,80,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,187,80,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,198,80,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,209,80,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,220,80,10
+    COMBOBOX        IDC_BS_HPOS,11,246,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,275,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,295,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_RADIOBUTTON DIALOGEX 0, 0, 87, 310
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- RadioButton プロパティ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,81,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,230
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,226,80,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,255,80,8
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    CONTROL         "自動チェック",IDC_BS_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,136,80,10
+    CONTROL         "プッシュ ボタン型",IDC_BS_PUSHLIKE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,147,80,10
+    CONTROL         "左揃えテキスト",IDC_BS_LEFTTEXT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,158,80,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,176,80,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,187,80,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,198,80,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,209,80,10
+    COMBOBOX        IDC_BS_HPOS,11,235,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,264,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,284,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_SCROLLBAR DIALOGEX 0, 0, 87, 148
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ScrollBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,96
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "配置:",IDC_STATIC,4,106,20,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,56,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,67,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,78,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,89,80,10
+    COMBOBOX        IDC_SBS_POSITION,24,104,59,54,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,123,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_ITEM_RENAMECAPTION DIALOGEX 0, 0, 163, 45
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "キャプション変更"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    EDITTEXT        IDC_CAPTION,7,17,90,14,ES_AUTOHSCROLL
+    LTEXT           "キャプション:",IDC_STATIC,7,7,89,8
+    DEFPUSHBUTTON   "OK",IDOK,107,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,107,24,50,14
+END
+
+IDD_RAD_PROP_LISTBOX DIALOGEX 0, 0, 87, 325
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ListBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,275
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "選択:",IDC_STATIC,4,103,80,8
+    LTEXT           "オーナー描画:",IDC_STATIC,4,132,80,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,55,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,66,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,77,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,88,80,10
+    COMBOBOX        IDC_LBS_SELECT,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_LBS_OWNERDRAW,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "文字列あり",IDC_LBS_HASSTRINGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,163,80,10
+    CONTROL         "複数列",IDC_LBS_MULTICOLUMN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,174,80,10
+    CONTROL         "ソート",IDC_LBS_SORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,192,80,10
+    CONTROL         "通知",IDC_LBS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,203,80,10
+    CONTROL         "水平スクロール バー",IDC_STYLE_HSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,221,77,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,232,78,10
+    CONTROL         "スクロールバーを表示",IDC_LBS_DISABLENOSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,243,79,10
+    CONTROL         "再描画しない",IDC_LBS_NOREDRAW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,261,80,10
+    CONTROL         "タブ ストップを使用",IDC_LBS_USETABSTOPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,272,80,10
+    CONTROL         "キーボード入力を検出",IDC_LBS_WANTKEYBOARDINPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,283,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,299,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_LISTVIEW DIALOGEX 0, 0, 87, 348
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ListView プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,297
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "表示:",IDC_STATIC,4,103,80,8
+    LTEXT           "配置:",IDC_STATIC,4,132,80,8
+    LTEXT           "ソート:",IDC_STATIC,4,161,80,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,55,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,66,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,77,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,88,80,10
+    COMBOBOX        IDC_LVS_VIEW,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_LVS_POSITION,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_LVS_SORT,11,171,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "単一選択",IDC_LVS_SINGLESEL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,192,80,10
+    CONTROL         "自動整列",IDC_LVS_AUTOARRANGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,203,80,10
+    CONTROL         "ラベルを折り返さない",IDC_LVS_NOLABELWRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,214,80,10
+    CONTROL         "ラベルの編集",IDC_LVS_EDITLABELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,225,80,10
+    CONTROL         "スクロールしない",IDC_LVS_NOSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,243,80,10
+    CONTROL         "ｶﾗﾑにﾍｯﾀﾞをつけない",IDC_LVS_NOCOLUMNHEADER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,254,80,10
+    CONTROL         "ヘッダをソートしない",IDC_LVS_NOSORTHEADER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,265,79,10
+    CONTROL         "選択を常に表示",IDC_LVS_SHOWSELALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,276,80,10
+    CONTROL         "オーナー描画固定",IDC_LVS_OWNERDRAWFIXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,296,80,10
+    CONTROL         "共有イメージリスト",IDC_LVS_SHAREIMAGELISTS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,307,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,323,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_TREEVIEW DIALOGEX 0, 0, 87, 292
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- TreeView プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,240
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,56,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,67,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,78,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,89,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,265,78,13,BS_MULTILINE
+    CONTROL         "ボタンあり",IDC_TVS_HASBUTTONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,105,80,10
+    CONTROL         "線を表示",IDC_TVS_HASLINES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,116,80,10
+    CONTROL         "ルートにも線を表示",IDC_TVS_LINESATROOT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,127,80,10
+    CONTROL         "ラベルの編集",IDC_TVS_EDITLABELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,145,80,10
+    CONTROL         "ﾄﾞﾗｯｸﾞ && ﾄﾞﾛｯﾌﾟを無効",IDC_TVS_DISABLEDRAGDROP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,156,80,10
+    CONTROL         "選択を常に表示",IDC_TVS_SHOWSELALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,167,80,10
+    CONTROL         "スクロールなし",IDC_TVS_NOSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,185,80,10
+    CONTROL         "ツールヒントなし",IDC_TVS_NOTOOLTIPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,196,80,10
+    CONTROL         "チェック ボックス",IDC_TVS_CHECKBOXES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,216,80,10
+    CONTROL         "全行選択",IDC_TVS_FULLROWSELECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,227,80,10
+    CONTROL         "トラック選択",IDC_TVS_TRACKSELECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,238,80,10
+    CONTROL         "シングル拡張",IDC_TVS_SINGLEEXPAND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,249,80,10
+END
+
+IDD_RAD_PROP_IMAGEBOX DIALOGEX 0, 0, 87, 233
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ImageBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,182
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "タイプ:",IDC_STATIC,4,108,19,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,56,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,67,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,78,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,89,80,10
+    COMBOBOX        IDC_IMAGE_TYPE,25,106,58,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,207,78,13,BS_MULTILINE
+    EDITTEXT        IDC_PATH,4,150,58,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_VISIBLE
+    LTEXT           "image situation",IDC_IMAGE_SITUATION,4,140,80,8,NOT WS_VISIBLE
+    PUSHBUTTON      "...",IDC_CHANGEPATH,64,150,18,14,NOT WS_VISIBLE
+    CONTROL         "通知",IDC_SS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,170,80,10
+    CONTROL         "中央配置",IDC_SS_CENTERIMAGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,181,80,10
+    CONTROL         "右に揃える",IDC_SS_RIGHTJUST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,192,80,10
+    CONTROL         "ファイル",IDC_FILE,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,5,125,35,10
+    CONTROL         "リソース",IDC_RESOURCE,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,45,125,36,10
+    COMBOBOX        IDC_RESCOMBO,4,150,79,71,CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_RAD_PROP_COMBOBOX DIALOGEX 0, 0, 87, 312
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ComboBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,261
+    LTEXT           "ID:",IDC_STATIC,3,15,63,8
+    LTEXT           "タイプ:",IDC_STATIC,4,103,80,8
+    LTEXT           "オーナー描画:",IDC_STATIC,4,132,80,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,55,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,66,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,77,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,88,80,10
+    COMBOBOX        IDC_CBS_TYPE,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_CBS_OWNERDRAW,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "文字列あり",IDC_CBS_HASSTRINGS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,163,80,10
+    CONTROL         "ソート",IDC_CBS_SORT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,181,80,10
+    CONTROL         "サイズ調整",IDC_CBS_NOINTEGRALHEIGHT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,192,80,10
+    CONTROL         "OEM 変換",IDC_CBS_OEMCONVERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,203,80,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,221,78,10
+    CONTROL         "水平オート スクロール",IDC_CBS_AUTOHSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,232,81,10
+    CONTROL         "スクロールバーを表示",IDC_CBS_DISABLENOSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,243,79,10
+    CONTROL         "大文字変換",IDC_CBS_UPPERCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,261,80,10
+    CONTROL         "小文字変換",IDC_CBS_LOWERCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,272,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,286,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_GROUPBOX DIALOGEX 0, 0, 87, 227
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- GroupBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,147
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,134,80,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,63,8
+    LTEXT           "ID:",IDC_STATIC,3,15,63,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,85,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,96,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,107,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,118,80,10
+    COMBOBOX        IDC_BS_POSITION,11,145,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,165,80,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,176,80,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,187,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,201,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_UPDOWN DIALOGEX 0, 0, 87, 246
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- UpDown プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,196
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "方向:",IDC_STATIC,4,103,80,8
+    LTEXT           "アタッチ",IDC_STATIC,4,132,80,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,55,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,66,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,77,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,88,80,10
+    COMBOBOX        IDC_UDS_SITUATION,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_UDS_ATTACH,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "自動関連付け",IDC_UDS_AUTOBUDDY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,163,80,10
+    CONTROL         "数値の自動表示",IDC_UDS_SETBUDDYINT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,174,80,10
+    CONTROL         "桁区切りなし",IDC_UDS_NOTHOUSANDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,185,80,10
+    CONTROL         "ワードラップ",IDC_UDS_WRAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,196,80,10
+    CONTROL         "方向キー",IDC_UDS_ARROWKEYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,207,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,221,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_PROGRESSBAR DIALOGEX 0, 0, 87, 156
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- ProgressBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,106
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,56,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,67,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,78,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,89,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,132,78,13,BS_MULTILINE
+    CONTROL         "垂直方向",IDC_PBS_VERTICAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,105,80,10
+    CONTROL         "スムーズ",IDC_PBS_SMOOTH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,116,80,10
+END
+
+IDD_RAD_PROP_TRACKBAR DIALOGEX 0, 0, 87, 224
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- TrackBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,173
+    LTEXT           "ID:",IDC_STATIC,3,15,81,8
+    LTEXT           "方向:",IDC_STATIC,4,103,80,8
+    LTEXT           "ポイント:",IDC_STATIC,4,132,80,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,55,80,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,66,80,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,77,80,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,88,80,10
+    COMBOBOX        IDC_TBS_SITUATION,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_TBS_POINT,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "マークなし",IDC_TBS_NOTICKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,163,80,10
+    CONTROL         "マーク自動設定",IDC_TBS_AUTOTICKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,174,80,10
+    CONTROL         "選択可能",IDC_TBS_ENABLESELRANGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,185,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,199,78,13,BS_MULTILINE
+END
+
+IDD_PROJECT_MENUEDIT DIALOGEX 0, 0, 87, 191
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CTEXT           "- メニュー エディタ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_CAPTIONSTATIC,3,45,63,8
+    LTEXT           "ID:",IDC_IDSTATIC,3,15,63,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAME,68,24,18,43
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "↑",IDC_UP,26,170,14,14
+    PUSHBUTTON      "↓",IDC_DOWN,43,170,14,14
+    CONTROL         "チェック",IDC_CHECKED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,98,62,10
+    CONTROL         "無効",IDC_DISABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,109,62,10
+    PUSHBUTTON      "挿入",IDC_INSERTMENUITEM,5,132,76,14
+    PUSHBUTTON      "削除",IDC_DELETEMENUITEM,5,150,76,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,2,124,83,1
+    CHECKBOX        "ポップアップ",IDC_POPUP,4,76,62,10
+    CONTROL         "セパレータ",IDC_SEPARATOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,87,62,10
+END
+
+IDD_INPUTID DIALOGEX 0, 0, 170, 45
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規メニュー"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    LTEXT           "メニュー ID:",IDC_STATIC,7,11,35,8
+    EDITTEXT        IDC_IDNAME,44,7,63,14,ES_AUTOHSCROLL
+    DEFPUSHBUTTON   "OK",IDOK,112,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,112,24,50,14
+END
+
+IDD_PJ_OPTION2 DIALOGEX 0, 0, 259, 180
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Win32API"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CONTROL         "コモン コントロールを使用する（api_commctrl.sbp）",IDC_API_COMMCTRL,
+                    "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,7,245,10
+    CONTROL         "マルチメディアAPIを使用する（api_mmsys.sbp）",IDC_API_MMSYS,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,20,245,10
+    CONTROL         "リッチエディット コントロールを使用する（api_richedit.sbp）",IDC_API_RICHEDIT,
+                    "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,33,245,10
+    CONTROL         "ソケットAPIを使用する（api_winsock2.sbp）",IDC_API_WINSOCK,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,46,245,10
+END
+
+IDD_NEWPROJECT_PAGE2 DIALOGEX 0, 0, 310, 177
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ2 （プロジェクト オプション）"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    GROUPBOX        "Win32API",IDC_STATIC,7,46,203,64
+    CONTROL         "コモン コントロールを使用する（api_commctrl.sbp）",IDC_API_COMMCTRL,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,59,191,10
+    CONTROL         "マルチメディアAPIを使用する（api_mmsys.sbp）",IDC_API_MMSYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,71,191,10
+    CONTROL         "リッチエディット コントロールを使用する（api_richedit.sbp）",IDC_API_RICHEDIT,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,83,191,10
+    CONTROL         "ソケットAPIを使用する（api_winsock2.sbp）",IDC_API_WINSOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,95,191,10
+    GROUPBOX        "一般",IDC_STATIC,7,7,203,31
+    CONTROL         "Unicode文字セットを使用する",IDC_UNICODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,21,191,10
+END
+
+IDD_PROJECT_MENURENAME DIALOGEX 0, 0, 167, 69
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "メニューID、キャプション設定"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    EDITTEXT        IDC_CAPTION,7,48,90,14,ES_AUTOHSCROLL
+    LTEXT           "キャプション",IDC_STATIC,7,38,89,8
+    DEFPUSHBUTTON   "OK",IDOK,110,30,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,110,47,50,14
+    EDITTEXT        IDC_IDNAME,7,17,90,14,ES_AUTOHSCROLL
+    LTEXT           "ID",IDC_IDSTATIC,7,7,89,8
+END
+
+IDD_OPTION_RAD DIALOG  0, 0, 187, 93
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "RADツール"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "ライン アジャスタを有効にする",IDC_LINEADJUST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,103,10
+END
+
+IDD_EXTENSION_LINK DIALOG  0, 0, 231, 216
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ファイルの関連付け"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "関連付ける",IDOK,173,178,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,173,195,50,14
+    LTEXT           "注意: 他のアプリケーションで使用する拡張子は削除してください。",IDC_STATIC,37,180,111,22
+    CONTROL         "List1",IDC_EXTENSION_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,217,133
+    PUSHBUTTON      "新規(&N)",IDC_ADD_BUTTON,67,145,50,14
+    PUSHBUTTON      "削除(&D)",IDC_DELETE_BUTTON,173,145,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,170,217,1
+    PUSHBUTTON      "編集(&E)",IDC_EDIT_BUTTON,120,145,50,14
+END
+
+IDD_RAD_SUPPORT DIALOGEX 0, 0, 321, 37
+STYLE DS_SETFONT | WS_CHILD
+EXSTYLE WS_EX_STATICEDGE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "X",IDC_STATIC,69,7,8,8
+    LTEXT           "Y",IDC_STATIC,69,23,8,8
+    LTEXT           "幅",IDC_STATIC,142,7,8,8
+    LTEXT           "高さ",IDC_STATIC,142,23,16,8
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDVERT,132,0,1,35
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDVERT,61,1,1,34
+    PUSHBUTTON      "テスト",IDC_TEST,6,11,50,14
+    EDITTEXT        IDC_XPOS,80,3,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,4,9,14
+    EDITTEXT        IDC_YPOS,80,19,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,21,9,14
+    EDITTEXT        IDC_WIDTH,161,3,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,262,5,9,14
+    EDITTEXT        IDC_HEIGHT,161,19,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN4,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,262,21,9,14
+END
+
+IDD_PJ_OPTION1 DIALOG  0, 0, 259, 180
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "一般"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "出力ファイル",IDC_STATIC,7,7,198,79
+    EDITTEXT        IDC_EDIT_RELEASE,16,31,177,14,ES_AUTOHSCROLL
+    LTEXT           "Release:",IDC_STATIC,16,21,26,8
+    EDITTEXT        IDC_EDIT_DEBUG,16,61,177,14,ES_AUTOHSCROLL
+    LTEXT           "Debug:",IDC_STATIC,16,51,20,8
+    GROUPBOX        "コンパイル オプション",IDC_STATIC,7,97,199,39
+    CONTROL         "Unicode文字セットを使用する",IDC_UNICODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,115,116,10
+END
+
+IDD_ICONEDIT_TOOL DIALOG  0, 0, 88, 266
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    COMBOBOX        IDC_ICONTYPECOMBO,10,12,69,104,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "追加",IDC_ADD_ICONTYPE,12,30,30,14
+    PUSHBUTTON      "削除",IDC_DELETE_ICONTYPE,46,30,30,14
+    GROUPBOX        "タイプ",IDC_STATIC,5,1,78,59
+    GROUPBOX        "ツール",IDC_STATIC,5,68,78,190
+END
+
+IDD_ICONEDIT_COLOR DIALOG  0, 0, 227, 43
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "",IDC_STATIC_COLOR,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,22,3,161,34
+    CONTROL         "",IDC_NOWCOLOR,"Static",SS_ETCHEDFRAME,3,3,16,17
+END
+
+IDD_ICONEDIT_BUTTONS DIALOG  0, 0, 59, 158
+STYLE DS_SETFONT | WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+IDD_ICONEDIT_ICONTYPE DIALOGEX 0, 0, 154, 73
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "アイコンタイプを選んでください"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,97,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,97,24,50,14
+    LISTBOX         IDC_TYPELIST,7,7,84,59,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_OPTION_COLOR DIALOGEX 0, 0, 254, 182
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "カラーデザイン"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "指定する部分:",IDC_STATIC_PARTS,7,39,59,8
+    LTEXT           "サンプル:",IDC_STATIC,7,75,59,8
+    LTEXT           "テーマ:",IDC_STATIC,7,6,59,8
+    COMBOBOX        IDC_THEME,7,17,100,91,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_TARGET,7,49,100,91,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_COLOR_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,111,49,20,12
+    CONTROL         "",IDC_SAMPLE,"Button",BS_OWNERDRAW | WS_TABSTOP,7,85,190,90,WS_EX_CLIENTEDGE
+END
+
+IDD_CODE_SAVE DIALOGEX 0, 0, 151, 110
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "文字コードを指定して保存"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    LISTBOX         IDC_LIST_CHARCODE,7,17,64,86,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+    LISTBOX         IDC_LIST_LFCODE,76,17,68,41,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+    DEFPUSHBUTTON   "上書き保存",IDOK,86,72,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,86,89,50,14
+    LTEXT           "文字コード",IDC_STATIC,7,7,65,8
+    LTEXT           "改行コード",IDC_STATIC,77,7,67,8
+END
+
+IDD_PJ_OPTION4 DIALOG  0, 0, 259, 180
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "デバッグ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "コマンドライン",IDC_STATIC,7,7,248,91
+    EDITTEXT        IDC_CMD_LINE,13,20,234,65,ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL
+    GROUPBOX        "デバッグセッションの実行可能ファイル（DLLのみ）",IDC_STATIC_DEBUG,7,109,248,55
+    EDITTEXT        IDC_EXE_PATH,14,125,234,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "参照...",IDC_DIR,219,143,29,14
+END
+
+IDD_EXTENSION_ADD DIALOGEX 0, 0, 227, 106
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張子を追加"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,117,85,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,170,85,50,14
+    EDITTEXT        IDC_EXTENSION,59,7,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_NOTE,59,26,80,14,ES_AUTOHSCROLL
+    LTEXT           "拡張子:",IDC_STATIC,7,11,44,8
+    LTEXT           "説明:",IDC_STATIC,7,30,47,8
+    LTEXT           "Windows検索:",IDC_STATIC,7,49,47,8
+    CONTROL         "有効",IDC_SEARCH_ON,"Button",BS_AUTORADIOBUTTON,66,49,30,10
+    CONTROL         "無効",IDC_SEARCH_OFF,"Button",BS_AUTORADIOBUTTON,98,49,30,10
+    LTEXT           "（例：txt）",IDC_STATIC,143,11,79,8
+    LTEXT           "（例：テキスト ドキュメント）",IDC_STATIC,143,30,73,8
+    LTEXT           "タブの色",IDC_STATIC_TABCOLOR,7,69,47,8
+    CONTROL         "",IDC_COLOR_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,59,67,20,12
+    LTEXT           "←ここをクリックして変更できます",IDC_STATIC_TABCOLOR2,83,69,114,8
+END
+
+IDD_OPTION_WEB DIALOG  0, 0, 250, 195
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Web検索"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "ドメイン検索",IDC_STATIC,7,38,236,135
+    CONTROL         "List2",IDC_DOMAIN_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,13,51,164,116
+    PUSHBUTTON      "新規(&N)",IDC_ADD,187,50,50,14
+    PUSHBUTTON      "削除(&D)",IDC_DELETE,187,68,50,14
+    CONTROL         "Ctrlキーによる単語リンクを有効にする",IDC_CTRLKEY_HYPERLINK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,127,10
+    PUSHBUTTON      "編集(&E)",IDC_EDIT,187,86,50,14
+    CONTROL         "アプリケーション終了時にWeb検索文字列を保存する",IDC_SAVE_WEBFINDSTR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,20,169,10
+END
+
+IDD_OPTION_WEB_DOMAIN_ADD DIALOG  0, 0, 245, 77
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Web検索用ドメインを追加"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,135,56,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,188,56,50,14
+    EDITTEXT        IDC_NAME,59,7,67,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_DOMAIN,59,26,113,14,ES_AUTOHSCROLL
+    LTEXT           "表示名:",IDC_STATIC,7,11,23,8
+    LTEXT           "ドメイン:",IDC_STATIC,7,30,23,8
+    LTEXT           "（例：辞書）",IDC_STATIC,176,11,32,8
+    LTEXT           "（例：ja.wikipedia.org）",IDC_STATIC,176,30,62,8
+END
+
+IDD_PREVIEW DIALOG  0, 0, 354, 429
+STYLE DS_SETFONT | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "印刷プレビュー"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "閉じる",IDOK,13,7,50,14
+    PUSHBUTTON      "ページ設定",IDC_PAGESET,13,57,50,14
+    PUSHBUTTON      "フォント",IDC_FONT,13,79,50,14
+    PUSHBUTTON      "印刷",IDC_PRINT,278,7,50,14
+    PUSHBUTTON      "前へ",IDC_PREV,85,7,50,14
+    PUSHBUTTON      "次へ",IDC_NEXT,138,7,50,14
+    GROUPBOX        "設定",IDC_STATIC,7,43,62,121,BS_CENTER
+    CONTROL         "ページ番号",IDC_SHOWPAGENUM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,111,49,10
+    EDITTEXT        IDC_PAGESTR,13,121,49,14,ES_AUTOHSCROLL
+    LTEXT           """&&n""がページ番号に置き換わります",IDC_STATIC,11,138,54,25
+    PUSHBUTTON      "Button2",IDC_ZOOMOUT,202,7,19,14,BS_ICON
+    PUSHBUTTON      "Button2",IDC_ZOOMIN,223,7,19,14,BS_ICON
+    LTEXT           "Static",IDC_ZOOMRATIO,244,12,31,8
+END
+
+IDD_PASSWORD DIALOGEX 0, 0, 187, 45
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ProjectEditor"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,130,7,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,130,24,50,14
+    LTEXT           "シリアルIDを入力してください",IDC_STATIC,7,7,107,8
+    EDITTEXT        IDC_PASSWORD,7,20,110,14,ES_AUTOHSCROLL
+END
+
+IDD_ATTACH DIALOG  0, 0, 362, 229
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "プロセスへアタッチ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,305,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,305,24,50,14
+    CONTROL         "List1",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP,7,7,285,215
+END
+
+IDD_PJ_OPTION3 DIALOGEX 0, 0, 259, 180
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "マニフェスト"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x0
+BEGIN
+    CONTROL         "マニフェストをリソースに埋め込む",IDC_RC_MANIFEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,138,25,114,10
+    LTEXT           "入力パス:",IDC_STATIC_PATH,7,11,35,25
+    EDITTEXT        IDC_PATH,42,7,210,14,ES_AUTOHSCROLL
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO 
+BEGIN
+    IDD_ABOUT, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 232
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 229
+    END
+
+    IDD_FIND, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 228
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 82
+    END
+
+    IDD_FINDALL, DIALOG
+    BEGIN
+        TOPMARGIN, 2
+    END
+
+    IDD_OPTION_WHOLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 224
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 175
+    END
+
+    IDD_PERMUTATION, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 260
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 104
+    END
+
+    IDD_NEWFILE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 275
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 159
+    END
+
+    IDD_OPTION_EDITOR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 244
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 251
+    END
+
+    IDD_OPTION_TOOLBAR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 86
+    END
+
+    IDD_NEWPROJECT_PAGE1, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_NEWPROJECT_PAGE3, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_PROJECT_FILEPROPERTY, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 223
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_RAD_CTRLBUTTONS, DIALOG
+    BEGIN
+        LEFTMARGIN, 1
+        RIGHTMARGIN, 87
+        TOPMARGIN, 1
+        BOTTOMMARGIN, 89
+    END
+
+    IDD_PROJECT_NEWWINDOW, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 164
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 146
+    END
+
+    IDD_RAD_PROP_WINDOW, DIALOG
+    BEGIN
+        RIGHTMARGIN, 86
+        BOTTOMMARGIN, 442
+    END
+
+    IDD_RAD_PROP_WINDOW_RENAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 173
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 92
+    END
+
+    IDD_RAD_EVENTCODE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 276
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 198
+    END
+
+    IDD_RAD_PROP_ITEM_RENAMEID, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 158
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_RAD_PROP_WINDOW_EXSTYLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 192
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 120
+    END
+
+    IDD_RAD_PROP_ITEM_EXSTYLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_RAD_PROP_ITEM_RENAMECAPTION, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 156
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_RAD_PROP_IMAGEBOX, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 224
+    END
+
+    IDD_INPUTID, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 163
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_PJ_OPTION2, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 252
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 173
+    END
+
+    IDD_NEWPROJECT_PAGE2, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_PROJECT_MENURENAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 160
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 62
+    END
+
+    IDD_OPTION_RAD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 86
+    END
+
+    IDD_EXTENSION_LINK, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 224
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 209
+    END
+
+    IDD_RAD_SUPPORT, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 35
+    END
+
+    IDD_PJ_OPTION1, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 252
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 173
+    END
+
+    IDD_ICONEDIT_TOOL, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 265
+    END
+
+    IDD_ICONEDIT_COLOR, DIALOG
+    BEGIN
+        RIGHTMARGIN, 187
+        BOTTOMMARGIN, 42
+    END
+
+    IDD_ICONEDIT_BUTTONS, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 157
+    END
+
+    IDD_ICONEDIT_ICONTYPE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 147
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 66
+    END
+
+    IDD_OPTION_COLOR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 247
+        TOPMARGIN, 6
+        BOTTOMMARGIN, 175
+    END
+
+    IDD_CODE_SAVE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 144
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 103
+    END
+
+    IDD_PJ_OPTION4, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 255
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 173
+    END
+
+    IDD_EXTENSION_ADD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 220
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 99
+    END
+
+    IDD_OPTION_WEB, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 243
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 188
+    END
+
+    IDD_OPTION_WEB_DOMAIN_ADD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 238
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_PREVIEW, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 347
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 422
+    END
+
+    IDD_PASSWORD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_ATTACH, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 355
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 222
+    END
+
+    IDD_PJ_OPTION3, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 252
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 173
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN                ICON                    "icon1.ico"
+IDI_BASICPROGRAM        ICON                    "BasicProgram.ico"
+IDI_TEXTDOCUMENT        ICON                    "TextDocument.ico"
+IDI_FOLDER_CLOSE        ICON                    "folder_close.ico"
+IDI_FOLDER_OPEN         ICON                    "folder_open.ico"
+IDI_WINDOW              ICON                    "Window.ico"
+IDI_PROCEDURE           ICON                    "Procedure.ico"
+IDI_MENU                ICON                    "menu.ico"
+IDI_FILE_ICON           ICON                    "file_icon.ico"
+IDI_FILE_BMP            ICON                    "file_bmp.ico"
+IDI_FILE_CURSOR         ICON                    "ico00001.ico"
+IDI_MEMBER_PRIVATE_FUNCTION ICON                    "member_private_function.ico"
+IDI_MEMBER_PUBLIC_FUNCTION ICON                    "member_public_function.ico"
+IDI_MEMBER_PRIVATE_VARIABLE ICON                    "member_private_variable.ico"
+IDI_MEMBER_PUBLIC_VARIABLE ICON                    "member_public_variable.ico"
+IDI_PAIRSTATEMENT       ICON                    "pair_statement.ico"
+IDI_VOID                ICON                    "ico00002.ico"
+IDI_PROGRAM_FOLDER      ICON                    "program_folder.ico"
+IDI_HTML_PARAMETER      ICON                    "html_parameter.ico"
+IDI_HTML_GENERAL_PARAMETER ICON                    "html_general_parameter.ico"
+IDI_NEWFILE_TEXT        ICON                    "newfile_text.ico"
+IDI_NEWFILE_ABP         ICON                    "newfile_abp.ico"
+IDI_NEWFILE_HTML        ICON                    "newfile_html.ico"
+IDI_NEWFILE_PJ          ICON                    "newfile_project.ico"
+IDI_NEWFILE_SBP         ICON                    "newfile_sbp.ico"
+IDI_NEWFILE_ICON        ICON                    "newfile_icon.ico"
+IDI_ZOOMIN              ICON                    "zoomin.ico"
+IDI_ZOOMOUT             ICON                    "zoomout.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_CURSOR_PEN          CURSOR                  "cursor_pen.cur"
+IDC_CURSOR_FILL         CURSOR                  "cursor_fill.cur"
+IDC_CURSOR_ARROW_TO_RIGHT CURSOR                  "cursor_arrow_to_right.cur"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE 
+BEGIN
+    IDS_DEV_GROUP           "山本 大祐\r\nNoWest\r\nイグトランス\r\nOverTaker\r\ntak\r\nkonisi"
+END
+
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/res/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/res/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/res/resource.h	(revision 774)
@@ -0,0 +1,625 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by res.rc
+//
+#define IDS_DEV_GROUP                   1
+#define IDCANCEL5                       13
+#define IDR_MAINMENU                    101
+#define IDR_ACCELERATOR1                105
+#define IDR_STANDARDTOOLBAR             106
+#define IDD_ABOUT                       108
+#define IDR_BASICTOOLBAR                111
+#define IDR_DEBUGGERTOOLBAR             111
+#define IDI_MAIN                        114
+#define IDI_BASICPROGRAM                118
+#define IDD_FIND                        119
+#define IDR_EDITMENU                    122
+#define IDD_MAKELINENUM                 124
+#define IDD_FINDALL                     126
+#define IDR_REBARMENU                   127
+#define IDD_SETWHOLE                    128
+#define IDD_OPTION_WHOLE                128
+#define IDD_PERMUTATION                 129
+#define IDD_NEWFILE                     130
+#define IDI_TEXTDOCUMENT                131
+#define IDD_SETEDITOR                   132
+#define IDD_OPTION_EDITOR               132
+#define IDD_SETTOOLBAR                  133
+#define IDD_OPTION_TOOLBAR              133
+#define IDD_NEWPROJECT_PAGE1            136
+#define IDB_BASE_NORMAL                 138
+#define IDB_BASE_PROMPT                 139
+#define IDD_NEWPROJECT_PAGE3            140
+#define IDD_PROJECT_VIEW                145
+#define IDR_PROJECTVIEW_FILETREEMENU    146
+#define IDR_PROJECTVIEW_FILETREEROOTMENU 147
+#define IDI_FOLDER_CLOSE                148
+#define IDI_FOLDER_OPEN                 149
+#define IDD_PROJECT_FILEPROPERTY        150
+#define IDI_WINDOW                      151
+#define IDR_PROJECTVIEW_MATERIALTREEMENU 153
+#define IDR_PROJECTVIEW_WINDOWTREEROOTMENU 157
+#define IDD_RAD_CTRLBUTTONS             158
+#define IDD_PROJECT_NEWWINDOW           161
+#define IDR_RADCONTEXTMENU              164
+#define IDD_RAD_PROP_WINDOW             166
+#define IDD_RAD_PROP_BUTTON             167
+#define IDD_RAD_PROP_WINDOW_RENAME      170
+#define IDD_RAD_EVENTCODE               171
+#define IDD_RAD_PROP_ITEM_RENAMEID      172
+#define IDD_RAD_PROP_WINDOW_EXSTYLE     174
+#define IDD_RAD_PROP_ITEM_EXSTYLE       176
+#define IDD_RAD_PROP_EDIT               177
+#define IDD_RAD_PROP_STATIC             178
+#define IDD_RAD_PROP_CHECKBOX           180
+#define IDD_RAD_PROP_RADIOBUTTON        182
+#define IDB_RADIOBUTTON                 183
+#define IDD_RAD_PROP_SCROLLBAR          184
+#define IDB_TITLE_BUTTON_CLOSE          189
+#define IDD_RAD_PROP_ITEM_RENAMECAPTION 190
+#define IDD_RAD_PROP_LISTBOX            192
+#define IDD_RAD_PROP_LISTVIEW           194
+#define IDD_RAD_PROP_TREEVIEW           198
+#define IDD_RAD_PROP_IMAGEBOX           201
+#define IDR_PROJECTVIEW_PROCEDURETREEMENU 202
+#define IDI_PROCEDURE                   203
+#define IDD_RAD_PROP_COMBOBOX           204
+#define IDD_RAD_PROP_GROUPBOX           208
+#define IDD_RAD_PROP_UPDOWN             211
+#define IDD_RAD_PROP_PROGRESSBAR        212
+#define IDD_RAD_PROP_TRACKBAR           214
+#define IDD_PROJECT_MENUEDIT            216
+#define IDD_PROJECT_NEWMENU             217
+#define IDD_INPUTID                     217
+#define IDD_PROJECT_OPTION              218
+#define IDD_PJ_OPTION2                  218
+#define IDD_NEWPROJECT_PAGE             219
+#define IDD_NEWPROJECT_PAGE2            219
+#define IDD_PROJECT_MENURENAME          220
+#define IDR_CONTROL                     221
+#define IDD_RAD_CHOOSECHILD             223
+#define IDD_RAD_PROP_CHILD              224
+#define IDD_SETRAD                      225
+#define IDD_OPTION_RAD                  225
+#define IDI_FILE_PJ                     226
+#define IDD_SETFILELINK                 227
+#define IDD_OPTION_FILELINK             227
+#define IDD_EXTENSION_LINK              227
+#define IDI_FILE_BAS                    229
+#define IDI_FILE_SBP                    230
+#define IDI_MENU                        231
+#define IDI_FILE_ICON                   233
+#define IDI_FILE_BMP                    234
+#define IDI_FILE_CURSOR                 236
+#define IDB_TITLE                       238
+#define IDD_RAD_SUPPORT                 239
+#define IDD_PJ_OPTION1                  241
+#define IDB_PARAMHINT_QUESTION          243
+#define IDB_PARAMHINT_QUESTION2         244
+#define IDD_ICONEDIT_TOOL               246
+#define IDD_ICONEDIT_COLOR              247
+#define IDD_ICONEDIT_BUTTONS            248
+#define IDR_ICONTOOLBAR                 257
+#define IDD_ICONEDIT_ICONTYPE           259
+#define IDC_CURSOR_PEN                  260
+#define IDC_CURSOR_FILL                 261
+#define IDI_MEMBER_PRIVATE_FUNCTION     262
+#define IDI_MEMBER_PUBLIC_FUNCTION      263
+#define IDI_MEMBER_PRIVATE_VARIABLE     264
+#define IDI_MEMBER_PUBLIC_VARIABLE      265
+#define IDB_BASE_DOSPROMPT              266
+#define IDB_BASE_NON                    267
+#define IDB_BASE_DIRECTX                268
+#define IDI_PAIRSTATEMENT               269
+#define IDC_CURSOR_ARROW_TO_RIGHT       272
+#define IDD_OPTION_COLOR                273
+#define IDD_CODE_SAVE                   274
+#define IDI_ICON1                       275
+#define IDI_VOID                        275
+#define IDI_PROGRAM_FOLDER              276
+#define IDR_STANDARDTOOLBAR_DISABLED    283
+#define IDD_PJ_OPTION4                  284
+#define IDR_TABMENU                     285
+#define IDD_EXTENSION_ADD               286
+#define IDD_OPTION_WEB                  287
+#define IDI_HTML_PARAMETER              287
+#define IDD_OPTION_WEB_DOMAIN_ADD       288
+#define IDI_HTML_GENERAL_PARAMETER      288
+#define IDI_NEWFILE_TEXT                290
+#define IDI_NEWFILE_ABP                 291
+#define IDI_NEWFILE_HTML                292
+#define IDI_NEWFILE_PJ                  293
+#define IDI_NEWFILE_SBP                 294
+#define IDI_NEWFILE_ICON                295
+#define IDD_PREVIEW                     296
+#define IDI_ZOOMIN                      296
+#define IDI_ZOOMOUT                     297
+#define IDR_BASICTOOLBAR_DISABLED       298
+#define IDR_DEBUGGERTOOLBAR_DISABLED    298
+#define IDD_PASSWORD                    299
+#define IDD_ATTACH                      300
+#define IDD_PJ_OPTION5                  309
+#define IDD_PJ_OPTION3                  309
+#define IDC_FINDSTR                     1001
+#define IDC_FINDINWINDOW                1002
+#define IDC_FINDALL                     1003
+#define IDC_ISBIGSMALL                  1004
+#define IDC_SHOWITEM                    1018
+#define IDC_FINDLIST                    1020
+#define IDC_EDITLINE                    1022
+#define IDC_NEWLINE                     1023
+#define IDC_RESETTOOLBAR                1027
+#define IDC_PERMUTATIONSTR              1034
+#define IDC_PERMUTATIONNEXT             1036
+#define IDC_PERMUTATIONALL              1037
+#define IDC_FIND                        1038
+#define IDC_FILETYPELIST                1039
+#define IDC_SETFONT                     1041
+#define IDC_TABSIZE                     1042
+#define IDC_PARAMHINT                   1043
+#define IDC_ISAUTOINDENT                1044
+#define IDC_PROJECTNAME                 1053
+#define IDC_DIRPATH                     1054
+#define IDC_EXE_PROMPTBASE              1055
+#define IDC_EXE_WINDOWBASE              1056
+#define IDC_EXE_NOBASE                  1057
+#define IDC_IMAGE_WINDOW                1058
+#define IDC_IMAGE_PROMPT                1059
+#define IDC_HELPTEXT_OFBASE             1060
+#define IDC_BUTTON1                     1061
+#define IDC_PATHBROWSE                  1061
+#define IDC_RENAMEWINDOW                1061
+#define IDC_HINTFONT                    1061
+#define IDC_LINKFILE                    1061
+#define IDC_TEST                        1061
+#define IDC_ADD_ICONTYPE                1061
+#define IDC_SAMPLE                      1061
+#define IDC_DIR                         1061
+#define IDC_ADD_BUTTON                  1061
+#define IDC_ADD                         1061
+#define IDC_PAGESET                     1061
+#define IDC_GOPRO                       1061
+#define IDC_PROJECTINFO                 1062
+#define IDC_DELETE_ICONTYPE             1062
+#define IDC_DELETE                      1062
+#define IDC_EDIT                        1063
+#define IDC_TAB_PROJECTINFO             1066
+#define IDC_SHOWHELLOWORLD              1068
+#define IDC_USING_FILE                  1069
+#define IDC_DEFINED_FILE                1070
+#define IDC_UPDATE_TIME                 1071
+#define IDC_FILETYPE                    1072
+#define IDC_TOOL_MOUSE                  1075
+#define IDC_TOOL_STATIC                 1076
+#define IDC_TOOL_BUTTON                 1077
+#define IDC_TOOL_EDIT                   1078
+#define IDC_TOOL_CHECKBOX               1079
+#define IDC_WINDOWNAME                  1080
+#define IDC_TOOL_RADIOBUTTON            1080
+#define IDC_WINDOWHANDLE                1081
+#define IDC_TOOL_GROUPBOX               1081
+#define IDC_WINDOWPROC                  1082
+#define IDC_TOOL_HSCROLLBAR             1082
+#define IDC_TOOL_VSCROLLBAR             1083
+#define IDC_TOOL_COMBOBOX               1084
+#define IDC_TOOL_LISTBOX                1085
+#define IDC_TOOL_UPDOWN                 1086
+#define IDC_TOOL_LISTVIEW               1087
+#define IDC_TOOL_TREEVIEW               1088
+#define IDC_CAPTION                     1090
+#define IDC_TOOL_IMAGEBOX               1091
+#define IDC_BGCOLOR                     1091
+#define IDC_TOOL_PROGRESSBAR            1092
+#define IDC_TOOL_TRACKBAR               1093
+#define IDC_IDNAME                      1095
+#define IDC_WINDOWSTYLE                 1097
+#define IDC_STYLE_HSCROLLBAR            1098
+#define IDC_STYLE_VSCROLLBAR            1099
+#define IDC_STYLE_CLIPSIBLINGS          1100
+#define IDC_STYLE_CLIPCHILDREN          1101
+#define IDC_STYLE_SYSMENU               1102
+#define IDC_STYLE_CAPTION               1104
+#define IDC_STYLE_MINIMIZE              1105
+#define IDC_STYLE_MAXIMIZE              1106
+#define IDC_STYLE_VISIBLE               1107
+#define IDC_STYLE_MAXIMIZEBOX           1108
+#define IDC_STYLE_MINIMIZEBOX           1109
+#define IDC_BORDERSTYLE                 1110
+#define IDC_STYLE_DISABLED              1111
+#define IDC_EXSTYLE                     1113
+#define IDC_PROCEDURENAME               1116
+#define IDC_EVENTLIST                   1117
+#define IDC_STYLE_GROUP                 1118
+#define IDC_STYLE_TABSTOP               1119
+#define IDC_BS_DEFPUSHBUTTON            1120
+#define IDC_BS_OWNERDRAW                1121
+#define IDC_BS_ICON                     1122
+#define IDC_BS_BITMAP                   1123
+#define IDC_BS_MULTILINE                1124
+#define IDC_BS_NOTIFY                   1125
+#define IDC_BS_HPOS                     1126
+#define IDC_BS_VPOS                     1127
+#define IDC_RENAMEID                    1128
+#define IDC_RENAMECAPTION               1129
+#define IDC_EXSTYLE_NOPARENTNOTIFY      1129
+#define IDC_EXSTYLE_TOPMOST             1130
+#define IDC_EXSTYLE_ACCEPTFILES         1131
+#define IDC_EXSTYLE_TRANSPARENT         1133
+#define IDC_EXSTYLE_TOOLWINDOW          1134
+#define IDC_EXSTYLE_DLGMODALFRAME       1135
+#define IDC_EXSTYLE_CLIENTEDGE          1136
+#define IDC_EXSTYLE_STATICEDGE          1137
+#define IDC_EXSTYLE_CONTEXTHELP         1138
+#define IDC_EXSTYLE_CONTROLPARENT       1139
+#define IDC_ES_MULTILINE                1161
+#define IDC_ES_NUMBER                   1162
+#define IDC_STYLE_HSCROLL               1163
+#define IDC_ES_AUTOHSCROLL              1164
+#define IDC_STYLE_VSCROLL               1165
+#define IDC_ES_AUTOVSCROLL              1166
+#define IDC_ES_PASSWORD                 1167
+#define IDC_ES_NOHIDESEL                1168
+#define IDC_ES_OEMCONVERT               1169
+#define IDC_ES_WANTRETURN               1170
+#define IDC_ES_UPPERCASE                1171
+#define IDC_ES_LOWERCASE                1172
+#define IDC_ES_READONLY                 1173
+#define IDC_ES_TEXTPOS                  1174
+#define IDC_LBS_SELECT                  1175
+#define IDC_LBS_OWNERDRAW               1176
+#define IDC_LVS_SORT                    1177
+#define IDC_SS_NOPREFIX                 1178
+#define IDC_SS_LEFTNOWORDWRAP           1179
+#define IDC_SS_NOTIFY                   1180
+#define IDC_SS_TEXTPOS                  1182
+#define IDC_BS_AUTO                     1184
+#define IDC_BS_3STATE                   1185
+#define IDC_BS_LEFTTEXT                 1187
+#define IDC_BS_PUSHLIKE                 1188
+#define IDC_SBS_POSITION                1207
+#define IDC_LBS_HASSTRINGS              1221
+#define IDC_LBS_SORT                    1223
+#define IDC_LBS_NOTIFY                  1224
+#define IDC_LBS_MULTICOLUMN             1225
+#define IDC_LBS_DISABLENOSCROLL         1226
+#define IDC_LBS_NOREDRAW                1227
+#define IDC_LBS_USETABSTOPS             1228
+#define IDC_LBS_WANTKEYBOARDINPUT       1229
+#define IDC_LVS_VIEW                    1240
+#define IDC_LVS_POSITION                1241
+#define IDC_LVS_SHOWSELALWAYS           1243
+#define IDC_LVS_SINGLESEL               1244
+#define IDC_LVS_AUTOARRANGE             1245
+#define IDC_LVS_NOLABELWRAP             1246
+#define IDC_LVS_EDITLABELS              1247
+#define IDC_LVS_NOSCROLL                1248
+#define IDC_LVS_NOCOLUMNHEADER          1249
+#define IDC_LVS_NOSORTHEADER            1250
+#define IDC_LVS_OWNERDRAWFIXED          1251
+#define IDC_LVS_SHAREIMAGELISTS         1252
+#define IDC_TVS_HASBUTTONS              1264
+#define IDC_TVS_HASLINES                1266
+#define IDC_TVS_LINESATROOT             1267
+#define IDC_TVS_EDITLABELS              1268
+#define IDC_TVS_DISABLEDRAGDROP         1269
+#define IDC_TVS_SHOWSELALWAYS           1270
+#define IDC_TVS_NOSCROLL                1271
+#define IDC_TVS_NOTOOLTIPS              1272
+#define IDC_TVS_CHECKBOXES              1273
+#define IDC_TVS_FULLROWSELECT           1274
+#define IDC_TVS_TRACKSELECT             1275
+#define IDC_TVS_SINGLEEXPAND            1276
+#define IDC_IMAGE_FILE                  1278
+#define IDC_IMAGE_TYPE                  1281
+#define IDC_SS_CENTERIMAGE              1283
+#define IDC_SS_RIGHTJUST                1284
+#define IDC_CBS_TYPE                    1288
+#define IDC_CBS_HASSTRINGS              1289
+#define IDC_CBS_SORT                    1290
+#define IDC_CBS_NOINTEGRALHEIGHT        1292
+#define IDC_CBS_OEMCONVERT              1293
+#define IDC_CBS_AUTOHSCROLL             1294
+#define IDC_CBS_DISABLENOSCROLL         1295
+#define IDC_CBS_UPPERCASE               1296
+#define IDC_CBS_LOWERCASE               1297
+#define IDC_CBS_OWNERDRAW               1301
+#define IDC_BS_POSITION                 1307
+#define IDC_UDS_AUTOBUDDY               1314
+#define IDC_UDS_SETBUDDYINT             1315
+#define IDC_UDS_NOTHOUSANDS             1316
+#define IDC_UDS_WRAP                    1317
+#define IDC_UDS_ARROWKEYS               1318
+#define IDC_UDS_SITUATION               1319
+#define IDC_UDS_ATTACH                  1320
+#define IDC_PROGRESS3                   1327
+#define IDC_PBS_SMOOTH                  1328
+#define IDC_PBS_VERTICAL                1329
+#define IDC_SLIDER2                     1331
+#define IDC_TBS_SITUATION               1332
+#define IDC_TBS_POINT                   1333
+#define IDC_TBS_NOTICKS                 1334
+#define IDC_TBS_AUTOTICKS               1335
+#define IDC_TBS_ENABLESELRANGE          1336
+#define IDC_SLIDER3                     1337
+#define IDC_HANDLE                      1339
+#define IDC_PATH                        1340
+#define IDC_CHANGEPATH                  1341
+#define IDC_IMAGE_SITUATION             1342
+#define IDC_WINDOWMENU                  1343
+#define IDC_ICONRES                     1344
+#define IDC_UP                          1347
+#define IDC_DOWN                        1348
+#define IDC_CHECKED                     1349
+#define IDC_DISABLED                    1350
+#define IDC_INSERTMENUITEM              1352
+#define IDC_DELETEMENUITEM              1353
+#define IDC_POPUP                       1356
+#define IDC_SEPARATOR                   1357
+#define IDC_DEFWINDOW                   1358
+#define IDC_API_MMSYS                   1362
+#define IDC_DEFAULT                     1363
+#define IDC_API_MMSYS2                  1363
+#define IDC_MMSYS                       1364
+#define IDC_MENU                        1365
+#define IDC_API_COMMCTRL                1368
+#define IDC_RENAME                      1369
+#define IDC_IDSTATIC                    1370
+#define IDC_CAPTIONSTATIC               1371
+#define IDC_STATUSBAR                   1373
+#define IDC_STATIC_HINTFONT             1374
+#define IDC_CHECK3                      1377
+#define IDC_SBP                         1377
+#define IDC_WINDOWLIST                  1380
+#define IDC_STATIC_HANDLE               1383
+#define IDC_SAVECHECK                   1384
+#define IDC_SUPPORT_COMMENT             1386
+#define IDC_LINEADJUST                  1387
+#define IDC_BAS                         1391
+#define IDC_ABP                         1392
+#define IDC_PJ                          1393
+#define IDC_MODALDLG                    1394
+#define IDC_MODELESSDLG                 1395
+#define IDC_DLL                         1397
+#define IDC_SLL                         1398
+#define IDC_EXE_DOSPROMPTBASE           1399
+#define IDC_API_RICHEDIT                1401
+#define IDC_FILE                        1402
+#define IDC_RESOURCE                    1403
+#define IDC_RESCOMBO                    1404
+#define IDC_STATIC_ICON                 1405
+#define IDC_API_WINSOCK                 1406
+#define IDC_XPOS                        1408
+#define IDC_YPOS                        1409
+#define IDC_WIDTH                       1410
+#define IDC_HEIGHT                      1411
+#define IDC_SPIN1                       1414
+#define IDC_SPIN2                       1415
+#define IDC_EDIT_RELEASE                1415
+#define IDC_SPIN3                       1416
+#define IDC_EDIT_DEBUG                  1416
+#define IDC_ADDTOPROJECT                1416
+#define IDC_SPIN4                       1417
+#define IDC_FILENAME                    1417
+#define IDC_STATIC_FILENAME             1418
+#define IDC_CLIP                        1419
+#define IDC_ICONTYPECOMBO               1420
+#define IDC_STATIC_COLOR                1422
+#define IDC_NOWCOLOR                    1423
+#define IDC_TYPELIST                    1425
+#define IDC_COMPLEMENT                  1427
+#define IDC_STATIC_SETFONT              1428
+#define IDC_STATIC_TABSIZE              1429
+#define IDC_EXE_DIRECTX                 1432
+#define IDC_IMAGE_DOSPROMPT             1433
+#define IDC_IMAGE_NON                   1434
+#define IDC_IMAGE_DIRECTX               1435
+#define IDC_PAIRSTATEMENT               1435
+#define IDC_BACKNUM                     1436
+#define IDC_STATIC_PAIRSTATEMENT        1439
+#define IDC_LINENUMBER                  1440
+#define IDC_CARETLINE_BACKGROUND        1441
+#define IDC_STATIC_VERSION              1442
+#define IDC_STRICT                      1443
+#define IDC_COMBO1                      1444
+#define IDC_TARGET                      1445
+#define IDC_THEME                       1446
+#define IDC_COLOR_BUTTON                1448
+#define IDC_STATIC_PARTS                1449
+#define IDC_LIST_CHARCODE               1451
+#define IDC_LIST_LFCODE                 1452
+#define IDC_STATIC_NAME                 1453
+#define IDC_CMD_LINE                    1454
+#define IDC_EXE_PATH                    1455
+#define IDC_STATIC_DEBUG                1456
+#define IDC_RULER                       1457
+#define IDC_EXTENSION_LIST              1458
+#define IDC_EDIT_BUTTON                 1459
+#define IDC_DELETE_BUTTON               1460
+#define IDC_EXTENSION                   1461
+#define IDC_NOTE                        1462
+#define IDC_SEARCH_ON                   1463
+#define IDC_SEARCH_OFF                  1464
+#define IDC_SAVE_TAB_TO_HEAD            1465
+#define IDC_DOMAIN_LIST                 1466
+#define IDC_CTRLKEY_HYPERLINK           1467
+#define IDC_NAME                        1468
+#define IDC_CATEGORY_TREE               1468
+#define IDC_DOMAIN                      1469
+#define IDC_REGEXP                      1471
+#define IDC_STATIC_TABCOLOR             1473
+#define IDC_STATIC_TABCOLOR2            1474
+#define IDC_SAVE_FINDSTR                1475
+#define IDC_SAVE_WEBFINDSTR             1476
+#define IDC_ZOOMOUT                     1477
+#define IDC_ZOOMIN                      1478
+#define IDC_ZOOMRATIO                   1479
+#define IDC_INPUT_PASSWORD              1480
+#define IDC_PASSWORD                    1481
+#define IDC_PROCESSLIST                 1482
+#define IDC_FONT                        1484
+#define IDC_PRINT                       1487
+#define IDC_RC_MANIFEST                 1487
+#define IDC_PREV                        1488
+#define IDC_NEXT                        1489
+#define IDC_STATIC_PATH                 1489
+#define IDC_SHOWPAGENUM                 1490
+#define IDC_DEV_GROUP                   1490
+#define IDC_PAGESTR                     1491
+#define IDC_PASTEINDENT                 1492
+#define IDC_UNICODE                     1494
+#define IDC_ISWORDUNIT                  1496
+#define IDM_EXIT                        40001
+#define IDM_NEW                         40002
+#define IDM_OPEN                        40003
+#define IDM_CLOSE                       40004
+#define IDM_SAVE                        40008
+#define IDM_NEWSAVE                     40009
+#define IDM_UNDO                        40010
+#define IDM_CUT                         40011
+#define IDM_COPY                        40012
+#define IDM_PASTE                       40013
+#define IDM_DELETE                      40014
+#define IDM_ABOUT                       40015
+#define IDM_WINDOWCHARGE                40017
+#define IDM_ALLSAVE                     40020
+#define IDM_ALLSELECT                   40021
+#define IDM_FIND                        40024
+#define IDM_REDO                        40034
+#define IDM_TOPIC                       40037
+#define ID_MENUITEM40038                40038
+#define IDM_DOCSELECTBAND               40039
+#define IDM_STANDARDBAND                40040
+#define IDM_BASICBAND                   40041
+#define IDM_DEBUGBAND                   40041
+#define IDM_SET                         40042
+#define IDM_PERMUTATION                 40044
+#define IDM_DSHOMEPAGE                  40047
+#define IDM_AB_WEBSITE                  40047
+#define IDM_ACTBDL                      40048
+#define IDM_PROJECT_OPEN                40051
+#define IDM_PROJECT_CLOSE               40052
+#define IDM_PROJECT_SAVE                40053
+#define IDM_PROJECTVIEW                 40054
+#define IDM_FILETREE_PROPERTY           40057
+#define IDM_FILETREE_OPEN               40058
+#define IDM_FILETREE_INSERT             40059
+#define IDM_FILETREE_DELETE             40060
+#define IDM_WINDOWTREE_OPEN             40062
+#define IDM_MATERIALTREE_OPEN           40062
+#define IDM_WINDOWTREE_DELETE           40063
+#define IDM_MATERIALTREE_DELETE         40063
+#define IDM_WINDOWTREE_PROPERTY         40064
+#define IDM_WINDOWTREE_INSERT           40065
+#define IDM_MATERIALTREE_INSERT         40065
+#define IDM_MATERIALTREE_INSERTWINDOW   40065
+#define IDM_RAD_ITEM_DELETE             40067
+#define IDM_RAD_WINDOW_EVENTCODE        40069
+#define IDM_ACCEL_UNDO                  -25466
+#define IDM_ACCEL_REDO                  -25465
+#define IDM_PROCEDURETREE_SHOW          40072
+#define IDM_RAD_WINDOW_MENUEVENTCODE    40074
+#define IDM_MENUTREE_RENAMEID           40075
+#define IDM_PROJECT_OPTION              40076
+#define IDM_TOPMOST                     40077
+#define ID_BUTTON40079                  40079
+#define ID_BUTTON40080                  40080
+#define ID_BUTTON40081                  40081
+#define ID_BUTTON40082                  40082
+#define ID_BUTTON40083                  40083
+#define ID_BUTTON40084                  40084
+#define ID_BUTTON40085                  40085
+#define ID_BUTTON40086                  40086
+#define ID_BUTTON40087                  40087
+#define ID_BUTTON40088                  40088
+#define ID_BUTTON40089                  40089
+#define ID_BUTTON40090                  40090
+#define ID_BUTTON40091                  40091
+#define ID_BUTTON40092                  40092
+#define ID_BUTTON40093                  40093
+#define ID_BUTTON40094                  40094
+#define ID_BUTTON40095                  40095
+#define ID_BUTTON40097                  40097
+#define IDM_DEBUG                       40101
+#define IDM_RELEASECOMPILE              40106
+#define IDM_DEBUGCOMPILE                40108
+#define IDM_MATERIALTREE_INSERTICON     40109
+#define IDM_MATERIALTREE_INSERTMENU     40110
+#define IDM_MATERIALTREE_ICON_SETMAIN   40113
+#define IDM_MATERIALTREE_INSERTBITMAP   40115
+#define IDM_MATERIALTREE_INSERTCURSOR   40116
+#define IDM_NOGRIPPER                   40117
+#define IDC_TOOL_SELECT                 40119
+#define IDC_TOOL_PEN                    40120
+#define IDC_TOOL_LINE                   40121
+#define IDC_TOOL_RECTANGLE              40123
+#define IDC_TOOL_ELLIPSE                40124
+#define IDC_TOOL_FILL                   40126
+#define IDC_TOOL_FILLRECT               40127
+#define IDC_TOOL_FILLRECT2              40128
+#define IDM_SELECTCOMPILERBAND          40133
+#define IDM_RESET_REBAR                 40134
+#define IDM_COMMU_PM                    40136
+#define ID_COMMU_FORUM1                 40138
+#define ID_COMMU_FORUM2                 40139
+#define ID_COMMU_FORUM4                 40140
+#define ID_COMMU_FORUM3                 40141
+#define ID_COMMU_FORUM5                 40142
+#define IDM_COMMUNITY                   40143
+#define IDM_CODE_SAVE                   40144
+#define IDM_COMMU_SEARCH                40148
+#define IDM_WEB_SEARCH                  40149
+#define IDM_BANDMENU_WEB_SEARCH         40150
+#define IDM_PROJECT_FOLDER_OPEN         40151
+#define IDM_ALLCLOSE_OMIT_MYSELF        40152
+#define IDM_PATH_COPY                   40153
+#define IDM_FOLDER_OPEN                 40154
+#define IDM_DELETE_FILE                 40155
+#define IDM_GRAY                        40157
+#define IDM_WHITE                       40158
+#define IDM_RED                         40159
+#define IDM_GREEN                       40160
+#define IDM_BLUE                        40161
+#define IDM_YELLOW                      40162
+#define IDM_USER_COLOR                  40163
+#define IDM_PRINTOUT                    40164
+#define IDM_PAGESET                     40165
+#define IDM_PREVIEW                     40166
+#define ID_MENUITEM40167                40167
+#define ID_MENUITEM40168                40168
+#define IDM_CONV_ALPHA_SMALL            40170
+#define IDM_CONV_ALPHA_BIG              40171
+#define IDM_CONV_HELF                   40172
+#define IDM_CONV_HALF                   40172
+#define IDM_CONV_MULTI                  40173
+#define IDM_CONV_KATAKANA               40174
+#define IDM_CONV_HIRAGANA               40175
+#define IDM_CONV_SPACE                  40176
+#define IDM_CONV_TAB                    40177
+#define IDM_ATTACH                      40178
+#define IDM_STEP_IN                     40180
+#define IDM_STEP_OVER                   40181
+#define IDM_STEP_CURSOR                 40184
+#define IDM_BREAKPOINT                  40185
+#define IDM_DEBUG_STOP                  40186
+#define IDM_DEBUG_PAUSE                 40187
+#define IDM_RELEASEBAND                 40189
+#define IDM_RELEASERUN                  40190
+#define ID_COMMU_FORUM6                 40191
+#define ID_COMMU_FORUM7                 40192
+#define ID_COMMU_FORUM8                 40193
+#define IDM_CODEFORMAT                  40194
+#define ID_40195                        40195
+#define ID_40196                        40196
+#define IDM_CLOSEALLWINDOW              40197
+#define IDM_CLOSE_ALL_WINDOW            40198
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        311
+#define _APS_NEXT_COMMAND_VALUE         40199
+#define _APS_NEXT_CONTROL_VALUE         1497
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/abdev/res_TheText/res.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/res_TheText/res.cpp	(revision 774)
+++ branches/egtra/ab5.0/abdev/res_TheText/res.cpp	(revision 774)
@@ -0,0 +1,15 @@
+#include <windows.h>
+
+BOOL WINAPI DllMain(HANDLE hDLL,DWORD dwReason,LPVOID lpReserved){
+	switch(dwReason){
+		case DLL_PROCESS_ATTACH:
+			break;
+		case DLL_PROCESS_DETACH:
+			break;
+		case DLL_THREAD_ATTACH:
+		case DLL_THREAD_DETACH:
+		default:
+			break;
+	}
+	return TRUE;
+}
Index: branches/egtra/ab5.0/abdev/res_TheText/res.dsp
===================================================================
--- branches/egtra/ab5.0/abdev/res_TheText/res.dsp	(revision 774)
+++ branches/egtra/ab5.0/abdev/res_TheText/res.dsp	(revision 774)
@@ -0,0 +1,275 @@
+# Microsoft Developer Studio Project File - Name="res" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** 編集しないでください **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=res - Win32 Debug
+!MESSAGE これは有効なﾒｲｸﾌｧｲﾙではありません。 このﾌﾟﾛｼﾞｪｸﾄをﾋﾞﾙﾄﾞするためには NMAKE を使用してください。
+!MESSAGE [ﾒｲｸﾌｧｲﾙのｴｸｽﾎﾟｰﾄ] ｺﾏﾝﾄﾞを使用して実行してください
+!MESSAGE 
+!MESSAGE NMAKE /f "res.mak".
+!MESSAGE 
+!MESSAGE NMAKE の実行時に構成を指定できます
+!MESSAGE ｺﾏﾝﾄﾞ ﾗｲﾝ上でﾏｸﾛの設定を定義します。例:
+!MESSAGE 
+!MESSAGE NMAKE /f "res.mak" CFG="res - Win32 Debug"
+!MESSAGE 
+!MESSAGE 選択可能なﾋﾞﾙﾄﾞ ﾓｰﾄﾞ:
+!MESSAGE 
+!MESSAGE "res - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE "res - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用)
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "res - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "NDEBUG"
+# ADD RSC /l 0x411 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../TheText/SubOperation/res.dll"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Cmds=copy D:\BasicProject\TheText\SubOperation\res.dll D:\BasicProject\TheText_Standard\SubOperation\res.dll
+# End Special Build Tool
+
+!ELSEIF  "$(CFG)" == "res - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RES_EXPORTS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x411 /d "_DEBUG"
+# ADD RSC /l 0x411 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF 
+
+# Begin Target
+
+# Name "res - Win32 Release"
+# Name "res - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\res.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\res.rc
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\base_directx.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_dosprompt.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_non.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_prompt.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\base_window.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\BasicProgram.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_arrow_to_right.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_fill.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\cursor_pen.cur
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_bas.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_bmp.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_icon.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_pj.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\file_sbp.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\folder_close.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\folder_open.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\html_general_parameter.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\html_parameter.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ico00001.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\ico00002.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\main.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_private_function.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_private_variable.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_public_function.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\member_public_variable.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\menu.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\pair_statement.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\Procedure.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\program_folder.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\TextDocument.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\thetext_pro_image.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\TOOLBAR1.BMP
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar2.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_debugger.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_icon.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_standard.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\toolbar_standard_disabled.bmp
+# End Source File
+# Begin Source File
+
+SOURCE=.\Window.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\zoomin.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\zoomout.ico
+# End Source File
+# End Group
+# End Target
+# End Project
Index: branches/egtra/ab5.0/abdev/res_TheText/res.dsw
===================================================================
--- branches/egtra/ab5.0/abdev/res_TheText/res.dsw	(revision 774)
+++ branches/egtra/ab5.0/abdev/res_TheText/res.dsw	(revision 774)
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# 警告: このﾜｰｸｽﾍﾟｰｽ ﾌｧｲﾙ を編集または削除しないでください!
+
+###############################################################################
+
+Project: "res"=.\res.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
Index: branches/egtra/ab5.0/abdev/res_TheText/res.rc
===================================================================
--- branches/egtra/ab5.0/abdev/res_TheText/res.rc	(revision 774)
+++ branches/egtra/ab5.0/abdev/res_TheText/res.rc	(revision 774)
@@ -0,0 +1,2238 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 日本語 resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
+#ifdef _WIN32
+LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
+#pragma code_page(932)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menu
+//
+
+IDR_MAINMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "ファイル(&F)"
+    BEGIN
+        MENUITEM "新規作成(&N)\tCtrl+N",        IDM_NEW
+        MENUITEM "ファイルを開く(&O)\tCtrl+O",  IDM_OPEN
+        MENUITEM "ファイルを閉じる(&C)",        IDM_CLOSE
+        MENUITEM SEPARATOR
+        MENUITEM "上書き保存(&S)\tCtrl+S",      IDM_SAVE
+        MENUITEM "名前を付けて保存(&A)",        IDM_NEWSAVE
+        MENUITEM "文字コードを指定して保存(&D)", IDM_CODE_SAVE
+        MENUITEM "すべて保存(&V)",              IDM_ALLSAVE
+        MENUITEM SEPARATOR
+        MENUITEM "ページ設定(&U)",              IDM_PAGESET
+        MENUITEM "プレビュー(&R)",              IDM_PREVIEW
+        MENUITEM "印刷(&P)",                    IDM_PRINTOUT
+        MENUITEM SEPARATOR
+        POPUP "FileHistory"
+        BEGIN
+            MENUITEM "dummy",                       ID_MENUITEM40180
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "アプリケーションの終了(&X)",  IDM_EXIT
+    END
+    POPUP "編集(&E)"
+    BEGIN
+        MENUITEM "元に戻す(&U)\tCtrl+Z",        IDM_UNDO
+        MENUITEM "やり直し(&R)\tCtrl+Y",        IDM_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "切り取り(&T)\tCtrl+X",        IDM_CUT
+        MENUITEM "コピー(&C)\tCtrl+C",          IDM_COPY
+        MENUITEM "貼り付け(&P)\tCtrl+V",        IDM_PASTE
+        MENUITEM "削除(&D)\tDel",               IDM_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "すべて選択(&A)\tCtrl+A",      IDM_ALLSELECT
+        MENUITEM SEPARATOR
+        MENUITEM "検索(&F)\tCtrl+F",            IDM_FIND
+        MENUITEM "置換(&S)\tCtrl+H",            IDM_PERMUTATION
+    END
+    POPUP "表示(&V)"
+    BEGIN
+        MENUITEM "常に手前に表示(&T)",          IDM_TOPMOST
+        MENUITEM SEPARATOR
+        MENUITEM "自動折り返し(&W)",            IDM_RIGHT_TURN
+        MENUITEM SEPARATOR
+        MENUITEM "オプション(&O)",              IDM_SET
+    END
+    POPUP "変換(&C)"
+    BEGIN
+        MENUITEM "アルファベット大文字 → アルファベット小文字(&A)", 
+                                                IDM_CONV_ALPHA_SMALL
+        MENUITEM "アルファベット小文字 → アルファベット大文字(&L)", 
+                                                IDM_CONV_ALPHA_BIG
+        MENUITEM SEPARATOR
+        MENUITEM "全角 → 半角(&H)",            IDM_CONV_HALF
+        MENUITEM "半角 → 全角(&M)",            IDM_CONV_MULTI
+        MENUITEM "全角ひらがな → 全角カタカナ(&K)", IDM_CONV_KATAKANA
+        MENUITEM "全角カタカナ → 全角ひらがな(&R)", IDM_CONV_HIRAGANA
+        MENUITEM SEPARATOR
+        MENUITEM "TAB → 空白(&S)",             IDM_CONV_SPACE
+        MENUITEM "空白 → TAB(&T)",             IDM_CONV_TAB
+        MENUITEM SEPARATOR
+        MENUITEM "自動折り返し改行コードを挿入(&U)", IDM_CONV_HASRETURN
+        MENUITEM "引用文に変換(&Q)",            IDM_CONV_QUOTE
+    END
+    POPUP "ツール(&T)"
+    BEGIN
+        MENUITEM "文字カウント(&O)",            IDM_STRING_COUNT
+    END
+    POPUP "ヘルプ(&H)"
+    BEGIN
+        MENUITEM "トピックス(&T)",              IDM_TOPIC
+        MENUITEM SEPARATOR
+        POPUP "ホームページを表示(&H)"
+        BEGIN
+            MENUITEM "Discoversoft のホームページ(&H)", IDM_DSHOMEPAGE
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "バージョン情報(&A)",          IDM_ABOUT
+    END
+END
+
+IDR_EDITMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "EditMenu"
+    BEGIN
+        MENUITEM "元に戻す(&U)",                IDM_UNDO
+        MENUITEM "やり直し(&R)",                IDM_REDO
+        MENUITEM SEPARATOR
+        MENUITEM "切り取り(&T)",                IDM_CUT
+        MENUITEM "コピー(&C)",                  IDM_COPY
+        MENUITEM "貼り付け(&P)",                IDM_PASTE
+        MENUITEM "削除(&D)",                    IDM_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "すべて選択(&A)",              IDM_ALLSELECT
+        MENUITEM SEPARATOR
+        MENUITEM "選択範囲を文字カウント(&O)",  IDM_SEL_STRING_COUNT
+    END
+END
+
+IDR_REBARMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "RebarMenu"
+    BEGIN
+        MENUITEM "ドキュメント セレクト(&D)",   IDM_DOCSELECTBAND
+        MENUITEM "スタンダード(&S)",            IDM_STANDARDBAND
+        MENUITEM "Web検索(&W)",                 IDM_BANDMENU_WEB_SEARCH
+        MENUITEM SEPARATOR
+        MENUITEM "ツールバーを固定する(&F)",    IDM_NOGRIPPER
+        MENUITEM SEPARATOR
+        MENUITEM "リセット(&R)",                IDM_RESET_REBAR
+    END
+END
+
+IDR_PROJECTVIEW_FILETREEMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "FileTreeRoot"
+    BEGIN
+        MENUITEM "ファイルを挿入(&I)",          IDM_FILETREE_INSERT
+    END
+    POPUP "FileTree"
+    BEGIN
+        MENUITEM "開く(&O)",                    IDM_FILETREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "プロジェクトから削除(&D)",    IDM_FILETREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "プロパティ(&P)",              IDM_FILETREE_PROPERTY
+    END
+END
+
+IDR_PROJECTVIEW_MATERIALTREEMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "BitmapRoot"
+    BEGIN
+        MENUITEM "ビットマップを挿入(&I)",      IDM_MATERIALTREE_INSERTBITMAP
+
+    END
+    POPUP "BitmapTree"
+    BEGIN
+        MENUITEM "削除(&D)",                    IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                IDM_MENUTREE_RENAMEID
+    END
+    POPUP "CursorRoot"
+    BEGIN
+        MENUITEM "カーソルを挿入(&I)",          IDM_MATERIALTREE_INSERTCURSOR
+
+    END
+    POPUP "CursorTree"
+    BEGIN
+        MENUITEM "削除(&D)",                    IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                IDM_MENUTREE_RENAMEID
+    END
+    POPUP "IconRoot"
+    BEGIN
+        MENUITEM "アイコンを挿入(&I)",          IDM_MATERIALTREE_INSERTICON
+    END
+    POPUP "IconTree"
+    BEGIN
+        MENUITEM "開く（&O)",                   IDM_MATERIALTREE_OPEN
+        MENUITEM "メインに設定(&M)",            IDM_MATERIALTREE_ICON_SETMAIN
+
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                    IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "IDを変更(&E)",                IDM_MENUTREE_RENAMEID
+    END
+    POPUP "MenuRoot"
+    BEGIN
+        MENUITEM "メニューを挿入(&I)",          IDM_MATERIALTREE_INSERTMENU
+    END
+    POPUP "MenuTree"
+    BEGIN
+        MENUITEM "開く(&O)",                    IDM_MATERIALTREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                    IDM_MATERIALTREE_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "メニューIDを変更(&E)",        IDM_MENUTREE_RENAMEID
+    END
+    POPUP "WindowRoot"
+    BEGIN
+        MENUITEM "ウィンドウを挿入（&I)",       IDM_MATERIALTREE_INSERTWINDOW
+
+    END
+    POPUP "WindowTree"
+    BEGIN
+        MENUITEM "開く(&O)",                    IDM_MATERIALTREE_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                    IDM_MATERIALTREE_DELETE
+    END
+END
+
+IDR_RADCONTEXTMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "Window"
+    BEGIN
+        MENUITEM "イベント コード(&C)",         IDM_RAD_WINDOW_EVENTCODE
+        MENUITEM "メニューによるイベント(&M)",  IDM_RAD_WINDOW_MENUEVENTCODE
+    END
+    POPUP "Item"
+    BEGIN
+        MENUITEM "イベント コード(&C)",         IDM_RAD_WINDOW_EVENTCODE
+        MENUITEM SEPARATOR
+        MENUITEM "削除(&D)",                    IDM_RAD_ITEM_DELETE
+    END
+END
+
+IDR_PROJECTVIEW_PROCEDURETREEMENU MENU DISCARDABLE 
+BEGIN
+    MENUITEM "ProcedureTreeRoot",           65535
+    POPUP "ProcedureTree"
+    BEGIN
+        MENUITEM "表示する(&S)",                IDM_PROCEDURETREE_SHOW
+    END
+END
+
+IDR_TABMENU MENU DISCARDABLE 
+BEGIN
+    POPUP "tabmenu"
+    BEGIN
+        POPUP "タブの色(&L)"
+        BEGIN
+            MENUITEM "灰色(&G)",                    IDM_GRAY
+            MENUITEM "白(&W)",                      IDM_WHITE
+            MENUITEM "赤(&R)",                      IDM_RED
+            MENUITEM "緑(&E)",                      IDM_GREEN
+            MENUITEM "青(&B)",                      IDM_BLUE
+            MENUITEM "黄色(&Y)",                    IDM_YELLOW
+            MENUITEM SEPARATOR
+            MENUITEM "ユーザー設定(&U)",            IDM_USER_COLOR
+        END
+        MENUITEM SEPARATOR
+        MENUITEM "保存(&S)",                    IDM_SAVE
+        MENUITEM "閉じる(&C)",                  IDM_CLOSE
+        MENUITEM "このウィンドウ以外をすべて閉じる(&A)", 
+                                                IDM_ALLCLOSE_OMIT_MYSELF
+        MENUITEM SEPARATOR
+        MENUITEM "絶対パスをコピー(&P)",        IDM_PATH_COPY
+        MENUITEM "フォルダを開く(&F)",          IDM_FOLDER_OPEN
+        MENUITEM SEPARATOR
+        MENUITEM "ファイルを削除(&D)",          IDM_DELETE_FILE
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE 
+BEGIN
+    "A",            IDM_ALLSELECT,          VIRTKEY, CONTROL, NOINVERT
+    "C",            IDM_COPY,               VIRTKEY, CONTROL, NOINVERT
+    "F",            IDM_FIND,               VIRTKEY, CONTROL, NOINVERT
+    "H",            IDM_PERMUTATION,        VIRTKEY, CONTROL, NOINVERT
+    "N",            IDM_NEW,                VIRTKEY, CONTROL, NOINVERT
+    "O",            IDM_OPEN,               VIRTKEY, CONTROL, NOINVERT
+    "S",            IDM_SAVE,               VIRTKEY, CONTROL, NOINVERT
+    "V",            IDM_PASTE,              VIRTKEY, CONTROL, NOINVERT
+    VK_F1,          IDM_TOPIC,              VIRTKEY, NOINVERT
+    VK_F5,          IDM_WEB_SEARCH,         VIRTKEY, NOINVERT
+    "X",            IDM_CUT,                VIRTKEY, CONTROL, NOINVERT
+    "Y",            IDM_ACCEL_REDO,         VIRTKEY, CONTROL, NOINVERT
+    "Z",            IDM_ACCEL_UNDO,         VIRTKEY, CONTROL, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Toolbar
+//
+
+IDR_STANDARDTOOLBAR TOOLBAR DISCARDABLE  16, 15
+BEGIN
+    BUTTON      IDM_NEW
+    BUTTON      IDM_OPEN
+    BUTTON      IDM_SAVE
+    BUTTON      IDM_ALLSAVE
+    BUTTON      IDM_CUT
+    BUTTON      IDM_COPY
+    BUTTON      IDM_PASTE
+    BUTTON      IDM_UNDO
+    BUTTON      IDM_REDO
+    BUTTON      IDM_FIND
+END
+
+IDR_BASICTOOLBAR TOOLBAR DISCARDABLE  16, 15
+BEGIN
+    BUTTON      IDM_DEBUG
+    BUTTON      IDM_DEBUGCOMPILE
+    BUTTON      IDM_RELEASECOMPILE
+END
+
+IDR_CONTROL TOOLBAR DISCARDABLE  16, 15
+BEGIN
+    BUTTON      IDC_TOOL_MOUSE
+    BUTTON      IDC_TOOL_STATIC
+    BUTTON      IDC_TOOL_EDIT
+    BUTTON      IDC_TOOL_GROUPBOX
+    BUTTON      IDC_TOOL_COMBOBOX
+    BUTTON      IDC_TOOL_LISTBOX
+    BUTTON      IDC_TOOL_BUTTON
+    BUTTON      IDC_TOOL_CHECKBOX
+    BUTTON      IDC_TOOL_RADIOBUTTON
+    BUTTON      IDC_TOOL_LISTVIEW
+    BUTTON      IDC_TOOL_TREEVIEW
+    BUTTON      IDC_TOOL_HSCROLLBAR
+    BUTTON      IDC_TOOL_VSCROLLBAR
+    BUTTON      IDC_TOOL_UPDOWN
+    BUTTON      IDC_TOOL_IMAGEBOX
+    BUTTON      IDC_TOOL_TRACKBAR
+    BUTTON      IDC_TOOL_PROGRESSBAR
+    BUTTON      ID_BUTTON40097
+END
+
+IDR_ICONTOOLBAR TOOLBAR DISCARDABLE  16, 15
+BEGIN
+    BUTTON      IDC_TOOL_SELECT
+    BUTTON      IDC_TOOL_PEN
+    BUTTON      IDC_TOOL_LINE
+    BUTTON      IDC_TOOL_FILL
+    BUTTON      IDC_TOOL_RECTANGLE
+    BUTTON      IDC_TOOL_FILLRECT
+    BUTTON      IDC_TOOL_FILLRECT2
+    BUTTON      IDC_TOOL_ELLIPSE
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Bitmap
+//
+
+IDR_STANDARDTOOLBAR     BITMAP  DISCARDABLE     "toolbar_standard.bmp"
+IDR_BASICTOOLBAR        BITMAP  DISCARDABLE     "toolbar2.bmp"
+IDB_BASE_NORMAL         BITMAP  DISCARDABLE     "base_window.bmp"
+IDB_BASE_PROMPT         BITMAP  DISCARDABLE     "base_prompt.bmp"
+IDB_RADIOBUTTON         BITMAP  DISCARDABLE     "radiobutton.bmp"
+IDB_TITLE_BUTTON_CLOSE  BITMAP  DISCARDABLE     "title_button_close.bmp"
+IDR_CONTROL             BITMAP  DISCARDABLE     "toolbar_control.bmp"
+IDB_TITLE               BITMAP  DISCARDABLE     "title.bmp"
+IDB_PARAMHINT_QUESTION  BITMAP  DISCARDABLE     "ParamHint_Question.bmp"
+IDB_PARAMHINT_QUESTION2 BITMAP  DISCARDABLE     "ParamHint_Question2.bmp"
+IDR_ICONTOOLBAR         BITMAP  DISCARDABLE     "toolbar_icon.bmp"
+IDB_BASE_DOSPROMPT      BITMAP  DISCARDABLE     "base_dosprompt.bmp"
+IDB_BASE_NON            BITMAP  DISCARDABLE     "base_non.bmp"
+IDB_BASE_DIRECTX        BITMAP  DISCARDABLE     "base_directx.bmp"
+IDR_STANDARDTOOLBAR_DISABLED BITMAP  DISCARDABLE     "toolbar_standard_disabled.bmp"
+IDB_THETEXT_PRO_IMAGE   BITMAP  DISCARDABLE     "thetext_pro_image.bmp"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUT DIALOG DISCARDABLE  0, 0, 238, 121
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "TheText のバージョン情報"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "閉じる",IDCANCEL,181,100,50,14
+    ICON            IDI_MAIN,IDC_STATIC,29,13,20,20
+    LTEXT           "Copyright(C) 1999-2006 Discoversoft",IDC_STATIC,28,51,
+                    111,8
+    LTEXT           "TheText",IDC_STATIC_NAME,53,15,141,8
+    LTEXT           "Version",IDC_STATIC_VERSION,53,26,112,8
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,70,224,1
+    LTEXT           "Static",IDC_NOTE,7,75,224,20
+    PUSHBUTTON      "Pro版",IDC_GOPRO,7,100,50,14,NOT WS_VISIBLE
+END
+
+IDD_FIND DIALOG DISCARDABLE  0, 0, 235, 84
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "検索"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "文字列(&N):",IDC_STATIC,7,11,32,8
+    COMBOBOX        IDC_FINDSTR,44,7,121,64,CBS_DROPDOWN | CBS_AUTOHSCROLL | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "大文字小文字を区別する(&C)",IDC_ISBIGSMALL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,23,32,98,10
+    CONTROL         "単語単位(&W)",IDC_ISWORDUNIT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,23,45,53,10
+    CONTROL         "正規表現(&E)",IDC_REGEXP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,23,58,52,10
+    DEFPUSHBUTTON   "次を検索(&F)",IDOK,178,7,50,14
+    PUSHBUTTON      "すべて検索(&A)",IDC_FINDALL,178,23,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,178,63,50,14
+END
+
+IDD_FINDALL DIALOG DISCARDABLE  0, 0, 186, 93
+STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "検索結果"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "該当を表示(&S)",IDC_SHOWITEM,2,2,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,55,2,50,14
+    LISTBOX         IDC_FINDLIST,0,17,186,76,LBS_NOINTEGRALHEIGHT | 
+                    WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_OPTION_WHOLE DIALOG DISCARDABLE  0, 0, 195, 103
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "全般"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "拡張子をもとに、ファイルの関連付けを行います。",
+                    IDC_STATIC,68,34,103,20
+    LTEXT           "-",IDC_STATIC,61,34,8,8
+    CONTROL         "ドキュメントを保存したときにタブを先頭に再配置する",
+                    IDC_SAVE_TAB_TO_HEAD,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,7,167,10
+    PUSHBUTTON      "関連付け",IDC_LINKFILE,7,30,50,14
+END
+
+IDD_PERMUTATION DIALOG DISCARDABLE  0, 0, 267, 104
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "置換"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "検索する文字列(&N):",IDC_STATIC,7,10,57,8
+    LTEXT           "置換後の文字列(&P):",IDC_STATIC,7,27,59,8
+    COMBOBOX        IDC_FINDSTR,68,7,134,69,CBS_DROPDOWN | CBS_AUTOHSCROLL | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_PERMUTATIONSTR,68,25,134,70,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "大文字小文字を区別する(&C)",IDC_ISBIGSMALL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,39,51,98,10
+    CONTROL         "単語単位(&W)",IDC_ISWORDUNIT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,39,64,53,10
+    CONTROL         "正規表現(&E)",IDC_REGEXP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,39,77,52,10
+    DEFPUSHBUTTON   "次を検索(&F)",IDC_FIND,210,7,50,14,WS_GROUP
+    PUSHBUTTON      "次を置換(&R)",IDC_PERMUTATIONNEXT,210,24,50,14
+    PUSHBUTTON      "すべて置換(&A)",IDC_PERMUTATIONALL,210,41,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,210,83,50,14
+END
+
+IDD_NEWFILE DIALOG DISCARDABLE  0, 0, 207, 105
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規作成"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,150,67,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,150,84,50,14
+    LISTBOX         IDC_FILETYPELIST,7,7,117,91,LBS_NOINTEGRALHEIGHT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "プロジェクトへ追加",IDC_ADDTOPROJECT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,129,14,70,10
+    EDITTEXT        IDC_FILENAME,129,43,71,14,ES_AUTOHSCROLL
+    LTEXT           "ファイル名:",IDC_STATIC_FILENAME,129,33,32,8
+END
+
+IDD_OPTION_EDITOR DIALOG DISCARDABLE  0, 0, 251, 174
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "エディタ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "全般",IDC_STATIC,7,7,237,77
+    LTEXT           "タブ サイズ(&T):",IDC_STATIC_TABSIZE,13,44,44,8
+    LTEXT           "フォント(&F):",IDC_STATIC_SETFONT,13,23,32,8
+    LTEXT           "自動折り返しのときの一行あたりの文字数:",IDC_STATIC,13,
+                    65,123,8
+    LTEXT           "文字（バイト）",IDC_STATIC,170,65,39,8
+    GROUPBOX        "入力サポート",IDC_STATIC,7,90,237,35
+    PUSHBUTTON      "font",IDC_SETFONT,69,19,50,14
+    EDITTEXT        IDC_TABSIZE,69,40,25,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "ルーラーを表示する",IDC_RULER,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,143,18,74,10
+    CONTROL         "行番号を表示する",IDC_LINENUMBER,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,143,30,69,10
+    CONTROL         "カーソル行を強調表示する",IDC_CARETLINE_BACKGROUND,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,143,42,94,10
+    EDITTEXT        IDC_MAX_ONELINE_TEXT_LENGTH,141,61,25,14,ES_NUMBER
+    CONTROL         "自動インデント(&I)",IDC_ISAUTOINDENT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,106,65,10
+    GROUPBOX        "検索・置換",IDC_STATIC,7,131,237,35
+    CONTROL         "アプリケーション終了時に検索・置換文字列を保存する",
+                    IDC_SAVE_FINDSTR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    13,147,174,10
+END
+
+IDD_OPTION_TOOLBAR DIALOG DISCARDABLE  0, 0, 187, 93
+STYLE WS_CHILD | WS_DISABLED | WS_CAPTION | WS_SYSMENU
+CAPTION "ツールバー"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    PUSHBUTTON      "リセット(&R)",IDC_RESETTOOLBAR,19,24,50,14
+END
+
+IDD_NEWPROJECT_PAGE1 DIALOGEX 0, 0, 310, 177
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ1 （プロジェクトを作成）"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    CONTROL         138,IDC_IMAGE_WINDOW,"Static",SS_BITMAP,7,7,73,64
+    CONTROL         139,IDC_IMAGE_PROMPT,"Static",SS_BITMAP | NOT WS_VISIBLE,
+                    18,15,73,64
+    LTEXT           "Static",IDC_HELPTEXT_OFBASE,28,141,275,29,0,
+                    WS_EX_STATICEDGE
+    LTEXT           "プロジェクト名(&N):",IDC_STATIC,99,11,52,8
+    LTEXT           "ディレクトリ(&D):",IDC_STATIC,107,28,44,8
+    GROUPBOX        "アプリケーション タイプ（Win32)",IDC_STATIC,95,49,131,
+                    86
+    LTEXT           "説明:",IDC_STATIC,7,141,16,8
+    EDITTEXT        IDC_PROJECTNAME,153,7,69,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_DIRPATH,153,25,107,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "参照(&B)",IDC_PATHBROWSE,271,25,32,14
+    CONTROL         "EXE - ノーマル ウィンドウ ベース",IDC_EXE_WINDOWBASE,
+                    "Button",BS_AUTORADIOBUTTON,102,61,112,10
+    CONTROL         "EXE - N88プロンプト ベース",IDC_EXE_PROMPTBASE,"Button",
+                    BS_AUTORADIOBUTTON,102,73,98,10
+    CONTROL         "EXE - DOSプロンプト ベース",IDC_EXE_DOSPROMPTBASE,
+                    "Button",BS_AUTORADIOBUTTON,102,85,99,10
+    CONTROL         "EXE - ベースなし",IDC_EXE_NOBASE,"Button",
+                    BS_AUTORADIOBUTTON,102,97,67,10
+    CONTROL         "EXE - DirectX対応アプリケーション",IDC_EXE_DIRECTX,
+                    "Button",BS_AUTORADIOBUTTON,102,109,119,10
+    CONTROL         "DLL - プロシージャ ライブラリ",IDC_DLL,"Button",
+                    BS_AUTORADIOBUTTON,102,121,103,10
+    CONTROL         """Hello world!"" 表示",IDC_SHOWHELLOWORLD,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,230,56,73,10
+    CONTROL         266,IDC_IMAGE_DOSPROMPT,"Static",SS_BITMAP | NOT 
+                    WS_VISIBLE,7,23,73,64
+    CONTROL         267,IDC_IMAGE_NON,"Static",SS_BITMAP | NOT WS_VISIBLE,18,
+                    31,73,64
+    CONTROL         268,IDC_IMAGE_DIRECTX,"Static",SS_BITMAP | NOT 
+                    WS_VISIBLE,7,39,73,64
+END
+
+IDD_NEWPROJECT_PAGE3 DIALOG DISCARDABLE  0, 0, 310, 177
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ3 （プロジェクト情報の確認）"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    EDITTEXT        IDC_PROJECTINFO,7,7,296,163,ES_MULTILINE | 
+                    ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | 
+                    WS_VSCROLL | WS_HSCROLL
+END
+
+IDD_PROJECT_FILEPROPERTY DIALOGEX 0, 0, 230, 77
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_TOOLWINDOW
+CAPTION "Source File プロパティ"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "使用ファイル:",IDC_STATIC,7,10,39,8
+    LTEXT           "定義:",IDC_STATIC,7,30,16,8
+    LTEXT           "最終更新日時:",IDC_STATIC,7,50,43,8
+    LTEXT           "形式:",IDC_STATIC,7,62,16,8
+    LTEXT           "time",IDC_UPDATE_TIME,55,50,168,8
+    LTEXT           "type",IDC_FILETYPE,55,62,168,8
+    EDITTEXT        IDC_USING_FILE,55,7,168,14,ES_AUTOHSCROLL | ES_READONLY
+    EDITTEXT        IDC_DEFINED_FILE,55,25,168,14,ES_AUTOHSCROLL | 
+                    ES_READONLY
+END
+
+IDD_RAD_CTRLBUTTONS DIALOG DISCARDABLE  0, 0, 88, 90
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+IDD_PROJECT_NEWWINDOW DIALOG DISCARDABLE  0, 0, 171, 153
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規ウィンドウ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "ウィンドウ名:",IDC_STATIC,13,11,36,8
+    LTEXT           "ハンドル:",IDC_STATIC,13,60,26,8
+    LTEXT           "プロシージャ:",IDC_STATIC,13,77,39,8
+    GROUPBOX        "詳細",IDC_STATIC,7,29,96,64
+    GROUPBOX        "タイプ",IDC_STATIC,7,99,157,47
+    EDITTEXT        IDC_WINDOWNAME,56,7,40,14,ES_AUTOHSCROLL
+    CONTROL         "自動設定",IDC_AUTOSET,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,13,42,43,10
+    EDITTEXT        IDC_WINDOWHANDLE,56,56,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_WINDOWPROC,56,73,40,14,ES_AUTOHSCROLL
+    CONTROL         "通常ウィンドウ",IDC_DEFWINDOW,"Button",
+                    BS_AUTORADIOBUTTON,13,111,57,10
+    CONTROL         "ダイアログ テンプレート（モーダル）",IDC_MODALDLG,
+                    "Button",BS_AUTORADIOBUTTON,13,122,117,10
+    CONTROL         "ダイアログ テンプレート（モードレス）",IDC_MODELESSDLG,
+                    "Button",BS_AUTORADIOBUTTON,13,133,121,10
+    DEFPUSHBUTTON   "作成",IDOK,114,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,114,24,50,14
+END
+
+IDD_RAD_PROP_WINDOW DIALOG DISCARDABLE  0, 0, 87, 484
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ウィンドウ プロパティ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_STATIC,3,59,38,8
+    LTEXT           "フォント:",IDC_STATIC,3,91,24,8
+    LTEXT           "背景:",IDC_STATIC,3,110,16,8
+    LTEXT           "ハンドル:",IDC_STATIC_HANDLE,3,42,26,8
+    LTEXT           "Handle",IDC_HANDLE,30,42,50,8
+    LTEXT           "識別名:",IDC_STATIC,3,18,23,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,187,85,219
+    LTEXT           "メニュー:",IDC_STATIC,4,128,26,8
+    GROUPBOX        "タイプ",IDC_STATIC,0,412,86,48
+    EDITTEXT        IDC_WINDOWNAME,1,28,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEWINDOW,68,27,18,14
+    EDITTEXT        IDC_CAPTION,1,69,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,68,18,14
+    PUSHBUTTON      "",IDC_SETFONT,28,88,58,14
+    COMBOBOX        IDC_WINDOWMENU,1,138,84,75,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_WINDOWSTYLE,4,199,80,60,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BORDERSTYLE,4,213,80,60,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "タイトルバー",IDC_STYLE_CAPTION,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,231,52,10
+    CONTROL         "システムメニュー",IDC_STYLE_SYSMENU,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,242,66,10
+    CONTROL         "最小化ボタン",IDC_STYLE_MINIMIZEBOX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,253,54,10
+    CONTROL         "最大化ボタン",IDC_STYLE_MAXIMIZEBOX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,264,54,10
+    CONTROL         "最小化",IDC_STYLE_MINIMIZE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,282,37,10
+    CONTROL         "最大化",IDC_STYLE_MAXIMIZE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,293,37,10
+    CONTROL         "水平スクロールバー",IDC_STYLE_HSCROLLBAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,311,71,10
+    CONTROL         "垂直スクロールバー",IDC_STYLE_VSCROLLBAR,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,322,71,10
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,340,64,10
+    CONTROL         "兄弟ウィンドウをクリップ",IDC_STYLE_CLIPSIBLINGS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,351,80,10
+    CONTROL         "子ウィンドウをクリップ",IDC_STYLE_CLIPCHILDREN,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,362,78,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,373,30,10
+    PUSHBUTTON      "拡張スタイルを設定",IDC_EXSTYLE,4,389,78,13
+    CONTROL         "通常ウィンドウ",IDC_DEFWINDOW,"Button",
+                    BS_AUTORADIOBUTTON,4,424,57,10
+    CONTROL         "モーダル ダイアログ",IDC_MODALDLG,"Button",
+                    BS_AUTORADIOBUTTON,4,435,80,10
+    CONTROL         "モードレス ダイアログ",IDC_MODELESSDLG,"Button",
+                    BS_AUTORADIOBUTTON,4,446,78,10
+    LTEXT           "アイコン:",IDC_STATIC_ICON,4,155,26,8
+    COMBOBOX        IDC_ICONRES,1,165,84,75,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_BGCOLOR,20,107,65,150,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+END
+
+IDD_RAD_PROP_BUTTON DIALOG DISCARDABLE  0, 0, 87, 293
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- Button プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,212
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,208,50,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,237,49,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    CONTROL         "標準のボタン",IDC_BS_DEFPUSHBUTTON,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,136,54,10
+    CONTROL         "オーナー描画",IDC_BS_OWNERDRAW,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,147,56,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,158,39,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,169,49,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,180,37,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,191,30,10
+    COMBOBOX        IDC_BS_HPOS,11,217,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,246,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,266,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_WINDOW_RENAME DIALOG DISCARDABLE  0, 0, 170, 99
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "識別設定"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "ウィンドウ名:",IDC_STATIC,13,11,36,8
+    LTEXT           "ハンドル:",IDC_STATIC,13,60,26,8
+    LTEXT           "プロシージャ:",IDC_STATIC,13,77,39,8
+    GROUPBOX        "詳細",IDC_STATIC,7,29,96,64
+    EDITTEXT        IDC_WINDOWNAME,56,7,40,14,ES_AUTOHSCROLL
+    CONTROL         "自動設定",IDC_AUTOSET,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,13,42,43,10
+    EDITTEXT        IDC_WINDOWHANDLE,56,56,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_WINDOWPROC,56,73,40,14,ES_AUTOHSCROLL
+    DEFPUSHBUTTON   "OK",IDOK,113,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,113,24,50,14
+END
+
+IDD_RAD_EVENTCODE DIALOGEX 0, 0, 283, 205
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "イベント処理"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "",IDC_PROCEDURENAME,7,167,205,31,0,WS_EX_STATICEDGE
+    LTEXT           "プロシージャ",IDC_STATIC,7,156,38,8
+    CONTROL         "List1",IDC_EVENTLIST,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | 
+                    WS_TABSTOP,7,7,269,133
+    CONTROL         "Default",IDC_DEFAULT,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,159,143,37,10
+    CONTROL         "Menu",IDC_MENU,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,199,143,37,10
+    CONTROL         "MMSYS",IDC_MMSYS,"Button",BS_AUTORADIOBUTTON | 
+                    BS_PUSHLIKE,238,143,37,10
+    DEFPUSHBUTTON   "コーディング",IDOK,225,167,50,14
+    PUSHBUTTON      "キャンセル",IDCANCEL,225,184,50,14
+END
+
+IDD_RAD_PROP_ITEM_RENAMEID DIALOG DISCARDABLE  0, 0, 165, 45
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ID名を変更"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    EDITTEXT        IDC_IDNAME,20,7,78,14,ES_AUTOHSCROLL
+    LTEXT           "ID:",IDC_STATIC,7,11,8,8
+    DEFPUSHBUTTON   "OK",IDOK,107,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,107,24,50,14
+END
+
+IDD_RAD_PROP_WINDOW_EXSTYLE DIALOG DISCARDABLE  0, 0, 199, 127
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張スタイル"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "最前面ウィンドウ",IDC_EXSTYLE_TOPMOST,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,7,64,10
+    CONTROL         "ドラッグ＆ドロップを許可",IDC_EXSTYLE_ACCEPTFILES,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,18,86,10
+    CONTROL         "透過ウィンドウ",IDC_EXSTYLE_TRANSPARENT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,29,57,10
+    CONTROL         "ツールウィンドウ",IDC_EXSTYLE_TOOLWINDOW,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,40,63,10
+    CONTROL         "クライアント境界線",IDC_EXSTYLE_CLIENTEDGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,58,70,10
+    CONTROL         "スタティック境界線",IDC_EXSTYLE_STATICEDGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,69,70,10
+    CONTROL         "親ウィンドウに通知しない",IDC_EXSTYLE_NOPARENTNOTIFY,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,87,88,10
+    CONTROL         "コンテキスト ヘルプ",IDC_EXSTYLE_CONTEXTHELP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,98,73,10
+    CONTROL         "Tabキーによる子ウィンドウの移動を許可",
+                    IDC_EXSTYLE_CONTROLPARENT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,109,133,10
+    DEFPUSHBUTTON   "OK",IDOK,142,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,142,24,50,14
+END
+
+IDD_RAD_PROP_ITEM_EXSTYLE DIALOG DISCARDABLE  0, 0, 187, 77
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張スタイル"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "ドラッグ＆ドロップを許可",IDC_EXSTYLE_ACCEPTFILES,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,86,10
+    CONTROL         "透過ウィンドウ",IDC_EXSTYLE_TRANSPARENT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,19,57,10
+    CONTROL         "モーダル フレーム",IDC_EXSTYLE_DLGMODALFRAME,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,37,70,10
+    CONTROL         "クライアント境界線",IDC_EXSTYLE_CLIENTEDGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,48,70,10
+    CONTROL         "スタティック境界線",IDC_EXSTYLE_STATICEDGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,59,70,10
+    DEFPUSHBUTTON   "OK",IDOK,130,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,130,24,50,14
+END
+
+IDD_RAD_PROP_EDIT DIALOG DISCARDABLE  0, 0, 87, 368
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- Edit プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,285
+    LTEXT           "テキストの配置:",IDC_STATIC,4,304,47,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    CONTROL         "複数行",IDC_ES_MULTILINE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,136,37,10
+    CONTROL         "番号",IDC_ES_NUMBER,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,147,30,10
+    CONTROL         "水平スクロール バー",IDC_STYLE_HSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,165,77,10
+    CONTROL         "水平オート スクロール",IDC_ES_AUTOHSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,176,81,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,187,77,10
+    CONTROL         "垂直オート スクロール",IDC_ES_AUTOVSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,198,81,10
+    CONTROL         "パスワード",IDC_ES_PASSWORD,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,216,47,10
+    CONTROL         "常に選択を表示",IDC_ES_NOHIDESEL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,227,62,10
+    CONTROL         "OEM変換",IDC_ES_OEMCONVERT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,238,43,10
+    CONTROL         "改行を許可",IDC_ES_WANTRETURN,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,249,49,10
+    CONTROL         "大文字変換",IDC_ES_UPPERCASE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,267,50,10
+    CONTROL         "小文字変換",IDC_ES_LOWERCASE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,278,50,10
+    CONTROL         "読み取り専用",IDC_ES_READONLY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,289,55,10
+    COMBOBOX        IDC_ES_TEXTPOS,11,315,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,338,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_STATIC DIALOG DISCARDABLE  0, 0, 87, 233
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- Static プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,153
+    LTEXT           "テキストの配置:",IDC_STATIC,4,173,47,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    CONTROL         "プリフィックスなし",IDC_SS_NOPREFIX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,136,66,10
+    CONTROL         "折り返しなし",IDC_SS_LEFTNOWORDWRAP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,147,51,10
+    CONTROL         "通知",IDC_SS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,158,30,10
+    COMBOBOX        IDC_SS_TEXTPOS,11,184,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,207,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_CHECKBOX DIALOG DISCARDABLE  0, 0, 87, 320
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- CheckBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,240
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,237,50,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,266,49,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    CONTROL         "自動チェック",IDC_BS_AUTO,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,136,52,10
+    CONTROL         "3 ステート",IDC_BS_3STATE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,147,46,10
+    CONTROL         "プッシュ ボタン型",IDC_BS_PUSHLIKE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,158,66,10
+    CONTROL         "左揃えテキスト",IDC_BS_LEFTTEXT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,169,60,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,187,39,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,198,49,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,209,37,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,220,30,10
+    COMBOBOX        IDC_BS_HPOS,11,246,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,275,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,295,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_RADIOBUTTON DIALOG DISCARDABLE  0, 0, 87, 310
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- RadioButton プロパティ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,230
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,226,50,8
+    LTEXT           "垂直方向の配置",IDC_STATIC,4,255,49,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    CONTROL         "自動チェック",IDC_BS_AUTO,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,136,52,10
+    CONTROL         "プッシュ ボタン型",IDC_BS_PUSHLIKE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,147,66,10
+    CONTROL         "左揃えテキスト",IDC_BS_LEFTTEXT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,158,60,10
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,176,39,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,187,49,10
+    CONTROL         "複数行",IDC_BS_MULTILINE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,198,37,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,209,30,10
+    COMBOBOX        IDC_BS_HPOS,11,235,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_BS_VPOS,11,264,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,284,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_SCROLLBAR DIALOG DISCARDABLE  0, 0, 87, 148
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ScrollBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,96
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "配置:",IDC_STATIC,4,106,16,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,56,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,67,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,78,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,89,52,10
+    COMBOBOX        IDC_SBS_POSITION,23,104,60,54,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,123,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_ITEM_RENAMECAPTION DIALOG DISCARDABLE  0, 0, 163, 45
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "キャプション変更"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    EDITTEXT        IDC_CAPTION,7,17,90,14,ES_AUTOHSCROLL
+    LTEXT           "キャプション:",IDC_STATIC,7,7,38,8
+    DEFPUSHBUTTON   "OK",IDOK,107,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,107,24,50,14
+END
+
+IDD_RAD_PROP_LISTBOX DIALOG DISCARDABLE  0, 0, 87, 325
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ListBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,275
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "選択:",IDC_STATIC,4,103,16,8
+    LTEXT           "オーナー描画:",IDC_STATIC,4,132,42,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,55,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,66,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,77,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,88,52,10
+    COMBOBOX        IDC_LBS_SELECT,11,113,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_LBS_OWNERDRAW,11,142,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "文字列あり",IDC_LBS_HASSTRINGS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,163,48,10
+    CONTROL         "複数列",IDC_LBS_MULTICOLUMN,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,174,37,10
+    CONTROL         "ソート",IDC_LBS_SORT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,192,33,10
+    CONTROL         "通知",IDC_LBS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,203,30,10
+    CONTROL         "水平スクロール バー",IDC_STYLE_HSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,221,77,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,232,78,10
+    CONTROL         "スクロールバーを表示",IDC_LBS_DISABLENOSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,243,79,10
+    CONTROL         "再描画しない",IDC_LBS_NOREDRAW,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,261,54,10
+    CONTROL         "タブ ストップを使用",IDC_LBS_USETABSTOPS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,272,71,10
+    CONTROL         "キーボード入力を検出",IDC_LBS_WANTKEYBOARDINPUT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,283,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,299,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_LISTVIEW DIALOG DISCARDABLE  0, 0, 87, 348
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ListView プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,297
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "表示:",IDC_STATIC,4,103,16,8
+    LTEXT           "配置:",IDC_STATIC,4,132,16,8
+    LTEXT           "ソート:",IDC_STATIC,4,161,19,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,55,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,66,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,77,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,88,52,10
+    COMBOBOX        IDC_LVS_VIEW,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_LVS_POSITION,11,142,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_LVS_SORT,11,171,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "単一選択",IDC_LVS_SINGLESEL,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,192,43,10
+    CONTROL         "自動整列",IDC_LVS_AUTOARRANGE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,203,43,10
+    CONTROL         "ラベルを折り返さない",IDC_LVS_NOLABELWRAP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,214,77,10
+    CONTROL         "ラベルの編集",IDC_LVS_EDITLABELS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,225,55,10
+    CONTROL         "スクロールしない",IDC_LVS_NOSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,243,65,10
+    CONTROL         "ｶﾗﾑにﾍｯﾀﾞをつけない",IDC_LVS_NOCOLUMNHEADER,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,254,78,10
+    CONTROL         "ヘッダをソートしない",IDC_LVS_NOSORTHEADER,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,265,79,10
+    CONTROL         "選択を常に表示",IDC_LVS_SHOWSELALWAYS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,276,62,10
+    CONTROL         "オーナー描画固定",IDC_LVS_OWNERDRAWFIXED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,296,70,10
+    CONTROL         "共有イメージリスト",IDC_LVS_SHAREIMAGELISTS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,307,80,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,323,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_TREEVIEW DIALOG DISCARDABLE  0, 0, 87, 292
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- TreeView プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,240
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,56,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,67,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,78,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,89,52,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,265,78,13,BS_MULTILINE
+    CONTROL         "ボタンあり",IDC_TVS_HASBUTTONS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,105,45,10
+    CONTROL         "線を表示",IDC_TVS_HASLINES,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,116,42,10
+    CONTROL         "ルートにも線を表示",IDC_TVS_LINESATROOT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,127,73,10
+    CONTROL         "ラベルの編集",IDC_TVS_EDITLABELS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,145,55,10
+    CONTROL         "ﾄﾞﾗｯｸﾞ && ﾄﾞﾛｯﾌﾟを無効",IDC_TVS_DISABLEDRAGDROP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,156,80,10
+    CONTROL         "選択を常に表示",IDC_TVS_SHOWSELALWAYS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,167,62,10
+    CONTROL         "スクロールなし",IDC_TVS_NOSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,185,59,10
+    CONTROL         "ツールヒントなし",IDC_TVS_NOTOOLTIPS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,196,62,10
+    CONTROL         "チェック ボックス",IDC_TVS_CHECKBOXES,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,216,64,10
+    CONTROL         "全行選択",IDC_TVS_FULLROWSELECT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,227,43,10
+    CONTROL         "トラック選択",IDC_TVS_TRACKSELECT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,238,51,10
+    CONTROL         "シングル拡張",IDC_TVS_SINGLEEXPAND,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,249,55,10
+END
+
+IDD_RAD_PROP_IMAGEBOX DIALOG DISCARDABLE  0, 0, 87, 233
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ImageBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,182
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "タイプ:",IDC_STATIC,4,108,19,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,56,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,67,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,78,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,89,52,10
+    COMBOBOX        IDC_IMAGE_TYPE,25,106,58,140,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,207,78,13,BS_MULTILINE
+    EDITTEXT        IDC_PATH,4,150,58,14,ES_AUTOHSCROLL | ES_READONLY | NOT 
+                    WS_VISIBLE
+    LTEXT           "image situation",IDC_IMAGE_SITUATION,4,140,73,8,NOT 
+                    WS_VISIBLE
+    PUSHBUTTON      "...",IDC_CHANGEPATH,64,150,18,14,NOT WS_VISIBLE
+    CONTROL         "通知",IDC_SS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,170,30,10
+    CONTROL         "中央配置",IDC_SS_CENTERIMAGE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,181,43,10
+    CONTROL         "右に揃える",IDC_SS_RIGHTJUST,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,192,48,10
+    CONTROL         "ファイル",IDC_FILE,"Button",BS_AUTORADIOBUTTON | NOT 
+                    WS_VISIBLE,5,125,35,10
+    CONTROL         "リソース",IDC_RESOURCE,"Button",BS_AUTORADIOBUTTON | 
+                    NOT WS_VISIBLE,45,125,36,10
+    COMBOBOX        IDC_RESCOMBO,4,150,79,71,CBS_DROPDOWNLIST | CBS_SORT | 
+                    NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_RAD_PROP_COMBOBOX DIALOG DISCARDABLE  0, 0, 87, 312
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ComboBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,261
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "タイプ:",IDC_STATIC,4,103,19,8
+    LTEXT           "オーナー描画:",IDC_STATIC,4,132,42,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,55,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,66,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,77,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,88,52,10
+    COMBOBOX        IDC_CBS_TYPE,11,113,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_CBS_OWNERDRAW,11,142,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "文字列あり",IDC_CBS_HASSTRINGS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,163,48,10
+    CONTROL         "ソート",IDC_CBS_SORT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,181,33,10
+    CONTROL         "サイズ調整",IDC_CBS_NOINTEGRALHEIGHT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,192,49,10
+    CONTROL         "OEM 変換",IDC_CBS_OEMCONVERT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,203,46,10
+    CONTROL         "垂直スクロール バー",IDC_STYLE_VSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,221,78,10
+    CONTROL         "水平オート スクロール",IDC_CBS_AUTOHSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,232,81,10
+    CONTROL         "スクロールバーを表示",IDC_CBS_DISABLENOSCROLL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,243,79,10
+    CONTROL         "大文字変換",IDC_CBS_UPPERCASE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,261,50,10
+    CONTROL         "小文字変換",IDC_CBS_LOWERCASE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,272,50,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,286,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_GROUPBOX DIALOG DISCARDABLE  0, 0, 87, 227
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- GroupBox プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,74,85,147
+    LTEXT           "水平方向の配置:",IDC_STATIC,4,134,50,8
+    LTEXT           "キャプション:",IDC_STATIC,3,45,38,8
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMECAPTION,68,54,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,85,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,96,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,107,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,118,52,10
+    COMBOBOX        IDC_BS_POSITION,11,145,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "アイコン",IDC_BS_ICON,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,165,39,10
+    CONTROL         "ビットマップ",IDC_BS_BITMAP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,176,49,10
+    CONTROL         "通知",IDC_BS_NOTIFY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,187,30,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,201,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_UPDOWN DIALOG DISCARDABLE  0, 0, 87, 246
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- UpDown プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,196
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "方向:",IDC_STATIC,4,103,16,8
+    LTEXT           "アタッチ",IDC_STATIC,4,132,24,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,55,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,66,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,77,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,88,52,10
+    COMBOBOX        IDC_UDS_SITUATION,11,113,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_UDS_ATTACH,11,142,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "自動関連付け",IDC_UDS_AUTOBUDDY,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,163,57,10
+    CONTROL         "数値の自動表示",IDC_UDS_SETBUDDYINT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,174,64,10
+    CONTROL         "桁区切りなし",IDC_UDS_NOTHOUSANDS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,185,53,10
+    CONTROL         "ワードラップ",IDC_UDS_WRAP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,196,51,10
+    CONTROL         "方向キー",IDC_UDS_ARROWKEYS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,207,41,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,221,78,13,BS_MULTILINE
+END
+
+IDD_RAD_PROP_PROGRESSBAR DIALOG DISCARDABLE  0, 0, 87, 156
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- ProgressBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,45,85,106
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,63,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,56,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,67,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,78,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,89,52,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,132,78,13,BS_MULTILINE
+    CONTROL         "垂直方向",IDC_PBS_VERTICAL,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,105,43,10
+    CONTROL         "スムーズ",IDC_PBS_SMOOTH,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,116,43,10
+END
+
+IDD_RAD_PROP_TRACKBAR DIALOG DISCARDABLE  0, 0, 87, 224
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- TrackBar プロパティ -",IDC_STATIC,0,3,86,8
+    GROUPBOX        "スタイル",IDC_STATIC,1,44,85,173
+    LTEXT           "ID:",IDC_STATIC,3,15,8,8
+    LTEXT           "方向:",IDC_STATIC,4,103,16,8
+    LTEXT           "ポイント:",IDC_STATIC,4,132,24,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAMEID,68,24,18,14
+    CONTROL         "無効（使用不可）",IDC_STYLE_DISABLED,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,55,64,10
+    CONTROL         "可視",IDC_STYLE_VISIBLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,66,30,10
+    CONTROL         "グループ",IDC_STYLE_GROUP,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,77,42,10
+    CONTROL         "タブ ストップ",IDC_STYLE_TABSTOP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,88,52,10
+    COMBOBOX        IDC_TBS_SITUATION,11,113,67,62,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_TBS_POINT,11,142,67,62,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "マークなし",IDC_TBS_NOTICKS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,163,46,10
+    CONTROL         "マーク自動設定",IDC_TBS_AUTOTICKS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,174,62,10
+    CONTROL         "選択可能",IDC_TBS_ENABLESELRANGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,4,185,43,10
+    PUSHBUTTON      "拡張スタイル",IDC_EXSTYLE,4,199,78,13,BS_MULTILINE
+END
+
+IDD_PROJECT_MENUEDIT DIALOG DISCARDABLE  0, 0, 87, 191
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CTEXT           "- メニュー エディタ -",IDC_STATIC,0,3,86,8
+    LTEXT           "キャプション:",IDC_CAPTIONSTATIC,3,45,38,8
+    LTEXT           "ID:",IDC_IDSTATIC,3,15,8,8
+    EDITTEXT        IDC_IDNAME,1,25,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "変更",IDC_RENAME,68,24,18,43
+    EDITTEXT        IDC_CAPTION,1,55,65,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "↑",IDC_UP,26,170,14,14
+    PUSHBUTTON      "↓",IDC_DOWN,43,170,14,14
+    CONTROL         "チェック",IDC_CHECKED,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,98,38,10
+    CONTROL         "無効",IDC_DISABLED,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,109,30,10
+    PUSHBUTTON      "挿入",IDC_INSERTMENUITEM,5,132,76,14
+    PUSHBUTTON      "削除",IDC_DELETEMENUITEM,5,150,76,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,2,124,83,1
+    CHECKBOX        "ポップアップ",IDC_POPUP,4,76,51,10
+    CONTROL         "セパレータ",IDC_SEPARATOR,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,4,87,47,10
+END
+
+IDD_INPUTID DIALOG DISCARDABLE  0, 0, 170, 45
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "新規メニュー"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LTEXT           "メニュー ID:",IDC_STATIC,7,11,35,8
+    EDITTEXT        IDC_IDNAME,44,7,63,14,ES_AUTOHSCROLL
+    DEFPUSHBUTTON   "OK",IDOK,112,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,112,24,50,14
+END
+
+IDD_PJ_OPTION2 DIALOG DISCARDABLE  0, 0, 203, 83
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Win32API"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "コモン コントロールを使用する（api_commctrl.sbp）",
+                    IDC_API_COMMCTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,
+                    7,159,10
+    CONTROL         "マルチメディアAPIを使用する（api_mmsys.sbp）",
+                    IDC_API_MMSYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,
+                    150,10
+    CONTROL         "リッチエディット コントロールを使用する（api_richedit.sbp）",
+                    IDC_API_RICHEDIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,
+                    31,181,10
+    CONTROL         "ソケットAPIを使用する（api_winsock2.sbp）",
+                    IDC_API_WINSOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,
+                    43,136,10
+END
+
+IDD_NEWPROJECT_PAGE2 DIALOG DISCARDABLE  0, 0, 310, 177
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ステップ2 （プロジェクト オプション）"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "Win32API",IDC_STATIC,7,46,189,64
+    CONTROL         "コモン コントロールを使用する（api_commctrl.sbp）",
+                    IDC_API_COMMCTRL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    13,59,159,10
+    CONTROL         "マルチメディアAPIを使用する（api_mmsys.sbp）",
+                    IDC_API_MMSYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,
+                    71,150,10
+    CONTROL         "リッチエディット コントロールを使用する（api_richedit.sbp）",
+                    IDC_API_RICHEDIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    13,83,181,10
+    CONTROL         "ソケットAPIを使用する（api_winsock2.sbp）",
+                    IDC_API_WINSOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,
+                    95,136,10
+    CONTROL         "厳密な型チェックを行う（#strict指定）",IDC_STRICT,
+                    "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,13,
+                    21,130,10
+    GROUPBOX        "一般",IDC_STATIC,7,7,189,30
+END
+
+IDD_PROJECT_MENURENAME DIALOG DISCARDABLE  0, 0, 167, 69
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "メニューID、キャプション設定"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    EDITTEXT        IDC_CAPTION,7,48,90,14,ES_AUTOHSCROLL
+    LTEXT           "キャプション",IDC_STATIC,7,38,36,8
+    DEFPUSHBUTTON   "OK",IDOK,110,30,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,110,47,50,14
+    EDITTEXT        IDC_IDNAME,7,17,90,14,ES_AUTOHSCROLL
+    LTEXT           "ID",IDC_IDSTATIC,7,7,8,8
+END
+
+IDD_OPTION_RAD DIALOG DISCARDABLE  0, 0, 187, 93
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "RADツール"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "ライン アジャスタを有効にする",IDC_LINEADJUST,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,7,103,10
+END
+
+IDD_OPTION_FILELINK DIALOG DISCARDABLE  0, 0, 187, 117
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ファイルの関連付け"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "関連付ける",IDOK,130,79,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,130,96,50,14
+    GROUPBOX        "拡張子",IDC_STATIC,7,7,173,63
+    CONTROL         ".bas（Basicプログラム ファイル）",IDC_BAS,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,21,107,10
+    CONTROL         ".abp（Basicプログラム ファイル）",IDC_ABP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,32,107,10
+    CONTROL         ".sbp（サブ プログラム ファイル）",IDC_SBP,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,43,106,10
+    CONTROL         ".pj（プロジェクト ファイル）",IDC_PJ,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,54,89,10
+    LTEXT           "注意: 他のアプリケーションで使用する拡張子はチェックをはずして下さい。",
+                    IDC_STATIC,7,79,111,22
+END
+
+IDD_RAD_SUPPORT DIALOGEX 0, 0, 321, 37
+STYLE WS_CHILD
+EXSTYLE WS_EX_STATICEDGE
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "X",IDC_STATIC,69,7,8,8
+    LTEXT           "Y",IDC_STATIC,69,23,8,8
+    LTEXT           "幅",IDC_STATIC,142,7,8,8
+    LTEXT           "高さ",IDC_STATIC,142,23,16,8
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDVERT,132,0,1,35
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDVERT,61,1,1,34
+    PUSHBUTTON      "テスト",IDC_TEST,6,11,50,14
+    EDITTEXT        IDC_XPOS,80,3,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,4,9,
+                    14
+    EDITTEXT        IDC_YPOS,80,19,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN2,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,21,
+                    9,14
+    EDITTEXT        IDC_WIDTH,161,3,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN3,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,262,5,9,
+                    14
+    EDITTEXT        IDC_HEIGHT,161,19,40,14,ES_AUTOHSCROLL | ES_NUMBER
+    CONTROL         "Spin1",IDC_SPIN4,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS,262,21,
+                    9,14
+END
+
+IDD_PJ_OPTION1 DIALOG DISCARDABLE  0, 0, 203, 143
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "一般"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "出力ファイル",IDC_STATIC,7,7,189,79
+    EDITTEXT        IDC_EDIT_RELEASE,13,31,177,14,ES_AUTOHSCROLL
+    LTEXT           "Release:",IDC_STATIC,13,21,26,8
+    EDITTEXT        IDC_EDIT_DEBUG,13,61,177,14,ES_AUTOHSCROLL
+    LTEXT           "Debug:",IDC_STATIC,13,51,20,8
+    GROUPBOX        "コンパイル オプション",IDC_STATIC,7,89,189,30
+    CONTROL         "厳密な型チェックを行う（#strict指定）",IDC_STRICT,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,103,122,10
+END
+
+IDD_ICONEDIT_TOOL DIALOG DISCARDABLE  0, 0, 88, 266
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    COMBOBOX        IDC_ICONTYPECOMBO,10,12,69,104,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "追加",IDC_ADD_ICONTYPE,12,30,30,14
+    PUSHBUTTON      "削除",IDC_DELETE_ICONTYPE,46,30,30,14
+    GROUPBOX        "タイプ",IDC_STATIC,5,1,78,59
+    GROUPBOX        "ツール",IDC_STATIC,5,68,78,190
+END
+
+IDD_ICONEDIT_COLOR DIALOG DISCARDABLE  0, 0, 227, 43
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    CONTROL         "",IDC_STATIC_COLOR,"Static",SS_BLACKFRAME | NOT 
+                    WS_VISIBLE,22,3,161,34
+    CONTROL         "",IDC_NOWCOLOR,"Static",SS_ETCHEDFRAME,3,3,16,17
+END
+
+IDD_ICONEDIT_BUTTONS DIALOG DISCARDABLE  0, 0, 59, 158
+STYLE WS_CHILD | WS_VISIBLE
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+END
+
+IDD_ICONEDIT_ICONTYPE DIALOG DISCARDABLE  0, 0, 154, 73
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "アイコンタイプを選んでください"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,97,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,97,24,50,14
+    LISTBOX         IDC_TYPELIST,7,7,84,59,LBS_SORT | LBS_NOINTEGRALHEIGHT | 
+                    WS_VSCROLL | WS_TABSTOP
+END
+
+IDD_OPTION_COLOR DIALOGEX 0, 0, 254, 182
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "デザイン"
+FONT 9, "ＭＳ Ｐゴシック", 0, 0, 0x1
+BEGIN
+    LTEXT           "指定する部分:",IDC_STATIC_PARTS,7,39,42,8
+    LTEXT           "サンプル:",IDC_STATIC,7,75,28,8
+    LTEXT           "テーマ:",IDC_STATIC,7,6,22,8
+    COMBOBOX        IDC_THEME,7,17,100,91,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_TARGET,7,49,100,91,CBS_DROPDOWNLIST | CBS_SORT | 
+                    WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_COLOR_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,
+                    111,49,20,12
+    CONTROL         "",IDC_SAMPLE,"Button",BS_OWNERDRAW | WS_TABSTOP,7,85,
+                    190,90,WS_EX_CLIENTEDGE
+    PUSHBUTTON      "保存(&S)",IDC_SAVE,110,16,35,14
+END
+
+IDD_CODE_SAVE DIALOG DISCARDABLE  0, 0, 151, 110
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "文字コードを指定して保存"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    LISTBOX         IDC_LIST_CHARCODE,7,17,64,86,LBS_NOINTEGRALHEIGHT | 
+                    WS_VSCROLL | WS_TABSTOP
+    LISTBOX         IDC_LIST_LFCODE,76,17,68,41,LBS_NOINTEGRALHEIGHT | 
+                    WS_VSCROLL | WS_TABSTOP
+    DEFPUSHBUTTON   "上書き保存",IDOK,86,72,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,86,89,50,14
+    LTEXT           "文字コード",IDC_STATIC,7,7,32,8
+    LTEXT           "改行コード",IDC_STATIC,77,7,32,8
+END
+
+IDD_PJ_OPTION3 DIALOG DISCARDABLE  0, 0, 203, 132
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "デバッグ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "コマンドライン",IDC_STATIC,7,7,192,61
+    EDITTEXT        IDC_CMD_LINE,13,20,177,42,ES_MULTILINE
+    GROUPBOX        "デバッグセッションの実行可能ファイル（DLLのみ）",
+                    IDC_STATIC_DEBUG,7,74,192,51
+    EDITTEXT        IDC_EXE_PATH,13,88,177,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "参照...",IDC_DIR,161,106,29,14
+END
+
+IDD_EXTENSION_LINK DIALOG DISCARDABLE  0, 0, 231, 216
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ファイルの種類設定と関連付け"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "関連付ける",IDOK,173,178,50,14
+    PUSHBUTTON      "閉じる",IDCANCEL,173,195,50,14
+    LTEXT           "注意: 他のアプリケーションで使用する拡張子はチェックを外してください。",
+                    IDC_STATIC,37,180,111,22
+    CONTROL         "List1",IDC_EXTENSION_LIST,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | 
+                    WS_TABSTOP,7,7,217,133
+    PUSHBUTTON      "新規(&N)",IDC_ADD_BUTTON,67,145,50,14
+    PUSHBUTTON      "削除(&D)",IDC_DELETE_BUTTON,173,145,50,14
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,170,217,1
+    PUSHBUTTON      "編集(&E)",IDC_EDIT_BUTTON,120,145,50,14
+END
+
+IDD_STRING_COUNT DIALOG DISCARDABLE  0, 0, 143, 85
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "文字カウント"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "閉じる",IDCANCEL,86,64,50,14
+    LTEXT           "総バイト数",IDC_STATIC,7,7,32,8
+    LTEXT           "文字数（スペースを含めない）",IDC_STATIC,7,18,86,8
+    LTEXT           "文字数（スペースを含む）",IDC_STATIC,7,29,74,8
+    LTEXT           "行数",IDC_STATIC,7,40,15,8
+    RTEXT           "byte",IDC_SCOUNT_BYTE,98,7,39,8
+    RTEXT           "omit space",IDC_SCOUNT_OMIT_SPACE,98,18,39,8
+    RTEXT           "with space",IDC_SCOUNT_WITH_SPACE,98,29,39,8
+    RTEXT           "linenum",IDC_SCOUNT_LINENUM,98,40,39,8
+    CONTROL         "",IDC_STATIC,"Static",SS_ETCHEDHORZ,7,56,129,1
+END
+
+IDD_EXTENSION_ADD DIALOG DISCARDABLE  0, 0, 227, 108
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "拡張子を追加"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,117,87,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,170,87,50,14
+    EDITTEXT        IDC_EXTENSION,59,7,40,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_NOTE,59,26,80,14,ES_AUTOHSCROLL
+    LTEXT           "拡張子:",IDC_STATIC,7,11,23,8
+    LTEXT           "説明:",IDC_STATIC,7,30,16,8
+    LTEXT           "Windows検索:",IDC_STATIC,7,49,41,8
+    CONTROL         "有効",IDC_SEARCH_ON,"Button",BS_AUTORADIOBUTTON,66,49,
+                    30,10
+    CONTROL         "無効",IDC_SEARCH_OFF,"Button",BS_AUTORADIOBUTTON,98,49,
+                    30,10
+    LTEXT           "（例：txt）",IDC_STATIC,143,11,26,8
+    LTEXT           "（例：テキスト ドキュメント）",IDC_STATIC,143,30,77,8
+    LTEXT           "タブの色",IDC_STATIC_TABCOLOR,7,70,26,8
+    CONTROL         "",IDC_COLOR_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,
+                    60,67,20,12
+    LTEXT           "←ここをクリックして変更できます",IDC_STATIC_TABCOLOR2,
+                    84,70,123,8
+END
+
+IDD_OPTION_WEB DIALOG DISCARDABLE  0, 0, 250, 195
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Web検索"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    GROUPBOX        "ドメイン検索",IDC_STATIC,7,38,236,135
+    CONTROL         "List2",IDC_DOMAIN_LIST,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | 
+                    WS_TABSTOP,13,51,164,116
+    PUSHBUTTON      "新規(&N)",IDC_ADD,187,50,50,14
+    PUSHBUTTON      "削除(&D)",IDC_DELETE,187,68,50,14
+    CONTROL         "Ctrlキーによる単語リンクを有効にする",
+                    IDC_CTRLKEY_HYPERLINK,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,7,127,10
+    PUSHBUTTON      "編集(&E)",IDC_EDIT,187,86,50,14
+    CONTROL         "アプリケーション終了時にWeb検索文字列を保存する",
+                    IDC_SAVE_WEBFINDSTR,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,20,169,10
+END
+
+IDD_OPTION_WEB_DOMAIN_ADD DIALOG DISCARDABLE  0, 0, 245, 77
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Web検索用ドメインを追加"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,135,56,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,188,56,50,14
+    EDITTEXT        IDC_NAME,59,7,67,14,ES_AUTOHSCROLL
+    EDITTEXT        IDC_DOMAIN,59,26,113,14,ES_AUTOHSCROLL
+    LTEXT           "表示名:",IDC_STATIC,7,11,23,8
+    LTEXT           "ドメイン:",IDC_STATIC,7,30,23,8
+    LTEXT           "（例：辞書）",IDC_STATIC,176,11,32,8
+    LTEXT           "（例：ja.wikipedia.org）",IDC_STATIC,176,30,62,8
+END
+
+IDD_PREVIEW DIALOG DISCARDABLE  0, 0, 354, 429
+STYLE WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+CAPTION "印刷プレビュー"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "閉じる",IDOK,13,7,50,14
+    PUSHBUTTON      "ページ設定",IDC_PAGESET,13,57,50,14
+    PUSHBUTTON      "フォント",IDC_FONT,13,79,50,14
+    PUSHBUTTON      "印刷",IDC_PRINT,278,7,50,14
+    PUSHBUTTON      "前へ",IDC_PREV,85,7,50,14
+    PUSHBUTTON      "次へ",IDC_NEXT,138,7,50,14
+    GROUPBOX        "設定",IDC_STATIC,7,43,62,121,BS_CENTER
+    CONTROL         "ページ番号",IDC_SHOWPAGENUM,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,13,111,49,10
+    EDITTEXT        IDC_PAGESTR,13,121,49,14,ES_AUTOHSCROLL
+    LTEXT           """&&n""がページ番号に置き換わります",IDC_STATIC,11,138,
+                    54,25
+    PUSHBUTTON      "Button2",IDC_ZOOMIN,223,7,19,14,BS_ICON
+    PUSHBUTTON      "Button2",IDC_ZOOMOUT,202,7,19,14,BS_ICON
+    LTEXT           "100%",IDC_ZOOMRATIO,246,12,29,8
+END
+
+IDD_OPTION_THEME_SAVE DIALOG DISCARDABLE  0, 0, 195, 52
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "デザイン テーマの保存"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "保存する",IDOK,138,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,138,24,50,14
+    LTEXT           "テーマ名",IDC_STATIC,7,10,27,8
+    EDITTEXT        IDC_NAME,40,7,86,14,ES_AUTOHSCROLL
+    CONTROL         "上書きを許可する",IDC_OVERWRITE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,40,27,67,10
+END
+
+IDD_PASSWORD DIALOG DISCARDABLE  0, 0, 187, 45
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "TheText"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,130,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,130,24,50,14
+    EDITTEXT        IDC_PASSWORD,7,20,110,14,ES_AUTOHSCROLL
+    LTEXT           "シリアルIDを入力してください",IDC_STATIC,7,7,84,8
+END
+
+IDD_PROFESSIONAL_START DIALOG DISCARDABLE  0, 0, 251, 110
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "TheText Pro版について"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "引き続きTheTextを利用する",IDCANCEL,65,84,116,19
+    LTEXT           "  TheText Proをご利用いただき、ありがとうございます。シリアルIDを正常に認証致しました。\n  準備が整いましたので、引き続きTheTextをご利用ください。\n\n\n※このメッセージは初回のみ表示されるものです。",
+                    IDC_STATIC,94,13,148,65
+    CONTROL         302,IDC_STATIC,"Static",SS_BITMAP,7,7,79,65
+END
+
+IDD_RESERVE DIALOG DISCARDABLE  0, 0, 269, 214
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ﾀﾞｲｱﾛｸﾞ"
+FONT 9, "ＭＳ Ｐゴシック"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,212,7,50,14
+    PUSHBUTTON      "ｷｬﾝｾﾙ",IDCANCEL,212,24,50,14
+    PUSHBUTTON      "Button1",IDD_PJ_OPTION4,7,7,50,14
+    PUSHBUTTON      "Button2",IDC_UNICODE,7,27,50,14
+    PUSHBUTTON      "IDC_PASTEINDENT",IDC_PASTEINDENT,7,48,50,14
+    PUSHBUTTON      "Button4",IDC_RC_MANIFEST,7,77,50,14
+    PUSHBUTTON      "Button5",IDC_STATIC_PATH,70,7,50,14
+    PUSHBUTTON      "Button6",IDM_STEP_IN,66,29,50,14
+    PUSHBUTTON      "Button7",IDM_STEP_OUT,75,53,50,14
+    PUSHBUTTON      "Button8",IDM_STEP_CURSOR,71,77,50,14
+    PUSHBUTTON      "Button9",IDM_DEBUG_PAUSE,138,7,50,14
+    PUSHBUTTON      "Button10",IDM_DEBUG_STOP,137,28,50,14
+    PUSHBUTTON      "Button11",IDM_RELEASERUN,139,43,50,14
+    PUSHBUTTON      "Button12",IDM_STEP_OVER,142,77,50,14
+    PUSHBUTTON      "Button13",IDM_BREAKPOINT,7,96,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE 
+BEGIN
+    IDD_ABOUT, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 231
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 114
+    END
+
+    IDD_FIND, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 228
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 77
+    END
+
+    IDD_FINDALL, DIALOG
+    BEGIN
+        TOPMARGIN, 2
+    END
+
+    IDD_OPTION_WHOLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 188
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 96
+    END
+
+    IDD_PERMUTATION, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 260
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 97
+    END
+
+    IDD_NEWFILE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 200
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 98
+    END
+
+    IDD_OPTION_EDITOR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 244
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 167
+    END
+
+    IDD_OPTION_TOOLBAR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 86
+    END
+
+    IDD_NEWPROJECT_PAGE1, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_NEWPROJECT_PAGE3, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_PROJECT_FILEPROPERTY, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 223
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_RAD_CTRLBUTTONS, DIALOG
+    BEGIN
+        LEFTMARGIN, 1
+        RIGHTMARGIN, 87
+        TOPMARGIN, 1
+        BOTTOMMARGIN, 89
+    END
+
+    IDD_PROJECT_NEWWINDOW, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 164
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 146
+    END
+
+    IDD_RAD_PROP_WINDOW, DIALOG
+    BEGIN
+        RIGHTMARGIN, 86
+        BOTTOMMARGIN, 442
+    END
+
+    IDD_RAD_PROP_WINDOW_RENAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 163
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 92
+    END
+
+    IDD_RAD_EVENTCODE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 276
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 198
+    END
+
+    IDD_RAD_PROP_ITEM_RENAMEID, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 158
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_RAD_PROP_WINDOW_EXSTYLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 192
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 120
+    END
+
+    IDD_RAD_PROP_ITEM_EXSTYLE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_RAD_PROP_ITEM_RENAMECAPTION, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 156
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_RAD_PROP_IMAGEBOX, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 224
+    END
+
+    IDD_INPUTID, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 163
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_PJ_OPTION2, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 196
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 76
+    END
+
+    IDD_NEWPROJECT_PAGE2, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 303
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 170
+    END
+
+    IDD_PROJECT_MENURENAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 160
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 62
+    END
+
+    IDD_OPTION_RAD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 86
+    END
+
+    IDD_OPTION_FILELINK, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 110
+    END
+
+    IDD_RAD_SUPPORT, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 35
+    END
+
+    IDD_PJ_OPTION1, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 196
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 136
+    END
+
+    IDD_ICONEDIT_TOOL, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 265
+    END
+
+    IDD_ICONEDIT_COLOR, DIALOG
+    BEGIN
+        RIGHTMARGIN, 187
+        BOTTOMMARGIN, 42
+    END
+
+    IDD_ICONEDIT_BUTTONS, DIALOG
+    BEGIN
+        BOTTOMMARGIN, 157
+    END
+
+    IDD_ICONEDIT_ICONTYPE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 147
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 66
+    END
+
+    IDD_OPTION_COLOR, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 246
+        TOPMARGIN, 6
+        BOTTOMMARGIN, 175
+    END
+
+    IDD_CODE_SAVE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 144
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 103
+    END
+
+    IDD_PJ_OPTION3, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 199
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 125
+    END
+
+    IDD_EXTENSION_LINK, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 224
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 209
+    END
+
+    IDD_STRING_COUNT, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 136
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 78
+    END
+
+    IDD_EXTENSION_ADD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 220
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 101
+    END
+
+    IDD_OPTION_WEB, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 243
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 188
+    END
+
+    IDD_OPTION_WEB_DOMAIN_ADD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 238
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 70
+    END
+
+    IDD_PREVIEW, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 347
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 422
+    END
+
+    IDD_OPTION_THEME_SAVE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 188
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 45
+    END
+
+    IDD_PASSWORD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 180
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 38
+    END
+
+    IDD_PROFESSIONAL_START, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 244
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 103
+    END
+
+    IDD_RESERVE, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 262
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 207
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_MAIN                ICON    DISCARDABLE     "main.ico"
+IDI_BASICPROGRAM        ICON    DISCARDABLE     "BasicProgram.ico"
+IDI_TEXTDOCUMENT        ICON    DISCARDABLE     "TextDocument.ico"
+IDI_FOLDER_CLOSE        ICON    DISCARDABLE     "folder_close.ico"
+IDI_FOLDER_OPEN         ICON    DISCARDABLE     "folder_open.ico"
+IDI_WINDOW              ICON    DISCARDABLE     "Window.ico"
+IDI_PROCEDURE           ICON    DISCARDABLE     "Procedure.ico"
+IDI_FILE_PJ             ICON    DISCARDABLE     "file_pj.ico"
+IDI_FILE_BAS            ICON    DISCARDABLE     "file_bas.ico"
+IDI_FILE_SBP            ICON    DISCARDABLE     "file_sbp.ico"
+IDI_MENU                ICON    DISCARDABLE     "menu.ico"
+IDI_FILE_ICON           ICON    DISCARDABLE     "file_icon.ico"
+IDI_FILE_BMP            ICON    DISCARDABLE     "file_bmp.ico"
+IDI_FILE_CURSOR         ICON    DISCARDABLE     "ico00001.ico"
+IDI_MEMBER_PRIVATE_FUNCTION ICON    DISCARDABLE     "member_private_function.ico"
+IDI_MEMBER_PUBLIC_FUNCTION ICON    DISCARDABLE     "member_public_function.ico"
+IDI_MEMBER_PRIVATE_VARIABLE ICON    DISCARDABLE     "member_private_variable.ico"
+IDI_MEMBER_PUBLIC_VARIABLE ICON    DISCARDABLE     "member_public_variable.ico"
+IDI_PAIRSTATEMENT       ICON    DISCARDABLE     "pair_statement.ico"
+IDI_VOID                ICON    DISCARDABLE     "ico00002.ico"
+IDI_PROGRAM_FOLDER      ICON    DISCARDABLE     "program_folder.ico"
+IDI_HTML_PARAMETER      ICON    DISCARDABLE     "html_parameter.ico"
+IDI_HTML_GENERAL_PARAMETER ICON    DISCARDABLE     "html_general_parameter.ico"
+IDI_ZOOMOUT             ICON    DISCARDABLE     "zoomout.ico"
+IDI_ZOOMIN              ICON    DISCARDABLE     "zoomin.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Cursor
+//
+
+IDC_CURSOR_PEN          CURSOR  DISCARDABLE     "cursor_pen.cur"
+IDC_CURSOR_FILL         CURSOR  DISCARDABLE     "cursor_fill.cur"
+IDC_CURSOR_ARROW_TO_RIGHT CURSOR  DISCARDABLE     "cursor_arrow_to_right.cur"
+#endif    // 日本語 resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+
Index: branches/egtra/ab5.0/abdev/res_TheText/resource.h
===================================================================
--- branches/egtra/ab5.0/abdev/res_TheText/resource.h	(revision 774)
+++ branches/egtra/ab5.0/abdev/res_TheText/resource.h	(revision 774)
@@ -0,0 +1,615 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by res.rc
+//
+#define IDCANCEL5                       13
+#define IDR_MAINMENU                    101
+#define IDR_ACCELERATOR1                105
+#define IDR_STANDARDTOOLBAR             106
+#define IDD_ABOUT                       108
+#define IDR_BASICTOOLBAR                111
+#define IDI_MAIN                        114
+#define IDI_BASICPROGRAM                118
+#define IDD_FIND                        119
+#define IDR_EDITMENU                    122
+#define IDD_MAKELINENUM                 124
+#define IDD_FINDALL                     126
+#define IDR_REBARMENU                   127
+#define IDD_SETWHOLE                    128
+#define IDD_OPTION_WHOLE                128
+#define IDD_PERMUTATION                 129
+#define IDD_NEWFILE                     130
+#define IDI_TEXTDOCUMENT                131
+#define IDD_SETEDITOR                   132
+#define IDD_OPTION_EDITOR               132
+#define IDD_SETTOOLBAR                  133
+#define IDD_OPTION_TOOLBAR              133
+#define IDD_NEWPROJECT_PAGE1            136
+#define IDB_BASE_NORMAL                 138
+#define IDB_BASE_PROMPT                 139
+#define IDD_NEWPROJECT_PAGE3            140
+#define IDD_PROJECT_VIEW                145
+#define IDR_PROJECTVIEW_FILETREEMENU    146
+#define IDR_PROJECTVIEW_FILETREEROOTMENU 147
+#define IDI_FOLDER_CLOSE                148
+#define IDI_FOLDER_OPEN                 149
+#define IDD_PROJECT_FILEPROPERTY        150
+#define IDI_WINDOW                      151
+#define IDR_PROJECTVIEW_MATERIALTREEMENU 153
+#define IDR_PROJECTVIEW_WINDOWTREEROOTMENU 157
+#define IDD_RAD_CTRLBUTTONS             158
+#define IDD_PROJECT_NEWWINDOW           161
+#define IDR_RADCONTEXTMENU              164
+#define IDD_RAD_PROP_WINDOW             166
+#define IDD_RAD_PROP_BUTTON             167
+#define IDD_RAD_PROP_WINDOW_RENAME      170
+#define IDD_RAD_EVENTCODE               171
+#define IDD_RAD_PROP_ITEM_RENAMEID      172
+#define IDD_RAD_PROP_WINDOW_EXSTYLE     174
+#define IDD_RAD_PROP_ITEM_EXSTYLE       176
+#define IDD_RAD_PROP_EDIT               177
+#define IDD_RAD_PROP_STATIC             178
+#define IDD_RAD_PROP_CHECKBOX           180
+#define IDD_RAD_PROP_RADIOBUTTON        182
+#define IDB_RADIOBUTTON                 183
+#define IDD_RAD_PROP_SCROLLBAR          184
+#define IDB_TITLE_BUTTON_CLOSE          189
+#define IDD_RAD_PROP_ITEM_RENAMECAPTION 190
+#define IDD_RAD_PROP_LISTBOX            192
+#define IDD_RAD_PROP_LISTVIEW           194
+#define IDD_RAD_PROP_TREEVIEW           198
+#define IDD_RAD_PROP_IMAGEBOX           201
+#define IDR_PROJECTVIEW_PROCEDURETREEMENU 202
+#define IDI_PROCEDURE                   203
+#define IDD_RAD_PROP_COMBOBOX           204
+#define IDD_RAD_PROP_GROUPBOX           208
+#define IDD_RAD_PROP_UPDOWN             211
+#define IDD_RAD_PROP_PROGRESSBAR        212
+#define IDD_RAD_PROP_TRACKBAR           214
+#define IDD_PROJECT_MENUEDIT            216
+#define IDD_PROJECT_NEWMENU             217
+#define IDD_INPUTID                     217
+#define IDD_PROJECT_OPTION              218
+#define IDD_PJ_OPTION2                  218
+#define IDD_NEWPROJECT_PAGE             219
+#define IDD_NEWPROJECT_PAGE2            219
+#define IDD_PROJECT_MENURENAME          220
+#define IDR_CONTROL                     221
+#define IDD_RAD_CHOOSECHILD             223
+#define IDD_RAD_PROP_CHILD              224
+#define IDD_SETRAD                      225
+#define IDD_OPTION_RAD                  225
+#define IDI_FILE_PJ                     226
+#define IDD_SETFILELINK                 227
+#define IDD_OPTION_FILELINK             227
+#define IDI_FILE_BAS                    229
+#define IDI_FILE_SBP                    230
+#define IDI_MENU                        231
+#define IDI_FILE_ICON                   233
+#define IDI_FILE_BMP                    234
+#define IDI_FILE_CURSOR                 236
+#define IDB_TITLE                       238
+#define IDD_RAD_SUPPORT                 239
+#define IDD_PJ_OPTION1                  241
+#define IDB_PARAMHINT_QUESTION          243
+#define IDB_PARAMHINT_QUESTION2         244
+#define IDD_ICONEDIT_TOOL               246
+#define IDD_ICONEDIT_COLOR              247
+#define IDD_ICONEDIT_BUTTONS            248
+#define IDR_ICONTOOLBAR                 257
+#define IDD_ICONEDIT_ICONTYPE           259
+#define IDC_CURSOR_PEN                  260
+#define IDC_CURSOR_FILL                 261
+#define IDI_MEMBER_PRIVATE_FUNCTION     262
+#define IDI_MEMBER_PUBLIC_FUNCTION      263
+#define IDI_MEMBER_PRIVATE_VARIABLE     264
+#define IDI_MEMBER_PUBLIC_VARIABLE      265
+#define IDB_BASE_DOSPROMPT              266
+#define IDB_BASE_NON                    267
+#define IDB_BASE_DIRECTX                268
+#define IDI_PAIRSTATEMENT               269
+#define IDC_CURSOR_ARROW_TO_RIGHT       272
+#define IDD_OPTION_COLOR                273
+#define IDD_CODE_SAVE                   274
+#define IDI_ICON1                       275
+#define IDI_VOID                        275
+#define IDI_PROGRAM_FOLDER              276
+#define IDR_STANDARDTOOLBAR_DISABLED    283
+#define IDD_PJ_OPTION3                  284
+#define IDD_EXTENSION_LINK              285
+#define IDD_STRING_COUNT                286
+#define IDR_TABMENU                     287
+#define IDD_EXTENSION_ADD               288
+#define IDD_OPTION_WEB                  291
+#define IDD_OPTION_WEB_DOMAIN_ADD       292
+#define IDI_HTML_PARAMETER              293
+#define IDI_HTML_GENERAL_PARAMETER      294
+#define IDD_PREVIEW                     296
+#define IDI_ZOOMOUT                     297
+#define IDI_ZOOMIN                      298
+#define IDD_OPTION_THEME_SAVE           299
+#define IDD_PASSWORD                    300
+#define IDD_PROFESSIONAL_START          301
+#define IDB_THETEXT_PRO_IMAGE           302
+#define IDD_RESERVE                     303
+#define IDC_FINDSTR                     1001
+#define IDC_FINDINWINDOW                1002
+#define IDC_FINDALL                     1003
+#define IDC_ISBIGSMALL                  1004
+#define IDC_SHOWITEM                    1018
+#define IDC_FINDLIST                    1020
+#define IDC_EDITLINE                    1022
+#define IDC_NEWLINE                     1023
+#define IDC_RESETTOOLBAR                1027
+#define IDC_PERMUTATIONSTR              1034
+#define IDC_PERMUTATIONNEXT             1036
+#define IDC_PERMUTATIONALL              1037
+#define IDC_FIND                        1038
+#define IDC_FILETYPELIST                1039
+#define IDC_SETFONT                     1041
+#define IDC_TABSIZE                     1042
+#define IDC_PARAMHINT                   1043
+#define IDC_ISAUTOINDENT                1044
+#define IDC_PROJECTNAME                 1053
+#define IDC_DIRPATH                     1054
+#define IDC_EXE_PROMPTBASE              1055
+#define IDC_EXE_WINDOWBASE              1056
+#define IDC_EXE_NOBASE                  1057
+#define IDC_IMAGE_WINDOW                1058
+#define IDC_IMAGE_PROMPT                1059
+#define IDC_HELPTEXT_OFBASE             1060
+#define IDC_BUTTON1                     1061
+#define IDC_PATHBROWSE                  1061
+#define IDC_RENAMEWINDOW                1061
+#define IDC_HINTFONT                    1061
+#define IDC_LINKFILE                    1061
+#define IDC_TEST                        1061
+#define IDC_ADD_ICONTYPE                1061
+#define IDC_SAMPLE                      1061
+#define IDC_DIR                         1061
+#define IDC_ADD_BUTTON                  1061
+#define IDC_ADD                         1061
+#define IDC_GOPRO                       1061
+#define IDC_PAGESET                     1061
+#define IDD_PJ_OPTION4                  1061
+#define IDC_PROJECTINFO                 1062
+#define IDC_DELETE_ICONTYPE             1062
+#define IDC_DELETE_BUTTON               1062
+#define IDC_DELETE                      1062
+#define IDC_EDIT                        1063
+#define IDC_TAB_PROJECTINFO             1066
+#define IDC_SHOWHELLOWORLD              1068
+#define IDC_USING_FILE                  1069
+#define IDC_DEFINED_FILE                1070
+#define IDC_UPDATE_TIME                 1071
+#define IDC_FILETYPE                    1072
+#define IDC_TOOL_MOUSE                  1075
+#define IDC_TOOL_STATIC                 1076
+#define IDC_TOOL_BUTTON                 1077
+#define IDC_TOOL_EDIT                   1078
+#define IDC_TOOL_CHECKBOX               1079
+#define IDC_WINDOWNAME                  1080
+#define IDC_TOOL_RADIOBUTTON            1080
+#define IDC_WINDOWHANDLE                1081
+#define IDC_TOOL_GROUPBOX               1081
+#define IDC_WINDOWPROC                  1082
+#define IDC_TOOL_HSCROLLBAR             1082
+#define IDC_AUTOSET                     1083
+#define IDC_TOOL_VSCROLLBAR             1083
+#define IDC_TOOL_COMBOBOX               1084
+#define IDC_TOOL_LISTBOX                1085
+#define IDC_TOOL_UPDOWN                 1086
+#define IDC_TOOL_LISTVIEW               1087
+#define IDC_TOOL_TREEVIEW               1088
+#define IDC_CAPTION                     1090
+#define IDC_TOOL_IMAGEBOX               1091
+#define IDC_BGCOLOR                     1091
+#define IDC_TOOL_PROGRESSBAR            1092
+#define IDC_TOOL_TRACKBAR               1093
+#define IDC_IDNAME                      1095
+#define IDC_WINDOWSTYLE                 1097
+#define IDC_STYLE_HSCROLLBAR            1098
+#define IDC_STYLE_VSCROLLBAR            1099
+#define IDC_STYLE_CLIPSIBLINGS          1100
+#define IDC_STYLE_CLIPCHILDREN          1101
+#define IDC_STYLE_SYSMENU               1102
+#define IDC_STYLE_CAPTION               1104
+#define IDC_STYLE_MINIMIZE              1105
+#define IDC_STYLE_MAXIMIZE              1106
+#define IDC_STYLE_VISIBLE               1107
+#define IDC_STYLE_MAXIMIZEBOX           1108
+#define IDC_STYLE_MINIMIZEBOX           1109
+#define IDC_BORDERSTYLE                 1110
+#define IDC_STYLE_DISABLED              1111
+#define IDC_EXSTYLE                     1113
+#define IDC_PROCEDURENAME               1116
+#define IDC_EVENTLIST                   1117
+#define IDC_STYLE_GROUP                 1118
+#define IDC_STYLE_TABSTOP               1119
+#define IDC_BS_DEFPUSHBUTTON            1120
+#define IDC_BS_OWNERDRAW                1121
+#define IDC_BS_ICON                     1122
+#define IDC_BS_BITMAP                   1123
+#define IDC_BS_MULTILINE                1124
+#define IDC_BS_NOTIFY                   1125
+#define IDC_BS_HPOS                     1126
+#define IDC_BS_VPOS                     1127
+#define IDC_RENAMEID                    1128
+#define IDC_RENAMECAPTION               1129
+#define IDC_EXSTYLE_NOPARENTNOTIFY      1129
+#define IDC_EXSTYLE_TOPMOST             1130
+#define IDC_EXSTYLE_ACCEPTFILES         1131
+#define IDC_EXSTYLE_TRANSPARENT         1133
+#define IDC_EXSTYLE_TOOLWINDOW          1134
+#define IDC_EXSTYLE_DLGMODALFRAME       1135
+#define IDC_EXSTYLE_CLIENTEDGE          1136
+#define IDC_EXSTYLE_STATICEDGE          1137
+#define IDC_EXSTYLE_CONTEXTHELP         1138
+#define IDC_EXSTYLE_CONTROLPARENT       1139
+#define IDC_ES_MULTILINE                1161
+#define IDC_ES_NUMBER                   1162
+#define IDC_STYLE_HSCROLL               1163
+#define IDC_ES_AUTOHSCROLL              1164
+#define IDC_STYLE_VSCROLL               1165
+#define IDC_ES_AUTOVSCROLL              1166
+#define IDC_ES_PASSWORD                 1167
+#define IDC_ES_NOHIDESEL                1168
+#define IDC_ES_OEMCONVERT               1169
+#define IDC_ES_WANTRETURN               1170
+#define IDC_ES_UPPERCASE                1171
+#define IDC_ES_LOWERCASE                1172
+#define IDC_ES_READONLY                 1173
+#define IDC_ES_TEXTPOS                  1174
+#define IDC_LBS_SELECT                  1175
+#define IDC_LBS_OWNERDRAW               1176
+#define IDC_LVS_SORT                    1177
+#define IDC_SS_NOPREFIX                 1178
+#define IDC_SS_LEFTNOWORDWRAP           1179
+#define IDC_SS_NOTIFY                   1180
+#define IDC_SS_TEXTPOS                  1182
+#define IDC_BS_AUTO                     1184
+#define IDC_BS_3STATE                   1185
+#define IDC_BS_LEFTTEXT                 1187
+#define IDC_BS_PUSHLIKE                 1188
+#define IDC_SBS_POSITION                1207
+#define IDC_LBS_HASSTRINGS              1221
+#define IDC_LBS_SORT                    1223
+#define IDC_LBS_NOTIFY                  1224
+#define IDC_LBS_MULTICOLUMN             1225
+#define IDC_LBS_DISABLENOSCROLL         1226
+#define IDC_LBS_NOREDRAW                1227
+#define IDC_LBS_USETABSTOPS             1228
+#define IDC_LBS_WANTKEYBOARDINPUT       1229
+#define IDC_LVS_VIEW                    1240
+#define IDC_LVS_POSITION                1241
+#define IDC_LVS_SHOWSELALWAYS           1243
+#define IDC_LVS_SINGLESEL               1244
+#define IDC_LVS_AUTOARRANGE             1245
+#define IDC_LVS_NOLABELWRAP             1246
+#define IDC_LVS_EDITLABELS              1247
+#define IDC_LVS_NOSCROLL                1248
+#define IDC_LVS_NOCOLUMNHEADER          1249
+#define IDC_LVS_NOSORTHEADER            1250
+#define IDC_LVS_OWNERDRAWFIXED          1251
+#define IDC_LVS_SHAREIMAGELISTS         1252
+#define IDC_TVS_HASBUTTONS              1264
+#define IDC_TVS_HASLINES                1266
+#define IDC_TVS_LINESATROOT             1267
+#define IDC_TVS_EDITLABELS              1268
+#define IDC_TVS_DISABLEDRAGDROP         1269
+#define IDC_TVS_SHOWSELALWAYS           1270
+#define IDC_TVS_NOSCROLL                1271
+#define IDC_TVS_NOTOOLTIPS              1272
+#define IDC_TVS_CHECKBOXES              1273
+#define IDC_TVS_FULLROWSELECT           1274
+#define IDC_TVS_TRACKSELECT             1275
+#define IDC_TVS_SINGLEEXPAND            1276
+#define IDC_IMAGE_FILE                  1278
+#define IDC_IMAGE_TYPE                  1281
+#define IDC_SS_CENTERIMAGE              1283
+#define IDC_SS_RIGHTJUST                1284
+#define IDC_CBS_TYPE                    1288
+#define IDC_CBS_HASSTRINGS              1289
+#define IDC_CBS_SORT                    1290
+#define IDC_CBS_NOINTEGRALHEIGHT        1292
+#define IDC_CBS_OEMCONVERT              1293
+#define IDC_CBS_AUTOHSCROLL             1294
+#define IDC_CBS_DISABLENOSCROLL         1295
+#define IDC_CBS_UPPERCASE               1296
+#define IDC_CBS_LOWERCASE               1297
+#define IDC_CBS_OWNERDRAW               1301
+#define IDC_BS_POSITION                 1307
+#define IDC_UDS_AUTOBUDDY               1314
+#define IDC_UDS_SETBUDDYINT             1315
+#define IDC_UDS_NOTHOUSANDS             1316
+#define IDC_UDS_WRAP                    1317
+#define IDC_UDS_ARROWKEYS               1318
+#define IDC_UDS_SITUATION               1319
+#define IDC_UDS_ATTACH                  1320
+#define IDC_PROGRESS3                   1327
+#define IDC_PBS_SMOOTH                  1328
+#define IDC_PBS_VERTICAL                1329
+#define IDC_SLIDER2                     1331
+#define IDC_TBS_SITUATION               1332
+#define IDC_TBS_POINT                   1333
+#define IDC_TBS_NOTICKS                 1334
+#define IDC_TBS_AUTOTICKS               1335
+#define IDC_TBS_ENABLESELRANGE          1336
+#define IDC_SLIDER3                     1337
+#define IDC_HANDLE                      1339
+#define IDC_PATH                        1340
+#define IDC_CHANGEPATH                  1341
+#define IDC_IMAGE_SITUATION             1342
+#define IDC_WINDOWMENU                  1343
+#define IDC_ICONRES                     1344
+#define IDC_UP                          1347
+#define IDC_DOWN                        1348
+#define IDC_CHECKED                     1349
+#define IDC_DISABLED                    1350
+#define IDC_INSERTMENUITEM              1352
+#define IDC_DELETEMENUITEM              1353
+#define IDC_POPUP                       1356
+#define IDC_SEPARATOR                   1357
+#define IDC_DEFWINDOW                   1358
+#define IDC_API_MMSYS                   1362
+#define IDC_DEFAULT                     1363
+#define IDC_API_MMSYS2                  1363
+#define IDC_MMSYS                       1364
+#define IDC_MENU                        1365
+#define IDC_API_COMMCTRL                1368
+#define IDC_RENAME                      1369
+#define IDC_IDSTATIC                    1370
+#define IDC_CAPTIONSTATIC               1371
+#define IDC_STATUSBAR                   1373
+#define IDC_STATIC_HINTFONT             1374
+#define IDC_CHECK3                      1377
+#define IDC_SBP                         1377
+#define IDC_WINDOWLIST                  1380
+#define IDC_STATIC_HANDLE               1383
+#define IDC_SAVECHECK                   1384
+#define IDC_SUPPORT_COMMENT             1386
+#define IDC_LINEADJUST                  1387
+#define IDC_BAS                         1391
+#define IDC_ABP                         1392
+#define IDC_PJ                          1393
+#define IDC_MODALDLG                    1394
+#define IDC_MODELESSDLG                 1395
+#define IDC_DLL                         1397
+#define IDC_SLL                         1398
+#define IDC_EXE_DOSPROMPTBASE           1399
+#define IDC_API_RICHEDIT                1401
+#define IDC_FILE                        1402
+#define IDC_RESOURCE                    1403
+#define IDC_RESCOMBO                    1404
+#define IDC_STATIC_ICON                 1405
+#define IDC_API_WINSOCK                 1406
+#define IDC_XPOS                        1408
+#define IDC_YPOS                        1409
+#define IDC_WIDTH                       1410
+#define IDC_HEIGHT                      1411
+#define IDC_SPIN1                       1414
+#define IDC_SPIN2                       1415
+#define IDC_EDIT_RELEASE                1415
+#define IDC_SPIN3                       1416
+#define IDC_EDIT_DEBUG                  1416
+#define IDC_ADDTOPROJECT                1416
+#define IDC_SPIN4                       1417
+#define IDC_FILENAME                    1417
+#define IDC_STATIC_FILENAME             1418
+#define IDC_CLIP                        1419
+#define IDC_ICONTYPECOMBO               1420
+#define IDC_STATIC_COLOR                1422
+#define IDC_NOWCOLOR                    1423
+#define IDC_TYPELIST                    1425
+#define IDC_COMPLEMENT                  1427
+#define IDC_STATIC_SETFONT              1428
+#define IDC_STATIC_TABSIZE              1429
+#define IDC_EXE_DIRECTX                 1432
+#define IDC_IMAGE_DOSPROMPT             1433
+#define IDC_IMAGE_NON                   1434
+#define IDC_IMAGE_DIRECTX               1435
+#define IDC_PAIRSTATEMENT               1435
+#define IDC_BACKNUM                     1436
+#define IDC_STATIC_PAIRSTATEMENT        1439
+#define IDC_LINENUMBER                  1440
+#define IDC_CARETLINE_BACKGROUND        1441
+#define IDC_STATIC_VERSION              1442
+#define IDC_STRICT                      1443
+#define IDC_COMBO1                      1444
+#define IDC_TARGET                      1445
+#define IDC_THEME                       1446
+#define IDC_COLOR_BUTTON                1448
+#define IDC_STATIC_PARTS                1449
+#define IDC_LIST_CHARCODE               1451
+#define IDC_LIST_LFCODE                 1452
+#define IDC_STATIC_NAME                 1453
+#define IDC_CMD_LINE                    1454
+#define IDC_EXE_PATH                    1455
+#define IDC_STATIC_DEBUG                1456
+#define IDC_MAX_ONELINE_TEXT_LENGTH     1457
+#define IDC_MAX_CONV_ONELINE_TEXT_LENGTH 1458
+#define IDC_SCOUNT_BYTE                 1463
+#define IDC_SCOUNT_OMIT_SPACE           1464
+#define IDC_SCOUNT_WITH_SPACE           1465
+#define IDC_SCOUNT_LINENUM              1466
+#define IDC_RULER                       1467
+#define IDC_EXTENSION_LIST              1468
+#define IDC_EXTENSION                   1469
+#define IDC_NOTE                        1470
+#define IDC_SEARCH_ON                   1472
+#define IDC_SEARCH_OFF                  1473
+#define IDC_EDIT_BUTTON                 1473
+#define IDC_SAVE_TAB_TO_HEAD            1474
+#define IDC_DOMAIN_LIST                 1478
+#define IDC_CTRLKEY_HYPERLINK           1479
+#define IDC_NAME                        1480
+#define IDC_DOMAIN                      1481
+#define IDC_REGEXP                      1482
+#define IDC_FONT                        1484
+#define IDC_PRINT                       1487
+#define IDC_PREV                        1488
+#define IDC_NEXT                        1489
+#define IDC_SHOWPAGENUM                 1490
+#define IDC_PAGESTR                     1491
+#define IDC_STATIC_TABCOLOR             1492
+#define IDC_STATIC_TABCOLOR2            1493
+#define IDC_SAVE_FINDSTR                1494
+#define IDC_SAVE_WEBFINDSTR             1495
+#define IDC_ZOOMIN                      1496
+#define IDC_ZOOMOUT                     1497
+#define IDC_ZOOMRATIO                   1498
+#define IDC_SAVE                        1499
+#define IDC_OVERWRITE                   1501
+#define IDC_PASSWORD                    1502
+#define IDC_UNICODE                     1503
+#define IDC_PASTEINDENT                 1504
+#define IDC_RC_MANIFEST                 1505
+#define IDC_STATIC_PATH                 1506
+#define IDM_STEP_IN                     1507
+#define IDM_STEP_OUT                    1508
+#define IDM_STEP_CURSOR                 1509
+#define IDM_DEBUG_PAUSE                 1510
+#define IDM_DEBUG_STOP                  1511
+#define IDM_RELEASERUN                  1512
+#define IDM_STEP_OVER                   1513
+#define IDM_BREAKPOINT                  1514
+#define IDC_ISWORDUNIT                  1515
+#define IDM_EXIT                        40001
+#define IDM_NEW                         40002
+#define IDM_OPEN                        40003
+#define IDM_CLOSE                       40004
+#define IDM_SAVE                        40008
+#define IDM_NEWSAVE                     40009
+#define IDM_UNDO                        40010
+#define IDM_CUT                         40011
+#define IDM_COPY                        40012
+#define IDM_PASTE                       40013
+#define IDM_DELETE                      40014
+#define IDM_ABOUT                       40015
+#define IDM_WINDOWCHARGE                40017
+#define IDM_ALLSAVE                     40020
+#define IDM_ALLSELECT                   40021
+#define IDM_FIND                        40024
+#define IDM_REDO                        40034
+#define IDM_TOPIC                       40037
+#define ID_MENUITEM40038                40038
+#define IDM_DOCSELECTBAND               40039
+#define IDM_STANDARDBAND                40040
+#define IDM_BASICBAND                   40041
+#define IDM_SET                         40042
+#define IDM_PERMUTATION                 40044
+#define IDM_DSHOMEPAGE                  40047
+#define IDM_ACTBDL                      40048
+#define IDM_PROJECT_OPEN                40051
+#define IDM_PROJECT_CLOSE               40052
+#define IDM_PROJECT_SAVE                40053
+#define IDM_PROJECTVIEW                 40054
+#define IDM_FILETREE_PROPERTY           40057
+#define IDM_FILETREE_OPEN               40058
+#define IDM_FILETREE_INSERT             40059
+#define IDM_FILETREE_DELETE             40060
+#define IDM_WINDOWTREE_OPEN             40062
+#define IDM_MATERIALTREE_OPEN           40062
+#define IDM_WINDOWTREE_DELETE           40063
+#define IDM_MATERIALTREE_DELETE         40063
+#define IDM_WINDOWTREE_PROPERTY         40064
+#define IDM_WINDOWTREE_INSERT           40065
+#define IDM_MATERIALTREE_INSERT         40065
+#define IDM_MATERIALTREE_INSERTWINDOW   40065
+#define IDM_RAD_ITEM_DELETE             40067
+#define IDM_RAD_WINDOW_EVENTCODE        40069
+#define IDM_ACCEL_UNDO                  -25466
+#define IDM_ACCEL_REDO                  -25465
+#define IDM_PROCEDURETREE_SHOW          40072
+#define IDM_RAD_WINDOW_MENUEVENTCODE    40074
+#define IDM_MENUTREE_RENAMEID           40075
+#define IDM_PROJECT_OPTION              40076
+#define IDM_TOPMOST                     40077
+#define ID_BUTTON40079                  40079
+#define ID_BUTTON40080                  40080
+#define ID_BUTTON40081                  40081
+#define ID_BUTTON40082                  40082
+#define ID_BUTTON40083                  40083
+#define ID_BUTTON40084                  40084
+#define ID_BUTTON40085                  40085
+#define ID_BUTTON40086                  40086
+#define ID_BUTTON40087                  40087
+#define ID_BUTTON40088                  40088
+#define ID_BUTTON40089                  40089
+#define ID_BUTTON40090                  40090
+#define ID_BUTTON40091                  40091
+#define ID_BUTTON40092                  40092
+#define ID_BUTTON40093                  40093
+#define ID_BUTTON40094                  40094
+#define ID_BUTTON40095                  40095
+#define ID_BUTTON40097                  40097
+#define IDM_DEBUG                       40101
+#define IDM_RELEASECOMPILE              40106
+#define IDM_DEBUGCOMPILE                40108
+#define IDM_MATERIALTREE_INSERTICON     40109
+#define IDM_MATERIALTREE_INSERTMENU     40110
+#define IDM_MATERIALTREE_ICON_SETMAIN   40113
+#define IDM_MATERIALTREE_INSERTBITMAP   40115
+#define IDM_MATERIALTREE_INSERTCURSOR   40116
+#define IDM_NOGRIPPER                   40117
+#define IDC_TOOL_SELECT                 40119
+#define IDC_TOOL_PEN                    40120
+#define IDC_TOOL_LINE                   40121
+#define IDC_TOOL_RECTANGLE              40123
+#define IDC_TOOL_ELLIPSE                40124
+#define IDC_TOOL_FILL                   40126
+#define IDC_TOOL_FILLRECT               40127
+#define IDC_TOOL_FILLRECT2              40128
+#define IDM_SELECTCOMPILERBAND          40133
+#define IDM_RESET_REBAR                 40134
+#define IDM_COMMU_PM                    40136
+#define ID_COMMU_FORUM1                 40138
+#define ID_COMMU_FORUM2                 40139
+#define ID_COMMU_FORUM4                 40140
+#define ID_COMMU_FORUM3                 40141
+#define ID_COMMU_FORUM5                 40142
+#define IDM_COMMUNITY                   40143
+#define IDM_CODE_SAVE                   40144
+#define IDM_COMMU_SEARCH                40148
+#define IDM_WEB_SEARCH                  40149
+#define IDM_BANDMENU_WEB_SEARCH         40150
+#define IDM_RIGHT_TURN                  40151
+#define IDM_STRING_COUNT                40153
+#define IDM_SEL_STRING_COUNT            40154
+#define IDM_DELETE_FILE                 40156
+#define IDM_PATH_COPY                   40157
+#define IDM_ALLCLOSE_OMIT_MYSELF        40158
+#define IDM_FOLDER_OPEN                 40159
+#define IDM_RED                         40160
+#define IDM_GREEN                       40161
+#define IDM_BLUE                        40162
+#define IDM_YELLOW                      40163
+#define IDM_USER_COLOR                  40164
+#define IDM_GRAY                        40165
+#define IDM_WHITE                       40166
+#define IDM_PRINTOUT                    40167
+#define IDM_CONV_ALPHA_SMALL            40168
+#define IDM_CONV_ALPHA_BIG              40169
+#define IDM_CONV_HELF                   40170
+#define IDM_CONV_HALF                   40170
+#define IDM_CONV_MULTI                  40171
+#define IDM_CONV_KATAKANA               40172
+#define IDM_CONV_HIRAGANA               40173
+#define IDM_CONV_SPACE                  40174
+#define IDM_CONV_TAB                    40175
+#define IDM_PAGESET                     40176
+#define IDM_PREVIEW                     40177
+#define ID_MENUITEM40180                40180
+#define IDM_CONV_QUOTE                  40182
+#define IDM_CONV_HASRETURN              40183
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        304
+#define _APS_NEXT_COMMAND_VALUE         40184
+#define _APS_NEXT_CONTROL_VALUE         1516
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
Index: branches/egtra/ab5.0/deploy/build.xml
===================================================================
--- branches/egtra/ab5.0/deploy/build.xml	(revision 774)
+++ branches/egtra/ab5.0/deploy/build.xml	(revision 774)
@@ -0,0 +1,79 @@
+<project name="ActiveBasic" default="deploy_all">
+
+	<!-- å
+±éãã­ããã£ -->
+	<property name="root.dir" value="../abdev/build/release"/>
+	<property name="abc32" value="${root.dir}/bin/x86/abc.exe"/>
+	<property name="abc64" value="${root.dir}/bin/x64/abc.exe"/>
+
+	<target name="deploy_all">
+		<antcall target="make_x86_core_lib" />
+		<antcall target="make_x86_cored_lib" />
+		<antcall target="make_x64_core_lib" />
+		<antcall target="make_x64_cored_lib" />
+		<antcall target="copy_files" />
+	</target>
+
+	<target name="deploy_x86_only">
+		<antcall target="make_x86_core_lib" />
+		<antcall target="make_x86_cored_lib" />
+		<antcall target="copy_files" />
+	</target>
+
+	<target name="copy_files">
+		<property name="dest.dir" value="./dest" />
+		<property name="application" value="${dest.dir}/ab5.0" />
+
+		<!-- æ¬ä½ãã³ãã¼ -->
+		<mkdir dir="${dest.dir}" />
+		<mkdir dir="${application}" />
+		<copy todir="${application}">
+			<fileset dir="${root.dir}">
+				<exclude name="**/UserSetting" />
+				<exclude name="**/UserSetting/**" />
+				<exclude name="**/*.log" />
+				<exclude name="*.log" />
+				<exclude name="*.tmp" />
+			</fileset>
+		</copy>
+	</target>
+
+	<target name="make_x86_core_lib">
+		<exec executable="${abc32}" failonerror="true">
+			<arg value="${root.dir}/ablib/src/basic.sbp" />
+			<arg value="${root.dir}/ablib/lib/core.lib" />
+			<arg value="/static_library" />
+			<arg value="/include_dir:${root.dir}/ablib/src" />
+		</exec>
+	</target>
+
+	<target name="make_x86_cored_lib">
+		<exec executable="${abc32}" failonerror="true">
+			<arg value="${root.dir}/ablib/src/basic.sbp" />
+			<arg value="${root.dir}/ablib/lib/cored.lib" />
+			<arg value="/static_library" />
+			<arg value="/debug" />
+			<arg value="/include_dir:${root.dir}/ablib/src" />
+		</exec>
+	</target>
+
+	<target name="make_x64_core_lib">
+		<exec executable="${abc64}" failonerror="true">
+			<arg value="${root.dir}/ablib/src/basic.sbp" />
+			<arg value="${root.dir}/ablib/lib/x64/core.lib" />
+			<arg value="/static_library" />
+			<arg value="/include_dir:${root.dir}/ablib/src" />
+		</exec>
+	</target>
+
+	<target name="make_x64_cored_lib">
+		<exec executable="${abc64}" failonerror="true">
+			<arg value="${root.dir}/ablib/src/basic.sbp" />
+			<arg value="${root.dir}/ablib/lib/x64/cored.lib" />
+			<arg value="/static_library" />
+			<arg value="/debug" />
+			<arg value="/include_dir:${root.dir}/ablib/src" />
+		</exec>
+	</target>
+
+</project>
Index: branches/egtra/ab5.0/deploy/deploy_copy_files.bat
===================================================================
--- branches/egtra/ab5.0/deploy/deploy_copy_files.bat	(revision 774)
+++ branches/egtra/ab5.0/deploy/deploy_copy_files.bat	(revision 774)
@@ -0,0 +1,2 @@
+call ant copy_files
+pause
Index: branches/egtra/ab5.0/deploy/deploy_full.bat
===================================================================
--- branches/egtra/ab5.0/deploy/deploy_full.bat	(revision 774)
+++ branches/egtra/ab5.0/deploy/deploy_full.bat	(revision 774)
@@ -0,0 +1,2 @@
+call ant
+pause
Index: branches/egtra/ab5.0/deploy/deploy_x86_only.bat
===================================================================
--- branches/egtra/ab5.0/deploy/deploy_x86_only.bat	(revision 774)
+++ branches/egtra/ab5.0/deploy/deploy_x86_only.bat	(revision 774)
@@ -0,0 +1,2 @@
+call ant deploy_x86_only
+pause
Index: branches/egtra/ab5.0/deploy/installer.iss
===================================================================
--- branches/egtra/ab5.0/deploy/installer.iss	(revision 774)
+++ branches/egtra/ab5.0/deploy/installer.iss	(revision 774)
@@ -0,0 +1,33 @@
+; -- Example1.iss --
+; Demonstrates copying 3 files and creating an icon.
+
+#define AppName "ActiveBasic 5.0"
+#define CampanyName "activebasic.com"
+#define DestDir ".\dest"
+#define Version "5.0.0.5"
+#define VersionSubText "(CP5)"
+
+[Setup]
+AppName={#AppName}
+AppVerName={#AppName}
+DefaultDirName={pf}\{#AppName}
+DefaultGroupName={#AppName}
+Compression=lzma/fast
+SolidCompression=yes
+OutputDir={#DestDir}
+
+AppComments={#AppName}
+AppPublisher={#CampanyName}
+AppVersion={#Version}{#VersionSubText}
+
+; version info
+VersionInfoCopyright=Copyright (C) 2008 {#CampanyName}
+VersionInfoVersion={#Version}
+VersionInfoTextVersion={#Version}{#VersionSubText}
+VersionInfoCompany={#CampanyName}
+
+[Files]
+Source: {#DestDir}\ab5.0\*; DestDir: {app}; Flags: recursesubdirs
+
+[Icons]
+Name: {group}\abdev.exe; Filename: {app}\abdev.exe
Index: branches/egtra/ab5.0/jenga/include/MyAssert.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/MyAssert.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/MyAssert.h	(revision 774)
@@ -0,0 +1,14 @@
+#pragma once
+
+#define MyAssertMsg(expr, msg) (void)( expr || Jenga::AssertReport( __FILE__, __LINE__, msg ) )
+#define MyAssert(expr) (void)( expr || Jenga::AssertReport( __FILE__, __LINE__, "" ) )
+
+namespace Jenga
+{
+
+
+bool AssertReport( const char *lpszFilePath, int line, const char *msg );
+bool AssertReport( const char *lpszFilePath, int line, const std::string &msg );
+
+
+}
Index: branches/egtra/ab5.0/jenga/include/common/Binary.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Binary.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Binary.h	(revision 774)
@@ -0,0 +1,170 @@
+#pragma once
+
+namespace Jenga{ namespace Common{
+
+
+class Binary
+{
+	int allocateSize;
+	char *buffer;
+	int size;
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+	template<class Archive> void load(Archive& ar, const unsigned int version)
+	{
+		std::string _buffer;
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( size );
+
+		// 読み込み後の処理
+		Realloc( size );
+		for( int i=0; i<size; i++ )
+		{
+			ULONG_PTR l1 = ( ( _buffer[i*3] >= 'a' ) ? ( _buffer[i*3] - 'a' + 0x0a ) : ( _buffer[i*3] - '0' ) ) * 0x10;
+			ULONG_PTR l2 = ( _buffer[i*3+1] >= 'a' ) ? ( _buffer[i*3+1] - 'a' + 0x0a ) : ( _buffer[i*3+1] - '0' );
+			ULONG_PTR l = l1 + l2;
+			buffer[i] = static_cast<char>(l);
+		}
+	}
+	template<class Archive> void save(Archive& ar, const unsigned int version) const
+	{
+		// 保存準備
+		char *tempCode = (char *)calloc( (size+1) * 3, 1 );
+		for( int i=0; i<size; i++ )
+		{
+			char temp[32];
+			sprintf( temp, "%02x,", (unsigned char)buffer[i] );
+			tempCode[i*3] = temp[0];
+			tempCode[i*3+1] = temp[1];
+			tempCode[i*3+2] = temp[2];
+		}
+
+		std::string _buffer = tempCode;
+		free( tempCode );
+
+		ar & BOOST_SERIALIZATION_NVP( _buffer );
+		ar & BOOST_SERIALIZATION_NVP( size );
+	}
+
+	void Realloc( int newSize )
+	{
+		if( allocateSize < newSize + 8192 )
+		{
+			while( allocateSize < newSize + 8192 )
+			{
+				allocateSize += 8192;
+			}
+			buffer = (char *)realloc( buffer, allocateSize );
+
+			// 再確保した部分を0で埋める
+			memset( buffer + size, 0, allocateSize - size );
+		}
+	}
+
+public:
+	Binary()
+		: allocateSize( 8192 )
+		, buffer( (char *)malloc( allocateSize ) )
+		, size( 0 )
+	{
+	}
+	Binary( const char *buffer, int size )
+		: allocateSize( 8192 )
+		, buffer( (char *)malloc( allocateSize ) )
+		, size( 0 )
+	{
+		Put( buffer, size );
+	}
+	~Binary()
+	{
+		free( buffer );
+	}
+
+	void Clear()
+	{
+		size = 0;
+	}
+
+	const char *GetBuffer() const
+	{
+		return buffer;
+	}
+	int GetSize() const
+	{
+		return size;
+	}
+	void Resize( int newSize )
+	{
+		Realloc( newSize );
+		size = newSize;
+	}
+
+	long GetLong( int pos ) const
+	{
+		return *(long *)( buffer + pos );
+	}
+
+	void Overwrite( int pos, const char *buffer, int size )
+	{
+		memcpy( this->buffer + pos, buffer, size );
+	}
+	void Overwrite( int pos, char c )
+	{
+		buffer[pos] = c;
+	}
+	void Overwrite( int pos, long newLongValue )
+	{
+		*(long *)( buffer + pos ) = newLongValue;
+	}
+	void Overwrite( int pos, _int64 newInt64Value )
+	{
+		*(_int64 *)( buffer + pos ) = newInt64Value;
+	}
+
+	void Put( const char *buffer, int size )
+	{
+		Realloc( this->size + size );
+
+		memcpy( this->buffer + this->size, buffer, size );
+		this->size += size;
+	}
+	void Put( const Binary &binary )
+	{
+		Put( binary.GetBuffer(), binary.GetSize() );
+	}
+	void Put( double dbl )
+	{
+		Put( (const char *)(&dbl), sizeof(double) );
+	}
+	void Put( float flt )
+	{
+		Put( (const char *)(&flt), sizeof(float) );
+	}
+	void Put( _int64 i64data )
+	{
+		Put( (const char *)(&i64data), sizeof(_int64) );
+	}
+	void Put( long l )
+	{
+		Realloc( size + sizeof(long) );
+		*((long *)(buffer+size))=l;
+		size += sizeof(long);
+	}
+	void Put( short s )
+	{
+		Realloc( size + sizeof(short) );
+		*((short *)(buffer+size))=s;
+		size += sizeof(short);
+	}
+	void Put( char c )
+	{
+		Realloc( size + 1 );
+		buffer[size++] = c;
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/BoostSerializationSupport.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/BoostSerializationSupport.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/BoostSerializationSupport.h	(revision 774)
@@ -0,0 +1,36 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+template<class T_xml_schema> class BoostSerializationSupport{
+	virtual const char *RootTagName() const = 0;
+
+	void echo( const char *msg ) const;
+
+public:
+	bool ReadXml( std::istream& ifs, bool isShowExceptionMessage = true );
+	bool WriteXml( std::ostream& ofs, bool isShowExceptionMessage = true ) const;
+	bool ReadXml( const std::string &xmlFilePath, bool isShowExceptionMessage = true );
+	bool WriteXml( const std::string &xmlFilePath, bool isShowExceptionMessage = true ) const;
+	bool ReadXmlString( const std::string &xmlString );
+	bool WriteXmlString( std::string &xmlString ) const;
+
+	bool ReadBinaryFile( const std::string &filePath, bool isShowExceptionMessage = true );
+	bool WriteBinaryFile( const std::string &filePath, bool isShowExceptionMessage = true ) const;
+	bool ReadBinaryString( const std::string &binaryString );
+	bool WriteBinaryString( std::string &binaryString ) const;
+
+/*
+ビルドに時間がかかるので外しておく
+	bool ReadText( const std::string &filePath, bool isShowExceptionMessage = true );
+	bool WriteText( const std::string &filePath, bool isShowExceptionMessage = true ) const;
+	bool ReadTextString( const std::string &textString );
+	bool WriteTextString( std::string &textString ) const;
+
+	bool ReadXmlFromString( const std::string &xmlBuffer );
+*/
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/CmdLine.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/CmdLine.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/CmdLine.h	(revision 774)
@@ -0,0 +1,40 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+
+class CmdLine{
+	std::string command;
+	std::string parameter;
+public:
+
+	CmdLine( const std::string &command, const std::string &parameter )
+		: command( command )
+		, parameter( parameter )
+	{
+	}
+
+	bool IsNamelessCommand() const
+	{
+		return ( command.size() == 0 );
+	}
+	const std::string& GetCommand() const
+	{
+		return command;
+	}
+	const std::string& GetParameter() const
+	{
+		return parameter;
+	}
+};
+
+class CmdLines : public std::vector<CmdLine>
+{
+public:
+	CmdLines( const std::string &strCmdLine );
+	bool IsExist( const std::string &commandString ) const;
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/Directory.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Directory.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Directory.h	(revision 774)
@@ -0,0 +1,25 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+class Directory
+{
+	std::string path;
+public:
+	Directory( const std::string &path, bool isMake = false );
+	Directory( const Directory &dir );
+
+	const std::string &GetPath() const
+	{
+		return path;
+	}
+
+	std::string GetFullPath( const std::string &relationPath ) const;
+	std::string GetRelationalPath( const std::string &fullPath ) const;
+
+	void SearchFiles( Jenga::Common::Strings &resultOfFullPath, const std::string &findStr, bool isRecuresive = false ) const;
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/EasyToken.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/EasyToken.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/EasyToken.h	(revision 774)
@@ -0,0 +1,9 @@
+#pragma once
+
+namespace Jenga{ namespace Common{ namespace EasyToken{
+
+
+std::string GetIdentifierToken( const std::string &source, int &sourceIndex );
+
+
+}}}
Index: branches/egtra/ab5.0/jenga/include/common/Environment.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Environment.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Environment.h	(revision 774)
@@ -0,0 +1,92 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+#pragma warning(disable : 4996)
+
+class Environment
+{
+public:
+	static const std::string GetCurrentDir()
+	{
+		char temp[MAX_PATH];
+		::GetCurrentDirectory( MAX_PATH, temp );
+		return temp;
+	}
+
+	static const std::string &GetAppDir()
+	{
+		static std::string appDir;
+		if( appDir.empty() )
+		{
+			char temporary[MAX_PATH];
+			char temp2[MAX_PATH];
+			char temp3[MAX_PATH];
+			GetModuleFileName(GetModuleHandle(0),temporary,MAX_PATH);
+			_splitpath(temporary,temp2,temp3,NULL,NULL);
+			if( temp3[lstrlen(temp3)-1]=='\\' )
+			{
+				temp3[lstrlen(temp3)-1] = 0;
+			}
+			lstrcat(temp2,temp3);
+
+			appDir = temp2;
+		}
+		return appDir;
+	}
+
+	static const std::string &GetAppFileName()
+	{
+		static std::string appFileName;
+		if( appFileName.empty() )
+		{
+			char temporary[MAX_PATH];
+			char temp2[MAX_PATH];
+			char temp3[MAX_PATH];
+			GetModuleFileName(GetModuleHandle(0),temporary,MAX_PATH);
+			_splitpath(temporary,NULL,NULL,temp2,temp3);
+			lstrcat(temp2,temp3);
+
+			appFileName = temp2;
+		}
+		return appFileName;
+	}
+
+	static const std::string &GetAppFilePath()
+	{
+		static std::string appFilePath;
+		if( appFilePath.empty() )
+		{
+			char temporary[MAX_PATH];
+			GetModuleFileName(GetModuleHandle(0),temporary,MAX_PATH);
+
+			appFilePath = temporary;
+		}
+		return appFilePath;
+	}
+
+	static const std::string &GetUserAppDir()
+	{
+		static std::string userAppDir;
+		if( userAppDir.empty() )
+		{
+			char szDirPath[MAX_PATH];
+			if( SHGetSpecialFolderPath( NULL, szDirPath, CSIDL_APPDATA, TRUE ) == FALSE )
+			{
+				throw;
+			}
+			userAppDir = szDirPath;
+
+			if( userAppDir[userAppDir.size()-1] == '\\' )
+			{
+				userAppDir = userAppDir.substr( 0, userAppDir.size() - 1 );
+			}
+		}
+
+		return userAppDir;
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/Exception.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Exception.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Exception.h	(revision 774)
@@ -0,0 +1,9 @@
+#pragma once
+
+namespace Jenga{
+
+
+void Throw( const std::string &message );
+
+
+}
Index: branches/egtra/ab5.0/jenga/include/common/File.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/File.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/File.h	(revision 774)
@@ -0,0 +1,73 @@
+#pragma once
+#pragma warning(disable : 4996)
+
+
+namespace Jenga{
+namespace Common{
+
+
+class File
+{
+	const std::string filePath;
+public:
+	File( const std::string &filePath )
+		: filePath( filePath )
+	{
+	}
+
+	std::string Read()
+	{
+		HANDLE hFile = CreateFile( filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+		if( hFile == INVALID_HANDLE_VALUE )
+		{
+			Jenga::Throw( filePath + " がオープンできません" );
+		}
+		int size = GetFileSize( hFile, NULL );
+
+		char *temp = static_cast<char *>(calloc( size + 1, 1 ));
+		DWORD dummy;
+		ReadFile( hFile, temp, size, &dummy, NULL );
+		CloseHandle(hFile);
+
+		std::string result = temp;
+		free( temp );
+
+		return result;
+	}
+
+	bool ReadBinary( Binary &binary )
+	{
+		HANDLE hFile = CreateFile( filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+		if( hFile == INVALID_HANDLE_VALUE )
+		{
+			return false;
+		}
+		int size = GetFileSize( hFile, NULL );
+
+		char *temp = static_cast<char *>(calloc( size + 1, 1 ));
+		DWORD dummy;
+		ReadFile( hFile, temp, size, &dummy, NULL );
+		CloseHandle(hFile);
+
+		binary.Put( temp, size );
+
+		return true;
+	}
+
+	bool WriteBinary( const Binary &binary )
+	{
+		HANDLE hFile = CreateFile(filePath.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
+		if(hFile==INVALID_HANDLE_VALUE)
+		{
+			return false;
+		}
+		DWORD dw;
+		WriteFile(hFile,binary.GetBuffer(),binary.GetSize(),&dw,NULL);
+		CloseHandle(hFile);
+
+		return true;
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/FileSystem.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/FileSystem.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/FileSystem.h	(revision 774)
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace Jenga{ namespace Common{
+
+
+class FileSystem
+{
+public:
+	static void SearchFiles( Jenga::Common::Strings &resultOfFullPath, const std::string &findStr, bool isNeedDirResults = false );
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/Hashmap.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Hashmap.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Hashmap.h	(revision 774)
@@ -0,0 +1,284 @@
+#pragma once
+
+
+namespace Jenga{
+namespace Common{
+
+
+#define MAX_HASHMAP 65535
+template<class T> class Hashmap
+{
+	T* hashArray[MAX_HASHMAP];
+
+public:
+	virtual int GetHash( const char *keyName ) const
+	{
+		int key;
+		for(key=0;*keyName!='\0';keyName++){
+			key=((key<<8)+ *keyName )%MAX_HASHMAP;
+		}
+		return key;
+	}
+
+	Hashmap()
+		: isIteratorReady( false )
+	{
+		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+	}
+	~Hashmap()
+	{
+		Clear();
+	}
+	void Clear()
+	{
+		for( int i=0; i<MAX_HASHMAP; i++ )
+		{
+			T* temp = hashArray[i];
+			if( temp )
+			{
+				delete temp;
+			}
+		}
+		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+	}
+
+	// 内容を破棄せずにすべて抜き取る
+	void PullOutAll()
+	{
+		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+	}
+
+	bool Put( T* value )
+	{
+		int key = GetHash( value->GetKeyName().c_str() );
+
+		if(hashArray[key]){
+			T *temp = hashArray[key];
+			while( true ){
+				if( temp->IsDuplication( value ) )
+				{
+					// 重複している
+					return false;
+				}
+
+				if( temp->GetChainNext() == NULL )
+				{
+					break;
+				}
+				temp = temp->GetChainNext();
+			}
+			temp->SetChainNext( value );
+		}
+		else{
+			hashArray[key] = value;
+		}
+
+		return true;
+	}
+
+	T* GetHashArrayElement( const char *keyName )
+	{
+		return hashArray[GetHash(keyName)];
+	}
+	const T* GetHashArrayElement( const char *keyName ) const
+	{
+		return hashArray[GetHash(keyName)];
+	}
+
+	bool IsExistDuplicationKeyName( const std::string &keyName ) const
+	{
+		int key = GetHash( keyName.c_str() );
+
+		if(hashArray[key]){
+			const T *temp = hashArray[key];
+			while( true ){
+				if( temp->IsDuplication( keyName ) )
+				{
+					// 重複している
+					return true;
+				}
+
+				if( temp->GetChainNext() == NULL )
+				{
+					break;
+				}
+				temp = temp->GetChainNext();
+			}
+		}
+
+		return false;
+	}
+
+	bool IsExist( const T* value ) const
+	{
+		int key = GetHash( value->GetKeyName().c_str() );
+
+		if(hashArray[key]){
+			const T *temp = hashArray[key];
+			while( true ){
+				if( temp->IsDuplication( value ) )
+				{
+					// 重複している
+					return true;
+				}
+
+				if( temp->GetChainNext() == NULL )
+				{
+					break;
+				}
+				temp = temp->GetChainNext();
+			}
+		}
+
+		return false;
+	}
+
+	const T *FindLike( const T* value ) const
+	{
+		int key = GetHash( value->GetKeyName().c_str() );
+
+		if(hashArray[key]){
+			const T *temp = hashArray[key];
+			while( true ){
+				if( temp->IsDuplication( value ) )
+				{
+					// 重複している
+					return temp;
+				}
+
+				if( temp->GetChainNext() == NULL )
+				{
+					break;
+				}
+				temp = temp->GetChainNext();
+			}
+		}
+
+		return NULL;
+	}
+
+
+	/////////////////////////////////////////////////////////////////
+	// イテレータ
+	/////////////////////////////////////////////////////////////////
+private:
+	mutable std::vector<T*> iterator_Objects;
+	mutable int iterator_CurrentNext;
+	mutable bool isIteratorReady;
+public:
+	void Iterator_Init() const
+	{
+		iterator_Objects.clear();
+		iterator_CurrentNext = 0;
+
+		for( int i=0; i<MAX_HASHMAP; i++ ){
+			if( hashArray[i] ){
+				T* temp = hashArray[i];
+				while( temp )
+				{
+					iterator_Objects.push_back( temp );
+
+					temp = (T*)temp->GetChainNext();
+				}
+			}
+		}
+
+		isIteratorReady = true;
+	}
+	void Iterator_Reset() const
+	{
+		if( !isIteratorReady )
+		{
+			Jenga::Throw( "イテレータの準備ができていない" );
+		}
+		iterator_CurrentNext = 0;
+	}
+	bool Iterator_HasNext() const
+	{
+		return ( iterator_CurrentNext < (int)iterator_Objects.size() );
+	}
+	T *Iterator_GetNext() const
+	{
+		return iterator_Objects[iterator_CurrentNext++];
+	}
+	int Iterator_GetMaxCount() const
+	{
+		return (int)iterator_Objects.size();
+	}
+
+
+	// XMLシリアライズ用
+private:
+	friend class boost::serialization::access;
+	BOOST_SERIALIZATION_SPLIT_MEMBER();
+	template<class Archive> void load(Archive& ar, const unsigned int version)
+	{
+		std::vector<T *> objects;
+		ar & BOOST_SERIALIZATION_NVP( objects );
+
+		// 読み込み後の処理
+		Clear();
+		BOOST_FOREACH( T *object, objects )
+		{
+			Put( object );
+		}
+		Iterator_Init();
+	}
+	template<class Archive> void save(Archive& ar, const unsigned int version) const
+	{
+		// 保存準備
+		std::vector<T *> objects;
+		objects.clear();
+		Iterator_Reset();
+		while( Iterator_HasNext() )
+		{
+			objects.push_back( Iterator_GetNext() );
+		}
+
+		ar & BOOST_SERIALIZATION_NVP( objects );
+	}
+};
+
+template<class T> class ObjectInHashmap
+{
+	T *pNextObject;
+public:
+
+	ObjectInHashmap()
+		: pNextObject( NULL )
+	{
+	}
+	~ObjectInHashmap()
+	{
+		if( pNextObject )
+		{
+			delete pNextObject;
+		}
+	}
+
+	virtual const std::string &GetKeyName() const = 0;
+	virtual bool IsDuplication( const T *value ) const
+	{
+		return ( GetKeyName() == value->GetName() );
+	}
+	virtual bool IsDuplication( const std::string &keyName ) const
+	{
+		return ( GetKeyName() == keyName );
+	}
+
+	T *GetChainNext()
+	{
+		return pNextObject;
+	}
+	const T *GetChainNext() const
+	{
+		return pNextObject;
+	}
+	void SetChainNext( T *pNextObject )
+	{
+		this->pNextObject = pNextObject;
+	}
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/Path.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/Path.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/Path.h	(revision 774)
@@ -0,0 +1,76 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+
+class Path
+{
+	std::string fullPath;
+	std::string driveName;
+	std::string dirName;
+	std::string fileName;
+	std::string ext;
+
+	void Expand()
+	{
+		char szDrive[32], szDir[1024], szFile[1024], szExt[255];
+		_splitpath_s( fullPath.c_str(), szDrive, 32, szDir, 1024, szFile, 1024, szExt, 255 );
+		driveName = szDrive;
+		dirName = szDir;
+		fileName = szFile;
+		ext = szExt;
+	}
+
+public:
+	Path( const std::string &fullPath )
+		: fullPath( fullPath )
+	{
+		Expand();
+	}
+	~Path()
+	{
+	}
+
+	bool IsExistFile() const;
+
+	const std::string &GetDriveName() const
+	{
+		return driveName;
+	}
+	const std::string GetDirPath() const
+	{
+		return driveName + dirName;
+	}
+	const std::string &GetFileName() const
+	{
+		return fileName;
+	}
+	const std::string &GetExt() const
+	{
+		return ext;
+	}
+	const std::string GetFullFileName() const
+	{
+		return fileName + ext;
+	}
+	const std::string &GetFullPath() const
+	{
+		return fullPath;
+	}
+	bool IsNetworkPath() const
+	{
+		if( fullPath.size() < 2 )
+		{
+			return false;
+		}
+		return ( ( fullPath[0] == '\\' ) && ( fullPath[1] == '\\' ) );
+	}
+
+	static std::string MakeFullPath( const std::string &relativePath, const std::string &baseDirPath );
+	static std::string MakeFullPathByCurrentDirectory( const std::string &relativePath );
+	static std::string ExtractDirPath( const std::string &path );
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/SourceTemplate.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/SourceTemplate.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/SourceTemplate.h	(revision 774)
@@ -0,0 +1,25 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+
+class SourceTemplate
+{
+public:
+	class Values
+		: public std::map<std::string,std::string>
+	{
+	public:
+		void Insert( const std::string &tagName, const std::string &value );
+	};
+
+	SourceTemplate( const std::string &filePath );
+	std::string GetResult( const std::map<std::string,std::string> &values );
+
+private:
+	std::string source;
+};
+
+
+}}
Index: branches/egtra/ab5.0/jenga/include/common/String.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/String.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/String.h	(revision 774)
@@ -0,0 +1,21 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+
+typedef std::vector<std::string> Strings;
+
+bool IsExistString( const Jenga::Common::Strings &strings, const std::string &findStr );
+
+std::string& StringReplace( std::string& str, const std::string &sb, const std::string &sa );
+
+std::string ToString( int n );
+std::string ToString( const std::wstring &wstr );
+std::wstring ToWString( const std::string &str );
+
+bool IsIdentifierTopChar( char c );
+bool IsIdentifierChar( char c );
+
+}
+}
Index: branches/egtra/ab5.0/jenga/include/common/VectorSupporter.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/common/VectorSupporter.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/common/VectorSupporter.h	(revision 774)
@@ -0,0 +1,22 @@
+#pragma once
+
+namespace Jenga{
+namespace Common{
+
+
+template<class T> void EraseVectorItem( T &v, int index )
+{
+	T::iterator it = v.begin();
+	int i = 0;
+	while( i < index )
+	{
+		i ++;
+		it ++;
+	}
+	v.erase( it );
+}
+
+
+
+}
+}
Index: branches/egtra/ab5.0/jenga/include/jenga.h
===================================================================
--- branches/egtra/ab5.0/jenga/include/jenga.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/include/jenga.h	(revision 774)
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "MyAssert.h"
+#include "common/Binary.h"
+#include "common/BoostSerializationSupport.h"
+#include "common/CmdLine.h"
+#include "common/String.h"
+#include "common/Directory.h"
+#include "common/EasyToken.h"
+#include "common/Environment.h"
+#include "common/Exception.h"
+#include "common/File.h"
+#include "common/FileSystem.h"
+#include "common/Hashmap.h"
+#include "common/Path.h"
+#include "common/SourceTemplate.h"
+#include "common/VectorSupporter.h"
Index: branches/egtra/ab5.0/jenga/projects/jenga/jenga.vcproj
===================================================================
--- branches/egtra/ab5.0/jenga/projects/jenga/jenga.vcproj	(revision 774)
+++ branches/egtra/ab5.0/jenga/projects/jenga/jenga.vcproj	(revision 774)
@@ -0,0 +1,439 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="8.00"
+	Name="jenga"
+	ProjectGUID="{F01805B6-65B4-4708-88F4-A5E07DEA9FBD}"
+	RootNamespace="common"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug(x64)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/GR"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\..\;..\..\..\cpplibs\boost"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="0"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+				DisableSpecificWarnings="4103"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="..\..\lib\amd64\$(ProjectName)d.lib"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release(x64)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalOptions="/GR"
+				InlineFunctionExpansion="2"
+				EnableIntrinsicFunctions="true"
+				FavorSizeOrSpeed="1"
+				WholeProgramOptimization="false"
+				AdditionalIncludeDirectories="..\..\..\;..\..\..\cpplibs\boost"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="0"
+				DisableSpecificWarnings="4103"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="..\..\lib\amd64\$(ProjectName).lib"
+				IgnoreDefaultLibraryNames=""
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Debug(x86)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				AdditionalIncludeDirectories="..\..\..\;..\..\..\cpplibs\boost"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="1"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="..\..\lib\x86\$(ProjectName)d.lib"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release(x86)|Win32"
+			OutputDirectory=".\$(ConfigurationName)"
+			IntermediateDirectory="$(ConfigurationName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			WholeProgramOptimization="0"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				AdditionalIncludeDirectories="..\..\..\;..\..\..\cpplibs\boost"
+				RuntimeLibrary="0"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="true"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="..\..\lib\x86\$(ProjectName).lib"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="ソース ファイル"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath="..\..\src\common\CmdLine.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\Directory.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\EasyToken.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\Exception.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\FileSystem.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\MyAssert.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\Path.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\src\common\SourceTemplate.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x64)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Debug(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release(x86)|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\..\src\common\String.cpp"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="ヘッダー ファイル"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath="..\..\include\common\Binary.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\BoostSerializationSupport.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\CmdLine.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\Directory.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\EasyToken.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\Environment.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\Exception.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\File.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\FileSystem.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\Hashmap.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\jenga.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\MyAssert.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\Path.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\SourceTemplate.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\String.h"
+				>
+			</File>
+			<File
+				RelativePath="..\..\include\common\VectorSupporter.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="リソース ファイル"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
Index: branches/egtra/ab5.0/jenga/projects/jenga/stdafx.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/projects/jenga/stdafx.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/projects/jenga/stdafx.cpp	(revision 774)
@@ -0,0 +1,1 @@
+#include "stdafx.h"
Index: branches/egtra/ab5.0/jenga/projects/jenga/stdafx.h
===================================================================
--- branches/egtra/ab5.0/jenga/projects/jenga/stdafx.h	(revision 774)
+++ branches/egtra/ab5.0/jenga/projects/jenga/stdafx.h	(revision 774)
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <map>
+#include <string>
+#include <vector>
+#include <fstream>
+#include <iostream>
+
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <commctrl.h>
+#include <time.h>
+#include <limits.h>
+#include <shlobj.h>
+#include <process.h>
+#include <fcntl.h>
+#include <io.h>
+#include <imagehlp.h>
+#include <assert.h>
+
+//boost libraries
+#include <boost/foreach.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/export.hpp>
+
+#include <jenga/include/jenga.h>
Index: branches/egtra/ab5.0/jenga/src/MyAssert.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/MyAssert.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/MyAssert.cpp	(revision 774)
@@ -0,0 +1,15 @@
+#include "stdafx.h"
+
+bool Jenga::AssertReport( const char *lpszFilePath, int line, const char *msg )
+{
+	char temporary[8192];
+	sprintf( temporary, "Application Error!\n\nFile: %s\nLine: %d\nMessage: %s", lpszFilePath, line, msg );
+	MessageBox( NULL, temporary, "Application Error!", MB_OK | MB_ICONSTOP );
+	return true;
+}
+
+bool Jenga::AssertReport( const char *lpszFilePath, int line, const std::string &msg )
+{
+	Jenga::AssertReport( lpszFilePath, line, msg.c_str() );
+	return true;
+}
Index: branches/egtra/ab5.0/jenga/src/common/CmdLine.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/CmdLine.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/CmdLine.cpp	(revision 774)
@@ -0,0 +1,133 @@
+#include "stdafx.h"
+
+using namespace Jenga::Common;
+
+CmdLines::CmdLines( const std::string &strCmdLine )
+{
+	char temporary[8192];
+	int i = 0;
+	while( i<(int)strCmdLine.size() )
+	{
+		while( strCmdLine[i] == ' ' )
+		{
+			i ++;
+		}
+
+		if( strCmdLine[i] == '\0' )
+		{
+			break;
+		}
+
+		if( strCmdLine[i] == '/' )
+		{
+			i++;
+
+			// コマンド文字列（オプション名）を抽出
+			for( int j = 0; ; j++, i++ )
+			{
+				if( isalpha( strCmdLine[i] ) || isdigit( strCmdLine[i] ) || strCmdLine[i] == '_' )
+				{
+					temporary[j] = strCmdLine[i];
+				}
+				else
+				{
+					temporary[j] = 0;
+					break;
+				}
+			}
+			while( strCmdLine[i] == ' ' ) i++;
+
+			std::string command = temporary;
+			std::string parameter = "";
+
+			if( (int)strCmdLine.size() > i && strCmdLine[i] != '/' )
+			{
+				if( strCmdLine[i] == ':' )
+				{
+					// ':'はコマンドとパラメータの区切り文字として認識する
+					i++;
+				}
+
+				// パラメータを抽出
+				if( strCmdLine[i] == '\"' )
+				{
+					i++;
+					//ダブルクォートの中身を取り出す
+					for( int j=0; ; j++, i++ )
+					{
+						if( strCmdLine[i] == '\"' || strCmdLine[i] == '\0' )
+						{
+							temporary[j] = 0;
+
+							if( strCmdLine[i] == '\"' ) i++;
+							break;
+						}
+						temporary[j] = strCmdLine[i];
+					}
+				}
+				else
+				{
+					//空白またはヌル文字以前を取り出す
+					for( int j=0; ; j++, i++ )
+					{
+						if( strCmdLine[i] == ' ' || strCmdLine[i] == '\0' )
+						{
+							temporary[j] = 0;
+							break;
+						}
+						temporary[j] = strCmdLine[i];
+					}
+				}
+				parameter = temporary;
+			}
+
+			this->push_back( CmdLine( command, parameter ) );
+		}
+		else if( strCmdLine[i] == '\"' )
+		{
+			i++;
+			//ダブルクォートの中身を取り出す
+			for( int j=0; ; j++, i++ )
+			{
+				if( strCmdLine[i] == '\"' || strCmdLine[i] == '\0' )
+				{
+					temporary[j] = 0;
+
+					if( strCmdLine[i] == '\"' ) i++;
+					break;
+				}
+				temporary[j] = strCmdLine[i];
+			}
+
+			this->push_back( CmdLine( "", temporary ) );
+		}
+		else
+		{
+			//空白またはヌル文字以前を取り出す
+			for( int j=0; ; j++, i++ )
+			{
+				if( strCmdLine[i] == ' ' || strCmdLine[i] == '\0' )
+				{
+					temporary[j] = 0;
+					break;
+				}
+				temporary[j] = strCmdLine[i];
+			}
+
+			this->push_back( CmdLine( "", temporary ) );
+		}
+	}
+}
+
+bool CmdLines::IsExist( const std::string &commandString ) const
+{
+	const CmdLines &cmdLines = *this;
+	BOOST_FOREACH( const CmdLine &cmdLine, cmdLines )
+	{
+		if( cmdLine.GetCommand() == commandString )
+		{
+			return true;
+		}
+	}
+	return false;
+}
Index: branches/egtra/ab5.0/jenga/src/common/Directory.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/Directory.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/Directory.cpp	(revision 774)
@@ -0,0 +1,172 @@
+#include "stdafx.h"
+
+using namespace Jenga::Common;
+
+Directory::Directory( const std::string &path, bool isMake )
+	: path( path )
+{
+	if ( isMake )
+	{
+		std::string tempPath = path;
+		if( !tempPath.empty() && tempPath[tempPath.size()-1] != '\\' )
+		{
+			tempPath += "\\";
+		}
+		if (!::MakeSureDirectoryPathExists(tempPath.c_str()))
+		{
+			Jenga::Throw( "MakeSureDirectoryPathExists failed!" );
+		}
+	}
+}
+Directory::Directory( const Directory &dir )
+	: path( dir.path )
+{
+}
+
+std::string Directory::GetFullPath( const std::string &relationPath ) const
+{
+	std::string resultPath = relationPath;
+
+	// '/'→'\'
+	BOOST_FOREACH( char &c, resultPath )
+	{
+		if( c == '/' )
+		{
+			c = '\\';
+		}
+	}
+
+	if( resultPath.find( ":" ) != std::string::npos || resultPath.find( "\\\\" ) != std::string::npos )
+	{
+		// フルパスが引き渡されていたとき
+		return resultPath;
+	}
+
+	int i=0,i2=0;
+	while(1){
+		if(resultPath[i]=='.'&&resultPath[i+1]=='\\') i+=2;
+		if(resultPath[i]=='.'&&resultPath[i+1]=='.'&&resultPath[i+2]=='\\'){
+			i2++;
+			i+=3;
+		}
+		else break;
+	}
+
+	int i3 = (int)path.size(),i4=0;
+	while(i4<i2){
+		for(i3--;;i3--){
+			if(path[i3-1]=='\\'){
+				i4++;
+				break;
+			}
+		}
+	}
+
+	char temporary[MAX_PATH];
+	memcpy(temporary,path.c_str(),i3);
+	temporary[i3]=0;
+	lstrcat(temporary,resultPath.c_str()+i);
+
+	return temporary;
+}
+
+void _GetRelationalPath(char *path,const char *dir){
+	//相対パスを取得
+	int i,i2,i3,i4,i5;
+	char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH],temp4[MAX_PATH];
+
+	//ドライブ名をチェック
+	_splitpath(path,temporary,0,0,0);
+	_splitpath(dir,temp2,0,0,0);
+	if(lstrcmpi(temporary,temp2)!=0) return;
+
+	_splitpath(path,0,temporary,0,0);
+	_splitpath(dir,0,temp2,0,0);
+	i=1;i2=1;
+	while(1){
+		i4=i;
+		if(temporary[i-1]=='\\'&&temporary[i]){	//path側
+			for(i3=0;;i++,i3++){
+				if(temporary[i]=='\\'){
+					temp3[i3]=0;
+					i++;
+					break;
+				}
+				temp3[i3]=temporary[i];
+			}
+		}
+		else temp3[0]=0;
+
+		i5=i2;
+		if(temp2[i2-1]=='\\'&&temp2[i2]){		//dir側
+			for(i3=0;;i2++,i3++){
+				if(temp2[i2]=='\\'){
+					temp4[i3]=0;
+					i2++;
+					break;
+				}
+				temp4[i3]=temp2[i2];
+			}
+		}
+		else temp4[0]=0;
+
+		if(temp3[0]=='\0'&&temp4[0]=='\0'){
+			lstrcpy(temp3,".\\");
+			break;
+		}
+
+		if(lstrcmpi(temp3,temp4)!=0){
+			for(i3=0;;i5++){
+				if(temp2[i5]=='\0') break;
+				if(temp2[i5]=='\\') i3++;
+			}
+			if(i3==0) lstrcpy(temp3,".\\");
+			else{
+				temp3[0]=0;
+				for(i2=0;i2<i3;i2++) lstrcat(temp3,"..\\");
+			}
+			lstrcat(temp3,temporary+i4);
+			break;
+		}
+	}
+	_splitpath(path,0,0,temporary,temp2);
+	lstrcat(temp3,temporary);
+	lstrcat(temp3,temp2);
+	lstrcpy(path,temp3);
+}
+
+std::string Directory::GetRelationalPath( const std::string &fullPath ) const
+{
+	char temp[1024];
+	lstrcpy( temp, fullPath.c_str() );
+	_GetRelationalPath( temp, path.c_str() );
+	return temp;
+}
+
+void Directory::SearchFiles( Jenga::Common::Strings &resultOfFullPath, const std::string &findStr, bool isRecuresive ) const
+{
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind=FindFirstFile( ( this->path + "\\" + findStr ).c_str(), &wfd );
+	if( hFind != INVALID_HANDLE_VALUE )
+	{
+		do
+		{
+			if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) 
+			{
+				// ディレクトリのとき
+				if( isRecuresive )
+				{
+					Directory tempDir( this->path + "\\" + wfd.cFileName );
+					tempDir.SearchFiles( resultOfFullPath, findStr, isRecuresive );
+				}
+			}
+			else
+			{
+				//ファイルのとき
+				resultOfFullPath.push_back( this->path + "\\" + wfd.cFileName );
+			}
+		} while( FindNextFile( hFind, &wfd ) );
+
+		FindClose( hFind );
+	}
+}
Index: branches/egtra/ab5.0/jenga/src/common/EasyToken.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/EasyToken.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/EasyToken.cpp	(revision 774)
@@ -0,0 +1,21 @@
+#include "stdafx.h"
+
+std::string Jenga::Common::EasyToken::GetIdentifierToken( const std::string &source, int &sourceIndex )
+{
+	char *token = (char *)malloc( source.size() + 1 );
+
+	for( int i=0; ; i++, sourceIndex++ )
+	{
+		if( ! IsIdentifierChar( source[sourceIndex] ) )
+		{
+			token[i] = 0;
+			break;
+		}
+		token[i] = source[sourceIndex];
+	}
+
+	std::string resultToken = token;
+	free( token );
+
+	return resultToken;
+}
Index: branches/egtra/ab5.0/jenga/src/common/Exception.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/Exception.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/Exception.cpp	(revision 774)
@@ -0,0 +1,14 @@
+#include "stdafx.h"
+
+
+namespace Jenga{
+
+
+void Throw( const std::string &message )
+{
+	MessageBox( NULL, message.c_str(), "Jenga::Throw", MB_OK );
+	throw message;
+}
+
+
+}
Index: branches/egtra/ab5.0/jenga/src/common/FileSystem.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/FileSystem.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/FileSystem.cpp	(revision 774)
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+
+void Jenga::Common::FileSystem::SearchFiles( Jenga::Common::Strings &resultOfFullPath, const std::string &findStr, bool isNeedDirResults )
+{
+	// '/' → '\\'
+	std::string tempFindStr = findStr;
+	Jenga::Common::StringReplace( tempFindStr, "/", "\\" );
+
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind=FindFirstFile( tempFindStr.c_str(), &wfd );
+
+	Jenga::Common::Path path( tempFindStr );
+	std::string dirPath = path.GetDirPath();
+	if( !dirPath.empty() && dirPath[dirPath.size()-1] == '\\' )
+	{
+		dirPath = dirPath.substr( 0, dirPath.size() - 1 );
+	}
+
+	if( hFind != INVALID_HANDLE_VALUE )
+	{
+		do
+		{
+			if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) 
+			{
+				// ディレクトリのとき
+				if( isNeedDirResults )
+				{
+					resultOfFullPath.push_back( dirPath + "\\" + wfd.cFileName );
+				}
+			}
+			else
+			{
+				//ファイルのとき
+				resultOfFullPath.push_back( dirPath + "\\" + wfd.cFileName );
+			}
+		} while( FindNextFile( hFind, &wfd ) );
+
+		FindClose( hFind );
+	}
+}
Index: branches/egtra/ab5.0/jenga/src/common/Path.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/Path.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/Path.cpp	(revision 774)
@@ -0,0 +1,82 @@
+#include "stdafx.h"
+
+bool Jenga::Common::Path::IsExistFile() const
+{
+	WIN32_FIND_DATA wfd;
+	HANDLE hFind = FindFirstFile( fullPath.c_str() , &wfd );
+	if( hFind != INVALID_HANDLE_VALUE ){
+		FindClose( hFind );
+		if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
+		{
+			// ディレクトリ
+			return false;
+		}
+
+		return true;
+	}
+
+	return false;
+}
+
+std::string Jenga::Common::Path::MakeFullPath( const std::string &relativePath, const std::string &baseDirPath )
+{
+	int i,i2,i3,i4;
+	char temporary[MAX_PATH];
+
+	char resultPath[MAX_PATH];
+	lstrcpy( resultPath, relativePath.c_str() );
+
+	// '/'→'\'
+	for( i=0;resultPath[i];i++ ){
+		if( resultPath[i] == '/' ){
+			resultPath[i]='\\';
+		}
+	}
+
+	if(strstr(resultPath,":")||strstr(resultPath,"\\\\")) return resultPath;
+
+	i=0;i2=0;
+	while(1){
+		if(resultPath[i]=='.'&&resultPath[i+1]=='\\') i+=2;
+		if(resultPath[i]=='.'&&resultPath[i+1]=='.'&&resultPath[i+2]=='\\'){
+			i2++;
+			i+=3;
+		}
+		else break;
+	}
+
+	std::string tempBaseDirPath = baseDirPath;
+	if( tempBaseDirPath[tempBaseDirPath.size()-1] != '\\' )
+	{
+		tempBaseDirPath += "\\";
+	}
+
+	i3=(int)tempBaseDirPath.size();i4=0;
+	while(i4<i2){
+		for(i3--;;i3--){
+			if(tempBaseDirPath[i3-1]=='\\'){
+				i4++;
+				break;
+			}
+		}
+	}
+	memcpy(temporary,tempBaseDirPath.c_str(),i3);
+	temporary[i3]=0;
+	lstrcat(temporary,resultPath+i);
+	lstrcpy(resultPath,temporary);
+
+	if( resultPath[lstrlen(resultPath)-1] == '\\' )
+	{
+		resultPath[lstrlen(resultPath)-1] = 0;
+	}
+
+	return resultPath;
+}
+std::string Jenga::Common::Path::MakeFullPathByCurrentDirectory( const std::string &relativePath )
+{
+	return MakeFullPath( relativePath, Jenga::Common::Environment::GetCurrentDir() );
+}
+std::string Jenga::Common::Path::ExtractDirPath( const std::string &filepath )
+{
+	return Path( filepath ).GetDirPath();
+}
Index: branches/egtra/ab5.0/jenga/src/common/SourceTemplate.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/SourceTemplate.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/SourceTemplate.cpp	(revision 774)
@@ -0,0 +1,39 @@
+#include "stdafx.h"
+
+using namespace Jenga::Common;
+
+void SourceTemplate::Values::Insert( const std::string &tagName, const std::string &value )
+{
+	this->insert( Values::value_type(
+		tagName,
+		value
+	) );
+}
+
+SourceTemplate::SourceTemplate( const std::string &filePath )
+{
+	Jenga::Common::File file = Jenga::Common::File( filePath );
+	source = file.Read();
+}
+std::string SourceTemplate::GetResult( const std::map<std::string,std::string> &values )
+{
+	std::string result = source;
+
+	std::map<std::string,std::string>::const_iterator it = values.begin();
+	while( it != values.end() )
+	{
+		while( true )
+		{
+			std::string::size_type index = result.find( it->first );
+			if( index == std::string::npos )
+			{
+				break;
+			}
+
+			result = result.substr( 0, index ) + it->second + result.substr( index + it->first.length() );
+		}
+		it++;
+	}
+
+	return result;
+}
Index: branches/egtra/ab5.0/jenga/src/common/String.cpp
===================================================================
--- branches/egtra/ab5.0/jenga/src/common/String.cpp	(revision 774)
+++ branches/egtra/ab5.0/jenga/src/common/String.cpp	(revision 774)
@@ -0,0 +1,84 @@
+#include "stdafx.h"
+#include <algorithm>
+
+bool Jenga::Common::IsExistString( const Jenga::Common::Strings &strings, const std::string &findStr )
+{
+	return std::find( strings.begin(), strings.end(), findStr ) != strings.end();
+}
+
+std::string& Jenga::Common::StringReplace( std::string& str, const std::string &sb, const std::string &sa )
+{
+	std::string::size_type n, nb = 0;
+	
+	while ((n = str.find(sb,nb)) != std::string::npos)
+	{
+		str.replace(n,sb.size(),sa);
+		nb = n + sa.size();
+	}
+	
+	return str;
+}
+
+std::string Jenga::Common::ToString( int n )
+{
+	char temp[255];
+	wsprintf( temp, "%d", n );
+	return temp;
+}
+
+std::string Jenga::Common::ToString( const std::wstring &wstr )
+{
+	int needSize = 	WideCharToMultiByte(
+		CP_THREAD_ACP,
+		0,
+		wstr.data(), static_cast<int>(wstr.size()),
+		NULL, NULL,
+		NULL, NULL );
+
+	char *pstr = (char *)calloc( needSize, 1 );
+	WideCharToMultiByte(
+		CP_THREAD_ACP,
+		0,
+		wstr.data(), static_cast<int>(wstr.size()),
+		pstr, needSize,
+		NULL, NULL );
+
+	std::string result(pstr, needSize);
+
+	free( pstr );
+
+	return result;
+}
+
+std::wstring Jenga::Common::ToWString( const std::string &str )
+{
+	int size = MultiByteToWideChar(
+		CP_ACP,
+		0,
+		str.data(), static_cast<int>(str.size()),
+		NULL, 0 );
+
+	LPWSTR pwstr = (LPWSTR)calloc( size, sizeof (wchar_t) );
+
+	MultiByteToWideChar(
+		CP_ACP,
+		0,
+		str.data(), static_cast<int>(str.size()),
+		pwstr, size );
+
+	std::wstring wstr( pwstr, size );
+
+	free( pwstr );
+
+	return wstr;
+}
+
+bool Jenga::Common::IsIdentifierTopChar( char c )
+{
+	return ( isalpha( c ) || c == '_' );
+}
+
+bool Jenga::Common::IsIdentifierChar( char c )
+{
+	return ( IsIdentifierTopChar( c ) || isdigit( c ) );
+}
