2012-06-25 33 views
2

以下代碼嘗試附加到打開了C:\ test文件的Excel會話。如果這樣的會話不存在,則返回null或拋出異常。BindToMoniker打開新的Excel會話

var myExcelWorkbook = Marshal.BindToMoniker(@"C:\test") as Excel.Workbook; 

當文件沒有擴展名時,這很有效。但是,如果我嘗試使用具有擴展名的文件(例如C:\ test.xlsb)完全相同的代碼,則調用會在返回之前嘗試使用excel打開該文件。如果一個實例已經在運行,它將嘗試在該實例中打開該文件(就像在Windows資源管理器中雙擊該文件一樣)。

var myExcelWorkbook = Marshal.BindToMoniker(@"C:\test.xlsb") as Excel.Workbook; 

這肯定與擴展(怎麼會BindToMoniker將知道如何以其它方式打開的Excel?)做的,但很討厭,因爲我從來沒有要附加到不具有現有的Excel會話文件已經打開。

有沒有辦法禁用「功能」?我希望BindToMoniker方法永遠不會嘗試打開文件,並讓我決定在各種情況下要做什麼。

回答

1

這個問題很可能與Excel文檔如何在「運行對象表」中命名而不是擴展名的存在有關。

閱讀IRunningObjectTable ...有IRunningObjectTable.EnumRunning這可能是有用的。

+0

好的,但是,如果沒有任何開放的Excel,運行對象表是空的Excel對象。爲什麼'BindToMoniker(「C:\ test.xlsb」)'打開excel和'BindToMoniker(「C:\ test」)'不是? –

+0

沒關係,我所做的是循環通過運行表中的對象,如果我沒有找到我正在尋找的那個,我不稱之爲BindToMoniker。感謝您的建議 –

+0

你很幸運,檢查ROT第一次爲你的情況工作。學習內部工作 - 開始閱讀真正的文檔[IMoniker :: BindToObject](http://msdn.microsoft.com/en-us/library/ms889312.aspx)(鏈接是Win CE,找不到更好的文檔) 。 –