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

📄 association.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		wsprintf(szBuf, _T("%s\\Shell\\Open\\Command"), szSubKey);

		//僐儅儞僪儔僀儞庢摼
		//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-Shell-Open-Command-(嬻敀)
		if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
			_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
			continue;

		dwType = REG_SZ;
		dwDataSize = sizeof(szTemp);
		if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
		{
			RegCloseKey(hKeyWk);
			continue;
		}
		RegCloseKey(hKeyWk);
		memset(szTemp, 0x00, sizeof(szTemp));
		memcpy(szTemp, lpData, dwDataSize);

		//傾僾儕働乕僔儑儞柤
		//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-(嬻敀)
		hKeyWk = 0;
		if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szSubKey, 0,
			_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
			continue;

		dwType = REG_SZ;
		dwDataSize = sizeof(szAppName);
		if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
		{
			RegCloseKey(hKeyWk);
			continue;
		}
		RegCloseKey(hKeyWk);
		memset(szAppName, 0x00, sizeof(szAppName));
		memcpy(szAppName, lpData, dwDataSize);

		//傾僀僐儞ID(儕僜乕僗ID)
		//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-DefaultIcon
		wsprintf(szBuf, _T("%s\\DefaultIcon"), szSubKey);
		hKeyWk = 0;
		if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
			_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
			continue;

		nIconID = 0;
		dwType = REG_SZ;
		dwDataSize = MAX_PATH*sizeof(TCHAR);
		if (ERROR_SUCCESS==RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
		{
			TCHAR szIconBuf[MAX_PATH];
			memset(szIconBuf, 0x00, sizeof(szIconBuf));
			memcpy(szIconBuf, lpData, dwDataSize);

			LPTSTR lpszTemp = wcsrchr(szIconBuf, _T(','));
			if(lpszTemp)
			{
				*lpszTemp = 0x00;
				wcscpy(szIconPath, szIconBuf);
				nIconID = wcstol((lpszTemp+1), 0, 10);
			}
		}
		RegCloseKey(hKeyWk);

		//搊榐敾掕
		LPTSTR lpszStart = szTemp;
		if(lpszStart[0] == _T('\"')) lpszStart++;

		LPTSTR lpszEnd = lpszStart;
		for(;;)
		{
			lpszEnd = wcschr(lpszEnd, _T('.'));
			if(!lpszEnd) break;
			
			TCHAR szExt[4];
			memset(szExt, 0x00, sizeof(szExt));
			wcsncpy(szExt, ++lpszEnd, 3);

			if(0==wcsicmp(szExt, _T("EXE")))
			{
				lpszEnd+=3;
				*lpszEnd=0x00;
				break;
			}
		} //End of for

		//庢摼幐攕偺応崌
		if(!lpszEnd) continue;

		//梋暘側嬻敀傪嶍彍
		lpszEnd++;
		while(lpszEnd)
		{
			if(*lpszEnd != _T(' ')) break;
			lpszEnd++;
		} //End of while
		wcscpy(szCommand, lpszEnd);
		wcscpy(szAppPath, lpszStart);

		//僷僗偑側偄応崌偼"\Windows"僼僅儖僟偲偡傞
		if(0!=wcslen(szAppPath) && !wcschr(szAppPath, _T('\\')))
		{
			TCHAR szAppBuf[MAX_PATH];
			wcscpy(szAppBuf, szAppPath);
			wsprintf(szAppPath, _T("%s\\%s"), g_MainWnd.m_szWindowsPath, szAppBuf);
		}
		if(0!=wcslen(szIconPath) && !wcschr(szIconPath, _T('\\')))
		{
			TCHAR szAppBuf[MAX_PATH];
			wcscpy(szAppBuf, szIconPath);
			wsprintf(szIconPath, _T("%s\\%s"), g_MainWnd.m_szWindowsPath, szAppBuf);
		}
		//傾僾儕働乕僔儑儞偑側偄応崌偼柍帇
		if(GetFileAttributes(szAppPath) == 0xFFFFFFFF)
			continue;

		//庢摼僨乕僞奿擺
		APPLICATIONLIST *lpList = new APPLICATIONLIST;
		//1.奼挘巕
		lpList->lpszExt = new TCHAR[wcslen(szExt)];
		wcscpy(lpList->lpszExt, (szExt+1));
		//2.僉乕柤
		lpList->lpszKeyName = new TCHAR[wcslen(szSubKey)+1];
		wcscpy(lpList->lpszKeyName, szSubKey);
		//3.傾僾儕働乕僔儑儞柤
		lpList->lpszAppName = new TCHAR[wcslen(szAppName)+1];
		wcscpy(lpList->lpszAppName, szAppName);
		//4.傾僾儕働乕僔儑儞僷僗
		lpList->lpszAppPath = new TCHAR[wcslen(szAppPath)+1];
		wcscpy(lpList->lpszAppPath, szAppPath);
		//5.僐儅儞僪儔僀儞
		lpList->lpszCommand = new TCHAR[wcslen(szCommand)+1];
		wcscpy(lpList->lpszCommand, szCommand);
		//6.傾僀僐儞
		lpList->lpszIconPath = new TCHAR[wcslen(szIconPath)+1];
		lpList->nIconID = nIconID;
		//7.僀儊乕僕儕僗僩僀儞僨僢僋僗
		lpList->nImageIndex = 0;
		//8.師儗僐乕僪億僀儞僞
		lpList->lpNext = NULL;

		//儕僗僩偺楢寢
		if(lpOldList) lpOldList->lpNext = lpList;

		//愭摢傾僪儗僗曐懚
		if(!m_lpAppList) m_lpAppList = lpList;

		//師偺儗僐乕僪偺弨旛
		lpOldList = lpList;

	} //End of for

	delete[] lpData;

	//儗僕僗僩儕僉乕偺僋儘乕僘
	RegCloseKey(hKey);

	return;
}

