4

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

更新:

使用oleviewon 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 中,智能感知显示[object Filename = Type.Missing]了大多数参数,我认为这是有道理的,因为 IDL 没有提供有关类型 ( VARIANT) 或任何默认值的任何信息。然而,对于参数AccessMode,IDL 提供了所需的信息并由智能感知显示。

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

4

1 回答 1

3

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

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

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

于 2012-06-30T00:31:46.913 回答