问题标签 [variant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2819 浏览

delphi - Delphi,olevariants和字符串数组

我有一个用(简单版本)创建的 ole 对象

一切正常, res 变量有一个函数String[] GetAns() ,我像这样调用

这又有效..除了有时没有返回数组,然后抛出异常。

作为临时解决方案,我将它包装在一个空的 try except 块中,我知道这是不好的。我试过 VarIsArray(Res.GetAns) 但如果结果为空,它仍然不起作用

检查正确结果的正确方法是什么?

ps 我无法控制 ole 对象

0 投票
1 回答
3244 浏览

c# - 通过 COM 将对象从 C++ 传递到 C#

您好,在 C# 中有一个 COM 可见 API,如下所示:

这个想法是,基于字符串参数的值,我期望一个不同的类作为第三个参数,并在实现中适当地转换它(我知道这种设计不是最优的,但我在这里没有太大的灵活性)。

假设对于字符串参数的某些组合,附加参数的类型如下:

我需要从一些非托管代码中获取我的 API 方法;但是我在创建variant第三个参数所需的正确值时遇到了困难。

我正在使用CComVariant(...)传递IDispatch指向我刚刚构建的 TestObject 的方法。

假设这pTestObject是一个指向我的 TestObject 的 IDispatch 指针,我有如下内容:

但是,当最终调用 C# 函数时,我看到该对象具有类型bool而不是TestObject我所期望的类型。

任何的想法?

斯特凡诺

0 投票
1 回答
289 浏览

c# - 如何处理变体缺失

我是 C# 世界的新手。我有一个用 C++ 编写的 COM 服务器,在某些情况下它返回一个 variant_t::missing()。当我尝试在 C# 中接收该值时:

它引发了一个我无法在 C# 中进行事件处理的异常。

我该怎么办?

0 投票
3 回答
13252 浏览

c++ - boost::variant 的访问者模板

我想使用 aboost.variant<T0,T1,T2>作为模板“访问者”类的参数,该类将根据 boost.variant 访问者机制的要求提供访问者运算符,在这种情况下,所有返回 void 即,

该模板还将为每个类型 T0... 在变体中具有相应的虚函数,默认情况下该虚函数不执行任何操作。用户可以从模板类继承并只重新定义他感兴趣的那些虚函数。这类似于众所周知的“模板方法”模式。我能想出的唯一解决方案是将 boost::variant 和关联的访问者包装在一个模板中,并通过 typedefs 访问它们。这工作正常,但感觉有点笨拙。这是代码:

然后按如下方式使用该类:

正如我所说,这似乎工作得很好,但如果我不必创建一个特殊的包装类来将变体和访问者联系在一起,我会更喜欢它。我希望能够直接使用 boost.variant 来实例化模板访问者类。我看过使用类型参数、非类型参数和模板模板参数,但似乎没有任何建议。我想做的事是不可能的吗?我可能会遗漏一些东西,如果有人对此有任何意见,我将不胜感激。

0 投票
3 回答
1690 浏览

c++ - 使用映射将 COM VARIANT 类型映射到实际类型

我正在为 COM 对象编写一个 COM 包装器,该对象从客户端发送不同类型的值,并希望将 Map 中的这些类型映射到它们的实际 C++ 类型,例如 VT_BSTR 到 wstring 等。

我正在考虑定义所有 COM Variant 类型的枚举,然后使用映射将该 Enum 作为键和包含检索到的值的实际类型,但是我遇到了我似乎找不到全局类型的问题放入我的地图,我可以将其转换为字符串或双精度或任何交给我放置在地图中的东西。

也许我对如何做到这一点的想法是完全错误的,请指教?

我在想一个 void 指针,但是编译器似乎不喜欢我的演员表:

(例子)

迭代这个地图可能需要一个 switch 语句来找到正确的类型,我不确定是否有更好的方法?

0 投票
2 回答
46290 浏览

arrays - 如何在 Delphi 中使用变体数组

我有两个 Delphi7 程序:一个 COM 自动化服务器 (EXE) 和另一个正在使用自动化服务器的程序。

我需要将一个字节数组从一个程序传递到另一个程序。

经过一番搜索,我发现使用变体数组是可行的方法(如果您知道更好的方法,请纠正我)。

我的问题是:如何在一个程序中创建一个变量数组,然后如何在另一个程序中读取它的值?

我知道 VarArrayCreate 和 VarArrayLowBound/VarArrayHighBound,但我不确定如何正确执行此操作。

谢谢!

0 投票
1 回答
1741 浏览

delphi - 如何停止这种 Variant 内存泄漏?

我正在使用其创建者不再支持的旧脚本引擎,并且在内存泄漏方面遇到了一些麻烦。它使用 ASM 编写的函数从脚本调用 Delphi 函数,并将结果作为整数返回,然后将该整数作为无类型参数传递给另一个过程,该过程将其转换为正确的类型。

这对大多数事情都很好,但是当 Delphi 函数的返回类型是 Variant 时,它会泄漏内存,因为该变量永远不会被处理掉。有谁知道我如何获取包含变体的无类型参数并确保正确处理它?这可能会涉及一些内联汇编。

编辑:在评论中回应 Rob Kennedy 的问题:

AnsiString 转换的工作方式如下:

这工作正常,不会产生内存泄漏。当我尝试使用变体作为输入参数做同样的事情,并Null在第二个过程中分配原始参数时,内存泄漏仍然发生。

变体主要包含字符串——所讨论的脚本用于生成 XML——并且它们通过将 Delphi 字符串分配给该脚本正在调用的 Delphi 函数中的变体来到达那里。(在这种情况下,更改函数的返回类型不起作用。)

0 投票
1 回答
1942 浏览

parameters - 关于如何正确转换变体记录函数参数的老式 Pascal 问题

我正在尝试使用允许内联转换或赋值的变体记录类型参数创建一个函数,如下所示:

现在,上面的“工作”很好,只要您花时间手动设置变量,如下所示:

但是,我想稍微滥用一下打字系统,并尝试内联(我稍后会解释原因),大致如下:

辅助函数也可以,我尝试了几种不同的方法来做到这一点,可以在这里看到(为了简洁起见):

http://pastie.org/private/glxhwbpsbbh5gtxju0uvxa

现在,原因是:我正在研究,并且确实发布了一个单元测试套件,旨在与 Pascal 本身一样可移植(在 FreePascal 和 Turbo Pascal 7 下构建(是的,真的))。我已经公开发布了开源软件(还不能链接,rep不够),其中包括针对不同类型的不同功能:isI()、isR()、isS()、isP()、isC()等。这重复了很多代码,我知道有更好的方法来做到这一点。我相信 FPC 和 Delphi 支持一种变体类型,我可以在这些平台上通过 IFDEF 指令使用它,但真正的关键是 TP7,出于淫秽的原因我仍然想支持它。

每个函数调用 4 行来设置记录的原因实际上并不可行,因为这是面向用户的 API,并且进行复杂的测试意味着没有人会这样做。使用当前 API 的测试集很简单,只需一个函数调用即可执行每个测试,我只是希望可以将所有几个特定于类型的函数转换为如下内容:

我愿意竭尽全力避免在 TP7 下打字,包括自己在汇编中操作堆栈等。但我希望使用我不熟悉的语法的修改版本能够完成这项工作。

所以,老派的 Pascal 程序员(我知道肯定有一些),有什么建议吗?

0 投票
2 回答
1492 浏览

c++ - boost::any,变体,基于它们的数组调用函数

给定一组函数,例如:

是否可以采用某种变体类型的数组并根据其内容触发正确的功能?我的应用程序是我想将一组参数 X 传递给另一个进程,在那里我只能选择传递单个指针。我的想法是发送一个指向 std::vector<boost::any> 的指针,然后根据其内容以某种方式计算出上述哪些方法可以触发。

这涉及我对跨线程事件和通信的实验,因此它可能看起来不必要的深奥!

编辑:好的,例如,这是意图。显然它不会编译(模板解析发生在编译时,但我想确定在运行时调用哪个函数!):

0 投票
1 回答
722 浏览

c++ - C ++ boost变体问题

我知道它boost::variant使用boost::mpl了它背后的东西并且有一个与 mpl 兼容的 typedef types

假设我有一个简单的 typedef:typedef boost::variant<bool, int> Variant;

现在我有了另一个模板函数,比如说:

我希望这个函数在两种情况下表现不同:当它的T一部分Variant::types和不是的时候。

显然,我必须做类似的事情

我唯一不知道的是这个CONDITION

现在 - 我确实认为如果TVariant::types.

有人知道怎么做吗?