///////////////////////////////////////////////////////////////
void CAssociation::DeleteAppList()
{
	//傾僾儕働乕僔儑儞儕僗僩嶍彍
	while(m_lpAppList)
	{
		APPLICATIONLIST *lpList = NULL;
		lpList = m_lpAppList;
		m_lpAppList = lpList->lpNext;

		delete[] lpList->lpszExt;
		delete[] lpList->lpszKeyName;
		delete[] lpList->lpszAppName;
		delete[] lpList->lpszAppPath;
		delete[] lpList->lpszCommand;
		delete[] lpList->lpszIconPath;
		delete lpList;

	} //End of while;

	return;
}

///////////////////////////////////////////////////////////////
BOOL CAssociation::SetApplication(LPTSTR lpszPath, LPTSTR lpszKeyName, LPTSTR lpszAppName, LPTSTR lpszParam, LPTSTR lpszIconPath, int nIconID)
{
	//僂傿儞僪僂僘僼僅儖僟偺応崌偼僷僗傪嶍彍偡傞
	TCHAR szPath[MAX_PATH];
	wcscpy(szPath, lpszPath);
	LPTSTR lpszTemp = wcsrchr(szPath, _T('\\'));
	if(lpszTemp)
	{
		*lpszTemp = 0x00;
		if(0==wcsicmp(g_MainWnd.m_szWindowsPath, szPath))
			lpszPath = ++lpszTemp;
	}

	//僉乕柤嶌惉
	TCHAR szKeyName[MAX_PATH];
	memset(szKeyName, 0x00, sizeof(szKeyName));
	if(lpszKeyName)
		wcscpy(szKeyName, lpszKeyName);
	else
	{
		//僷僗偺暘夝
		LPTSTR lpszStart = wcsrchr(lpszPath, _T('\\'));
		if(!lpszStart)
			lpszStart = lpszPath;
		else
			lpszStart++;

		LPTSTR lpszEnd = wcsrchr(lpszStart, _T('.'));
		if(lpszEnd)
			wcsncpy(szKeyName, lpszStart, (lpszEnd-lpszStart));
		else
			wcscpy(szKeyName, lpszStart);
	}

	//傾僾儕働乕僔儑儞柤
	TCHAR szAppName[MAX_PATH];
	memset(szAppName, 0x00, sizeof(szAppName));
	wcscpy(szAppName, (lpszAppName?lpszAppName:szKeyName));

	//僐儅儞僪儔僀儞
	TCHAR szCommand[MAX_PATH];
	lpszTemp = wcschr(lpszPath, _T(' '));
	if(lpszTemp)
	{
		//僐儅儞僪儔僀儞嶌惉("僼傽僀儖柤" "%1")
		wsprintf(szCommand, _T("\"%s\" %s"),
			lpszPath, (lpszParam?lpszParam:_T("\"%1\"")));
	}
	else
	{
		//僐儅儞僪儔僀儞嶌惉(僼傽僀儖柤 "%1")
		wsprintf(szCommand, _T("%s %s"),
			lpszPath, (lpszParam?lpszParam:_T("\"%1\"")));
	}

	//僨僼僅儖僩傾僀僐儞
	TCHAR szDefaultIcon[MAX_PATH];
	wsprintf(szDefaultIcon, _T("%s,%d"), (lpszIconPath?lpszIconPath:lpszPath), nIconID);

	HKEY hKey;
	DWORD dwDisposition;
	//儗僕僗僩儕搊榐
	//儗僕僗僩儕乕僉乕偺僆乕僾儞1
	//HKEY_CLASSES_ROOT-僉乕柤
	if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szKeyName, 0,
		_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
		return FALSE;

	//儗僕僗僩儕偺搊榐1
	//HKEY_CLASSES_ROOT-僉乕柤-(嬻敀)"傾僾儕働乕僔儑儞柤"
	RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szAppName, ((wcslen(szAppName)+1)  * sizeof(TCHAR)));

	//儗僕僗僩儕僉乕偺僋儘乕僘1
	RegCloseKey(hKey);

	//儗僕僗僩儕乕僉乕偺僆乕僾儞2
	//HKEY_CLASSES_ROOT-僉乕柤-Shell-Open-Command
	TCHAR szBuf[MAX_PATH];
	wsprintf(szBuf, _T("%s\\Shell\\Open\\Command"), szKeyName);
	if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
		_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
		return FALSE;

	//儗僕僗僩儕偺搊榐2
	//HKEY_CLASSES_ROOT-僉乕柤-Shell-Open-Command-(嬻敀)"僐儅儞僪"
	RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szCommand, ((wcslen(szCommand)+1)  * sizeof(TCHAR)));

	//儗僕僗僩儕僉乕偺僋儘乕僘2
	RegCloseKey(hKey);

	//儗僕僗僩儕乕僉乕偺僆乕僾儞3
	//HKEY_CLASSES_ROOT-僉乕柤-DefaultIcon
	wsprintf(szBuf, _T("%s\\DefaultIcon"), szKeyName);
	if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
		_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
		return FALSE;

	//儗僕僗僩儕偺搊榐3
	//HKEY_CLASSES_ROOT-僉乕柤-DefaultIcon-(嬻敀)"僐儅儞僪"
	RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szDefaultIcon, ((wcslen(szDefaultIcon)+1)  * sizeof(TCHAR)));

	//儗僕僗僩儕僉乕偺僋儘乕僘3
	RegCloseKey(hKey);

	return TRUE;
}

