⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuorder.cpp

📁 myie2.4版本的源代码
💻 CPP
字号:
#include "stdafx.h"
#include "Menuorder.h"

char MENU_ORDER_KEY[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites\\";

DWORD GetDWORD(LPBYTE& lpb, LPBYTE lpend)
{
	if(lpb+4>lpend && lpend!=NULL)
		return 0;

	DWORD dw = (DWORD)(*lpb);
	lpb+=4;
	return dw;
}

WORD GetWORD(LPBYTE& lpb, LPBYTE lpend)
{
	if(lpb+2>lpend && lpend!=NULL)
		return 0;

	WORD w = (WORD)(*lpb);
	lpb+=2;
	return w;
}

char* GetString(LPBYTE& lpb, LPBYTE lpend)
{
	int sl = strlen((char*)lpb);
	if(lpb+sl>lpend && lpend!=NULL)
		return NULL;

	if(sl>0)
	{
		char * lptemp;
		try
		{
			lptemp = new char[sl+1];
		}
		catch(CMemoryException* e)
		{
			if(e!=NULL)e->Delete();
			return NULL;
		}

		if(lptemp!=NULL)
		{
			strcpy(lptemp, (char*)lpb);
		}
		lpb+=sl;
		lpb++;
		return lptemp;
	}
	else
		return NULL;
}

char* GetStringW(LPBYTE& lpb, LPBYTE lpend)
{
	int sl = wcslen((wchar_t*)lpb);
	sl = sl*2;
	if(lpb+sl>lpend && lpend!=NULL)
		return NULL;

	if(sl>0)
	{
		char * lptemp;
		try
		{
			lptemp = new char[sl+2];
		}
		catch(CMemoryException* e)
		{
			if(e!=NULL)e->Delete();
			return NULL;
		}

		if(lptemp!=NULL)
		{
			WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)lpb, -1, lptemp, sl+2, NULL, NULL); 
			//strcpy(lptemp, (char*)lpb);
		}
		lpb+=sl;
		while(*lpb==0 && (lpb<=lpend || lpend==NULL))
			lpb++;
		return lptemp;
	}
	else
		return NULL;
}

void PutWORD(WORD w, LPBYTE& lpb)
{
	*lpb = LOBYTE(w);
	lpb ++;
	*lpb = HIBYTE(w);
	lpb++;
}

void PutDWORD(DWORD dw, LPBYTE& lpb)
{
	PutWORD(LOWORD(dw), lpb);
	PutWORD(HIWORD(dw), lpb);
}

void PutString(char* lpstr, LPBYTE& lpb)
{
	if(lpstr==NULL)
		return;
	strcpy((char*)lpb, lpstr);
	lpb += strlen(lpstr);
	lpb++;
}


BOOL CMenuOrder::LoadMenuOrder(LPCSTR sFolderPath)
{
	if(mois)
		delete[] mois;
	if(index)
		delete[] index;
	mois = NULL;
	index = NULL;
	len = 0;

	HKEY hKey;
	BOOL ret = FALSE;
	CString lpSubKey = MENU_ORDER_KEY;
	lpSubKey += sFolderPath;
	HRESULT hr = RegOpenKey(HKEY_CURRENT_USER, lpSubKey, &hKey);
	if(hr == ERROR_SUCCESS)
	{
		BYTE* lpBuf = NULL;
		DWORD size = 0;
		DWORD type = 0;
		hr = RegQueryValueEx(hKey, "Order", NULL, &type, NULL, &size);
		if(size>0)
		{
			try
			{
			lpBuf = new BYTE[size];
			}
			catch(CMemoryException* e)
			{
				RegCloseKey(hKey);
				if(e!=NULL)e->Delete();
				return FALSE;
			}

			hr = RegQueryValueEx(hKey, "Order", NULL, &type, lpBuf, &size);

			if(type == REG_BINARY)
			{
				BYTE* lpData = lpBuf;
				lpData += 8;
				cbsize = GetDWORD(lpData, NULL);
				reserved = GetDWORD(lpData, NULL);
				len = GetDWORD(lpData, NULL);
				if(len>0)
				{
					try
					{
					mois = new CMenuOrderItem[len];
					index = new int[len];
					ZeroMemory(index, len*sizeof(int));
					}
					catch(CMemoryException* e)
					{
						if(e!=NULL)e->Delete();
						len = 0;
					}

				}
				
				int len1, len2;
				for(int i =0; i< len && mois!= NULL; i++)
				{
					BYTE* lpend = lpBuf+size;
					BYTE* lpbt = lpData;
					len1 = mois[i].cbsize = GetDWORD(lpData, lpend);

					lpend = lpbt + len1;
					mois[i].order = GetDWORD(lpData, lpend);
					len2 = mois[i].len = GetWORD(lpData, lpend);
					mois[i].itemtype = GetWORD(lpData, lpend);
					mois[i].filesize = GetDWORD(lpData, lpend);
					mois[i].filedate = GetWORD(lpData, lpend);
					mois[i].filetime = GetWORD(lpData, lpend);
					mois[i].filetype = GetWORD(lpData, lpend);
					if((mois[i].itemtype & 4) != 0)
					{
						mois[i].longname = GetStringW(lpData, lpend);
					}
					else
						mois[i].longname = GetString(lpData, lpend);
					mois[i].shortname = GetString(lpData, lpend);
					if(mois[i].order>=0 && mois[i].order<len)
						index[mois[i].order] = i;

					lpData = lpbt + len1;
					ret = TRUE;
				}
			}
			delete[] lpBuf;
		}
		RegCloseKey(hKey);
	}
 
	return ret;
}


