程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 由Tencent://Message協議想到的一個解決方案

由Tencent://Message協議想到的一個解決方案

編輯:關於C++

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

好了,來到最關鍵的步驟了,在注冊表中為我們自定義的helloworld協議建立起注冊 表項,從而讓HelloWorld應用程序支持此協議。將如下的注冊表項加入即可,這裡為了簡 單起見我直接用一個.reg文件來實現,也可以用其他方式進行:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOTHelloWorld]
@="HelloWorld Protocol"
"URL Protocol"=""

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

[HKEY_CLASSES_ROOTHelloWorldshell]
@=""

[HKEY_CLASSES_ROOTHelloWorldshellopen]
@=""

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

結果如圖所示

好了,這下可以來測試helloworld協議了,在地址欄中輸入:helloworld://hello world/,怎麼樣,下面的畫面出來了吧,

再來 到web頁面進行測試,修改上面的html代碼如下:

<html>
<head></head>
<body>
<div>
<a href="helloworld://hello world">
<img border="0" SRC='/uploads/2011/1104/0QQQ032-1.gif' alt="點擊這裡給我發消息">
</a>
</div>
</body>
</html>

若是要在web頁面調用本地的winform程序,同理也是可行 ,不過我不大懂.net,有心的朋友請試試看。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved