C#后期绑定到com / activeX服务器,遇到一个方法问题

时间:2010-06-21 07:51:04

标签: c# com interop reference

我是Interop / Com / ActiveX等的新手,所以请耐心等待。

我迟到绑定到com / activex(不确定哪一个)服务器(基本上是exe不是dll)。我成功使用了该服务器中的所有方法,除了一个,这里是描述:

  

VT_INT GetLastCCTError(变体   *的error_string);

     

说明:此函数用于检索生成的最后一个错误   由CCT。可以调用该函数   在任何时候只要CCT Server   已初始化。如果没有错误   在调用函数时发生,   返回的代码为'0'(零),和   错误字符串将为空。只要   最后一次发生的错误   CCT服务器的当前运行将   可用。

     

输入:无

     

输出:该函数返回单个输出参数,   VARTYPE VT_BSTR类型的'error_string'   | VT_BYREF。该参数包含一个   错误代码的错误字符串   与最后一个CCT功能相关联   失败。返回值:此功能   返回类型的整数值   VT_INT。这是错误代码   与最后一个CCT功能相关联   失败

我首先尝试使用此代码:

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, new object[] {this.LastErrorString});

我遇到以下异常:来自HRESULT的异常:0x80020005(DISP_E_TYPEMISMATCH)

然后经过一番思考后我将代码更改为:

object[] Args = { "SomeString" };

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, Args);

仍然是同样的错误。经过一些谷歌搜索后,我发现了这篇文章:http://www.informit.com/articles/article.aspx?p=27219&seqNum=8

如果您查看3.3节,它似乎是我的问题的解决方案,因此我将我的代码更改为:

object[] Args = { "SomeString" };

ParameterModifier ParMod = new ParameterModifier(1);
ParMod[0] = true;
ParameterModifier[] ArrParMod = { ParMod };

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, Args, ArrParMod, null, null);

this.LastErrorString = (string) Args[0];

这仍会导致相同的异常。我现在认为问题可能不是参考传递而是其他东西。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是因为C#中的字符串是不可变的。

“SomeString”将被编译器解析为托管内存上的不可更改字符串(堆栈或堆在您的情况下基本上无关紧要)。

所以,在某种程度上,你没有传入一个字符串引用,而是一个文字 - 一些永远不会像你的例子那样的'out'参数...所以编组不会做它想的(知道)会是一个坏主意。

Andrew D,我怀疑,是对的。

可能会建议您尝试以下方式:

StringBuilder errorMessage = new StringBuilder();

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, errorMessage );

this.LastErrorString = errorMessage.ToString();

此致

Aidanapword

答案 1 :(得分:0)

自从我完成任何互操作以来已经有一段时间了,但您是否考虑过使用StringBuilder?有关示例,请参阅receiving strings through interop

希望这有帮助,

安德鲁