指向C#和C++之间接口的变量指针

本文关键字:变量 指针 接口 之间 C++ 指向 | 更新日期: 2023-09-27 18:26:14

我目前正试图进行此转换。我有一个C++包装器,它公开了一个函数。。。

public __gc class InternalModuleConfig : public ModuleConfig
{
Object* InternalModuleConfig::CommitChanges(IModuleConfig* config)
{
    VARIANT variant = {0};
    m_pModuleConfig = config;
    HRESULT hr = m_pModuleConfig->CommitChanges(&variant);
    if (FAILED(hr))
    {
        VariantClear(&variant);
        return Marshal::GetObjectForNativeVariant(&variant);
    }
    return NULL;
};
};

我试图在c#中调用这个函数,但失败了。我在c#中有一个接口,名称空间如下:

DirectShow.IModuleConfig

现在我正在尝试使用我现有的接口,并获取一个指向它的指针,用作C#中CommitChanges的变量,但我总是遇到转换错误。

这是我尝试的最基本的。。。

InternalModuleConfig config;
config.CommitChanges(ref (filter as IModuleConfig));

这不起作用。。。对于如何为参数应用类型IModuleConfig*,我有点困惑。

有什么想法吗?

编辑:这是InternalModuleConfig基于的接口:

public __gc interface ModuleConfig : public IDisposable
{
public:
virtual Object* CommitChanges(IModuleConfig* config) = 0;
IModuleConfig* m_pModuleConfig;
};

指向C#和C++之间接口的变量指针

我完成C++/CLI已经有一段时间了,但如果您想要一个C#ref参数,我相信您需要一个指向C++中指针的点。

Object* InternalModuleConfig::CommitChanges(IModuleConfig** config) 

托管堆中的每个对象都由一个指针访问。为了允许在函数(ref语义)中更改指针,您需要一个指向该指针的指针。

或者相反,如果您不打算使用ref语义,请删除C#端的修饰符,这样您就可以传递托管对象。

当向C#公开C++/CLI接口时,必须使用跟踪句柄而不是指针或引用:

virtual Object^ CommitChanges( IModuleConfig^% config) = 0;

(参数的语法表示通过引用传递的跟踪句柄,这是相当于C#的ref参数的C++/CLI)

这行不通;如果该方法将不同的IModuleConfig实现放到现场,会发生什么?

相反,使用正确的变量类型:

IModuleConfig config = something;
config.CommitChanges(ref filter as IModuleConfig);