posts - 3, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2011年1月16日




转自:http://www.cnblogs.com/phinecos/archive/2009/03/06/1404951.html

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

源代码下载:http://files.cnblogs.com/phinecos/HelloWorldProtocal.rar

前天在BruceZhang 的一篇博文《求助:如何在ASP页面中调用Winform程序呢?》中回答了他提出的问题,但细想下觉得我的思路有误。

    今天在试用WebQQ的时候,无聊中想起很多人的博客上都有这样的小玩意,点击下就可以和博主进行对话,而且无需加博主为好友。

哎,这样的方式不就正好是BruceZhang那个问题的解决方案吗?那么腾讯是怎么做到在Web页面中调用QQ程序的呢?

先来看腾讯提供给我们的代码:

<href="tencent://message/?uin=88888888&Site=JooIT.com&Menu=yes">
<img border="0" SRC='http://is.qq.com/webpresence/images/status/01_online.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_ROOT\Tencent]
@="TencentProtocol"
"URL Protocol"="D:\\Program Files\\Tencent\\QQ\\Timwp.exe"

[HKEY_CLASSES_ROOT\Tencent\DefaultIcon]
@="D:\\Program Files\\Tencent\\QQ\\Timwp.exe,1"

[HKEY_CLASSES_ROOT\Tencent\shell]

[HKEY_CLASSES_ROOT\Tencent\shell\open]

[HKEY_CLASSES_ROOT\Tencent\shell\open\command]
@="\"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);

     好了,来到最关键的步骤了,在注册表中为我们自定义的helloworld协议建立起注册表项,从而让HelloWorld应用程序支持此协议。将如下的注册表项加入即可,这里为了简单起见我直接用一个.reg文件来实现,也可以用其他方式进行:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT
\HelloWorld]
@
="HelloWorld Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT
\HelloWorld\DefaultIcon]
@
="D:\\My Documents\\Visual Studio 2005\\Projects\\HelloWorld\\release\\HelloWorld.exe,1"

[HKEY_CLASSES_ROOT
\HelloWorld\shell]
@
=""

[HKEY_CLASSES_ROOT
\HelloWorld\shell\open]
@
=""

[HKEY_CLASSES_ROOT
\HelloWorld\shell\open\command]
@
="\"D:\\My Documents\\Visual Studio 2005\\Projects\\HelloWorld\\release\\HelloWorld.exe\" \"%1\""

 结果如图所示

 

     好了,这下可以来测试helloworld协议了,在地址栏中输入:helloworld://hello world/,怎么样,下面的画面出来了吧,

     再来到web页面进行测试,修改上面的html代码如下:

<html>
<head></head>
<body>
<div>
<href="helloworld://hello world">
<img border="0" SRC='http://is.qq.com/webpresence/images/status/01_online.gif' alt="点击这里给我发消息">
</a>
</div>
</body>
</html>

    若是要在web页面调用本地的winform程序,同理也是可行,不过我不大懂.net,有心的朋友请试试看。

参考资料:

1, Registering an Application to a URL Protocol

2, Tencent://Message/协议的实现原理

3仿腾讯 QQ 和 Skype 通过URL触发自己的程序

4,Register protocol

作者:洞庭散人

出处:http://phinecos.cnblogs.com/  

posted @ 2011-01-16 18:01 树袋大雄 阅读(427) | 评论 (0)编辑 收藏

牛人用C++实现了八皇后问题的非递归算法。

使用了stl,stl的algorithm就是好用啊!
原文出处: http://wangcong.org/blog/?p=267

#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int MAX = 8;

vector<int> board(MAX);

void show_result()
{
    for(size_t i = 0; i < board.size(); i++)
        cout<<"("<<i<<","<<board[i]<<")";
    cout<<endl;
}

int check_cross()
{
    for(size_t i = 0; i < board.size()-1; i++)
    {
        for(size_t j = i+1; j < board.size(); j++)
        {
            if((j-i) == (size_t)abs(board[i]-board[j]))
                return 1;
        }
    }
    return 0;
}

void put_chess()
{
    while(next_permutation(board.begin(), board.end()))
    {
        if(!check_cross())
        {
            show_result();
        }
    }
}

int main()
{
    for(size_t i =0; i < board.size(); i++)
        board[i] = i;
    put_chess();
    return 0;
}


 

posted @ 2011-01-16 17:10 树袋大雄 阅读(450) | 评论 (0)编辑 收藏

2011年1月10日

     摘要:   阅读全文

posted @ 2011-01-10 17:48 树袋大雄 阅读(542) | 评论 (0)编辑 收藏