///////////////////////////////////////////////////////////////
BOOL CAssociation::SetAssociation(LPTSTR lpszKeyName)
{
	HKEY hKey;
	DWORD dwDisposition;
	//儗僕僗僩儕乕僉乕偺僆乕僾儞
	//HKEY_CLASSES_ROOT-奼挘巕
	if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, m_lpszExt, 0,
		_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
		return FALSE;

	//儗僕僗僩儕偺搊榐1
	//HKEY_CLASSES_ROOT-奼挘巕-(嬻敀)"僉乕柤"
	RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)lpszKeyName, ((wcslen(lpszKeyName)+1)  * sizeof(TCHAR)));

	//儗僕僗僩儕僉乕偺僋儘乕僘1
	RegCloseKey(hKey);

	return TRUE;
}

///////////////////////////////////////////////////////////////
BOOL CAssociation::DeleteSubKey(LPTSTR lpszSubKey)
{
	HKEY hKey;
	//儗僕僗僩儕僉乕僆乕僾儞
	//HKEY_CLASSES_ROOT-巜掕僒僽僉乕(奼挘巕)
	if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,lpszSubKey,0,KEY_ALL_ACCESS,&hKey))
		return FALSE;

	//僒僽僉乕専嶕
	BYTE* lpData = new BYTE[MAX_PATH];
	APPLICATIONLIST *lpOldList = NULL;
	for(int i=0; ;i++)
	{
		TCHAR szSubKey[MAX_PATH];
		TCHAR szTemp[MAX_PATH];

		//僒僽僉乕偺庢摼
		FILETIME ftime;
		DWORD dwDataSize = sizeof(szSubKey);
		if(ERROR_SUCCESS!=RegEnumKeyEx(hKey, i, szSubKey, &dwDataSize, NULL, NULL, NULL, &ftime))
			break;

		//嵞婲屇傃弌偟(僒僽僉乕偺僒僽僉乕嶍彍)
		wsprintf(szTemp, _T("%s\\%s"), lpszSubKey, szSubKey);
		DeleteSubKey(szSubKey);

	} //End of for

	//儗僕僗僩儕僉乕偺僋儘乕僘
	RegCloseKey(hKey);

	//儗僕僗僩儕僉乕僆乕僾儞
	//HKEY_CLASSES_ROOT
	if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,_T(""),0,KEY_ALL_ACCESS,&hKey))
		return FALSE;

	//儗僕僗僩儕僒僽僉乕嶍彍
	//HKEY_CLASSES_ROOT-巜掕僒僽僉乕(奼挘巕)
	LONG nRtn = RegDeleteKey(hKey, lpszSubKey);

	//儗僕僗僩儕僉乕偺僋儘乕僘
	RegCloseKey(hKey);

	return (nRtn==ERROR_SUCCESS ? TRUE : FALSE);
}

