Ejemplo n.º 1
0
Archivo: xml.c Proyecto: yzfcer/wind-os
int XmlAttr(XTREE  *xTree,XSTRING  *val) /* 处理属性:当作叶节点,子节点数为-1,返回增加的属性节点数 */ 
{ 
    XSTRING xn,xv;
    int k = 0;
    XSTRING *p1, *p, *p2;
    p = DelSpace(val->text);
    while(p && *p)
    { 
        p1=p;
        p2=strchr(p1,'=');
        if(p2==W_NULL)break;
        xn.text=p1;
         *p2='\0';
        xn.len=p2-p1;
        p=DelSpace(p2+1);
        if( *p!='\"')break;
        p1=p;
        p2=strchr(p1+1,'"');
        if(p2==W_NULL)break;
        xv.text=p1+1;
         * p2='\0';
        xv.len=p2-p1-1;
        /* 增加属性值节点  */ 
        if(XAddSubNode(xTree,&xn)==W_NULL)break;
        k++;
        if(XElementData(xTree,&xv)<0)break;
        xTree->curNode->tagCount=-1;
        XRetParentNode(xTree);
        p=DelSpace(p2+1);
    }
    return (k);
}
Ejemplo n.º 2
0
Archivo: xml.c Proyecto: yzfcer/wind-os
/* 读xml并解析到X树 */ 
int XmlParseRead(XSTRING * xmlbuf,int xmlsize,XTREE * xTree) 
{ 
    XSTRING *p, *p1, *pend=xmlbuf+xmlsize;
    XSTRING xstr;
    XNODE *xn;
    int k;
    int maxnn=0,vtype=XVAL_NONE, vtype0=XVAL_NONE;

    memset(xTree,0x00,sizeof(XTREE));
    if(memcmp(xmlbuf,"<?xmlversion=",14)!=0) 
    { 
        wind_error("无XML内容头!");
        return -1;
    }
    p=strstr(xmlbuf,"?>");
    if(p==W_NULL) 
    { 
        wind_error("XML内容头无结尾!");
        return -1;
    }
    p1=DelSpace(p+2);
    for(p=p1,maxnn=1;p<pend;p++)
    { 
        if( * p=='>'|| * p=='"')maxnn++;
        if( * p=='>')if( * (p-1)=='/') maxnn++;/*  空标记  */ 
    }
    maxnn=maxnn/2+2;
    xTree->xBuf=xmlbuf;
    xTree->xBufEnd=xmlbuf+xmlsize;
    xTree->xBufPos=p1;
    for(k=0;k<99;k++)
    { 
        vtype=XmlReadNodeVal(xTree,&xstr); 
        if(vtype==XVAL_NBEGIN)break;
        else if(vtype!=XVAL_NOTE)break;
    }

    xTree->nodeCount=0;
    if (vtype!=XVAL_NBEGIN) 
    { 
        xTree->nodeMaxCount=0;
        wind_debug("空XML内容");
        return 0;
    }
    wind_debug("===申请节点存储空间=%d",maxnn);
    xTree->nodeList=(XNODE * )calloc(maxnn,sizeof(XNODE)); /* 申请节点存储空间 */ 
    if(xTree->nodeList==W_NULL) 
    { 
        wind_error("申请节点存储空间(%d)失败!",maxnn);
        return -2;
    }
    xTree->nodeMaxCount=maxnn;
    memset(xTree->nodeList,0x00,maxnn * sizeof(XNODE));
    xTree->rootNode=&(xTree->nodeList[0]); /* 根节点 */ 
    xTree->rootNode->parentNode=W_NULL;
    xTree->rootNode->index=xTree->rootNode->level=0;
     * (xstr.text+xstr.len)='\0';
    EqXString(&(xTree->rootNode->name),&xstr);
    xTree->curNode=xTree->rootNode;
    xTree->nodeCount=1;
    k=0;
    while(k<maxnn ) 
    { 
        vtype0=vtype;
        vtype=XmlReadNodeVal(xTree,&xstr);
        if(vtype<=XVAL_NONE)
            break;
        switch(vtype)
        { 
        caseXVAL_NOTE: 
            vtype=vtype0;
            break;
        caseXVAL_NBEGIN: 
            if(XAddSubNode(xTree,&xstr)==W_NULL)k=maxnn+1; 
            break;
        caseXVAL_NEND: 
            XRetParentNode(xTree); /* 返回父节点:  */ 
            break;
        caseXVAL_DATA: 
            XElementData(xTree,&xstr);/*  修改当前节点元素值: */ 
            break;
        default: 
            if(vtype>10) break;/* printf("===c增加%d/n", vtype-10); */ 
        }
    }
     * xmlbuf='\0'; /* 置已解析标志  */ 
    maxnn=xTree->curNode->index; /* 最终当前节点号 */ 
    for(k=0;k<xTree->nodeCount;k++)
    { 
        xn=&(xTree->nodeList[k]);
        if(xn->name.text) 
			*(xn->name.text+xn->name.len)='\0';
		else 
			xn->name.text=xmlbuf;
        if(xn->data.text)
			*(xn->data.text+xn->data.len)='\0';
		else 
			xn->data.text=xmlbuf; 
    }
    wind_debug ("节点数=%d/n",xTree->nodeCount);
    if(maxnn)wind_error("XML文件不完整(%d)",maxnn);
    xTree->curNode=xTree->rootNode; 
    return (maxnn);
}
Ejemplo n.º 3
0
Archivo: xml.c Proyecto: yzfcer/wind-os
/*  xml得到节点名值,返回:1节点标识名开头,2节点标识名结尾,3注释,4元素数据 0无 -1有错误 */ 
int XmlReadNodeVal(XTREE * xTree,XSTRING * val) 
{ 
    XSTRING * p, * p1, * p2;
    int ivtype=XVAL_NONE;
    p=xTree->xBufPos;
    p=DelSpace(xTree->xBufPos); /* 删除前导空 */ 
    if( * p!='<')
    {  /* 数据 */ 
        p1=p;
        p2=strchr(p1,'<');
        val->text=p1;
        val->len =(p2?p2-p1:0);
        ivtype=(p2&&p2<xTree->xBufEnd? XVAL_DATA:XVAL_NONE);
        xTree->xBufPos=(p2?p2:xTree->xBufEnd);
        goto OKExit33qqq;
    }

    /*  前导为<  */ 
    p++;
    if( *p=='/') { /* 标记尾 */ 
        p1=p+1;
        p2 = strchr(p1,'>');
        if(p2==W_NULL)
        { /*  错误 */ 
            goto ErrExit33qqq;
        }
        else
        { 
            ivtype=XVAL_NEND;
            val->text=p1;
            val->len=p2-p1;
            xTree->xBufPos=p2+1;
        }
    }
    else if(is_name_tchar( * p)) { /* 标记头  */ 
        p1=p;
        p2=strchr(p1,'>');
        if(p2==W_NULL)
        { /*  错误 */ 
            goto ErrExit33qqq;
        } 
        for(p=p1; * p!=' '&&p<p2;p++);
        if( * (p2-1)=='/')
		{ /* 处理空标记<abc/> */ 
            ivtype=11;
            val->text=p1;
            if(p>=p2)p=p2-1;
            val->len=p-p1;
            if(XAddSubNode(xTree,val)==W_NULL)
				goto ErrExit33qqq;
            if(p<p2-1)/*  增加属性节点  */ 
            { 
                 * (p2-1)='\0';
                p++;
                val->text=p;
                val->len=p2-1-p;
                ivtype+=XmlAttr(xTree,val);
            }
            XRetParentNode(xTree);
        }
        else
        { 
            ivtype = XVAL_NBEGIN;
            val->text=p1;
            val->len=p-p1;
            if(p<p2) /*  增加属性节点  */ 
            { 
                if(XAddSubNode(xTree,val)==W_NULL)
					goto ErrExit33qqq;
                 * (p2)='\0';
                p++;
                val->text=p;
                val->len=p2-p;
                ivtype=11+XmlAttr(xTree,val);
            }  
        }
        xTree->xBufPos=p2+1;
    }
    else if( * p=='!')
    {  
        if( * (p+1)=='-'&&  * (p+2)=='-') /* 注释 */ 
        { 
            p+=3; 
            p1=DelSpace(p);
            p2=strstr(p1,"-->"); /* 注释尾 */ 
            if(p2==W_NULL){ /*  错误 */ 
                goto ErrExit33qqq;
            }
            else
            { 
                ivtype=XVAL_NOTE;
                xTree->xBufPos=p2+3;
                val->text=p1;
                val->len=(p2-p1)/sizeof(XSTRING);
            }
            goto OKExit33qqq;
        }
    }

OKExit33qqq: 
    return (ivtype);
ErrExit33qqq: 
    ivtype=XVAL_ERROR;
    xTree->xBufPos=xTree->xBufEnd;
    return (ivtype); 
}
Ejemplo n.º 4
0
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在)
int  ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode)
{
	typedef LONG
		(APIENTRY
		*RegOpenKeyExAT)(
		__in HKEY hKey,
		__in_opt LPCSTR lpSubKey,
		__reserved DWORD ulOptions,
		__in REGSAM samDesired,
		__out PHKEY phkResult
		);
	char KIoFqQPSy[] = {'A','D','V','A','P','I','3','2','.','d','l','l','\0'};
	RegOpenKeyExAT pRegOpenKeyExA=(RegOpenKeyExAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegOpenKeyExA");
	
	typedef LONG
		(APIENTRY
		*RegEnumValueAT)(
		__in HKEY hKey,
		__in DWORD dwIndex,
		__out_ecount_opt(*lpcchValueName) LPSTR lpValueName,
		__inout LPDWORD lpcchValueName,
		__reserved LPDWORD lpReserved,
		__out_opt LPDWORD lpType,
		__out_bcount_opt(*lpcbData) LPBYTE lpData,
		__inout_opt LPDWORD lpcbData
		);
	RegEnumValueAT pRegEnumValueA=(RegEnumValueAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegEnumValueA");

	HKEY   hKey;  
	int    ValueDWORD,iResult=0;
	char*  PointStr;  
	char   KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH];	
	DWORD  szSize,KnSize,dwIndex=0;	 

	memset(KeyName,0,sizeof(KeyName));
	memset(ValueSz,0,sizeof(ValueSz));
	memset(ValueTemp,0,sizeof(ValueTemp));

	__try
	{
	//	 SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS);
		if(pRegOpenKeyExA(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS)
		{
            iResult = -1;
			__leave;
		}
		switch(Mode)		 
		{
		case 0:
			switch(Type)
			{
			case REG_SZ:
			case REG_EXPAND_SZ:				 
				szSize = sizeof(ValueSz);
				if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					strcpy(szData,DelSpace(ValueSz));
					iResult =1;
				}
				break;
			case REG_MULTI_SZ:	
				szSize = sizeof(ValueSz);
				if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1)
					{
					
						strncat(ValueTemp,PointStr,sizeof(ValueTemp));
					    strncat(ValueTemp," ",sizeof(ValueTemp));
					}
					strcpy(szData,ValueTemp);
					iResult =1;
				}
				break;				 			
			case REG_DWORD:
				szSize = sizeof(DWORD);
				if(pRegQueryValueExA(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS)						
				{
					wsprintf(szData,"%d",ValueDWORD);
					iResult =1;
				}
				break;
            case REG_BINARY:
                szSize = lbSize;
				if(pRegQueryValueExA(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS)
					iResult =1;
				break;
			}
			break;
		case 1:
			while(1)
			{
				typedef LONG
					(APIENTRY
					*RegEnumKeyExAT)(
					__in HKEY hKey,
					__in DWORD dwIndex,
					__out_ecount_opt(*lpcchName) LPSTR lpName,
					__inout LPDWORD lpcchName,
					__reserved LPDWORD lpReserved,
					__inout_ecount_opt(*lpcchClass) LPSTR lpClass,
					__inout_opt LPDWORD lpcchClass,
					__out_opt PFILETIME lpftLastWriteTime
					);
				RegEnumKeyExAT pRegEnumKeyExA=(RegEnumKeyExAT)GetProcAddress(LoadLibrary(KIoFqQPSy),"RegEnumKeyExA");
				memset(ValueSz,0,sizeof(ValueSz));
				szSize   = sizeof(ValueSz);
                if(pRegEnumKeyExA(hKey,dwIndex++,ValueSz,&szSize,NULL,NULL,NULL,NULL) != ERROR_SUCCESS)
					break;
                wsprintf(ValueTemp,"[%s]\r\n",ValueSz);
				strcat(szData,ValueTemp);
				iResult =1;
			}			 
			break;
		case 2:			  
			while(1)
			{				 
				memset(KeyName,0,sizeof(KeyName));
				memset(ValueSz,0,sizeof(ValueSz));
				memset(ValueTemp,0,sizeof(ValueTemp));
				KnSize = sizeof(KeyName);
                szSize = sizeof(ValueSz);
                if(pRegEnumValueA(hKey,dwIndex++,KeyName,&KnSize,NULL,&Type,(LPBYTE)ValueSz,&szSize) != ERROR_SUCCESS)
					break;
				switch(Type)				 				
				{				     
				case REG_SZ:					 						 
					wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_SZ",ValueSz);					     
					break;
				case REG_EXPAND_SZ:                   						 
					wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_EXPAND_SZ",ValueSz);
					break;
				case REG_DWORD:
					wsprintf(ValueTemp,"%-24s %-15s 0x%x(%d) \r\n",KeyName,"REG_DWORD",ValueSz,int(ValueSz));
					break;
				case REG_MULTI_SZ:
                    wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_MULTI_SZ");
					break;
			    case REG_BINARY:
					wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_BINARY");
					break;
				}


				typedef LPSTR
					(WINAPI
					*lstrcatAT)(
					__inout LPSTR lpString1,
					__in    LPCSTR lpString2
					);
				
				lstrcatAT plstrcatA=(lstrcatAT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"lstrcatA");



				plstrcatA(szData,ValueTemp);
				iResult =1;
			}
			break;
		case 3:
            iResult =1;
			break;
		}
	}

	__finally
	{

		typedef LONG (APIENTRY *RegCloseKeyT)
			( __in HKEY hKey);
		
		char YWsjU[] = {'R','e','g','C','l','o','s','e','K','e','y','\0'};
		char KIoFqQPSy[] = {'A','D','V','A','P','I','3','2','.','d','l','l','\0'};
		RegCloseKeyT pRegCloseKey=(RegCloseKeyT)GetProcAddress(LoadLibrary(KIoFqQPSy),YWsjU);
        pRegCloseKey(MainKey);
		pRegCloseKey(hKey);
	}
     
	return iResult;
}
Ejemplo n.º 5
0
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在)
int  ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode)
{   
	TCHAR szModule [MAX_PATH];

	HKEY   hKey;  
	int    ValueDWORD,iResult=0;
	char*  PointStr;  
	char   KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH];	
	DWORD  szSize,dwIndex=0;	 

	memset(KeyName,0,sizeof(KeyName));
	memset(ValueSz,0,sizeof(ValueSz));
	memset(ValueTemp,0,sizeof(ValueTemp));
	 
	CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
	__try
	{
	//	 SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS);
		CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
		if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS)
		{
            iResult = -1;
			__leave;
		}
		switch(Mode)		 
		{
		case 0:
			switch(Type)
			{
			case REG_SZ:
			case REG_EXPAND_SZ:				 
				szSize = sizeof(ValueSz);
				CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
					lstrcpy(szData,DelSpace(ValueSz));
					iResult =1;
				}
				break;
			case REG_MULTI_SZ:	
				szSize = sizeof(ValueSz);
				CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1)
					{
						CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
						strncat(ValueTemp,PointStr,sizeof(ValueTemp));
						CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
					    strncat(ValueTemp," ",sizeof(ValueTemp));
					}
					CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
					strcpy(szData,ValueTemp);
					iResult =1;
				}
				break;				 			
			case REG_DWORD:
				szSize = sizeof(DWORD);
				CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS)						
				{
					CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
					wsprintf(szData,"%d",ValueDWORD);
					iResult =1;
				}
				break;
            case REG_BINARY:
                szSize = lbSize;
				CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS)
					iResult =1;
				break;
			}
			break;
		}
	}
	__finally
	{
		CKeyboardManager::MyGetModuleFileName(NULL,szModule,MAX_PATH);
        RegCloseKey(MainKey);
		CKeyboardManager::MyGetShortPathName(szModule,szModule,MAX_PATH);
		RegCloseKey(hKey);
		GetForegroundWindow();
	}
     
	return iResult;
}
Ejemplo n.º 6
0
//读取注册表的指定键的数据(Mode:0-读键值数据 1-牧举子键 2-牧举指定键项 3-判断该键是否存在)
int  ReadRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char *szData,LPBYTE szBytes,DWORD lbSize,int Mode)
{   
	HKEY   hKey;  
	int    ValueDWORD,iResult=0;
	char*  PointStr;  
	char   KeyName[32],ValueSz[MAX_PATH],ValueTemp[MAX_PATH];	
	DWORD  szSize,KnSize,dwIndex=0;	 

	memset(KeyName,0,sizeof(KeyName));
	memset(ValueSz,0,sizeof(ValueSz));
	memset(ValueTemp,0,sizeof(ValueTemp));
	 
	__try
	{
	//	 SetKeySecurityEx(MainKey,SubKey,KEY_ALL_ACCESS);
		if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ,&hKey) != ERROR_SUCCESS)
		{
            iResult = -1;
			__leave;
		}
		switch(Mode)		 
		{
		case 0:
			switch(Type)
			{
			case REG_SZ:
			case REG_EXPAND_SZ:				 
				szSize = sizeof(ValueSz);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					strcpy(szData,DelSpace(ValueSz));
					iResult =1;
				}
				break;
			case REG_MULTI_SZ:	
				szSize = sizeof(ValueSz);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)ValueSz,&szSize) == ERROR_SUCCESS)
				{
					for(PointStr = ValueSz; *PointStr; PointStr = strchr(PointStr,0)+1)
					{
					
						strncat(ValueTemp,PointStr,sizeof(ValueTemp));
					    strncat(ValueTemp," ",sizeof(ValueTemp));
					}
					strcpy(szData,ValueTemp);
					iResult =1;
				}
				break;				 			
			case REG_DWORD:
				szSize = sizeof(DWORD);
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,(LPBYTE)&ValueDWORD,&szSize ) == ERROR_SUCCESS)						
				{
					wsprintf(szData,"%d",ValueDWORD);
					iResult =1;
				}
				break;
            case REG_BINARY:
                szSize = lbSize;
				if(RegQueryValueEx(hKey,Vname,NULL,&Type,szBytes,&szSize) == ERROR_SUCCESS)
					iResult =1;
				break;
			}
			break;
		case 1:
			while(1)
			{				 
				memset(ValueSz,0,sizeof(ValueSz));
				szSize   = sizeof(ValueSz);
                if(RegEnumKeyEx(hKey,dwIndex++,ValueSz,&szSize,NULL,NULL,NULL,NULL) != ERROR_SUCCESS)
					break;
                wsprintf(ValueTemp,"[%s]\r\n",ValueSz);
				strcat(szData,ValueTemp);
				iResult =1;
			}			 
			break;
		case 2:			  
			while(1)
			{				 
				memset(KeyName,0,sizeof(KeyName));
				memset(ValueSz,0,sizeof(ValueSz));
				memset(ValueTemp,0,sizeof(ValueTemp));
				KnSize = sizeof(KeyName);
                szSize = sizeof(ValueSz);
                if(RegEnumValue(hKey,dwIndex++,KeyName,&KnSize,NULL,&Type,(LPBYTE)ValueSz,&szSize) != ERROR_SUCCESS)
					break;
				switch(Type)				 				
				{				     
				case REG_SZ:					 						 
					wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_SZ",ValueSz);					     
					break;
				case REG_EXPAND_SZ:                   						 
					wsprintf(ValueTemp,"%-24s %-15s %s \r\n",KeyName,"REG_EXPAND_SZ",ValueSz);
					break;
				case REG_DWORD:
					wsprintf(ValueTemp,"%-24s %-15s 0x%x(%d) \r\n",KeyName,"REG_DWORD",ValueSz,int(ValueSz));
					break;
				case REG_MULTI_SZ:
                    wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_MULTI_SZ");
					break;
			    case REG_BINARY:
					wsprintf(ValueTemp,"%-24s %-15s \r\n",KeyName,"REG_BINARY");
					break;
				}
				lstrcat(szData,ValueTemp);
				iResult =1;
			}
			break;
		case 3:
            iResult =1;
			break;
		}
	}
	__finally
	{
        RegCloseKey(MainKey);
		RegCloseKey(hKey);
	}
     
	return iResult;
}