2017-01-30 53 views
0

我試圖創建一個包含在項目中改善編譯時間所有的#imports的stdafx.cpp文件。我想包括office 2010,2013和2016的word/excel/ppt的所有導入。#進口產生不正確TLH文件

當我將所有導入放置在CPP中時,沒有任何問題,但是當我將所有#imports放入stdafx的.cpp。 cx_excel2013.tlh生成不正確。

問題是,cx_excel2013.tlh試圖爲「Office2013」​​中的對象使用「Office2010」命名空間,導致構建失敗。 例如,正在生成枚舉的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/TLIs。

回答

0

的問題是,所有的Office版本都使用相同的GUID,唯一的區別是版本,其中#import指令忽略。

這就是爲什麼在構建Excel2013.tlh/tli時使用Office2010(第一個辦公室TLB)時,因爲它所查找的GUID已經定義,所以它可以忽略Office2013。從VS角度來看,它是一樣的。

的接口是向後兼容的,因此該解決方案只是導入2016的缺點是,Office2010中/ 2013的代碼可以嘗試使用代碼,它並沒有真正支持(無法在運行時)。