我正在尝试在我的 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 无法找到该内容。
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 &();
};