C++ cli 如何使用';本地';C+中引用类中的指针+/CLI?

C++ cli 如何使用';本地';C+中引用类中的指针+/CLI?,c++-cli,clr,C++ Cli,Clr,我正在尝试编写一个使用DirectShow的小型库。该库将由.NET应用程序使用,因此我认为最好用C++/CLI编写它 但是,我在这条线路上遇到了问题: HRESULT hr = CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,

我正在尝试编写一个使用DirectShow的小型库。该库将由.NET应用程序使用,因此我认为最好用C++/CLI编写它

但是,我在这条线路上遇到了问题:

    HRESULT hr = CoCreateInstance(  CLSID_FilterGraph,
                                    NULL,
                                    CLSCTX_INPROC_SERVER,
                                    IID_IGraphBuilder,
                                    (void**)(&graphBuilder) );  //error C2440:
其中声明了
graphBuilder

public ref class VideoPlayer
{
public:
    VideoPlayer();
    void Load(String^ filename);

    IGraphBuilder*  graphBuilder;

};
如果我理解正确,我可以像往常一样使用
*/&
来表示指向C++/CLI库中非托管内存的“本机”指针<代码>^用于表示指向托管对象的指针。但是,此代码生成:

错误C2440:“类型转换”:无法从“cli::interior\u ptr”转换为“void**”

该错误表明
graphBuilder
被认为是
'cli::interior\u ptr'
。这是一个指向托管内存的指针/句柄,不是吗?但它是一个纯本地指针。我没有试图将指针传递给需要句柄的方法,反之亦然-我只是想将其存储在托管类中)如果是这样,我怎么说
graphBuilder
是“传统”指针


(与此类似,但答案是,使用pin_ptr,我看不出有什么帮助,因为它不能是我的类的成员)

错误消息有点神秘,但编译器试图提醒您,不能将指向托管类成员的指针传递给非托管代码。这在设计上是行不通的,当垃圾收集器在函数执行和移动托管对象时启动,灾难就会发生。使指向进程中成员的指针无效,并导致本机代码在错误地址向gc堆中喷射字节

解决方法很简单,只需声明一个局部变量并传递指向它的指针即可。无法移动堆栈上的变量。像这样:

void init() {
    IGraphBuilder* builder;    // Local variable, okay to pass its address
    HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder,
        (void**)(&builder) );
    if (SUCCEEDED(hr)) {
        graphBuilder = builder;
        // etc...
    }
}

指针本身可以移动,而被设置-我完全错过了!谢谢你,汉斯!所以,要清楚一点,您是说您不能将非托管指针保留为托管类的内部成员?如果这是真的,我就想知道我应该如何以连贯的方式在托管类型和非托管类型之间架起桥梁。不,没关系。OP创建了一个指向对象成员&graphBuilder的指针。只想添加完整的错误代码:
类型为“interior\u pointer”的错误参数与类型为“”的参数不兼容,因为我花了一段时间才找到此答案。