创建 DualEngine 适配器插件 DLL

DualEngine API 只能从 Internet Explorer 进程内部使用。 因此,若要使用 DualEngine API,必须创建 Internet Explorer 加载的插件 DLL。 此 DLL 托管使用 DualEngine API 的代码,以及与 main 应用程序通信所需的任何代码;这就是它称为适配器的原因。

若要让 Internet Explorer 成功加载 DLL,请执行以下操作。

解锁受限访问功能

DualEngine API 是 LAF) (受限访问功能;也就是说,需要解锁才能使用的功能。 有关实现的详细信息,请参阅 LimitedAccessFeatures 类。 若要请求解锁令牌,请联系 Microsoft 支持部门

DualEngine API 不是典型的 LAF,它 Windows.ApplicationModel.TryUnlockFeature 不用于解锁该功能。 这是因为 LAF 通常使用调用进程的应用程序标识来授予访问权限,而作为插件 DLL,这始终是 Internet Explorer。 因此,若要解锁 API,需要调用 DualEngineSessionFactory::TryUnlockFeature

此外,应用程序标识必须通过 DLL 中设置的特定资源字符串提供给 Internet Explorer。 可以在资源文件中设置值,如下所示:

IDENTITY LIMITEDACCESSFEATURE { L"ExampleApp_6v1kqc8g0gcae" }

授予 LAF 访问权限后,Microsoft 将向你提供特定标识字符串。

实现函数导出

适配器 DLL 必须实现以下函数导出:

  • DualEngineInitialize
  • DualEngineReady

这些导出在加载 DLL 时由 Internet Explorer 调用。 它们提供用于创建 DualEngine API 对象的工厂对象。

这些导出是从 Internet Explorer 进程的main线程调用的,因此在导出中执行任何长期处理都将停止 Internet Explorer。 因此,若要处理任何长时间运行的工作,应创建一个新线程。

DualEngineInitialize

HRESULT APIENTRY DualEngineInitialize(DualEngineSessionFactory* pSessionFactory, PCWSTR pipeName)
参数
  • pSessionFactory 用于访问 DualEngine API 的工厂对象。
  • pipeName 通过命令行标志传递到 Internet Explorer 的 -DualEnginePipe 字符串。

Internet Explorer 成功加载 DLL 后,将立即调用此导出。 这是你第一次有机会设置应用程序所需的任何内容。

这是你通常在适配器 DLL 和主机应用之间设置通信的位置。 提供 pipeName 字符串用于此目的。 尽管字符串的名称 pipeName 不一定是管道名称;它只是一个字符串,它根据启动 Internet Explorer 时使用的命令行标志的值 -DualEnginePipe 传递给适配器,没有其他语义含义。

pSessionFactory尽管此调用中提供了 对象,但调用GetVersionedBrowserSession尚无效,因为此时 Internet Explorer 尚未准备好创建会话。

DualEngineReady

HRESULT APIENTRY DualEngineReady()

此导出是在 Internet Explorer 完成其所有初始设置且 API 准备就绪后调用的。 现在,可以调用 GetVersionedBrowserSession 并获取 Session 对象,前提是已成功调用 TryUnlockFeature

绕过对适配器 DLL 进行签名

Internet Explorer 要求加载适配器 DLL 时,必须使用受信任的签名对其进行签名。 出于测试和开发目的,可以通过为要测试的设备打开TestSigning来绕过此检查,如下所示:

Bcdedit.exe -set TESTSIGNING ON