65.9K
CodeProject 正在变化。 阅读更多。
Home

用于调用应用程序的自定义 URL 协议

starIconstarIconstarIconstarIconstarIcon

5.00/5 (18投票s)

2012年2月18日

CPOL

3分钟阅读

viewsIcon

129332

downloadIcon

15124

注册自定义 URL 协议以调用应用程序

引言

在工作中,我遇到了一个问题,需要从我的 Web 应用程序调用一个 Windows 应用程序(位于本地机器中)。经过一些 Google 搜索,我了解到通过使用自定义 URL 协议,我们可以调用 Windows 应用程序。我发现有很多关于自定义 URL 协议的信息。 我还在互联网上找到了一些示例应用程序。 但是所有示例应用程序似乎都是用 C# 或其他一些语言编写的。 但是根据项目需求,我需要在 C++\Win32 中编写代码来注册自定义 URL 协议处理程序。 我编写了一个 C++\Win32 类,它注册自定义 URL 协议处理程序。

本文提供了有关注册客户端自定义 URL 协议处理程序的信息,用于从基于 Web 的应用程序调用 Windows 应用程序。 我附加了 "CustomURLProtocolFiles.zip" 文件,其中包含一个 cpp 和头文件。 这些文件可以添加到应用程序中以创建自定义 URL 协议。 我还附加了一个演示应用程序及其源代码,该源代码使用这些自定义 URL 协议文件。

自定义 URL 协议也可以用于在应用程序之间传递内容。

示例:应用程序 A 希望在其处理后将一些数据传递给应用程序 B。 为此,应用程序 A 可以注册一个协议处理程序,并使用处理后的数据作为参数调用应用程序 B。 这样,一个应用程序就可以将数据传递给另一个应用程序。

Using the Code

Zip 文件 "CustomURLProtocolFiles.zip" 包含一个 cpp 文件和一个头文件,应将其包含在您的项目中。 该文件包含一个名为 "class CustomURLProtocol" 的类。 该类包含用于协议名称、公司名称和要启动的应用程序路径的设置器和获取器函数。

std::wstring getProtocolName() {return wszProtocolName;}
std::wstring getCompanyName() {return wszCompanyName;}
std::wstring getAppPath() {return wszAppPath;}

void setProtocolName(std::wstring pwProtocolName){wszProtocolName = pwProtocolName;}
void setCompanyName(std::wstring pwCompanyName){wszCompanyName = pwCompanyName;}
void setAppPath(std::wstring pwAppPath){wszAppPath = pwAppPath;}

调用代码必须创建 CustomURLProtocol 类的对象。 在设置器函数的帮助下,调用应用程序必须设置所需的参数,例如协议名称、公司名称和应用程序路径。 设置此参数后,调用应用程序可以调用 CreateCustomProtocol 函数。 此函数将为应用程序创建一个自定义 URL 协议。

在我的演示中,应用程序调用 initializeParameter 函数,该函数调用 CustomURLProtocol 类的设置器函数。 它调用 DeleteCustomProtocol 函数,该函数将删除已经存在的自定义协议。 最后,它调用 CreateCustomProtocol 函数,该函数将创建一个自定义协议以启动应用程序。

void CCustomURLProtocolDlg::OnBnClickedOk()
{
  DWORD errorCode = 0;

  // Initialize Custom Protocol Class Parameter
  initializeParameter();

  // Delete Custom Protocol if already present
  m_CustomURLProtocol.DeleteCustomProtocol();

  // Create new Custom protocol
	if(m_CustomURLProtocol.CreateCustomProtocol() != ERROR_SUCCESS)
		MessageBox(m_CustomURLProtocol.getErrorMsg().c_str());
	else
		MessageBox(L"Successfully Created Custom Protocol.");
}

CreateCustomProtocol 函数通过在注册表中输入以下键来注册自定义协议。

CustomURLProtocol 类还处理错误条件。 上面的代码片段显示,如果发生某些错误,则应用程序可以通过调用 m_CustomURLProtocol.getErrorMsg().c_str() 来获取错误描述。

[HKEY_CLASSES_ROOT]
  [< ProtocolName >]
      (Default) = "URL:< ProtocolName > Protocol Handler"
      URL Protocol = ""
    [DefaultIcon]
       (Default) = "< Application Path >"
    [shell]
       [open]
         [command]
           (Default) = "< Application Path> "%1""

要删除自定义协议,我们只需要调用 DeleteCustomProtocol 函数,如以下演示函数中所示。 首先,我们需要初始化 CustomURLProtocol 类的参数,然后调用 DeleteCustomProtocol 函数。

void CCustomURLProtocolDlg::OnBnClickedBtnDelete()
{
    DWORD errorCode = 0;
    initializeParameter();
	if(m_CustomURLProtocol.DeleteCustomProtocol() != ERROR_SUCCESS)
		MessageBox(m_CustomURLProtocol.getErrorMsg().c_str());
	else
		MessageBox(L"Successfully Deleted Custom Protocol.");
}

在某些 Windows 操作系统中,创建和删除注册表项需要管理员权限。 这将需要您的应用程序以管理员权限运行。 我的演示应用程序包含一个清单文件,用于以管理员权限启动演示应用程序。 如果有任何错误,则演示应用程序提供错误描述以及错误代码。

在演示应用程序中,我还提供了一种测试已注册的自定义 URL 协议处理程序的方法。 当用户单击 Test 按钮时,演示应用程序会生成一个 HTML 文件,该文件启动已注册的应用程序。 此测试应用程序可用作调用应用程序的示例。

提供的用于创建自定义协议的类可以根据项目的需要进行更新。 我将在发现问题时更新代码。

历史

  • 2012 年 2 月 17 日:初始版本
  • 2012 年 2 月 27 日:在 CustomURLProtocol 类中添加错误处理代码
  • 2012 年 3 月 6 日:解决了测试应用程序源代码中与 Chrome 浏览器相关的问题
© . All rights reserved.