问题标签 [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 回答
544 浏览

com - COM 可见函数 (VB6) 中复杂对象的参数类型

我们应该使用objectorvariant吗?它有什么区别?

0 投票
4 回答
1879 浏览

c# - 如何在 CLR/托管 C++ 中实现变体类型?

在.net 中,CLR 对象是所有类对象的基础,但不是基本类型(例如 int、float 等)。如何使用 Object 等基本类型?即喜欢Boost.Variant吗?

例如 -

0 投票
1 回答
3763 浏览

delphi - Delphi:没有 VarIsBoolean( ) 函数?

在 variant.pas 中,有几个 VarIsXXX( ) 函数用于对变体进行类型检查。但是,没有 VarIsBoolean()。

检查变量是否为布尔类型的首选方法是什么?

0 投票
2 回答
4101 浏览

c# - 无效的变体崩溃

我有一种情况,我用 C++/CLI 包装了一个 Native C++ DLL,以便最终在 C# 中使用。

有一些回调函数会在运行时引起一些问题。特别是,我得到以下异常:

ToadWrapTest.dll 中出现“System.Runtime.InteropServices.InvalidOleVariantTypeException”类型的未处理异常

附加信息:指定的 OLE 变体无效。

在这行代码(C++/CLI)上:

我制作这个“中间回调”的原因是试图规避当我尝试将委托从 C# 直接映射到本机 C++ 代码时引发的 Invalid variant 异常。作为一种尝试的解决方法,我在 C# 端声明了一个委托,并将该 funcptr 传递给 C++/CLI 包装器。然后,我将中介 funcptr 传递给本机 C++,然后将调用以菊花链形式连接在一起。

我所知道的是,这一切都适用于原生 C++ 世界。问题是将 void* 映射到托管世界。以下代码显示了回调的本机 C++ 版本:

如果有人可以在这里提供帮助,我将不胜感激。

0 投票
2 回答
1335 浏览

c# - 在 C#.NET 中使用来自 C++ 的 COM 对象返回对象 []

我有一个我试图从 C++(不是 .NET)使用的 COM 对象,并且所有示例程序和手册都是假设使用 C#.NET 或 VB.NET 编写的。COM 对我来说是新的,所以我有点不知所措。我在 TLB 上使用#import,但正在努力处理用作参数的变体。我有一种特殊的方法,根据文档和 C#.NET 中的示例程序,它应该返回一个对象 []。然后我应该将此数组中的第一个条目转换为 ControlEvent,然后它会告诉我如何处理数组中的其余对象。C#.NET 示例如下所示:

就我而言,GetEvent 正在向我返回一个 _variant_t,我需要知道如何将其转换为 object[] 以便我可以进一步处理。我什至不清楚我如何在 C++ 中表达“对象”。我看到 _variant_t 文档向我展示了一百万个我可以将变体转换为的东西,但它们似乎都没有转换为我可以使用的任何东西。我希望在将上述 C#.NET 代码转换为 Visual C++ 时得到一些帮助

谢谢。

0 投票
14 回答
11835 浏览

c++ - 返回未知类型的函数

现在,使用 a = 1 意味着我需要返回一个整数等知识,Doit() 是否可以返回一个可变数据类型的变量?

本质上,我用什么来代替SOMETHING

PS:我正在尝试找到一种替代方法来返回包含这些数据类型的结构/联合。

0 投票
2 回答
2493 浏览

delphi - free the variant VarArray

I am using Delphi for Win32.

Does this function create a memory leak or not ?

Should I free the variant v as vararray and how?

Should I free or initialize the local variant v?

0 投票
1 回答
1722 浏览

.net - 如何为 COM 使用创建 propput IDL 方法 .NET 接口

我在 Excel/VBA 中使用 .NET/ComVisible 程序集时遇到问题。我在 .NET 中将几个参数定义为“对象”,因此它们将在 VBA 中转换为 Variant,因为 VBA 中的可选参数需要使用 Variant 类型。

问题是当我尝试在 Excel/VBA 中使用该对象时,我收到“运行时错误'424':需要对象”。我认为我在 C# 界面中缺少属性,该属性将添加一个“ propput ”方法而不是“ propputref ”方法,该方法将允许变量中的值,但我在互联网上没有找到任何答案,只是类似的问题。我看到了 System.Reflection.BindingFlags,但这似乎只适用于编译时和运行时代码,不适用于接口定义。

底层数据类型是双精度的,我需要它为空或通过 COM/VBA 的双精度。我对字符串参数没有问题,只是变体/双精度。

这是C#接口:

这是 C# 对象:

这是VBA的用法:

这是来自 OleView 的类型库 IDL:

似乎唯一的解决方案是手动生成 IDL,然后将其导入 .NET,就像在这个线程中使用 VB.NET 和 VB6一样。那是唯一的解决方案吗?这篇关于The Essentials for Using COM in Managed Code的文章也非常好,但没有涵盖在 .NET/C# 中定义接口。

0 投票
1 回答
3062 浏览

c# - 如何将 .NET 字符串编组为 COM 调用的变体

我正在使用 C# 中的第三方 COM 库。

有些 get/set 方法采用 VARIANT 类型的参数(类型 VT_BSTR)。在 .NET 包装器中,这些参数显示为 type object,即

getValue 方法工作正常,我执行对象的简单转换以键入字符串:

但是以类似的方式设置字符串不会:

第三方库不喜欢这样,会产生异常。它必须期待 VT_BSTR 类型的 VARIANT(因为它适用于本机 C++)。所以我的问题是,如何在 C# 中创建其中之一?

我一直在研究类似的方法Marshal.GetNativeVariantForObject,但是关于正确使用它的文档似乎有点薄,所以任何示例代码都会很有用。

0 投票
1 回答
1326 浏览

c# - 如何围绕 Variant 值创建类型安全的包装器

我正在使用一个OPC Server控件,它将数据标签存储为变体类型,由System.Runtime.InteropServices.VarEnum描述。这些类型包括以下,VT_BSTR(字符串)、VT_I2(短)和VT_I4(长)。

所有这些值都由服务器作为对象存储,然后我必须在获取它们时转换为正确的值。

我知道我可以执行以下操作:

其中 TypedVariant 是一个泛型类,如下所示:

但是有什么方法可以让我在运行时做到这一切,即类似于以下内容:

显然这段代码不会编译,但是这样可以吗?

更新:根据@Konamiman 的建议,我已经更改了类以允许隐式转换。因此,您现在可以编写此代码并且它都是类型安全的,因此您不能将变体存储在与创建它的类型不同的类型中。