註冊你自己的僞協議

註冊你自己的僞協議

如果你安裝了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;
}

發佈了47 篇原創文章 · 獲贊 178 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章