C#延迟绑定到com/activeX服务器,一种方法有问题
我对Interop/Com/ActiveX等相当陌生,所以请耐心听我说 我很晚才绑定到com/activex(不确定是哪一个)服务器(基本上是exe而不是dll)。我成功地使用了该服务器中的所有方法,除了一个,以下是说明: VT_INT GetLastCcorror(变体 *错误(U字符串) 说明:此函数用于检索上次生成的错误 由CCT提供。可以调用该函数 只要CCT服务器 已初始化。如果没有出现错误 调用函数时发生, 返回的代码为“0”(零),并且 错误字符串将为空。只有 期间发生的最后一个错误 CCT服务器的当前运行将 有空 输入:无 输出:函数返回单个输出参数, VARTYPE VT\u BSTR类型的“错误字符串” |拜里夫。该参数包含一个 错误代码的错误字符串 与最后一个CCT功能关联 失败。返回值:此函数 返回类型为的整数值 这是错误代码 与最后一个CCT功能关联 失败 我首先尝试使用以下代码:C#延迟绑定到com/activeX服务器,一种方法有问题,c#,com,interop,reference,C#,Com,Interop,Reference,我对Interop/Com/ActiveX等相当陌生,所以请耐心听我说 我很晚才绑定到com/activex(不确定是哪一个)服务器(基本上是exe而不是dll)。我成功地使用了该服务器中的所有方法,除了一个,以下是说明: VT_INT GetLastCcorror(变体 *错误(U字符串) 说明:此函数用于检索上次生成的错误 由CCT提供。可以调用该函数 只要CCT服务器 已初始化。如果没有出现错误 调用函数时发生, 返回的代码为“0”(零),并且 错误字符串将为空。只有 期间发生的最后一个错
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);
还是一样的错误。通过谷歌搜索,我发现了这篇文章:
如果您查看第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];
这仍然会导致相同的异常。我现在想,问题可能不是引用传递,而是其他问题。任何帮助都将不胜感激 这是因为C#中的字符串是不可变的 “SomeString”将由编译器解析为托管内存上的不可更改字符串(堆栈或堆在您的情况下基本上是不相关的) 因此,在某种程度上,您传递的不是字符串引用,而是一个文本-在您的示例中,它永远不可能是“out”参数。。。所以编组不会做它认为(知道)是个坏主意的事情 我想,安德鲁·D是对的 可能建议您尝试以下方式:
StringBuilder errorMessage = new StringBuilder();
this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, errorMessage );
this.LastErrorString = errorMessage.ToString();
问候,
只是为了兴趣。我尝试在VB中调用该方法,它使用以下代码:Dim CCTObject As Object CCTObject=CreateObject(“CCTServer.Document”)Dim Result=CCTObject.InitializeDevice(“Camera”)Dim ms As String Result=CCTObject.GetLastCCTError(ms)