ComPtr的介绍以及使用

ComPtr是为COM而设计的智能指针。它支持WindowsRT,也支持传统Win32。相比ATL里的CComPtr类,它有了一些提升。

ComPtr包含在Windows 8.x SDK and Windows 10 SDK,

如果是Windows7系统,需要下载Windows7.1 SDK

下载地址

https://www.microsoft.com/en-us/download/details.aspx?id=8442

转载于:https://www.cnblogs.com/zhaotianff/p/11448143.html

ComPtr是一个智能指针类,用于管理COM对象的生命周期,它会自动进行AddRef和Release操作,避免了手动管理引用计数的麻烦。如果你想要在自己的class中使用ComPtr,可以按照以下步骤进行: 1. 在头文件中引入ComPtr类: ```C++ #include <wrl/client.h> using Microsoft::WRL::ComPtr; ``` 2. 在class中定义成员变量时,将需要管理的COM对象的指针类型改为ComPtr类型,例如: ```C++ class MyClass { public: MyClass(); private: ComPtr<ID3D11Device> m_d3dDevice; }; ``` 3. 在构造函数中初始化ComPtr对象,例如: ```C++ MyClass::MyClass() { HRESULT hr = D3D11CreateDevice(..., &m_d3dDevice); if (FAILED(hr)) { // 处理错误 } } ``` 这样,当MyClass对象被销毁时,m_d3dDevice的引用计数会被自动减少,从而释放COM对象的资源。在使用m_d3dDevice时,可以像使用普通指针一样访问其成员函数和属性,例如: ```C++ m_d3dDevice->CreateBuffer(..., &m_buffer); ``` 需要注意的是,ComPtr对象是不能被复制的,因为这样会导致同一个COM对象被多次释放。如果需要传递ComPtr对象,可以使用其Get方法获取普通指针,例如: ```C++ void MyClass::DoSomething(ID3D11Buffer* buffer) { m_d3dDevice->CreateBuffer(..., &m_buffer); // 使用buffer } MyClass obj; ComPtr<ID3D11Buffer> buffer; obj.DoSomething(buffer.Get()); ``` 这里的buffer是一个ComPtr对象,但是在传递给DoSomething函数时使用了Get方法获取了其指针,因此DoSomething函数中使用的是普通指针,不会影响ComPtr对象的引用计数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值