如何在C++Builder中使用ComPtr?

问题描述 投票:0回答:2

我正在尝试在我的 C++Builder 项目中实现 DX11。所有 SDK 参考均使用

ComPtr<>
模板,例如:

// Create the DX11 API device object, and get a corresponding context.
ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;

当然,C++Builder 不知道

ComPtr
,那么我如何包含它,或者通过
ComPtr
模板进行移植?基本上,让它在 C++Builder 中工作。

更新

所以,有人问我关于标题的事情。显然,我没有所需的标头,因此我在这里寻求解决方案。

#include <vcl.h>
#include <winuser.h>
#include <d2d1.h>
#include <d3d11.h>

根据 Microsoft 的说法,我应该包含

<client.h>
,但 C++Builder 无法找到该内容。

smart-pointers directx-11 c++builder-11-alexandria
2个回答
0
投票

ATL::CComPtr
是微软的课程。我相信它在微软的atlcom.h或atlcomcli.h中。将会有一个 MFC 等效项。

如果您没有 Visual Studio,模板将如下所示:

template<typename T>
class CComPtr
{
    T *m_pObj;
public:
    CComPtr() : m_pObj(nullptr) {}
    CComPtr(T *p) : m_pObj(p)
    {
        p->AddRef();
    }
    ~CComPtr();

    HRESULT CreateInstance(REFCLSID rclsid, DWORD dwClsContext, LPUNKNOWN pUnkOuter=nullptr, REFIID    riid = IID_IUnknown)
    {
        ASSERTE(m_pObj == nullptr); // if not, release first
        return CoCreateInstance(rclsid, pUnkOuter, dwClasContext, riid, &m_pObj);
    }

    void Release()
    {
        if (m_pObj)
            m_pObj->Release();
        m_pObj = nullptr;
    }

    // These methods access the pointer without adding or releasing references.
    void Attach(T *p);
    T* Detach();

    // non-modifying operator overloads
    T* operator *();
    T* operator ->();
    operator bool();
    // modifying overload - Pointer should be null before use.
    T** operator &();
};

0
投票

C++Builder 有自己的智能接口指针类,例如

TComInterface
中的
<utilcls.h>
:

#include <utilcls.h>

TComInterface<ID3D11Device> device;
TComInterface<ID3D11DeviceContext> context;
© www.soinside.com 2019 - 2024. All rights reserved.