使用 COM 互操作从非托管 C++ 访问 c# 属性

Posted

技术标签:

【中文标题】使用 COM 互操作从非托管 C++ 访问 c# 属性【英文标题】:Accessing c# property from unmanaged C++ using COM Interop 【发布时间】: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# 中引发一个事件。

【问题讨论】:

【参考方案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 为核心。

以上是关于使用 COM 互操作从非托管 C++ 访问 c# 属性的主要内容,如果未能解决你的问题,请参考以下文章

从非托管 c++ 调用托管 c# 函数

从非托管 c++ 调用托管 c# 函数

如何从非托管 C++ 代码获取结构化列表值到 C#?

将 HBITMAP 句柄从非托管代码传递到托管代码以创建 System.Drawing.Bitmap 的安全性

从非托管 C++ mfc active x dll 启动 C# 对话框

在 C++Builder 中使用 C# .NET DLL?