前天在BruceZhang 的一篇博文《求助:如何在ASP页面中调用Winform程序呢?》中回 答了他提出的问题,但细想下觉得我的思路有误。
今天在试用WebQQ的时候,无聊 中想起很多人的博客上都有这样的小玩意, , 点击下 就可以和博主进行对话,而且无需加博主为好友。
哎,这样的方式不就正好是 BruceZhang那个问题的解决方案吗?那么腾讯是怎么做到在Web页面中调用QQ程序的呢?
先来看腾讯提供给我们的代码:
<a href="tencent://message/? uin=88888888&Site=JooIT.com&Menu=yes">
<img border="0" SRC='/uploads/2011/1104/0QQQ032-1.gif' alt="点击这里给我发消息">
</a>
很显然,奥妙就在“tencent://message/? uin=215555521&Site=JooIT.com&Menu=yes”这里,那这又到底是什么原理 呢?
先扯开话题按自己的思路来想,要打开本地的QQ,肯定要分两步走,首先是 定位到QQ,然后是传递给它一些参数,也就是 “uin=215555521&Site=JooIT.com&Menu=yes”这样的东西。定位的 话,借助注册表是最明显的方式了。可怎么把QQ跑起来呢?要我们自己去启动一个进程么 ?答案是否定的,Windows操作系统考虑了这一点,允许我们为自己的应用程序注册为一 个协议处理者,具体参见MSDN上的文章《Registering an Application to a URL Protocol》
腾讯的Tencent://Message协议注册表如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTTencent]
@="TencentProtocol"
"URL Protocol"="D:\Program Files\Tencent\QQ\Timwp.exe"
[HKEY_CLASSES_ROOTTencentDefaultIcon]
@="D:\Program Files\Tencent\QQ\Timwp.exe,1"
[HKEY_CLASSES_ROOTTencentshell]
[HKEY_CLASSES_ROOTTencentshellopen]
[HKEY_CLASSES_ROOTTencentshellopencommand]
@=""D:\Program Files\Tencent\QQ\Timwp.exe" "% 1""
此注册表所实现的就是当浏览器(或其它)碰到 tencent://… 时,自动调用 Timwp.exe,并把 tencent://… 地址作为第 一个参数传递给 Timwp.exe。
废话不多说,下面就动手实验一个demo来说明一切 ,源代码请在文章首部自行下载。很简单的功能,就是显示传递给MFC Dialog程序的参数 值。就只分析下我添加的代码:
首先需要获取传入的参数,在控制台程序中我们 都知道main()函数的参数argv里带入了传入的参数,而在MFC程序中则需要在 InitInstance()中进行命令行参数解析。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
为了给对话框传入待显示的参数,加入了一个SetDisplayInfo方法。
CHelloWorldDlg dlg;
dlg.SetDisplayInfo(cmdInfo.m_strFileName);//设置待显示的信息
void CHelloWorldDlg::SetDisplayInfo(CString& strInfo)
{
this->m_strInfo = strInfo;
}
最后在OnInitDialog函数中进行参数解析
//解析传入的完 整地址,e.g "helloworld://hello world/"
int pos = m_strInfo.Find("//");//找到分隔符
m_strInfo = m_strInfo.Mid(pos+2);//取到传入的参数
m_strInfo.Delete(m_strInfo.GetLength()-1);//去掉最后的'/'
m_edit_info.SetWindowText(m_strInfo);