2012-06-04 82 views
2

通常要創建COM接口,應該在IDL文件中聲明它。在我的工作項目,我有一個COM接口在C * .h文件中聲明++:在C++中聲明的COM接口

struct DECLSPEC_UUID("A67177F7-A4DD-4A80-8EE1-25CF12172068") ISomeService : public IUnknown 
{ 
    virtual ~ISomeService() {} 

    virtual HRESULT Initialize(const Settings& settings) = 0; 

    // ... 
}; 

此外,該方法初始化需要包含的std :: string領域作爲其參數結構。 相應的COM類在C++中實現,並從另一個C++模塊中使用。 這工作正常,直到我運行AppVerifier下的代碼。它會導致訪問衝突異常發生。

所以我的問題是

  1. 那麼,是否可以申報有時COM接口中的* .h文件?
  2. 如果是,是否將C++類型指定爲COM接口方法的參數是正確的?或者我應該總是在這種情況下使用符合COM的類型(BSTR等)?
+0

我從來沒有見過只在.h文件中定義的COM接口。 CoClass的定義在哪裏?無論如何,如果你正在使用一個自定義類,COM應該知道這個類,以便它可以編組這個類,以便數據正確地從調用者傳遞到被調用的方法。請參閱此鏈接中的第5.5節(http://progtutorials.tripod.com/COM.htm)瞭解如何實現此目的。 – PermanentGuest

+0

@Unni:爲什麼要有* coclass?這是一個接口。 –

回答

3
  1. 當然,你可以描述一個COM接口,而無需使用IDL。但是您將無法使用類型庫和編組代碼生成等IDL功能。但是,如果您使用COM組件作爲僅在proc服務器(DLL),並且可以將.h文件分發給客戶端 - 那麼此方法可以正常工作。

  2. 避免在接口中使用C++類型,因爲它可能會導致在跨越DLL邊界處理內存時導致訪問衝突。更好地利用普通的C類型,或COM類型