通过外部接口接收复杂的 JavaScript 值

2023-12-22

我正在尝试使用提供的外部对象通过 TWebBrowser (使用 TEmbeddedWB)接收并可能发送复杂值。 例如;在 javascript 中,我会尝试使用公开的方法并以数组作为参数:

var test = [123, 'abc'];
external.someFunction(test);

//Or something more complex
var complexObject = {
  someMethod : function(){ return 1; },
  someProperty : 123,
  someArray : ['xyz', 3.14]
}
external.someFunction(complexObject);

检查这两个示例的 VarType 告诉我它是 IDispatch。

function TSomeClass.someFunction(var Param : OleVariant) : OleVariant;
var
  vType : Integer;
begin
  vType := (VarType(Param) and VarTypeMask); //Says 9 (varDispatch)
  Result := true;
end;

我对 COM 并不完全熟悉,也不知道如何使用它。

任何帮助,将不胜感激。


您可以像对待任何其他 OleVariant COM 对象一样对待 JScript 对象。数组方面存在一些问题(几乎所有 JScript 对象本质上都是稀疏数组)。

将 JScript 对象放入 OleVariant 后,您可以像调用任何普通代码一样简单地调用它(当然无需编译时检查)。

下面是一些处理数组的代码:

type
  TJScriptArray = class
  private
    FArray:   IDispatchEx;
    FCount:   Integer;
    function  GetProperty( const AName: String ): OleVariant;
    function  GetItem(Index: Integer): OleVariant;
  public
    constructor Create( AObj: OleVariant );
    destructor  Destroy; override;
  public
    property  Count: Integer read FCount;
    property  Item[Index: Integer]: OleVariant read GetItem; default;
  end;

function  VarToDispatchEx( const AObject: OleVariant ): IDispatchEx;
begin
  Result := nil;
  if VarType( AObject ) <> varDispatch then
    Exit;
  Supports( IDispatch(AObject), IDispatchEx, Result );
end;

function  IsJScriptArray( const AObject: OleVariant ): Boolean;
var
  temp: IDispatchEx;
begin
  temp := VarToDispatchEx( AObject );
  Result := temp <> nil;
end;


constructor TJScriptArray.Create(AObj: OleVariant);
begin
  inherited Create;
  FArray := VarToDispatchEx( AObj );
  if FArray = nil then
    raise Exception.Create( 'TJscriptArray called with invalid parameters.' );
  FCount := GetProperty( 'length' );
end;

destructor TJScriptArray.Destroy;
begin
  inherited Destroy;
end;

function TJScriptArray.GetItem(Index: Integer): OleVariant;
begin
  if Index > FCount then
    raise Exception.Create( 'Index out of bounds.' );
  Result := GetProperty( IntToStr( Index ) );
end;

function TJScriptArray.GetProperty(const AName: String): OleVariant;
var
  sz: WideString;
  id: Integer;
  res: Variant;
  ei: TExcepInfo;
  params: TDispParams;
  hr: HResult;
begin
  {
    ACTION: return the specified property from the jscript array
    NOTE:   since a jscript array is a sparse array there may be
            gaps. In that case a null variant is returned. This is
            signalled by the name (id) not existing.
  }
  sz := AName;
  hr := FArray.GetDispID( PWideChar(sz), 0, id );
  if hr = disp_e_UnknownName then begin
    Result := Null;
    Exit;
    end
  else
    OleCheck( hr );

  VarClear( res );
  FillChar( ei, sizeof(ei), 0 );
  FillChar( params, sizeof(params), 0 );
  OleCheck( FArray.InvokeEx( id, 0, dispatch_PropertyGet, @params, @res, @ei, nil ) );
  Result := res;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过外部接口接收复杂的 JavaScript 值 的相关文章

