首先,我建議存儲智能指針代替原料所屬指針 STL容器內等std::vector
,例如
std::vector<CComPtr<ID3D11DeviceChild>> shaders;
使用原始擁有STL容器內指針是泄漏,潛在的錯誤和異常不安全代碼(觀察原始指針是細,雖然)的來源。
向下轉型從ID3D11DeviceChild*
到ID3D11VertexShader*
,可以考慮使用QueryInterface()
(再次使用ATL智能指針像CComPtr
簡化了代碼):
CComPtr<ID3D11VertexShader> spVertexShader;
HRESULT hr = (shaders[i])->QueryInterface(IID_PPV_ARGS(&spVertexShader));
if (FAILED(hr))
...
PS
除非我失蹤因爲ID3D11VertexShader
是派生類ID3D11DeviceChild
,所以您不需要static_cast
位置:
shaders.push_back(static_cast<ID3D11DeviceChild*>(VS));
這應該是罰款:
shaders.push_back(VS);
註上CAdapt
請注意,您可能需要使用CAdapt
與std::vector
:
std::vector<CAdapt<CComPtr<ID3D11DeviceChild>>> shaders;
一個符合C++ 11 STL實現應該不要求CAdapt
,但我認爲這是必要的,至少有VS2008和VS2010。
我不知道有關Visual Studio的更現代版本,但似乎他們固定的,例如:
你可能需要閱讀的段落標題爲this Visual C++ blog post「耐超載地址的運營商」。
謝謝C64先生。我想我需要閱讀更多的COM接口,以找出爲什麼c + +鑄造將無法正常工作。 – rashmatash