Index: /BasicCompiler32/Compile_Func.cpp
===================================================================
--- /BasicCompiler32/Compile_Func.cpp	(revision 108)
+++ /BasicCompiler32/Compile_Func.cpp	(revision 109)
@@ -12,4 +12,5 @@
 		case FUNC_SIZEOF:
 		case FUNC_VARPTR:
+		case FUNC_OBJPTR:
 			return DEF_DWORD;
 		case FUNC_GETDOUBLE:
@@ -35,4 +36,5 @@
 	if(lstrcmpi(FuncName,"SizeOf")==0)		return FUNC_SIZEOF;
 	if(lstrcmpi(FuncName,"VarPtr")==0)		return FUNC_VARPTR;
+	if(lstrcmpi(FuncName,"ObjPtr")==0)		return FUNC_OBJPTR;
 	if(lstrcmpi(FuncName,"GetDouble")==0)	return FUNC_GETDOUBLE;
 	if(lstrcmpi(FuncName,"GetSingle")==0)	return FUNC_GETSINGLE;
@@ -376,4 +378,5 @@
 	SetVarPtrToEax(&RelativeVar);
 
+	// TODO: 取り除く（この動きはObjPtrに託す）
 	if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
 		//参照をオブジェクトポインタに変更
@@ -381,4 +384,37 @@
 		//mov eax,dword ptr[eax]
 		op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+	}
+}
+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( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
+		//参照をオブジェクトポインタに変更
+
+		//mov eax,dword ptr[eax]
+		op_mov_RM( sizeof(long), REG_EAX, REG_EAX, 0, MOD_BASE );
+	}
+	else{
+		SetError(134,NULL,cp );
 	}
 }
@@ -472,4 +508,7 @@
 			Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
 			break;
+		case FUNC_OBJPTR:
+			Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
+			break;
 
 		case FUNC_GETDOUBLE:
Index: /BasicCompiler32/FunctionValue.h
===================================================================
--- /BasicCompiler32/FunctionValue.h	(revision 108)
+++ /BasicCompiler32/FunctionValue.h	(revision 109)
@@ -10,4 +10,5 @@
 //メモリ操作
 #define FUNC_VARPTR		0x0591
+#define FUNC_OBJPTR		0x0592
 
 //その他
Index: /BasicCompiler64/Compile_Func.cpp
===================================================================
--- /BasicCompiler64/Compile_Func.cpp	(revision 108)
+++ /BasicCompiler64/Compile_Func.cpp	(revision 109)
@@ -10,4 +10,5 @@
 		case FUNC_ADDRESSOF:
 		case FUNC_VARPTR:
+		case FUNC_OBJPTR:
 			return DEF_PTR_VOID;
 		case FUNC_GETDOUBLE:
@@ -31,4 +32,5 @@
 	if(lstrcmpi(FuncName,"SizeOf")==0)		return FUNC_SIZEOF;
 	if(lstrcmpi(FuncName,"VarPtr")==0)		return FUNC_VARPTR;
+	if(lstrcmpi(FuncName,"ObjPtr")==0)		return FUNC_OBJPTR;
 	if(lstrcmpi(FuncName,"GetDouble")==0)	return FUNC_GETDOUBLE;
 	if(lstrcmpi(FuncName,"GetSingle")==0)	return FUNC_GETSINGLE;
@@ -221,4 +223,5 @@
 	SetVarPtrToReg(REG_RAX,&RelativeVar);
 
+	// TODO: 取り除く（この動きはObjPtrに託す）
 	if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
 		//参照をオブジェクトポインタに変更
@@ -226,4 +229,37 @@
 		//mov rax,qword ptr[rax]
 		op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
+	}
+}
+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();
+
+	SetVarPtrToReg(REG_RAX,&RelativeVar);
+
+	if( beforeType == DEF_OBJECT && lstrcmpi( Parameter, "This" ) != 0 ){
+		//参照をオブジェクトポインタに変更
+
+		//mov rax,qword ptr[rax]
+		op_mov_RM( sizeof(_int64), REG_RAX, REG_RAX, 0, MOD_BASE );
+	}
+	else{
+		SetError(134,NULL,cp );
 	}
 }
@@ -270,4 +306,7 @@
 			Opcode_Func_VarPtr( Parameter, resultType, isCallOn );
 			break;
+		case FUNC_OBJPTR:
+			Opcode_Func_ObjPtr( Parameter, resultType, isCallOn );
+			break;
 
 		case FUNC_GETDOUBLE:
Index: /BasicCompiler64/FunctionValue.h
===================================================================
--- /BasicCompiler64/FunctionValue.h	(revision 108)
+++ /BasicCompiler64/FunctionValue.h	(revision 109)
@@ -9,4 +9,5 @@
 //メモリ操作
 #define FUNC_VARPTR		0x0591
+#define FUNC_OBJPTR		0x0592
 
 //その他
Index: /BasicCompiler_Common/error.cpp
===================================================================
--- /BasicCompiler_Common/error.cpp	(revision 108)
+++ /BasicCompiler_Common/error.cpp	(revision 109)
@@ -188,4 +188,5 @@
 	if(num==132) lstrcpy(msg,"明示的なコンストラクタ呼び出しと初期値の指定を同時に行うことはできません。");
 	if(num==133) lstrcpy(msg,"Thisに代入はできません。");
+	if(num==134) lstrcpy( msg,"ObjPtr関数にはオブジェクト インスタンス以外を指定できません。" );
 
 	//Enum関連
