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