///////////////////////////////////////////////////////////////
void CAssociation::InitAppImageList(HWND hList)
{
	//僀儊乕僕儕僗僩偺嶍彍
	ImageList_RemoveAll(m_hImageList);
	ImageList_Destroy(m_hImageList);

	//僀儊乕僕儕僗僩偺嶌惉
	m_hImageList = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 1, 2);

	//僀儊乕僕儕僗僩偺愝掕
	ListView_SetImageList(hList, m_hImageList, LVSIL_SMALL);

	APPLICATIONLIST *lpList = m_lpAppList;
	for(int i=0; lpList; i++)
	{
		//僀儊乕僕儕僗僩傊捛壛
		SHFILEINFO shfi;
		SHGetFileInfo(lpList->lpszAppPath, NULL, &shfi, sizeof(shfi), SHGFI_SMALLICON | SHGFI_ICON);
		lpList->nImageIndex = ImageList_AddIcon(m_hImageList, shfi.hIcon);
		DestroyIcon(shfi.hIcon);
	
		lpList = lpList->lpNext;

	}//End of for
}

///////////////////////////////////////////////////////////////
void CAssociation::DeleteAppImageList()
{
	//僀儊乕僕儕僗僩偺嶍彍
	if(0!=m_hImageList)
	{
		ImageList_RemoveAll(m_hImageList);
		ImageList_Destroy(m_hImageList);
	}
}
///////////////////////////////////////////////////////////////
void CAssociation::LoadAppList(LPTSTR szSelectAppPath)
{
	//旕昞帵
	ShowWindow(m_hListView, SW_HIDE);

	//儕僗僩偺嶍彍
	ListView_DeleteAllItems(m_hListView);

	//僀儊乕僕儕僗僩嶌惉
	InitAppImageList(m_hListView);

	APPLICATIONLIST *lpList = m_lpAppList;
	for(int i=0; lpList; i++)
	{
		//傾僀僥儉偺捛壛
		LVITEM lvitem;
		lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		lvitem.iItem = i;
		lvitem.iSubItem = 0;
		lvitem.iImage = lpList->nImageIndex;
		lvitem.lParam = (DWORD)lpList;
		lvitem.pszText = lpList->lpszAppName;
		int nIndex = ListView_InsertItem(m_hListView, &lvitem);
		
		if((szSelectAppPath && 0==wcsicmp(szSelectAppPath, lpList->lpszAppPath)) ||
		   (!szSelectAppPath && 0==wcsicmp(m_szExtType, lpList->lpszKeyName)))
			ListView_SetItemState(m_hListView, nIndex, LVIS_SELECTED, LVIS_SELECTED);

		lpList = lpList->lpNext;

	}//End of for
	
	//夋柺傪僗僋儘乕儖偝偣慖戰傾僀僥儉傪昞帵
	int nItem = ListView_GetNextItem(m_hListView, -1, LVNI_ALL|LVNI_SELECTED);
	if(nItem >= 0)
		ListView_EnsureVisible(m_hListView, nItem, FALSE);

	//旕昞帵
	ShowWindow(m_hListView, SW_SHOW);

	SetFocus(m_hListView);
}

