我是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];
这仍会导致相同的异常。我现在认为问题可能不是参考传递而是其他东西。任何帮助将不胜感激。
答案 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)