创建 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