【问题标题】:Is it possible to determine default values of optional parameters in a COM interop type?是否可以确定 COM 互操作类型中可选参数的默认值?
【发布时间】:2012-06-29 17:59:13
【问题描述】:

我正在使用 C# 4.0 实例化 Excel.Application 并打开 Excel.Workbook。剥离下来,我的代码如下所示:

Excel.Application xlApp;
Excel.Workbook xlWorkBook;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("someFile");

Open() 方法有很多我不需要提供的可选值。这很方便,只是我不知道那些可选参数的默认值是什么。因此,我无法决定是否必须提供值。

在这种情况下,我可以在 MSDN 文档中找到 一些 参数的所需信息。是否有一种通用方法来确定 COM 互操作类型中可选参数的默认值?

更新:

MSO.dll 上使用oleview,我检查了Workbook 接口的相应IDL。对于SaveAs() 方法,它看起来像这样:

HRESULT SaveAs(
    [in, optional] VARIANT Filename,
    [in, optional] VARIANT FileFormat,
    [in, optional] VARIANT Password,
    blahblah...
    [in, optional, defaultvalue(1)] XlSaveAsAccessMode AccessMode,
    blahblah...
    [in, optional] VARIANT Local,
    [in, lcid] long lcid);

在 Visual Studio 中,intellisense 为大多数参数显示 [object Filename = Type.Missing],我认为这是有道理的,因为 IDL 没有提供任何有关类型 (VARIANT) 或任何默认值的信息。但是,对于参数AccessMode,IDL 提供了所需的信息并由智能感知显示。

所以我想现在的问题变成了:为什么 IDL 没有更具体地说明所有参数的类型(和默认值),就像 AccessMode 一样?

【问题讨论】:

  • 智能感知不显示预期值吗?
  • @MBen:请参阅我对更新下的问题的补充以获得答案。

标签: c# c#-4.0 com


【解决方案1】:

为什么 IDL 没有更具体地说明类型(和默认值)

具体的类型,它是VARIANT。它没有必须具体说明默认值,变体能够指定“未指定”。实际上在类型库中指定默认值是可能的,你从逆向工程的 IDL 中看到了这一点。

这里有很大的灵活性。但是,如果变量值是“未指定”,那么 COM 服务器将替换它认为默认的任何值,或者给它未指定的特定行为。找出可能是什么的唯一方法是通过文档。这确实并不总是很出色。

【讨论】:

  • 好的,知道了。现在,由于这些是VARIANT 参数,它没有具有 来具体说明默认值,但是可以 它具体说明默认值吗?换句话说,是否可以为VARIANT类型参数指定默认值?
  • 不,变体本身没有默认值。特定的默认值只能在类型库中通过方法声明中的 [defaultvalue] 属性来指定。如果源代码省略了一个值,则编译器的工作就是使用该值创建一个变体。
  • 不确定我是否完全理解你的解释,所以我将改写我的问题。在SaveAs() 示例中,与[in, optional] VARIANT Filename 相反,在技术上是否可以使用[in, optional, defaultvalue("workbook.xls")] VARIANT Filename
  • 技术上是的。当然,它实际上并不存在于类型库中,您也没有添加它的选项。
  • 现在我明白了,所以在这种情况下,COM 对象的创建者(=Microsoft 团队)出于某种原因决定不在接口中包含(所有)默认值。这对我来说是违反直觉的。不过再想一想,即使知道默认值仍然不能保证您真正理解相应的行为,并且作为对象的用户,我应该无论如何都要阅读文档以充分理解方法 -- 有或没有默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2017-05-11
  • 2019-10-15
相关资源
最近更新 更多