• QQ网页链接打开本地QQ.exe原理


    一、观察现象

    QQ推广上有相关文档
    http://shang.qq.com/v3/widget.html

    新建一个html,点击链接就会启动本地QQ。

    <html>
    <body>
    <a target="_blank"
       href="http://wpa.qq.com/msgrd?v=3&uin=904000612&site=qq&menu=yes">
        <img border="0"
             src="http://wpa.qq.com/pa?p=2::52"
             alt="天下大势为我所控" title="天下大势为我所控"/></a>
    </body>
    </html>
    

    二、底层协议

    这个协议名字叫RAUP:Registering an Application to a URL Protocol,将程序注册为URL的协议。
    当点击链接tencent://xxxxx时,浏览器遇到不会处理的schema,也就是tencent,浏览器就会访问操作系统。
    操作系统看见tencent这个schema之后,就会查询注册表,发现QQ.exe与之关联,把URL中的请求参数传递给QQ.exe。剩下的任务就是QQ.exe解析参数、执行操作的过程了。

    需要注意的是:

    • 点击链接跟在浏览器地址栏直接输入地址是不一样的
      在浏览器地址栏直接输入tencent://xxxx是不可以的,浏览器会默认你正在搜索这个字符串。
    • 在注册表中关联的必须是exe而不能是批处理文件。
    • schema不区分大小写,比如我注册表中写的是Haha,访问时可以访问haha

    三、开始一个例子

    第一步:制作exe

    新建haha.cpp,编译链接生成haha.exe

    #include<stdlib.h>
    #include<iostream>
    using namespace std;
    int main(int argc, char*argv[]){
    	for (int i = 0; i < argc; i++){
    		cout << "第" << i << "个参数:" << argv[i] << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    第二步:填注册表

    新建haha.reg

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOTHelloWorld]
    @="HelloWorld Protocol"
    "URL Protocol"=""
    
    [HKEY_CLASSES_ROOTHelloWorldDefaultIcon]
    @=""
    
    [HKEY_CLASSES_ROOTHelloWorldshell]
    @=""
    
    [HKEY_CLASSES_ROOTHelloWorldshellopen]
    @=""
    
    [HKEY_CLASSES_ROOTHelloWorldshellopencommand]
    @="C:\users\weidiao\desktop\haha.exe "%1""
    
    

    第三步:测试

    新建haha.html,浏览器打开之,访问之

    <a href="haha://haha?a=3&b=4">helloworld</a>
    

    输出

    第0个参数:C:usersweidiaodesktophaha.exe
    第1个参数:haha://haha/?a=3&b=4
    请按任意键继续. . .
    

    除了使用浏览器启动,还有另外一种方式:在控制台下输入start haha://helloWorld也可以验证是否成功。

    一种良好的设计

    “应用注册为URL”这个协议不支持批处理文件,只支持exe,这样很不灵活。
    实际上,这是很容易处理的:直接让exe去调用某个批处理文件。
    把exe写死,让它始终去执行某个bat,这样一来,只需要更改这个bat就可以了。
    这样一来,更改注册表的.reg文件、执行命令的.bat文件都可以用文本生成,非常简洁明快,制作安装包的时候就很简单。

    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    int main(int argc, char*argv[]){
    	argv[0] = "c://haha.bat ";
    	int s = 0;
    	for (int i = 0; i < argc; i++){
    		s += strlen(argv[i]);
    	} 
    	char*a = new char[s + 1];
    	int j = 0;
    	for (int i = 0; i < argc; i++){
    		for (char*k = argv[i]; *k; k++){
    			a[j++] = *k;
    		}
    	}
    	a[j] = 0;
    	system(a);
    	delete a;
    	return 0;
    }
    

    参考资料

    微软MSDN 程序注册为URL协议介绍
    zanfeng的专栏:tencent://message协议
    Phinecos(洞庭散人):由Tencent://Message协议想到的一个解决方案

  • 相关阅读:
    JS元素分组统计
    并发工具类
    【Spring-Cloud】mall eureka微服务模块建立
    【Spring-Cloud】mall父工程建立
    【MySQL】创建函数和存储过程,批量插入大数据
    【JAVA】http 状态
    【JAVA】如何写好代码
    【Docker】dockerfile,支持jdk8、 sshd、 python3.6
    【Hadoop】MapperReduce WordCount 代码示例
    【Hadoop】YARN 完全分布式配置
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7642639.html
Copyright © 2020-2023  润新知