///////////////////////////////////////////////////////////////
void CAssociation::LoadAppList2()
{
	//旕昞帵
	ShowWindow(m_hListView2, SW_HIDE);

	//儕僗僩偺嶍彍
	ListView_DeleteAllItems(m_hListView2);

	//僀儊乕僕儕僗僩嶌惉
	InitAppImageList(m_hListView2);

	APPLICATIONLIST *lpList = m_lpAppList;
	for(int i=0; lpList; i++)
	{
		//傾僀僥儉偺捛壛
		LVITEM lvitem;
		lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
		lvitem.iItem = i;
		lvitem.iSubItem = 0;
		lvitem.iImage = lpList->nImageIndex;
		lvitem.lParam = (DWORD)lpList;
		lvitem.pszText = lpList->lpszExt;
		int nIndex = ListView_InsertItem(m_hListView2, &lvitem);
		ListView_SetItemText(m_hListView2, nIndex, 1, lpList->lpszAppName);
		
		lpList = lpList->lpNext;

	}//End of for

	//旕昞帵
	ShowWindow(m_hListView2, SW_SHOW);

	SetFocus(m_hListView2);
}

///////////////////////////////////////////////////////////////
APPLICATIONLIST *CAssociation::GetSelectItem(HWND hList, int nSubItem, int nType)
{
	//慖戰傾僀僥儉傪専嶕
	int nItem = ListView_GetNextItem(hList, -1, LVNI_ALL|LVNI_SELECTED);
	if(nItem == -1)
		return NULL;

	//傾僀僥儉庢摼
	TCHAR szBuf[MAX_PATH];
	ListView_GetItemText(hList, nItem, nSubItem, szBuf, sizeof(szBuf));

	//傾僾儕働乕僔儑儞慖戰
	nItem = -1;
	APPLICATIONLIST *lpList = m_lpAppList;
	for(int i=0; lpList; i++)
	{
		if(nType == FINDTYPE_APPNAME &&
		   0==wcscmp(szBuf, lpList->lpszAppName))
		{
			nItem = i;
			break;
		}

⌨️ 快捷键说明

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