是否有使用以下内容的替代方法?
class IGraphBuilder;
public ref class Device
{
private:
IGraphBuilder* pGraphBuilder;
public:
void Configure()
{
pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder, (void**)ppGraphBuilder);
reinterpret_cast(ppGraphBuilder)编译,但如果这种情况正确,我有点困惑。
如果这不是C ++ / CLI(其中&NativeMember
实际上意味着interior_ptr<Type>(NativeMember)
),我只会使用static_cast<void**>(&pGraphBuilder)
,但即使在正确转换为pin_ptr
之后,也会使用pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder;
static_cast<void**>(ppGraphBuilder)
编译
{{1}}
是否有任何解决方案或我被迫使用(void **)因为pin_ptr很奇怪?
答案 0 :(得分:1)
reinterpret_cast
(以及C演员)可能不行,尽管它可能因pin_ptr
所谓的微不足道的布局而起作用。实际上,您必须先将转换运算符从cli::pin_ptr<IGraphBuilder*>
调用到IGraphBuilder**
(因此来自编译器的抱怨)。
reinterpret_cast<void**>(static_cast<IGraphBuilder**>(ppGraphBuilder))
是对的。您可能希望首先引入类型为IGraphBuilder**
的中间变量:
pin_ptr<IGraphBuilder*> p = &pGraphBuilder;
IGraphBuilder** ppGraphBuilder = p;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC,
IID_IGraphBuilder, reinterpret_cast<void**>(p));