Fil*_*kun 4 com windows-runtime c++-cx winrt-xaml
C#有很多样本,但MSDN上的C++只有一些代码片段.我把它放在一起,我认为它会工作,但我不确定我是否发布了我必须的所有COM引用.
您的代码是正确的 - IBufferByteAccess
接口上的引用计数*buffer
通过调用递增QueryInterface
,您必须调用Release
一次以释放该引用.
但是,如果你使用ComPtr<T>
,这变得简单多了-有ComPtr<T>
,你不能调用任何的三名成员IUnknown
(AddRef
,Release
,和QueryInterface
); 它阻止你打电话给他们.相反,它以一种难以搞砸的方式封装对这些成员函数的调用.这是一个如何看起来的例子:
// Get the buffer from the WriteableBitmap:
IBuffer^ buffer = bitmap->PixelBuffer;
// Convert from C++/CX to the ABI IInspectable*:
ComPtr<IInspectable> bufferInspectable(AsInspectable(buffer));
// Get the IBufferByteAccess interface:
ComPtr<IBufferByteAccess> bufferBytes;
ThrowIfFailed(bufferInspectable.As(&bufferBytes));
// Use it:
byte* pixels(nullptr);
ThrowIfFailed(bufferBytes->Buffer(&pixels));
Run Code Online (Sandbox Code Playgroud)
bufferInspectable.As(&bufferBytes)
执行安全的调用QueryInterface
:它从类型中计算IID bufferBytes
,执行QueryInterface
,并将结果指针附加到bufferBytes
.当bufferBytes
超出范围时,它会自动调用Release
.代码与您的代码具有相同的效果,但没有容易出错的显式资源管理.
该示例使用以下两个实用程序,这有助于保持代码清洁:
auto AsInspectable(Object^ const object) -> Microsoft::WRL::ComPtr<IInspectable>
{
return reinterpret_cast<IInspectable*>(object);
}
auto ThrowIfFailed(HRESULT const hr) -> void
{
if (FAILED(hr))
throw Platform::Exception::CreateException(hr);
}
Run Code Online (Sandbox Code Playgroud)
细心的读者会发现,因为这个代码使用ComPtr
了IInspectable*
我们从拿到buffer
,这段代码实际上执行附加AddRef
/ Release
比原来的代码.我认为这种影响性能的可能性很小,最好从易于验证的代码开始,然后在理解热点后优化性能.
归档时间: |
|
查看次数: |
2176 次 |
最近记录: |