Я пытаюсь создать файл stdafx.cpp, который включает все #imports в проекте, чтобы улучшить время сборки. Я хочу включить все импорта для Word / Excel / PPT Office 2010, 2013 и 2016.
Когда я помещаю весь импорт в CPP, проблем не возникает, но когда я помещаю все #imports в stdafx.cpp. cx_excel2013.tlh генерируется неправильно.
Эта проблема является то, что cx_excel2013.tlh пытается использовать пространство имен «Office2010» для объектов в «Office2013», что приводит к сбою сборки.
например, enum Office2010 :: MsoTriState LinkToFile генерируется, что не удается построить.
Может кто-нибудь объяснить, что происходит или что происходит и как преодолеть это (не возвращая #imports обратно в CPP) ???
Кроме того, я подумал о том, чтобы просто сгенерировать TLH / TLI и полностью удалить импорт, потому что он не изменится, но это неправильно, и я не решаю реальную проблему.
Спасибо!
stdafx.cpp:
// Office 2010
#import "..\lib\tlb\office\MSO2010.tlb" rename_namespace("Office2010") rename("RGB","msoRGB") rename("SearchPath", "msoSearchPath") rename("DocumentProperties", "msoDocumentProperties")
#import "..\lib\tlb\office\VBE6EXT2010.tlb" rename_namespace("VBE6EXT2010") rename("Property", "vbeProperty")
#pragma warning(disable: 4192)
#import "..\lib\tlb\office\excel2010.tlb" rename_namespace("Excel2010") rename("VBE6", "VBE6EXT2010") rename("RGB","excelRGB") rename("DialogBox","excelDialogBox") rename("CopyFile","excelCopyFile") rename("ReplaceText","excelReplaceText") rename("Property", "excelProperty") no_function_mapping
#import "..\lib\tlb\office\msppt2010.tlb" rename_namespace("PowerPoint2010") rename("VBE6", "VBE6EXT2010") rename("RGB","pptRGB") rename("Property", "pptProperty") no_function_mapping
#import "..\lib\tlb\office\MSWORD2010.tlb" rename_namespace("Word2010") rename("VBE6", "VBE6EXT2010") rename("ExitWindows","wordExitWindows") rename("FindText","FindText1") rename("RGB", "wordRGB") no_function_mapping
#pragma warning(default: 4192)
// Office 2013
#import "..\lib\tlb\office\MSO2013.tlb" rename_namespace("Office2013") rename("RGB","msoRGB") rename("SearchPath", "msoSearchPath") rename("DocumentProperties", "msoDocumentProperties")
#import "..\lib\tlb\office\VBE6EXT2013.tlb" rename_namespace("VBE6EXT2013") rename("Property", "vbeProperty")
#pragma warning(disable: 4192)
#import "..\lib\tlb\office\excel2013.tlb" rename_namespace("Excel2013") rename("VBE6", "VBE6EXT2013") rename("RGB","excelRGB") rename("DialogBox","excelDialogBox") rename("CopyFile","excelCopyFile") rename("ReplaceText","excelReplaceText") rename("Property", "excelProperty") no_function_mapping
#import "..\lib\tlb\office\msppt2013.tlb" rename_namespace("PowerPoint2013") rename("VBE6", "VBE6EXT2013") rename("RGB","pptRGB") rename("Property", "pptProperty") no_function_mapping
#import "..\lib\tlb\office\MSWORD2013.tlb" rename_namespace("Word2013") rename("VBE6", "VBE6EXT2013") rename("ExitWindows","wordExitWindows") rename("FindText","FindText1") rename("RGB", "wordRGB") no_function_mapping
#pragma warning(default: 4192)
// Office 2016
#import "..\lib\tlb\office\MSO2016.tlb" rename_namespace("Office2016") rename("RGB","msoRGB") rename("SearchPath", "msoSearchPath") rename("DocumentProperties", "msoDocumentProperties")
#import "..\lib\tlb\office\VBE6EXT2016.tlb" rename_namespace("VBE6EXT2016") rename("Property", "vbeProperty")
#pragma warning(disable: 4192)
#import "..\lib\tlb\office\excel2016.tlb" rename_namespace("Excel2016") rename("VBE6", "VBE6EXT2016") rename("RGB","excelRGB") rename("DialogBox","excelDialogBox") rename("CopyFile","excelCopyFile") rename("ReplaceText","excelReplaceText") rename("Property", "excelProperty") no_function_mapping
#import "..\lib\tlb\office\msppt2016.tlb" rename_namespace("PowerPoint2016") rename("VBE6", "VBE6EXT2016") rename("RGB","pptRGB") rename("Property", "pptProperty") no_function_mapping
#import "..\lib\tlb\office\MSWORD2016.tlb" rename_namespace("Word2016") rename("VBE6", "VBE6EXT2016") rename("ExitWindows","wordExitWindows") rename("FindText","FindText1") rename("RGB", "wordRGB") no_function_mapping
#pragma warning(default: 4192)
РЕДАКТИРОВАТЬ:
Я должен добавить, что сборка не удалась и другие TLH / TLI не генерируются.
Проблема заключалась в том, что все офисные версии используют один и тот же GUID, единственное отличие — версия, которую игнорирует директива #import.
Вот почему при создании Excel2013.tlh / tli используется Office2010 (первый офисный TLB), потому что GUID, который он ищет, уже определен, поэтому он может игнорировать Office2013. С точки зрения VS, это то же самое.
Интерфейсы имеют обратную совместимость, поэтому решение просто импортировало 2016 год. Недостатком является то, что код Office2010 / 2013 может пытаться использовать код, который он на самом деле не поддерживает (происходит сбой во время выполнения).
Других решений пока нет …