【问题标题】:Accessing c# property from unmanaged C++ using COM Interop使用 COM 互操作从非托管 C++ 访问 c# 属性
【发布时间】:2013-06-29 05:56:34
【问题描述】:

我有一个返回类型为字符串(甚至是对象)的属性,它在 .tlh 文件中作为 get_Name 和 put_Name 暴露在 COm 中。如何在非托管 c++ 中访问并设置此属性。 直到现在.. 在 C# 方面, 我通过具有 DispId(1) 的接口公开了此属性,并在继承该接口的类中实现了它。 在 C++(非托管端)中, 我使用以下语法创建了一个接口指针:

ManagedDLL::ICalculatorPtr pICalculator;//Interface having the property
hr = pICalculator.CreateInstance(__uuidof(ManagedDLL::Calculator));//1. Calculator implements property of Icalculator & hr is of HRESULT type
    pICalculator->put_Name="New1";
    pICalculator->put_Name="New2";//below error comes here :

错误 C2659:“=”:作为左操作数起作用 我知道这个错误的含义。 仅供参考:当我的 Name 属性在非托管 c++ 中设置时,我想在 c# 中引发一个事件。

【问题讨论】:

    标签: c# c++ properties com interop


    【解决方案1】:

    试试这个:

    pICalculator->put_Name(_TEXT("New1"));
    

    从 COM 导入后,您的 C# 属性变成了方法。

    UPD。 该示例使用_TEXT 宏将char* 转换为BSTR,但ATL 中还有一个有用的类型CComBSTR,这使得处理BSTR 变得更加容易。

    【讨论】:

    • 我知道!所以我也试了一下。但它需要 BSTR。你能告诉我如何将 char* 转换为 BSTR。我也去了这个链接。看到了各种方法,但在实施时徒劳无功。 social.msdn.microsoft.com/Forums/vstudio/en-US/…
    • _TEXT 是一个宏,它可以替代什么?因为它肯定会给我一个错误未声明的标识符..对吗?我是 COM 的新手。所以饶了我吧!
    • 不,_TEXT 不会生成 BSTR。它属于博物馆,所以答案不应该再使用它,即使它完全错误地使用。使用 SysAllocString() 或包装类。
    • @HansPassant:为什么会这样?幸运的是,我很长一段时间都不是 C++ 人,我问这个只是出于好奇。
    • 它用于在需要在 Windows 95、98 或 ME 上运行的程序中生成 8 位字符串文字。没有人再使用这些了,所有使用的 Windows 版本都以 Unicode 为核心。
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2014-02-15
    • 2013-04-28
    • 2010-12-14
    • 2011-04-21
    相关资源
    最近更新 更多