我如何在C ++ / CLI的引用类中使用'native'指针?

我正在尝试编写一个使用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:'type cast':无法从'cli :: interior_ptr'转换为'void **'

这个错误表明graphBuilder被认为是'cli::interior_ptr<Type>' 。 这是一个托管内存的指针/句柄,不是吗? 但它是一个纯粹的本地指针。 我不想将指针传递给期望句柄的方法,反之亦然 - 我只是想将它存储在我的托管类中)如果是这样,我怎么说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...
    }
}
链接地址: http://www.djcxy.com/p/27803.html

上一篇: How can I use a 'native' pointer in a reference class in C++/CLI?

下一篇: Wrapping an Unmanaged C++ Class Library with C++/CLI