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