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

How to use ComPtr in C++Builder?

提问人:Max Kielland 提问时间:10/20/2023 最后编辑:Remy LebeauMax Kielland 更新时间:10/21/2023 访问量:47

问:

我正在尝试在我的 C++ Builder 项目中实现 DX11。所有 SDK 引用都使用该模板,例如:ComPtr<>

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

当然,C++ Builder 不知道,那么我该如何包含它或移植到模板上呢?基本上,让它在 C++ Builder 中工作。ComPtrComPtr

更新

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

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

根据 Microsoft 的说法,我应该包括 ,但 C++ Builder 找不到那个。<client.h>

Smart-pointers c++builder-11-alexandria

评论

0赞 Dai 10/20/2023
向我们展示您的标题。
0赞 Dai 10/20/2023
“根据Microsoft我应该包括<client.h> - 请告诉我们您从哪里得到的,例如文档链接。
0赞 Tom Huntington 10/20/2023
试 learn.microsoft.com/en-us/cpp/cppcx/wrl/...#include <wrl\client.h>
0赞 Tom Huntington 10/20/2023
WRL is now superseded by C++/WinRT所以也许只是用 learn.microsoft.com/en-us/cpp/cppcx/wrl/ 代替......winrt::com_ptr
0赞 Simon Mourier 10/20/2023
ComPtr附带 (learn.microsoft.com/en-us/cpp/cppcx/wrl/...),它今天随 Windows SDK 一起提供 developer.microsoft.com/en-us/windows/downloads/windows-sdk 一旦安装,它将位于这样的路径中。PS:您也可以从mingw(例如在msys64\mingw64\include中)获取它,但我不推荐这个。WRLC:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt\wrl

答:

0赞 SmellyCat 10/20/2023 #1

ATL::CComPtr是 Microsoft 类。我相信它在Microsoft的atlcom.h或atlcomcli.h中。将有一个 MFC 等效项。

如果没有 Visual Studio,模板将如下所示:If you don't have Visual Studio, the template will be like:

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赞 Simon Mourier 10/20/2023
问题是关于 ,而不是 . 来自 WRL,而不是来自 ATL(实际上只附带 Visual Studio)ComPtrCComPtrComPtr
0赞 Remy Lebeau 10/21/2023 #2

C++:Builder 有自己的智能接口指针类,例如:TComInterface<utilcls.h>

#include <utilcls.h>

TComInterface<ID3D11Device> device;
TComInterface<ID3D11DeviceContext> context;