现在的位置: 首页 > 综合 > 正文

C++ mfc学习之路二 网页按钮启动应用程序

2013年11月12日 ⁄ 综合 ⁄ 共 2896字 ⁄ 字号 评论关闭

C++ mfc学习之路二 网页按钮启动应用程序

 (2011-09-30 14:26:48)

标签: 

网页

 

按钮

 

启动

 

应用程序

 

.exe

 

杂谈

分类: 学习笔记

  当你点击网页上的按钮启动QQ的时候,你是否和想知道他是如何找到你的QQ的呢,其实不难想象,《注册表》成为了找你程序的关键,好的废话不多说了先看代码:

Windows Registry Editor Version 5.00  声明注册表编辑器5.0版本

[HKEY_CLASSES_ROOT\DDIT]      在注册表HKEY_CLASSES_ROOT目录下建立DDIT项(这个就是你的协议名字,下面会讲到用处)。
@="IMHelpProtocol"    DDIT项里面的默认键的值(随意起)
"URL Protocol"="要启动的程序的绝对路径"

[HKEY_CLASSES_ROOT\DDIT\DefaultIcon]
@="要启动的程序的绝对路径,2"(后面的数字控制的是当你点击按钮启动本地程序的时候弹出的提示框上边显示的你的程序的ICO 图标)。

[HKEY_CLASSES_ROOT\DDIT\shell]

 

[HKEY_CLASSES_ROOT\DDIT\shell\open]

 

[HKEY_CLASSES_ROOT\DDIT\shell\open\command]


@="\"要启动的程序的绝对路径" \"%1\""
把这些东西写好到记事本里面,修改他的扩展名为.reg 这样你就在注册表里面注册了一个DDIT://开头的协议了

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

然后开始写html 代码<a href=ddit://123&456&789&0123>Click   Here  </a> 建立一个这样的连接,然后打开网页点击超连接,当注册表检测到ddit://开头的协议以后就回去注册表里面找他对应的打开项,然后ddit://123&456&789&0123这一整段话就会被传递到程序里面,程序打开。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是这是需要用户点击注册表文件才能使文件注册到注册表里面,但是怎么才能实现不点击注册文件就实现呢,那我们只能把这段修改注册表的代码写入到要启动的程序,的初始化部门。具体代码如下:

HKEY RegKey=NULL;
CString fullName="IMHelpProtocol";
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());
fullName="要启动的文件的绝对路径";
RegSetValueEx(RegKey,"URL Protocol",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());

fullName="要启动的文件的绝对路径,1";
设置图标的
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\DefaultIcon",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());

RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell",&RegKey);
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell\\open",&RegKey);
fullName="\"要启动的文件的绝对路径" \"%1\"";
RegCreateKey(HKEY_CLASSES_ROOT,"DDIT\\shell\\open\\command",&RegKey);
RegSetValueEx(RegKey,NULL,0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength()); 

下面的的代码为MFC 内代码等同于上边的注册表文件代码。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~可爱的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是还有一些变态的 客户需要获取网页上的数据,传递给程序,这时候ddit://123&456&789&0123就是你发送的参数你可以需改//后面的字符串作为参数传递进来 中间可以用特殊符号标识,但是怎么接收呢,当然需要强大的API拉:CString text=AfxGetApp()->m_lpCmdLine;

其中的text的值就等于ddit://123&456&789&0123拉

剩下就截取拉 懒人请继续往下看:由于作为初学者代码写的比较麻烦,高手请路过,代码如下

 CString* listmessage =new CString[4]();

int p1,p2,p3,p4;
   p4=a.GetLength();
   p1=a.Find("&");
   
   listmessage[0]=a.Mid(8,p1-8);
   p2=a.Find("&",p1+1);

   listmessage[1]=a.Mid(p1+1,p2-p1-1);
   p3=a.Find("&",p2+1);
   listmessage[2]=a.Mid(p2+1,p3-p2-1);
   listmessage[3]=a.Mid(p3+1,p4-p3-3);
   AfxMessageBox(listmessage[0]);
   AfxMessageBox(listmessage[1]);
   AfxMessageBox(listmessage[2]);
   AfxMessageBox(listmessage[3]);

这个就写把用&特殊符号隔开的字符串获取出来分别存放在数组listmessage[0]到listmessage[3]中应为只用了4个参数所以长度只定义4个。

补充一点:可以使用一下代码获取当前程序的绝对路径

TCHAR szPath[MAX_PATH];

GetModuleFileName( NULL, szPath, MAX_PATH )

CString load=(CString)szPath;

load就是程序的绝对路径。    看了这些还有不明白的请联系QQ729839976

抱歉!评论已关闭.