註冊你自己的僞協議
如果你安裝了QQ或者TM,在地址欄輸入如下形式:tencent://Message/?uin=xxxxxx&websiteName=q-zone.qq.com&Menu=yes
便會調用Timwp.exe會進行解析處理。
這種形如標準協議HTTP,FTP的自定義協議叫做僞協議。如何註冊一個僞協議?其實很簡單,只要修改註冊表相關地方即可。下面是註冊僞協議的函數:
// ***************************************************************
// function : AddFakePro
// purpose : 註冊一個僞協議
//
// parameter : [IN] lpProName 協議名字,其實就是僞協議的標識
// [IN] lpProDescription 僞協議的描述
// [IN] lpExePath 遇到該僞協議時,系統會自動調用這個EXE程序進行解析
//
// author : liangyu
// created : 2008-1-30 14:10
// ***************************************************************
BOOL AddFakePro(char *lpProName, char *lpProDescription, char *lpExePath)
{
BOOL bRet = FALSE;
HKEY hKey = NULL;
HKEY hSubKey = NULL;//hKey的子鍵
HKEY hSubKey2 = NULL;//hSubKey得子鍵
HKEY hSubKey3 = NULL;//hSubKey2的子鍵
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_CLASSES_ROOT, lpProName, 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL))
{
RegCloseKey(hKey);
return bRet;
}
if (ERROR_SUCCESS != RegSetValueEx(hKey, NULL, 0, REG_SZ, //這是協議描述
(LPBYTE)lpProDescription, strlen(lpProDescription)+1))
{
RegCloseKey(hKey);
return bRet;
}
if (ERROR_SUCCESS != RegSetValueEx(hKey, "URL Protocol", 0, REG_SZ, //這一步不可少,否則出現語法錯誤
(LPBYTE)lpExePath, strlen(lpExePath)+1))
{
RegCloseKey(hKey);
return bRet;
}
//圖標在下面設置
if (ERROR_SUCCESS != RegCreateKeyEx(hKey, "DefaultIcon", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubKey, NULL))
{
RegCloseKey(hKey);
RegCloseKey(hSubKey);
return bRet;
}
//圖標在上面設置
RegCloseKey(hSubKey);
if (ERROR_SUCCESS != RegCreateKeyEx(hKey, "shell", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubKey, NULL))
{
RegCloseKey(hKey);
RegCloseKey(hSubKey);
return bRet;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hSubKey, "open", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubKey2, NULL))
{
RegCloseKey(hKey);
RegCloseKey(hSubKey);
RegCloseKey(hSubKey2);
return bRet;
}
if (ERROR_SUCCESS != RegCreateKeyEx(hSubKey2, "command", 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hSubKey3, NULL))
{
RegCloseKey(hKey);
RegCloseKey(hSubKey);
RegCloseKey(hSubKey2);
RegCloseKey(hSubKey3);
return bRet;
}
CString strCommand;
strCommand += "\"";
strCommand += lpExePath;
strCommand += "\"";
strCommand += " ";
strCommand += "\"";
strCommand += "%1";
strCommand += "\"";
if (ERROR_SUCCESS == RegSetValueEx(hSubKey3, NULL, 0, REG_SZ, //這一步不可少,否則無法觸發
(LPBYTE)(LPCTSTR)strCommand, strCommand.GetLength()+1))
{
bRet = TRUE;
}
RegCloseKey(hSubKey3);
RegCloseKey(hSubKey2);
RegCloseKey(hSubKey);
RegCloseKey(hKey);
return bRet;
}