2010-06-11 21 views
11

當更新的Microsoft Office 2007到Office 2010中嵌入我們的軟件,一些自定義的VBA腳本編程後重建.exd-文件失敗,出現以下錯誤消息編譯:加載VBA

對象庫無效或包含 引用以找不到 的對象定義。

據我所知,此錯誤是由Microsoft安全更新(Microsoft安全通報960715)導致的。將ActiveX控件添加到VBA腳本時,有關控件的信息存儲在本地硬盤驅動器(.exd-files)上的緩存文件中。安全更新修改了這些控件中的一部分,但.exd文件不會自動更新。當VBA腳本嘗試加載存儲在緩存文件中的舊版本控件時,會發生錯誤。這些緩存文件必須從硬盤中刪除,以便控件成功加載(這將自動創建新的更新的.exd文件)。

我想要做的是以編程方式(使用Visual C++)刪除過時的.exd文件,當我們的軟件加載。當使用CApcProject::ApcProject.Open打開VBA項目時,我設置了以下標誌:axProjectThrowAwayCompiledState

TestHR(ApcProject.Open(pHost, (MSAPC::AxProjectFlag) (MSAPC::axProjectNormal | MSAPC::axProjectThrowAwayCompiledState))); 

根據文檔,該標誌應該會導致VBA項目被重新編譯並且臨時文件被刪除和重建。我也嘗試更新宿主應用程序類型庫的校驗和,它應該具有相同的效果。但是,這些修復程序似乎都沒有完成這項工作,而且我的想法也不多了。

+3

我會申明,您首先嚐試手動刪除.exd文件,以驗證它是否解決了您的問題(然後嘗試以編程方式執行此操作)。在我的情況下,它並沒有解決問題。 http://stackoverflow.com/questions/4495002/object-library-invalid-or-contains-references-in-excel-vba-with-datepicker – CaBieberach 2011-04-27 10:34:18

+0

它可能是你引用的KillBit問題,或者它可能是其他的東西。您是否從x86 Office 2007升級到x64 Office 2010?您是否檢查過您的VBA參考以查找缺失的項目?您是否收到「隱藏模塊中的編譯錯誤」錯誤?您是否瀏覽過http://blogs.msdn.com/b/vsod/archive/2009/06/05/visual-basic-6-controls-stop-working-after-security-advisory-960715.aspx?你有沒有在Excel選項中選中「忽略使用動態數據交換(DDE)的其他應用程序」?同意@CaBieberach,您可能需要首先通過手動刪除.exd來確認這實際上是問題。 – 2011-05-01 10:15:31

+0

我們已經驗證刪除exd-files解決了這個問題(通過在幾臺測試機上手動完成)。升級到x86版本的Office時出現問題(我們不支持將Office 2010 x64與我們的軟件結合使用)。現在,當客戶遇到這個問題時,我們讓他們運行一個刪除所有exd文件的腳本。 – aspartame 2011-05-02 12:25:13

回答

2

我前幾次遇到這個問題,推薦的(和工作)解決方案確實是刪除系統驅動器上的所有.exd文件。顯然,它們在需要時被重建,因此不需要以編程方式觸發重建過程。

+0

問題是我實際上需要以編程方式進行。但已經差不多一年沒有找到辦法去做,所以我會接受這個答案,繼續我的生活;) – aspartame 2012-03-30 14:18:07