是否可以确定COM互操作类型中可选参数的默认值?

时间:2012-06-29 17:59:13

标签: c# c#-4.0 com

我使用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互操作类型中可选参数的默认值?

更新

oleview上使用MSO.dll,我检查了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一样?

1 个答案:

答案 0 :(得分:3)

  

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

特定于类型,它是VARIANT。它没有具有特定于默认值,变量能够指定“未指定”。实际上可以在类型库中指定默认值,您可以从反向工程IDL中看到它。

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