注册你自己的伪协议

注册你自己的伪协议

如果你安装了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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章