2013-10-10 79 views
4

是否可以使用COM调用参数化构造函数? 我将创建一个C#类的实例,它具有带COM的参数化构造函数。 现在它引发了内存禁止。所以我不确定C#类的实例是否携带COM的参数化构造函数。所以请让我知道一样。使用COM的参数化构造函数实例化类

我的C#构造函数是

public GetNumberFromClass(NumberClass number) 
{ 
} 

C++构造函数:

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

和指针getNumberFromClassPtr抛出内存异常,因为它涉及NULL。

+0

请提供一个说明内存异常的[SSCCE](http://sscce.org/)。 – nijansen

+0

@nijansen我不确定COM-Visible C#程序集*可能*是“短”还是“自包含”... – Medinoc

+0

@SkoolBoyAtWork,你可能想要关注[这个相关的问题](http: //stackoverflow.com/q/19308027/1768303)。 – Noseratio

回答

2

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

接下来出现的问题是您没有检查错误,CreateInstance()返回HRESULT。哪个会告诉你方法失败。嵌入式接口指针仍然为NULL,当您只是继续开着电源时,这会使您的程序遭受访问冲突。

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

+0

那么,这不是唯一的解决方案。他可以使用一个可以接受任何参数的创建者方法的类工厂。 – sharptooth

+0

Thanks for the Reply.Could you please告诉我有关类工厂创建者方法的示例或链接。因此,我会尽早在我的代码中实现它 – SkoolBoyAtWork

+0

您可以使您的C++代码看起来像你喜欢的任何方式,写一点点调用CreateInstance()的辅助函数,然后设置该属性为样板。它不会与你的问题有任何关系。 –

相关问题