Quick Reference
cpp
struct Vertex { float position[3]; };
const Vertex vertices[] = {
{{ 0.0f, 0.5f, 0.0f}},
{{ 0.5f, -0.5f, 0.0f}},
{{-0.5f, -0.5f, 0.0f}},
};
D3D11_BUFFER_DESC desc{};
desc.ByteWidth = sizeof(vertices);
desc.Usage = D3D11_USAGE_IMMUTABLE;
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA initialData{};
initialData.pSysMem = vertices;
Microsoft::WRL::ComPtr<ID3D11Buffer> buffer;
HRESULT hr = device->CreateBuffer(&desc, &initialData, buffer.GetAddressOf());
if (FAILED(hr)) throw std::system_error(hr, std::system_category(), "CreateBuffer");
UINT stride = sizeof(Vertex);
UINT offset = 0;
context->IASetVertexBuffers(0, 1, buffer.GetAddressOf(), &stride, &offset);ComPtr는 COM reference count를 수명에 맞게 관리합니다. API가 기존 pointer를 덮어쓰는지, 단순히 pointer 배열을 읽는지에 따라 address helper를 구분합니다.
Pointer 전달
Get()은 현재 raw interface pointer를 읽습니다.GetAddressOf()는 현재 pointer 저장 위치의 주소를 제공합니다. 기존 값이 없는 output에 사용합니다.ReleaseAndGetAddressOf()는 현재 참조를 먼저 해제하고 새 output을 받을 때 사용합니다.Reset()은 현재 참조를 해제합니다.As()는 다른 COM interface로QueryInterface합니다.
Create 함수의 output parameter와 Context의 *Set* 함수가 요구하는 pointer 형태를 시그니처로 확인합니다. Attach와 Detach는 소유 reference를 넘기는 고급 경계이므로 일반 생성 흐름에서 남용하지 않습니다.
HRESULT 처리
SUCCEEDED와 FAILED macro로 결과를 검사합니다. S_FALSE처럼 실패가 아닌 상태도 있으므로 hr == S_OK만으로 모든 성공을 판정하지 않습니다. Error code는 log에 16진수 값과 호출 이름을 함께 남깁니다.
자주 틀리는 점
- Raw pointer를 받아 별도
Release와ComPtr관리를 동시에 하지 않습니다. - Output parameter에 무조건
&comPtr를 쓰지 않고 helper를 사용합니다. Get()결과를 오래 보관해ComPtr보다 긴 수명으로 사용하지 않습니다.- HRESULT를 무시하고 null pointer 오류로 원인을 늦추지 않습니다.
참고 링크
2 sources