随机推荐

  • Rails4 动态选择下拉菜单

    我正在尝试使用 form tag 在搜索表单中设置一些动态下拉选择菜单 我想要的是与示例类似的功能铁路广播 88 http railscasts com episodes 88 dynamic select menus revised Mo
  • 如何高效存储数百万条统计记录?

    我们的 eshop 中有大约 170 万个产品 我们想要记录该产品在 1 年的时间内有多少浏览量 我们想要每至少 2 小时记录一次浏览量 问题是该任务使用什么结构 现在 我们尝试在具有 2 列的记录中保留 30 天的统计数据classifi
  • 类型上不存在属性

    我正在使用 Ionic2 和 Angular2 开发一个项目 当尝试跑步时ionic serve 数据被检索 没有任何错误 但是 当尝试在 ios 上测试并运行时ionic build ios 我收到以下编译时错误 该属性不存在 还有其他人
  • 将 animateColor 应用于多个 SVG 元素

    有没有办法同时为多个元素定义颜色动画 我尝试添加animateColor to a g元素 但这不起作用 我可以使用 Javascript 添加animateColor单独对每个元素进行处理 但我更喜欢在静态 SVG 数据中完成所有操作 请
  • 使用 java 从图像中提取文本

    是否可以在不使用任何第三方 API 的情况下从图像中读取文本 是的 你绝对可以自己写光学字符识别 http en wikipedia org wiki Optical character recognition OCR 软件 它的稳健性完全
  • Lambda 的行为与匿名内部类不同

    在做一些基本的 lambda 练习时 一个明显相同的匿名内部类的输出给了我与 lambda 不同的输出 interface Supplier
  • 与 RegEx 相比,使用 VB.NET Like 运算符有什么优势吗?

    除了可能增强非常简单模式的可读性之外 为什么有人会选择在 VB NET 中使用 Like 运算符而不是正则表达式来进行字符串模式匹配 有什么优点吗 大概 如果您想了解 Like 是如何实现的 大部分 全部 都在Microsoft Visua
  • Java泛型,通配符的嵌套集合

    编译 1 6 List
  • 如何在 clang 中从 AST 中排除标头?

    我正在使用 clang 生成 AST 我有以下文件 lambda cpp 要解析 include
  • 业力测试运行程序未运行任何测试

    我正在使用 karma 和 jasmine 并按照在线指南进行安装 npm install save dev karma 和其他必需品 i ran node modules karma bin karma start and karma s
  • 如何避免 C++ 中的连续释放/分配?

    考虑以下代码 class A B b an A object owns a B object A b NULL we don t know what b will be when constructing A void calledVery
  • 在打字稿中扩展枚举

    我希望在枚举中重用某些值 有关如何实现此类功能的任何建议 enum someEnum a Some String b 2 enum extendedEnum c string b someEnum b type someEnumType
  • 关闭终端本地回显的含义

    我有一个在 Linux 操作系统上运行的 C 应用程序 该应用程序从终端获取键盘按键并将其发送到远程服务器 下面的代码打开终端 save old terminal attributes if tcgetattr 0 ttyold 0 fpr
  • 在 Apps 脚本中将一维数组写入工作表列

    我正在尝试使用 Apps 脚本将长一维数组写入工作表的列中 但无法使其工作 尝试过 setValues 但它需要一个二维数组 function writeArrayToColumn var mainSheet SpreadsheetApp
  • 从文件中获取原始文件名

    我有一个需要 System File 的操作 public bool UploadToServer File file 我想在文件到达服务器后使用该文件的原始名称 我看过MSDN 的文件类 https msdn microsoft com
  • 计算表记录的最大存储大小?

    有没有办法确定 SQL Server 中记录的最大大小 而不是手动执行 例如 CREATE TABLE test id INT PRIMARY KEY IDENTITY 1 1 name VARCHAR 256 test date DATE
  • 通过电子邮件发送谷歌静态地图

    我可以在我的网站上显示谷歌静态地图图像 我创造 img src url 与电子邮件中的相同网址 图像以非常不同的方式显示 即世界地图 我检查了 chrome 中的元素 发现邮件服务器在其前面添加了一个 代理 url https ci6 go
  • TBXML 将复杂的 xml 解析为数组

    我有一个 xml 响应 需要将其设置为数组 问题是我需要访问每个元素并将其存储在数组中 以便我可以将其用于表视图
  • 如何使用复选框将电子邮件保存给订阅者?

    选中该框后 如何在单击 保存 后将用户的电子邮件从 输入电子邮件 添加到我的 mailchimp 订户列表中 用户 new html erb Get blog posts from Anthony Galli CEO Founder abo
  • 通过外部接口接收复杂的 JavaScript 值

    我正在尝试使用提供的外部对象通过 TWebBrowser 使用 TEmbeddedWB 接收并可能发送复杂值 例如 在 javascript 中 我会尝试使用公开的方法并以数组作为参数 var test 123 abc external s