【发布时间】:2011-04-12 21:11:15
【问题描述】:
我对 Interop/Com/ActiveX 等还很陌生,所以请耐心等待。
我延迟绑定到 com/activex(不确定是哪一个)服务器(基本上是 exe 而不是 dll)。我成功地使用了该服务器中的所有方法,除了一个,这里是描述:
VT_INT GetLastCCTError(变体 *error_string);
说明:该函数用于检索最后产生的错误 由 CCT。该函数可能被调用 只要 CCT 服务器在任何时候 被初始化。如果没有错误 调用函数时发生, 返回的代码为“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];
这仍然会导致相同的异常。我现在认为问题可能不是参考传递,而是其他问题。任何帮助将不胜感激。
【问题讨论】:
-
只是为了兴趣。我尝试在 VB 中调用该方法,它使用以下代码: Dim CCTObject As Object CCTObject = CreateObject("CCTServer.Document") Dim Result = CCTObject.InitializeDevice("Camera") Dim ms As String Result = CCTObject.GetLastCCTError(毫秒)