You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:27:24