自定义协议与Web集成

最近,被问到是否可以扩展过去几年一直在做的各种软件,以便在网页上显示其文档——在这种情况下是视频剪辑的名称。这很简单。然而,他们希望这些文档能够作为超链接,用户可以点击它们,应用程序将启动,加载视频剪辑,并跳转到视频中的特定帧。如果应用程序中有这样的功能,他们就可以在公司内网上发布一个网页,列出体育比赛视频中的精选亮点——进球、点球等。该应用程序已经具有很高的桌面集成度,使用快捷方式,所以(飞跃信念)的想法是这将是一个自然的补充。但事实并非如此简单。

如果这还不够,他们还希望这种自定义超链接行为能够在他们所有的办公应用程序中工作——Word、Excel等。第一反应是不可能。但在喝了一杯咖啡坐下来之后,小脑袋后面有些东西在响。隐约记得有关res:协议和异步可插拔协议的文章。是时候调查一下了...

异步可插拔协议——嗯?

微软的异步可插拔协议允许开发人员创建可插拔协议处理器、MIME过滤器和命名空间处理器,与IE一起工作。应用程序可以使用它们来处理自定义URL协议方案。使用可插拔协议处理器处理自定义URL协议方案的能力,允许开发人员为IE和使用URL monikers的应用程序实现自定义协议方案。Internet Explorer中包含的默认可插拔协议处理器处理现有的协议方案,如HTTP、FTP和Mailto。

现在,事实证明,在MSDN上有大量有用的信息,花了一些时间才弄清楚这一切。然而,很明显,将面临一段艰难的旅程,不太确定如何能让自定义URL在Word和Excel中工作。怎样才能让自定义协议实现插入到它们中呢?

在文档的深处,发现了一些宝贵的信息,意味着,通过一些注册表设置、一些代码和一些横向思考,可以提供一个整洁的解决方案,不需要实现一个完整的可插拔协议处理器。重要的是,可插拔协议没有在Office产品中实现。它似乎为选定的协议(HTTP、FTP、File、Mailto等)硬编码,但这个解决方案绕过了这个问题。

将应用程序注册到URL协议

通过一些注册表键,可以将应用程序注册为响应自定义协议并在命令行中传递参数。在这种情况下,设计了一个名为'vip'(非常重要的协议)的协议,并将其与APPTest应用程序注册。

HKEY_CLASSES_ROOT vip (Default) = "URL:vip Protocol" URL Protocol = "" DefaultIcon (Default) = "c:\somepath\APPTest.exe" shell open command (Default) = "c:\somepath\APPTest.exe" "%1"

这就像将应用程序与文件扩展名关联起来。显然,在现实世界中,c:\somepath需要是应用程序安装的实际路径。通过向注册表添加这些设置,运行"vip:wibble"在命令行上将尝试启动APPTest.exe并将wibble作为命令行参数传递。

APPTest应用程序和协议

想让这篇文章简短,并解释技术。所以,而不是构建一个完整的应用程序和相关的协议行为,将采取一个非常简单的例子,让决定想如何使用它。将使用上面描述的视频剪辑问题来演示原理。

让决定一个非常简单的协议。当有人需要显示视频剪辑名称时,他们需要一个ID(也许它保存在中央数据库中),一个关键帧(从剪辑开始的关键帧偏移量)和一个关键帧名称。

id-clipname-frame-framename

例如:

123-MonacoGP-19279-Senna

APPText代码只需要处理命令行参数(在这种情况下,它将作为字符串表示的协议),解析出它需要的东西,并用它做一些事情。在这种情况下,它只会在对话框中显示解析出的细节,但可以随心所欲。

void CAPPTestDlg::SetClip(CString strClip) { char *pStr = strClip.GetBuffer(); pStr = strtok (pStr, ":"); pStr = strtok(NULL, "-"); m_strId = pStr; pStr = strtok(NULL, "-"); m_strClipname = pStr; pStr = strtok(NULL, "-"); m_strFrame = pStr; pStr = strtok(NULL, "-"); m_strFramename = pStr; strClip.ReleaseBuffer(); }

要使所有这些工作,需要设置协议注册表键。可以在MSI安装程序中这样做,但选择将其放入APPTest代码中,以便它第一次运行时没有参数,就会设置必要的注册表键。

要检查一切都在工作,运行APPTest没有参数,将得到一个消息告诉一切都已注册。现在,转到命令行并键入:

vip:123-MonacoGP-19279-Senna

应该得到一个对话框,显示解析出的字符串,如下所示:

那么如何让它在点击超链接时工作呢?

有了在PC上注册的协议和安装的APPTest应用程序,需要找到一种方法从超链接中调用它。一些魔法?不,只是一点横向思考。可以利用资源管理器、Word、Excel等中现有的超链接行为,并将其连接到新协议上。一个标准的HTML页面上的超链接由一个锚点和一个目的地组成。链接从“源”锚点开始,并指向“目的地”锚点,它可能是任何Web资源(例如,一个图像,一个视频剪辑,一个声音位,一个程序,一个HTML文档,HTML文档中的一个元素等)。通常:

<a href="http:\\www.dashnet.co.uk">An excellent consultancy</a>

像IE、Word、Excel这样的应用程序被编写为解析这样的HTML表达式,将它们显示为可点击的超链接,并在点击时执行协议。如果在标准锚点中使用自己的协议,并劫持协议和目的地,不仅应用程序会将链接显示为标准可点击链接,而且在点击时它将执行协议。所以,将锚点更改为如下所示:

<a href="vip:123-MonacoGP-19279-Senna">Senna wins at Monaco</a>

然后魔法就会发生。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485