Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#COM vs C++;COM返回值_C#_C++_Com_Com Interop - Fatal编程技术网

C#COM vs C++;COM返回值

C#COM vs C++;COM返回值,c#,c++,com,com-interop,C#,C++,Com,Com Interop,我正在构建一个COM组件C#,客户可以设置二进制数据。如果COM组件返回异常而不是错误代码,这将是一件好事,但它意识到在(Delphi、C++和JScritp)中处理异常是困难的。我选择它以十六进制(内部转换为二进制)接收数据,并以十六进制(内部转换为二进制)返回数据。getData方法可以返回数据和错误代码,问题是:如何在C#interop中实现这一点 < C++ > com存在HESRESU/P> HRESULT getData([in] int __position, [out,retva

我正在构建一个COM组件C#,客户可以设置二进制数据。如果COM组件返回异常而不是错误代码,这将是一件好事,但它意识到在(Delphi、C++和JScritp)中处理异常是困难的。我选择它以十六进制(内部转换为二进制)接收数据,并以十六进制(内部转换为二进制)返回数据。
getData方法可以返回数据和错误代码,问题是:如何在C#interop中实现这一点

< C++ > com存在HESRESU/P>
HRESULT getData([in] int __position, [out,retval] BSTR* __data); // can Return __data or error -1 data not exists
HRESULT setData([in] BSTR __data, [out,retval] int* __status);
但是在C#COM中

感谢您的advanced,

这应该可以:

[DllImport(DllName)]
static extern int getData(int __position, StringBuilder __data);
这应该起作用:

[DllImport(DllName)]
static extern int getData(int __position, StringBuilder __data);

C#将已知的C#异常映射到HRESULT值。是映射列表中的Microsoft文档。通过将已知的C#异常映射到HRESULT值,可以获得进一步的控制。是映射列表中的Microsoft文档。通过抛出一个.

只需在C#中抛出一个异常即可获得进一步的控制。C#interop层将知道如何捕获异常,返回E#u FAIL hresult(如果C#exception已知,则返回其他适当的值,或者显式指定值的值),并在COM对象上设置。C++智能COM指针,比如知道如何处理这个情况,并会提出一个适当的C++异常。p>
请参阅。

只需在C#中抛出一个异常即可。C#interop层将知道如何捕获异常,返回E#u FAIL hresult(如果C#exception已知,则返回其他适当的值,或者显式指定值的值),并在COM对象上设置。C++智能COM指针,比如知道如何处理这个情况,并会提出一个适当的C++异常。p>
请参阅。

您应该从每个COM方法返回
HRESULT
,并在
out
参数中返回数据。但是,COM互操作层通过在COM
HRESULT
错误代码和C#异常之间自动转换来屏蔽这一点。我认为您的代码应该是这样的:

MIDL

HRESULT getData([out,retval] BSTR* pData);
HRESULT setData([in] BSTR data);
C#

关键是COM函数返回值始终是
HRESULT
。如果函数成功,则返回
S_OK
,否则返回描述失败原因的适当错误代码。在本例中,真正的返回值,
data
,是通过out参数而不是返回值返回的。当然,COM互操作层对您隐藏了实现细节


您的问题似乎表明,如果失败,您希望返回值为
HRESULT
,如果成功,则希望返回值为字符串。这是不可能的,因为函数返回值是静态类型的。

您应该从每个COM方法返回一个
HRESULT
,并在
out
参数中返回数据。但是,COM互操作层通过在COM
HRESULT
错误代码和C#异常之间自动转换来屏蔽这一点。我认为您的代码应该是这样的:

MIDL

HRESULT getData([out,retval] BSTR* pData);
HRESULT setData([in] BSTR data);
C#

关键是COM函数返回值始终是
HRESULT
。如果函数成功,则返回
S_OK
,否则返回描述失败原因的适当错误代码。在本例中,真正的返回值,
data
,是通过out参数而不是返回值返回的。当然,COM互操作层对您隐藏了实现细节


您的问题似乎表明,如果失败,您希望返回值为
HRESULT
,如果成功,则希望返回值为字符串。这是不可能的,因为函数返回值是静态类型。

Hi@SwDevMan81。我不使用C++ DLL,我只想写一个方法,它可以返回(字符串或错误代码)在C谢谢。@Cobaia-要返回两个值,可以使用KeyValuePair(如此处:)。或者,您可以使用“out”关键字为参数赋值
DLLImport
StringBuilder
在此处不适用。这是COM互操作,而不是P/invoke.Hi@SwDevMan81。我不使用C++ DLL,我只想写一个方法,它可以返回(字符串或错误代码)在C谢谢。@Cobaia-要返回两个值,可以使用KeyValuePair(如此处:)。或者,您可以使用“out”关键字为参数赋值
DLLImport
StringBuilder
在此处不适用。这是COM互操作,而不是P/invoke。您的问题在哪里?这里没有问题。我试图修改措辞。我想你是想问,如何在COM接口方法中控制HRESULT值。请看下面我的答案。@Shane Powell,为这一混乱感到抱歉,不是手柄而是投掷。我想返回错误代码或数据。异常解决,但是在Delphi、C++和JScript中捕获C语言互操作异常非常困难。net运行时将HRESULT值转换为从/到异常。COM客户端如何处理HRESULT取决于语言运行时。在C++中,你只需得到HEST,就必须处理它。在其他运行时会有所不同。您的问题在哪里?这里没有问题。我试图修改措辞。我想你是想问,如何在COM接口方法中控制HRESULT值。请看下面我的答案。@Shane Powell,为这一混乱感到抱歉,不是手柄而是投掷。我想返回错误代码或数据。异常解决,但是在Delphi、C++和JScript中捕获C语言互操作异常非常困难。net运行时将HRESULT值转换为从/到异常。COM客户端如何处理HRESULT取决于语言运行时。在C++中,你只需得到HEST,就必须处理它。在其他运行时,它会有所不同。