Недавно мы заметили проблемы в нашем унаследованном приложении 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 ...