2013-06-24 128 views
0

我是帶有v110_xp工具集的visual studio 2012 pro。我想在COM類中「轉換」我的C++動態庫。該庫的結構以這種方式:C++ COM ATL DLL

struct A; 
struct B; 

class IClass { 
public: 
    virtual ~IClass() = 0; 
    virtual A doA() = 0; 
    virtual B doB() = 0; 
    virtual void getA(A& a) = 0; 
    virtual void getB(B& b) = 0; 
}; 
inline IClass::~IClass() {} 

typedef std::unique_ptr<IClass> IClassPtr; 
API_LIB IClassPtr ClassCreate(/* param */); 

現在所有的方法和funcion可以拋出一個類的std ::例外獲得(與析構函數除外)。

我想讓這個COM類,所以我可以使用它從C#。哪種方法可以實現這一目標? ATL可以幫忙嗎?有人知道一些教程或書籍。我在COM中沒有經驗。

+2

你還是可以從右端做:創建一個新的ATL COM項目,添加COM類存在。你有嚮導,你可以在這裏找到教程。 –

+1

如果您只是希望能夠從C++/CLI調用C++,可能會比編寫COM組件更容易。 –

+0

A和B的外觀如何。除非它們是POD結構體,否則不能直接將它們傳遞給C#。你能展示A和B嗎? –

回答

1

你應該至少從IUnknown派生你的課程。如果你打算在某些腳本中使用你的COM,那麼你會從IDispatch派生你的類。 COM的一本好書是Jonathan Bates用ATL創建輕量級組件。

但是,一些真正簡陋實施看起來是這樣的:

class MyCOM : public IUnknown 
{ 
public: 
    static MyCOM * CreateInstance() 
    { 
     MyCOM * p(new(std::nothrow) MyCOM()); 
     p->AddRef(); 
     return p; 
    } 

    ULONG __stdcall AddRef() 
    { 
     return ++nRefCount_; 
    } 

    ULONG __stdcall Release() 
    { 
     assert(nRefCount_ > 0); 

     if(--nRefCount_ == 0) 
     { 
      delete this; 
      return 0; 
     } 

     return nRefCount_; 
    } 

    HRESULT __stdcall QueryInterface(const IID & riid, void** ppvObject) 
    { 
     if(riid == IID_IUnknown) 
     { 
      AddRef(); 
      *ppvObject = this; 
      return S_OK; 
     } 

     // TO DO: add code for interfaces that you support... 

     return E_NOINTERFACE; 
    } 

private: 

    MyCOM() 
    : nRefCount_(0){} 
    MyCOM(const MyCOM &); // don't implement 
    MyCOM & operator=(const MyCOM &); // don't implement 
    ~MyCOM(){} 

    ULONG nRefCount_; 
};