Конфликт имен автоматизации Excel "_FilterDatabase" - различное поведение автоматизации MFC ole и C # .NET - PullRequest
0 голосов
/ 18 февраля 2019

Открытие документа Excel с помощью C ++ MFC OLE-автоматизации показывает конфликт имен ("_FilterDatabase"), тогда как аналогичный подход в C # .NET через Microsoft.Office.Interop.Excel этого не делает.

В моем C ++ MFCПроект автоматизации OLE Я импортировал библиотеку типов для excel.exe и выбрал интерфейсы _Applicatin (CExcelApplication), _Workbook (CWorkbook) и Workbooks (CWorkbooks).

В моем проекте C # .NET я добавил ссылку на COM«Библиотека объектов Microsoft Excel 16.0».

Это код, который я использую в проекте автоматизации CLE MFC OLE:

void OpenExcelDocument(const std::wstring& strDocument)
{

    // Create Excel object and bring Excel to the screen
    CExcelApplication appExcel;
    appExcel.CreateDispatch(L"Excel.Application");

    appExcel.put_Visible(TRUE);


    // obtain the Workbooks interface
    LPDISPATCH pDispWorkbooks = appExcel.get_Workbooks();

    if (pDispWorkbooks == NULL)
        return;

    CExcelWorkbooks workbooks;
    workbooks.AttachDispatch(pDispWorkbooks);

    // setup the default parameters
    VARIANT varDefault;
    memset(&varDefault, 0, sizeof(varDefault));
    varDefault.vt = VT_ERROR;
    varDefault.scode = DISP_E_PARAMNOTFOUND;

    // open the document
    workbooks.Open(strDocument.c_str(),
        varDefault, varDefault, varDefault, varDefault, varDefault, varDefault, varDefault, varDefault,
        varDefault, varDefault, varDefault, varDefault, varDefault, varDefault);

} 

Следующий код демонстрирует аналогичный подход через C # .NET

using Excel = Microsoft.Office.Interop.Excel;

namespace ReadExcelDoc
{
    class Program
    {

        static void OpenExcelDocument(String strDocument)
        {
            Excel.Application xlApp = new Excel.Application();
            xlApp.Visible = true;

            Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(strDocument);
        }

        static void Main(string[] args)
        {
            String xlsFile = @"..."; 
            OpenExcelDocument(xlsFile); 
        }
    }
}

Мои вопросы:

  • Действительно ли это внутренне такой же подход для COM-объектов Excel?
  • Есть ли способ избежать запроса Excel наразрешить конфликт имен в моем подходе автоматизации CLE MFC OLE, несмотря на ручное изменение документа Excel?
  • Являются ли мои аргументы VARIANT по умолчанию в спецификации C ++правильно уволен?
...