gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:53:15 24 4
gpt4 key购买 nike

我正在尝试编写一个将使用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;

};

如果我正确理解了 this page,则可以像往常一样使用 */&来表示C++/CLI库中指向非托管内存的“ native ”指针。 ^用于表示指向托管对象的指针。但是,此代码产生:

error C2440: 'type cast' : cannot convert from 'cli::interior_ptr' to 'void **'



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

( This question与之类似,但答案是,使用pin_ptr,我看不到有帮助,因为它不能成为我类的一员)

最佳答案

该错误消息有点神秘,但是编译器试图提醒您,您不能将指向托管类成员的指针传递给非托管代码。这在设计上是行不通的,当函数执行并移动受管对象时,垃圾回收器将启动,灾难就会袭来。使指向进程中成员的指针无效,并使 native 代码将字节喷入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...
}
}

关于c++-cli - 如何在C++/CLI中的引用类中使用 'native'指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com