由Tencent://Message协议想到的一个解决方案

前天在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);

时间: 2024-09-09 10:04:17

由Tencent://Message协议想到的一个解决方案的相关文章

个域网通讯协议 ZigBee - 另一个不老的短距离、低功耗无线通信技术

个域网通讯协议 ZigBee - 另一个不老的短距离.低功耗无线通信技术 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 本来没想发此篇,对于 zigbee 的兴趣没这么深刻,可是看到下面截取百

stp-STP协议端口的一个小疑惑

问题描述 STP协议端口的一个小疑惑 为什么根网桥的这几个端口cost也是19 解决方案 STP协议

新建一个解决方案,如何导入已有窗体和代码等?

问题描述 新建一个解决方案,如何导入已有窗体和代码等? ## # 我就是个初学的小菜鸟,就想更改一下解决方案的修改时间,新建一个解决方案,但是如何将已有的项目.窗体.代码.工程这些东西导入进去?又被卡在这儿了...希望热心人帮助解决..... 解决方案 新建一个解决方案后,将已有窗体和代码复制到此解决方案的所在的对应目录中 如果是 Eclpse,会自动将这些已有窗体和代码增加到解决方案中 如果是 VS2008等,需要手动在工程中通过右键菜单来完成增加已有窗体和代码到项目中 解决方案二: 这还不简

VS2008+Qt一个解决方案下有多个项目是什么意思?这样做有什么用?各个项目之间文件有什么联系?

问题描述 VS2008+Qt一个解决方案下有多个项目是什么意思?这样做有什么用?各个项目之间文件有什么联系? 1.一个解决方案下有几个项目,这样是做什么用的?2.我看这几个项目里包含有部分相同的文件,这样是什么意思? 如果改动其中一个项目的文件,其他项目里的该文件会怎么样?3.之前查的资料说是什么引用,没看懂. 请求指点.谢谢你们! 解决方案 要具体看什么解决方案什么项目. 比如说一个经典的程序,分为客户端.服务器端,那么就要2个项目.其中客户端和服务器端显然共用调用接口之类的代码,那么这些代码

网络编程-我想用c在linux上做一个爬虫,但是遇到有些网站不能用ip访问求一个解决方案

问题描述 我想用c在linux上做一个爬虫,但是遇到有些网站不能用ip访问求一个解决方案 比如58同城,我ping出它的ip,然后用浏览器访问,结婚连接不上!求各位大神帮帮忙! 解决方案 用域名访问,在你的http请求中加上host字段,里面写域名

vs2012添加引用时,怎么添加另外一个解决方案下的类库项目

问题描述 vs2012添加引用时,怎么添加另外一个解决方案下的类库项目 解决方案 解决方案二:引用dll就行了解决方案三:另一个解决方案?就是不在同一个方案下了?那只有两种办法,一种是你直接添加dll引用,这种方式比较麻烦,而且问题也多另一个办法就是将你要引用的项目包含到当前项目,然后就可以在解决方案内添加引用最后很遗憾,项目不像文件那样可以以链接的方式添加--解决方案四:因为是几个人开发,共同引用一个解决方案的类库,类库会随时变动,所以不能这样干解决方案五:Dll拿过来即可解决方案六:经解决了

一个解决方案有多个工程,如何共用同一个CS文件或引用文件?

问题描述 我现在一个解决方案中有7个工程文件这7个工程中都用到同一个file1.cs,引用中也加载同一个dll文件这样我要添加7次file.cs与dll文件太过于麻烦.我在解决方案下添加了一个files.cs,但是在proj1里usingClass1;程式报错:未能找到类型或命名空间名称"file1"(是否缺少using指令或程序集引用?)如何添中这个共同的file1? 解决方案 解决方案二在你向一个工程添加现有的.cs文件时在选择文件窗口的右下角你会看到"添加文件"

读者Tom今年又想到了一个很geek的礼物来向太太示爱

摘要: 我们的读者Tom今年又想到了一个很geek的礼物来向太太示爱. 下面这几张图就是他的作品(为了避免广告嫌疑,他分别用了两个工具来记录): 可以看见图片里是Tom借助可穿戴设备记录 我们的读者Tom今年又想到了一个很geek的礼物来向太太示爱. 下面这几张图就是他的作品(为了避免广告嫌疑,他分别用了两个工具来记录): 可以看见图片里是Tom借助可穿戴设备记录自己的跑步轨迹,以此画出了"赵珊珊生日快乐,我爱你,Tom"的字样. Tom在一周前告诉我,他从2010年开始,就计划每年都

一个解决方案中有几个项目。如何发布。

问题描述 一个解决方案中有多个项目,一个是表现层.运行的时候是正确的,但是不知道如何发布.每次发布表现层后,提示"服务器应用程序不可用".请问这个问题如何解决? 解决方案 解决方案二:看看网站中的bin目录那就是其他项目编译后存在里面的服务器应用程序不可用会不会是IIS没有配置好把错误提示信息放到google里面去找找看解决方案三:把webui设为启动项目,如果启动没问题就是你iis配置的问题你只要吧编译好的webui放到web目录,剩下的就是配置iis了解决方案四:看一下IIS配置相