BOOL CListCtrl::LoadColumnsState(HKEY hRootKey,LPCSTR lpKey,LPCSTR lpSubKey)
{
	CRegKey RegKey;
	if (lpKey==NULL)
		RegKey.m_hKey=hRootKey;
	else if (RegKey.OpenKey(hRootKey,lpKey,CRegKey::openExist|CRegKey::samRead)!=ERROR_SUCCESS)
		return FALSE;
	DWORD nDataLength=RegKey.QueryValueLength(lpSubKey);
	if (nDataLength<4)
	{
		if (lpKey==NULL)
			RegKey.m_hKey=NULL;
		return FALSE;
	}
	int* pData=(int*)new BYTE[nDataLength];
	DWORD dwRet=RegKey.QueryValue(lpSubKey,(LPSTR)pData,nDataLength);
	if (lpKey==NULL)
		RegKey.m_hKey=NULL;
	if (dwRet<nDataLength)
	{
		delete[] (BYTE*)pData;
		return FALSE;
	}

	if ((pData[0]*2+1)*sizeof(int)!=nDataLength)
	{
		delete[] (BYTE*)pData;
		return FALSE;
	}
	BOOL nOrderOK=FALSE;
	for (int i=0;i<pData[0];i++)
	{
		SetColumnWidth(i,pData[1+i]);
		if (pData[1+pData[0]+i]!=0)
			nOrderOK=TRUE;
	}	
	if (nOrderOK)
		SetColumnOrderArray(pData[0],pData+1+pData[0]);
	delete[] (BYTE*)pData;
	return TRUE;
}