2010-07-06 29 views
1

我正在做一個activeX控件的拖放操作。拖動時,我提供了一個CComQIPtr,它具有實現COM方法的信息傳遞給放置目標。拖放時,放置目標的進程會調用我的COM方法來獲取信息。跨進程邊界的CRT類型

我是不是允許使用CRT類型或指針來接近接口邊界的CRT類型?我喜歡我的IDataObject有一個私有的std :: list和一些std :: strings,並且在接口的外部可以調用我的COM方法,它可以訪問這些私有成員。

我認爲這是確定的,因爲我實際上並不是通過跨越邊界的CRT類型。

MSDN: Potential Errors Passing CRT Objects Across DLL Boundaries

+0

我努力表達清楚,隨意修改問題以求清晰 – 2010-07-06 15:23:17

回答

2

你可以使用任何你在你的COM對象的實現作爲喜歡總是在這個過程中(或DLL)保持創建它。

您需要堅持使用COM接口中的COM類型,以便可以在使用對象的過程和創建對象的過程之間編組類型。

你是正確的。那篇文章不適用於這種情況,因爲你沒有通過任何東西跨越邊界。 COM基礎結構處理跨越邊界爲您編組COM類型。

只要確保您捕獲到COM方法中的所有異常,就不能讓它們泄漏出該函數,因爲COM基礎結構不知道如何處理它們。

我個人傾向於有一層COM代碼,它處理COM類型和'普通'類型之間的轉換,然後調用執行真正工作的代碼(請參閱here)。該層包含一個捕獲所有內容並轉換爲適當的HRESULT的異常處理程序。

+0

所以,界面就像是從外部進程到我的進程的一扇門,一旦你在我的進程中(在我的調試器中打到我的斷點),我可以使用任何我想要的類型,只要我只通過門傳回COM /原始類型即可。 – 2010-07-06 16:13:46

+0

非常多;我傾向於把它看作是一個必須跨越的邊界。您可以在邊境一側使用當地習俗,但必須遵守邊境管理部門要求您遵守的任何規則,以便能夠跨越。我在博客上寫了關於dll邊框和COM和.Net的內容:http://www.lenholgate.com/archives/000419.html – 2010-07-06 16:41:18