如何从ActiveX C ++类方法返回struct或ptr到struct

时间:2012-05-11 18:20:49

标签: c++ com struct activex marshalling

我有一个最初用MSVC ++ 6.0编写的非托管C ++ DLL。它有几个类和一些独立的C函数,我需要从C#.NET 4.0调用它们。我有几个错误的开始。我知道有几种方法可以做到这一点(转换为COM,MC ++包装器,PInvoke),但它还没有完全清楚哪个是最直接的。我目前的方法是将C ++ DLL转换为ActiveX控件。我遇到的问题是,当尝试在VS 2010 C ++ ActiveX项目中重新创建方法时,类向导不允许任何返回类型,除了基本类型,CString或指向CWnd的指针。如何返回结构的副本或指向结构的指针?由于方法参数的类型与返回类型具有相同的类型限制,因此似乎无法作为参数返回。

Allowed ActiveX Return Types

1 个答案:

答案 0 :(得分:0)

您不应该将非托管数据返回到托管代码(或任何代码)。如果您的ActiveX类正在分配此内存,那么您的ActiveX类将负责其取消分配。

解决此问题的常用方法是使用一个方法返回HRESULT并接收具有数据大小的原始数据,或者如果您想要更像托管的东西,它可以接收安全的字节数组(这可以是映射到托管代码中的byte []。

在方法实现中,您可以使用结构的数据覆盖数组。

回到托管代码中,您需要将结构编组为字节数组,以便将其传递给新方法。方法Marshal.StructureToPtr可能有助于完成此任务。

为了向接收指针作为参数的类添加方法,可以使用activex控件的默认接口的“add method”上下文菜单选项。见下图:

enter image description here