這很無意義。藉助#import編程Office進行互操作是樣板和推薦的方式。它自動生成的智能指針類型明確用於爲您自動完成引用計數,因此您不能忘記調用Release()。有一些尖銳的邊緣,你必須明白什麼是智能指針可以做和不做。
這是課程這是所有功能於一體代碼框架背後的團隊,否則相提並論。這些樣本是由上海的一個支持團隊創建的,最初被僱用來幫助MSDN論壇。這些人沒有你在Redmond工作的微軟程序員期望的那種憑證,他們的摘錄也沒有被審查。其中有些人是完全不適當的。如果您曾在MSDN論壇上提過問題,並看到他們發佈的答案,那麼您就明白我的意思了。
他們的Solution2.cpp示例通過IDispatch使用後期綁定。這絕對是與Office互操作的難題,當您編寫代碼時,您無論如何都得不到任何幫助。編寫方法調用時,智能感知不能提供任何有用的信息,編譯器也不能告訴您錯過了一個參數或錯誤的參數類型。您的程序在運行時會因爲不透明的錯誤代碼而失敗,如DISP_E_BADVARTYPE或DISP_E_BADPARAMCOUNT。 Release()調用必須明確地進行,當然這會使更容易錯過。您使用智能指針時沒有的問題,他們會給您自動完成和類型檢查。您可以親自看到Solution1.cpp具有多小和可讀性。
診斷到Release()的未接來電很容易,您的程序完成但您仍然會看到Outlook.exe在任務管理器中運行。無論如何你會習慣於檢查,當你調試你的程序,發現錯誤並停止程序來修正時,它也會發生。當然這也阻止了Release()被調用,所以Outlook將繼續運行。你必須自己殺死它。
不要考慮用像C#或VB.NET這樣的託管語言編寫這種代碼。如果您遇到問題,您將獲得lot更多幫助,並且您會發現很多示例代碼。垃圾收集器從不忘記發佈呼叫。這樣做有點慢。
太好了,謝謝!我瞭解循環引用,但我不知道這是此陳述的原因。所以我可以放心地使用#import。 – divB
@divB,除非你處理事件,否則執行「正常水平的預防措施」。否則,執行「高級別的預防措施」,並在完成特定的Excel對象時顯式釋放任何智能指針。 **如果您的應用程序終止,但Excel.exe仍然掛在進程列表中的時間超過幾秒鐘,那將是一個不好的跡象。** – Noseratio