如何在Delphi中实现TEdgeBrowser的Single Sign On(SSO)功能?
Delphi中WebView2启用SSO的解决方案
针对你遇到的Delphi自带WebView2接口缺少AllowSingleSignOnUsingOSPrimaryAccount属性的问题,这里提供几个可行的解决方案:
方案1:手动扩展COM接口
因为Delphi自带的ICoreWebView2EnvironmentOptions基于旧版Type Library生成,你可以手动声明包含新增属性的扩展接口,直接通过COM调用设置属性:
type ICoreWebView2EnvironmentOptions2 = interface(ICoreWebView2EnvironmentOptions) ['{3A0F7817-749C-4397-964B-119E4633010E}'] // 该GUID对应WebView2 1.0.774.44及以上版本的接口 procedure set_AllowSingleSignOnUsingOSPrimaryAccount(value: BOOL); safecall; function get_AllowSingleSignOnUsingOSPrimaryAccount: BOOL; safecall; end;
然后在创建环境时,创建CoreWebView2EnvironmentOptions实例后,转型为扩展接口设置属性:
var LEnvOptions: ICoreWebView2EnvironmentOptions; LEnvOptions2: ICoreWebView2EnvironmentOptions2; LEnvironment: ICoreWebView2Environment; LWebViewController: ICoreWebView2Controller; begin // 创建Options实例 CoCoreWebView2EnvironmentOptions.Create(LEnvOptions); // 转型到扩展接口并设置SSO属性 if LEnvOptions.QueryInterface(ICoreWebView2EnvironmentOptions2, LEnvOptions2) = S_OK then LEnvOptions2.set_AllowSingleSignOnUsingOSPrimaryAccount(True); // 创建WebView2环境 CheckHResult(CreateCoreWebView2Environment(nil, nil, LEnvOptions, TCoreWebView2CreateEnvironmentCompletedHandler.Create( procedure(const sender: ICoreWebView2Environment; result: HResult) begin if Succeeded(result) then begin // 创建WebView控制器 CheckHResult(sender.CreateCoreWebView2Controller(Handle, TCoreWebView2CreateCoreWebView2ControllerCompletedHandler.Create( procedure(const sender: ICoreWebView2Controller; result: HResult) begin if Succeeded(result) then begin // 设置浏览器填充窗口并加载目标URL sender.Bounds := ClientRect; sender.CoreWebView2.Navigate('https://example.com'); end; end ) )); end; end ) )); end;
方案2:重新生成最新的WebView2 Type Library
这是最彻底的解决方法,步骤如下:
- 找到最新版WebView2 Runtime安装目录下的
WebView2.tlb文件(通常路径为C:\Program Files (x86)\Microsoft\Edge WebView2\Application\<最新版本号>\WebView2.tlb) - 打开Delphi,通过
Tools > Import Type Library导入该tlb文件,生成新的Delphi单元(比如命名为Winapi.WebView2.Latest) - 在代码中引用新生成的单元,替换原有
Winapi.WebView2的引用 - 此时你可以直接使用属性,逻辑和C#写法一致:
var LEnvOptions: ICoreWebView2EnvironmentOptions; begin CoCoreWebView2EnvironmentOptions.Create(LEnvOptions); LEnvOptions.AllowSingleSignOnUsingOSPrimaryAccount := True; // 后续创建环境和WebView的逻辑同方案1 end;
方案3:通过IDispatch动态设置属性
如果不想修改接口或重新生成tlb,可以通过IDispatch接口动态调用属性的set方法:
var LEnvOptions: ICoreWebView2EnvironmentOptions; LDispatch: IDispatch; LDispParams: TDispParams; VArg: OleVariant; begin CoCoreWebView2EnvironmentOptions.Create(LEnvOptions); if LEnvOptions.QueryInterface(IDispatch, LDispatch) = S_OK then begin FillChar(LDispParams, SizeOf(LDispParams), 0); VArg := True; LDispParams.rgvarg := @VArg; LDispParams.cArgs := 1; // 调用set_AllowSingleSignOnUsingOSPrimaryAccount方法(DISPID=16,对应最新tlb的属性ID) LDispatch.Invoke(16, GUID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, LDispParams, nil, nil, nil); end; // 后续创建环境逻辑同上 end;
因为你不需要可视化组件,以上方案都可以通过纯代码创建WebView2实例并启用SSO功能,无需依赖Vcl.Edge单元的TEdgeBrowser组件。
内容的提问来源于stack exchange,提问作者Keith Miller
相关产品推荐
相关产品推荐

