【问题标题】:Representing IUnknown In Managed C++在托管 C++ 中表示 IUnknown
【发布时间】:2011-10-25 05:42:34
【问题描述】:

我在 C++/CLI 中为 C 静态库构建 Wrapper,以便通过 C# 在 .NET 应用程序中使用

我在 C 中有这样的功能

long    My_COM_Interface(   PVOID hDevice,IUnknown **pUnknown);

如何在 C++/CLI 中声明IUnknown **

对于第一个参数,我正在使用 IntPtr 但无法找到 IUknown 的替换。

我在另一个函数中有另一个 COM 数据类型 GUID,这对我来说也是一个问题。

请帮我找到数据类型 IUnknown 和 GUID 的替换。

【问题讨论】:

    标签: c++-cli iunknown


    【解决方案1】:

    没有替换

    C++/CLI 可以很好地理解本机类型。包括正确的头文件,你可以像往常一样使用IUnknown*

    【讨论】:

    • 实际上,您不应该,至少不应该在公共方法上。如果这样做,您将不得不在使用您的库的任何其他 .net 程序集上使用指针,这并不理想。
    • @yms:C++/CLI 类应该完全包装原生对象,这样使用你的库的其他程序集甚至都不知道有IUnknown*,没关系必须处理它。
    • 但问题是如何声明一个使用 IUnknown 的方法,所以答案不能只是使用 IUnknown...
    • @yms:但它与使用 C 代码有关,与构建托管接口以供其他.NET 代码使用无关。
    • @yms:你曾经构建过这样的包装器吗?我有,很多次。在实现中,您使用所有常用的本机指针类型。 .NET 消费者使用的包装器的公共接口是在 C++/CLI 中定义的 ref class 类型。消费者看不到本机指针,只有一组托管方法(可用行为,内部使用指针和本机库调用和 Win32 API 等)。
    【解决方案2】:

    我会参考 API,例如

     public static IntPtr GetIUnknownForObject(Object o);
    

    这个 API 可以简单地从 C++/CLR 中使用,建议你应该使用 IntPtr^

    【讨论】:

      【解决方案3】:

      尝试使用参数 like;

      ref object pUnknown
      

      并像使用它

      MyObject o = pUnknown as MyObject
      

      【讨论】:

      • 对于“void *”,你应该在c#中使用“ref IntPtr”
      • @EmirAkaydın,但问题是关于 C++/CLI,而不是 C#。
      猜你喜欢
      • 2018-07-26
      • 2013-05-18
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2014-09-14
      • 2011-01-26
      相关资源
      最近更新 更多