【问题标题】:C++ COM ATL DLLC++ COM ATL DLL
【发布时间】:2013-06-21 04:33:40
【问题描述】:

我是带有 v110_xp 工具集的 Visual Studio 2012 Pro。我想在 COM 类中“转换”我的 c++ 动态库。该库的结构是这样的:

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 */ );

现在所有方法和函数都可以抛出一个派生自 std::exception 的类(析构函数除外)。

我想让它成为一个 COM 类,这样我就可以在 C# 中使用它。实现这一目标的最快方法是什么? ATL 可以提供帮助吗?有人知道一些教程或书籍。我没有 COM 经验。

【问题讨论】:

  • 你应该从右端开始:创建一个新的 ATL COM 项目,在那里添加 COM 类。你有向导,你可以找到这方面的教程。
  • 如果您只是希望能够从 C++/CLI 调用 C++,可能比编写 COM 组件更容易。
  • A 和 B 长什么样。除非它们是 POD 结构,否则不能将它们直接传递给 C#。可以显示 A 和 B 吗?
  • 它们包含复杂的数据结构...例如 A 定义为:class A : private std::bitset&lt; 16 &gt;,B 例如包含 std::vector 和 std::string 作为数据成员

标签: c++ com atl


【解决方案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_;
};

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 2011-09-26
    • 2013-09-08
    • 2016-12-19
    • 2013-06-17
    • 2012-03-09
    • 2014-12-24
    • 2012-03-09
    • 2014-03-13
    相关资源
    最近更新 更多