BOOL CMenuOrder::WriteMenuOrder(LPCSTR sFolderPath)
{
	//sort dir and files by string
	if(len<=0)
		return FALSE;
	try
	{
	index = new int[len];
	}
	catch(CMemoryException* e)
	{
		if(e!=NULL)e->Delete();
		return FALSE;
	}

	int i, j;
	index[0]=0;
	for(i = 1; i<len; i++)
	{
		for(j=i-1; j>=0; j--)
		{
			if(lstrcmpiA(mois[i].longname, mois[index[j]].longname)<0)
			{
				index[j+1]=index[j];
				if(j==0)
					index[j]=i;
			}
			else
			{
				index[j+1]=i;
				break;
			}
		}
	}


	cbsize = 12;
	reserved = 1;
	for(i =0; i<len; i++)
	{
		//calculate length
		if(mois[i].longname!=NULL && mois[i].shortname!=NULL)
			mois[i].cbsize = strlen(mois[i].longname)+1 + strlen(mois[i].shortname)+1;  
		mois[i].cbsize += 22+6;
		cbsize += mois[i].cbsize;
	}

	HKEY hKey;
	BOOL ret = FALSE;
	CString lpSubKey = MENU_ORDER_KEY;
	lpSubKey += sFolderPath;
	HRESULT hr = RegCreateKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
	int slen;

	if(hr == ERROR_SUCCESS)
	{
		LPBYTE lpbuf;
		try
		{
			 lpbuf = new BYTE[cbsize + 8];
		}
		catch(CMemoryException* e)
		{
			if(e!=NULL)e->Delete();
			lpbuf = NULL;
		}
		

		if(lpbuf!=NULL)
		{
			LPBYTE lpt = lpbuf;
			PutDWORD(0x08, lpt);
			PutDWORD(0x02, lpt);
			PutDWORD(cbsize, lpt);
			PutDWORD(reserved, lpt);
			PutDWORD(len, lpt);
			for(j=0; j<len; j++)
			{
				i = index[j];
				if(mois[i].itemtype != 0x31)
					continue;
				PutDWORD(mois[i].cbsize, lpt);
				PutDWORD(mois[i].order, lpt);
				slen = 0;
				if(mois[i].longname!=NULL)
					slen = strlen(mois[i].longname);
				if(mois[i].shortname!=NULL)
					slen += strlen(mois[i].shortname);
				PutWORD(slen+1+1+14, lpt);
				PutWORD(mois[i].itemtype, lpt);
				PutDWORD(mois[i].filesize, lpt);
				PutWORD(mois[i].filedate, lpt);
				PutWORD(mois[i].filetime, lpt);
				PutWORD(mois[i].filetype, lpt);
				PutString(mois[i].longname, lpt);
				PutString(mois[i].shortname, lpt);
				PutWORD((WORD)0, lpt); // end with two 0
				PutDWORD((DWORD)0, lpt); //item end
			}
			for(j=0; j<len; j++)
			{
				i = index[j];
				if(mois[i].itemtype != 0x32)
					continue;
				PutDWORD(mois[i].cbsize, lpt);
				PutDWORD(mois[i].order, lpt);
				slen = 0;
				if(mois[i].longname!=NULL)
					slen = strlen(mois[i].longname);
				if(mois[i].shortname!=NULL)
					slen += strlen(mois[i].shortname);
				PutWORD(slen+1+1+14, lpt);
				PutWORD(mois[i].itemtype, lpt);
				PutDWORD(mois[i].filesize, lpt);
				PutWORD(mois[i].filedate, lpt);
				PutWORD(mois[i].filetime, lpt);
				PutWORD(mois[i].filetype, lpt);
				PutString(mois[i].longname, lpt);
				PutString(mois[i].shortname, lpt);
				PutWORD((WORD)0, lpt); // end with two 0
				PutDWORD((DWORD)0, lpt); //item end
			}

			//save
			RegSetValueEx(hKey, "Order", 0, REG_BINARY, lpbuf, cbsize+8);

			//release
			delete[] lpbuf;

			ret = TRUE;
		}
	}
	RegCloseKey(hKey);

	return ret;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -