【问题标题】:Instantiating class with parameterized constructor from COM使用 COM 的参数化构造函数实例化类
【发布时间】:2013-10-10 07:18:13
【问题描述】:

是否可以用 COM 调用参数化构造函数? 我将创建一个具有 COM 参数化构造函数的 C# 类实例。 现在它引发了内存异常。所以我不确定带有 COM 的参数化构造函数的 C# 类的实例化。所以请告诉我同样的情况。

我的 C# 构造函数是

public GetNumberFromClass(NumberClass number)
{
}

C++ 构造函数:

NumberFromC#::NumberFromC#
{
    getNumberFromClassPtr.CreateInstance(__uuidof(GetNumberFromClass));
}

并且指针 getNumberFromClassPtr 在出现 NULL 时会引发内存异常。

【问题讨论】:

  • 请提供说明内存异常的SSCCE
  • @nijansen 我不确定 COM-Visible C# 程序集可以是“短”还是“自包含”...
  • @SkoolBoyAtWork,您可能需要关注this related question

标签: c# c++ com constructor


【解决方案1】:

这是不可能的,COM 没有将参数传递给构造函数的机制。这在您的 C++ sn-p 中最为明显,您根据需要使用 __uuidof 关键字指定了类的 GUID,但您没有传递 NumberClass 参数。你不能。

接下来的问题是您没有检查错误,CreateInstance() 返回一个 HRESULT。这会告诉你该方法失败了。嵌入式接口指针仍然为 NULL,当您继续行驶时,这将使您的程序因访问冲突而崩溃。

首先在你的 C# 类中去掉那个构造函数来解决这个问题,它必须有一个默认的构造函数才能被 COM 使用。添加 NumberClass 类型的属性,以便您可以在创建对象后设置该值。当然,还要改进 C++ 代码中的错误处理,如果您没有任何故障,这些故障将变得完全无法诊断。您必须检查 CreateInstance() 的返回值,并且必须在使用该对象的代码中添加 try/catch 块,以便捕获方法调用失败时将引发的 _com_error 异常。

【讨论】:

  • 嗯,这不是唯一的解决方案。他可以使用具有可以接受任何参数的创建者方法的类工厂。
  • 感谢您的回复。能否请您告诉我与类工厂创建者方法相关的示例或链接。所以我会尽早在我的代码中实现它
  • 您可以使您的 C++ 代码看起来像您喜欢的任何方式,编写一个调用 CreateInstance() 的小辅助函数,然后将属性设置为样板。否则与您的问题没有任何关系。
  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多