Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 571)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 572)
@@ -11,8 +11,8 @@
 	Jenga::Common::Strings parameterStrings;
 	SplitParameter( paramStr, parameterStrings );
-	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( params, parameterStrings, sourceIndex );
+	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( this->GetParameters(), parameterStrings, sourceIndex );
 
 	// 動的パラメータを作る
-	dynamicParams = params;
+	dynamicParams = this->GetParameters();
 	dynamicParams.insert( dynamicParams.begin(), new Parameter( "_System_LocalThis", Type( DEF_PTR_VOID ) ) );
 
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp	(revision 571)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Procedure.cpp	(revision 572)
@@ -146,4 +146,133 @@
 		//パラメータを追加
 		params.push_back( pParam );
+	}
+
+	return true;
+}
+
+bool LexicalAnalyzer::SetParamsAndReturnTypeForUserProc( UserProc &userProc, const char *sourceOfParams, int nowLine, bool isStatic )
+{
+	int i = 0;
+
+	//ソースコードの位置
+	userProc.SetCodePos( 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 ) );
+	}
+
+	//パラメータをコピー
+	BOOST_FOREACH( Parameter *pParam, userProc.GetParameters() ){
+		userProc.RealParams().push_back( new Parameter( *pParam ) );
 	}
 
@@ -318,9 +447,131 @@
 	// パラメータを解析
 	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
-	pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic );
+	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( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
+
+	// パラメータを解析
+	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
+	pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
+
+	// パラメータのエラーチェック
+	BOOST_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;
 }
 
@@ -411,5 +662,6 @@
 				if(source[i]=='\0') break;
 			}
-			dllProcs.Add(namespaceScopes,temporary,i);
+			DllProc *pDllProc = ParseDllProc( namespaceScopes, temporary, i );
+			dllProcs.Put( pDllProc );
 
 			continue;
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp	(revision 571)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Procedure.cpp	(revision 572)
@@ -94,132 +94,4 @@
 	}
 	return *pMethod;
-}
-
-bool UserProc::SetParamsAndReturnType( const char *sourceOfParams, int nowLine, bool isStatic ){
-	int i = 0;
-
-	//ソースコードの位置
-	this->codePos = nowLine;
-
-	//パラメータ
-	if(sourceOfParams[i]!='('){
-		compiler.errorMessenger.Output(1,NULL,nowLine);
-		return false;
-	}
-	if(sourceOfParams[i + 1]!=')'&& this->pParentClass ){
-		//クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす
-		if(this->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( !this->IsFunction() ){
-				// Sub/Macroの場合
-				compiler.errorMessenger.Output(38,this->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( params, parameters, nowLine );
-
-	// 省略可能パラメータ（古い仕様。非推奨）
-	this->secondParmNum = (int)this->params.size();
-	SplitParameter( parametersStr2, parameters );
-	ActiveBasic::Compiler::LexicalAnalyzer::AnalyzeParameter( params, parameters, nowLine );
-
-
-	if(returnTypeStr[0]){
-		///////////////////
-		// 戻り値を取得
-		///////////////////
-
-		if( !this->IsFunction() ){
-			// Sub/Macroの場合
-			compiler.errorMessenger.Output(38,this->GetName(),nowLine);
-		}
-
-		if( this->pParentClass ){
-			if( this->GetName() == this->pParentClass->GetName() ||
-				this->GetName()[0]=='~'){
-				//クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす
-				compiler.errorMessenger.Output(115,NULL,nowLine);
-			}
-		}
-
-		compiler.StringToType( returnTypeStr, this->returnType );
-		if( this->returnType.IsNull() )
-		{
-			compiler.errorMessenger.Output(3,returnTypeStr,nowLine);
-		}
-	}
-	else{
-		if( this->IsFunction() )
-		{
-			// Function定義なのに、戻り値の型がセットされていない
-			compiler.errorMessenger.Output(-104,this->GetName().c_str(),nowLine);
-
-			this->returnType.SetBasicType( DEF_DOUBLE );
-		}
-		else
-		{
-			//戻り値なしのSub定義
-			this->returnType.SetNull();
-		}
-	}
-
-	//リアルパラメータ領域を取得（_System_LocalThisを考慮して2つだけ多く確保する場合がある）
-
-	if( this->pParentClass && isStatic == false ){
-		//オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用
-		std::string name = "_System_LocalThis";
-		Type type( DEF_PTR_VOID );
-		this->realParams.push_back( new Parameter( name, type ) );
-	}
-
-	if( this->returnType.IsStruct() ){
-		//構造体を戻り値として持つ場合
-		//※第一パラメータ（Thisポインタありの場合は第二パラメータ）を戻り値用の参照宣言にする
-
-		std::string name = this->GetName();
-		if(name[0]==1&&name[1]==ESC_OPERATOR){
-			name="_System_ReturnValue";
-		}
-		Type type( DEF_STRUCT, this->returnType.GetIndex() );
-		this->realParams.push_back( new Parameter( name, type, true ) );
-	}
-
-	//パラメータをコピー
-	BOOST_FOREACH( Parameter *pParam, params ){
-		this->realParams.push_back( new Parameter( *pParam ) );
-	}
-
-	return true;
 }
 
@@ -383,5 +255,5 @@
 
 		//パラメータを追加
-		this->params.push_back( pParam );
+		this->GetParameters().push_back( pParam );
 
 		if(sourceOfParams[i]==','){
@@ -435,126 +307,4 @@
 }
 
-void DllProcs::Add(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;
-	}
-	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;
-		}
-		procName[i2]=buffer[i];
-	}
-	i++;
-
-	//ユーザー定義関数との重複チェック
-	if(GetSubHash(procName)){
-		compiler.errorMessenger.Output(15,procName,nowLine);
-		return;
-	}
-
-
-	//ライブラリ
-	char dllFileName[MAX_PATH];
-	i = GetOneParameter( buffer, i, dllFileName );
-	Type resultType;
-	_int64 i64data;
-	if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
-		return;
-	}
-	if( resultType.GetBasicType() != typeOfPtrChar ){
-		compiler.errorMessenger.Output(1,NULL,nowLine);
-		return;
-	}
-	lstrcpy( dllFileName, (char *)i64data );
-	CharUpper(dllFileName);
-	if(!strstr(dllFileName,".")){
-		lstrcat(dllFileName,".DLL");
-		if(lstrlen(dllFileName)>=16){
-			compiler.errorMessenger.Output(7,NULL,nowLine);
-			return;
-		}
-	}
-
-	//エイリアス
-	char alias[VN_SIZE];
-	i = GetOneParameter( buffer, i, alias );
-	if( alias[0] ){
-		if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
-			return;
-		}
-		if( resultType.GetBasicType() != typeOfPtrChar ){
-			compiler.errorMessenger.Output(1,NULL,nowLine);
-			return;
-		}
-		lstrcpy( alias, (char *)i64data );
-	}
-	else{
-		//省略されたときは関数名
-		lstrcpy( alias, procName );
-	}
-
-
-	// オブジェクトを生成
-	DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
-
-	// パラメータを解析
-	// ※第1パラメータにに指定するデータの例："( s As String ) As String"
-	pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
-
-	// パラメータのエラーチェック
-	BOOST_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);
-		}
-	}
-
-	// ハッシュマップに追加
-	this->Put( pDllProc );
-}
-
 bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
 	int i = 0;
@@ -676,5 +426,5 @@
 
 		//パラメータを追加
-		this->params.push_back( pParam );
+		this->GetParameters().push_back( pParam );
 
 		if(sourceOfParams[i]==','){
