指向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++/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);