Автоматизация COM C ++ Excel - Workbook.SaveAs - член не найден - PullRequest
0 голосов
/ 05 декабря 2018

Недавно мы заметили проблемы в нашем унаследованном приложении MFC, где бы мы ни пытались вызвать Workbook.SaveAs, этот вызов не выполняется на машинах, которые используют более старую версию Office, чем наши машины для разработки.Я думаю, что я сузил проблему до изменений в библиотеке типов Excel, где-то между 16.0.4549.1000 и 16.0.9029.2106 в метод SaveAs был добавлен новый необязательный параметр.

Однако я озадачен, почемуНа этот раз изменения повлияли на нас, когда за последние 10 с лишним лет этого не происходили с аналогичными изменениями в библиотеке типов.Мы используем следующие директивы для импорта:

// MSO
#import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52"  \
        no_dual_interfaces \
        rename("RGB", "OfficeRGB") \
        rename("SearchPath", "OfficeSearchPath")

// VBA
#import "libid:0002E157-0000-0000-C000-000000000046" \
        no_dual_interfaces

// Excel
#import "libid:00020813-0000-0000-C000-000000000046" \
        no_dual_interfaces \
        rename("RGB", "ExcelRGB") \
        rename("DialogBox", "ExcelDialogBox") \
        rename("CopyFile", "ExcelCopyFile") \
        rename("ReplaceText", "ExcelReplaceText")

Насколько я понимаю, использование "no_dual_interfaces" гарантирует, что все вызовы сгенерированных методов-оболочек выполняются через IDispatch, поэтому используется позднее связывание, которое должно точно решить проблемумодифицированных методов в библиотеке типов.Или я ошибаюсь в этом предположении?

Пример кода, иллюстрирующего проблему:

// create Excel instance
Excel::_ApplicationPtr excelApp;
excelApp.CreateInstance(_T("Excel.Application"));

// add a new workbook
Excel::WorkbooksPtr workbooks = excelApp->GetWorkbooks();
Excel::_WorkbookPtr workbook = workbooks->Add();
workbook->Activate();

// insert data
// ...

// save the workbook to the temp directory
TCHAR lpTempPath[MAX_PATH];
GetTempPath(MAX_PATH, lpTempPath);
COleVariant filename(CString(lpTempPath) + _T("ExcelAutomation"));
workbook->SaveAs(filename, vtMissing, vtMissing, vtMissing, VARIANT_FALSE, VARIANT_FALSE, Excel::xlNoChange, vtMissing, VARIANT_FALSE);

Наш вызов SaveAs предоставляет только те параметры, которые поддерживаются веками, все новые параметры остаются по умолчанию.стоимость vtMissing.Мы что-то упускаем, ожидая, что этот вызов будет работать в описанном сценарии, независимо от точной версии Office, используемой в месте выполнения?

Мы напрямую связались с Microsoft Professional Support по этой проблеме, но нам поручили спроситьздесь вместо StackOverflow ...

1 Ответ

0 голосов
/ 07 декабря 2018

Ожидается, что службы поддержки Microsoft не смогут вам помочь.Они не устраняют неисправности любого вида кода.Для такого рода вопросов вам необходимо заключить контракт с «Premier support».

...