C++ cli 使用重新解释型铸造或静态铸造的引脚ptr替代(无效**)?

C++ cli 使用重新解释型铸造或静态铸造的引脚ptr替代(无效**)?,c++-cli,C++ Cli,除了使用以下选项,还有其他选择吗 class IGraphBuilder; public ref class Device { private: IGraphBuilder* pGraphBuilder; public: void Configure() { pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder; HRESULT hr = CoCreateI

除了使用以下选项,还有其他选择吗

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);

有没有什么解决方案,或者我是因为pin\u ptr很奇怪而被迫使用(void**)的?

重新解释pin\u cast
(因此C cast)可能是不好的,尽管它可能会因为
pin\u ptr
的据称微不足道的布局而起作用。实际上,您必须首先从
cli::pin_ptr
调用转换操作符到
IGraphBuilder**
(因此编译器会发出抱怨)


C2440:“static_cast”中执行此操作时出错:无法从“IGraphBuilder**”转换为“void**”
此线程讨论相同的问题@你说得对。第二次施展必须使用
重新解释施展
。这并没有改变这样一个事实,即从技术上讲,您需要两次转换。在这种情况下,在第一次转换为IGraphBuilder**后使用是否安全?@NtscCobalt:是的,否则您将永远无法进行COM。@Alaxandre C.啊,好的,谢谢。使用C样式
(void**)
的铸造确实有效,并且当前已就位
(void**)销\u ptr(&pGraphBuilder)
。为了可读性和安全性,我将更改所有的C++/CLI COM调用,使其看起来像您的文章。谢谢
pin_ptr<IGraphBuilder*> ppGraphBuilder = &pGraphBuilder;
static_cast<void**>(ppGraphBuilder)
reinterpret_cast<void**>(static_cast<IGraphBuilder**>(ppGraphBuilder))
pin_ptr<IGraphBuilder*> p = &pGraphBuilder;
IGraphBuilder** ppGraphBuilder = p;

HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
        NULL,
        CLSCTX_INPROC,
        IID_IGraphBuilder, reinterpret_cast<void**>(p));