gpt4 book ai didi

vba - 通过 COM 创建 TimeSpan 实例

转载 作者:行者123 更新时间:2023-12-04 20:00:16 26 4
gpt4 key购买 nike

我正在使用从 VBA 向 COM 公开的 .NET 库。库接口(interface)使用 TimeSpan可设置属性的类。有什么方法可以构建 TimeSpan通过COM,以便我可以为属性分配一个值?

我发现我可以实例化一些 System程序集类型,如果我为 COM 注册程序集:
https://docs.microsoft.com/en-us/previous-versions/ms364069(v=vs.80)#calling-into-the-framework

但它似乎根本没有用,因为 TimeSpan是一个不可变对象(immutable对象),其值只能通过带参数的构造函数或静态工厂方法来设置。这些都不能通过 COM 调用,afaik。

我希望有一些技巧。例如,可以创建 TimeSpan间接使用以下理论上可以转换为 COM 的 C# 代码是 DateTime暴露给 COM 的类(它不是什么,与 TimeSpan 相反):

new DateTime().AddMilliseconds(1000).TimeOfDay;

显然,我可以使用一些工厂方法来实现我自己的暴露给 COM 的 .NET 程序集。但我希望有一个仅使用“标准”.NET 库或纯 VBA 代码的解决方案。

最佳答案

许多基本的 .NET 类型都具有 [ComVisible(true)] 属性,因此它们可以在 COM 互操作中使用。 TimeSpan 也是如此,CLR 会自动为您编码它。

问题是,没有明确表示时间跨度的标准 COM 自动化类型。就像 DateTime 一样,它被编码为一个缩放的 double 数,0 表示 12/30/1899,它每天递增 1.0。 TimeOfDay 是分数。 DateTime.ToOADate() 返回它。在一段时间内没有选择过这样的标准。与 VBScript DateDiff() 函数相比,它返回​​一个整数,其值取决于您要求的单位。

因此,CLR 几乎没有办法让每个人都开心,它会处理和编码 TimeSpan.Ticks 属性值。一个 64 位整数,单位是 100 纳秒。对应的自动化类型为 VT_I8。

麻烦的是,许多 COM 主机逐渐减少到 32 位整数。 VBA 可以。所以他们往往会摔倒,常见的错误信息是“不支持自动化类型”。

没有什么是您无法解决的,您可以使用 VBA 支持的不同类型公开该值。以 double 为例。您只需要记录 COM 客户端应该如何解释它。 0 值是完全明确的,只有缩放是设计选择。由于 TimeSpan 已经具有将时间跨度作为 double 返回的属性,因此您可能更喜欢毫秒。因此,您可以简单地返回 TimeSpan.TotalMilliseconds 并使用 TimeSpan.FromMilliseconds() 进行往返。像 DateTime 那样使用天数也很有吸引力。使用 TimeSpan.TotalDays 和 TimeSpan.FromDays()。将其公开为 int 也是一种选择。但请注意溢出,如果您选择毫秒,则无法表示大于 27 天的时间跨度。由您做出选择。

关于vba - 通过 COM 创建 TimeSpan 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com