C#延迟绑定到com/activeX服务器,一种方法有问题

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”(零),并且 错误字符串将为空。只有 期间发生的最后一个错

我对Interop/Com/ActiveX等相当陌生,所以请耐心听我说

我很晚才绑定到com/activex(不确定是哪一个)服务器(基本上是exe而不是dll)。我成功地使用了该服务器中的所有方法,除了一个,以下是说明:

VT_INT GetLastCcorror(变体 *错误(U字符串)

说明:此函数用于检索上次生成的错误 由CCT提供。可以调用该函数 只要CCT服务器 已初始化。如果没有出现错误 调用函数时发生, 返回的代码为“0”(零),并且 错误字符串将为空。只有 期间发生的最后一个错误 CCT服务器的当前运行将 有空

输入:无

输出:函数返回单个输出参数, VARTYPE VT\u BSTR类型的“错误字符串” |拜里夫。该参数包含一个 错误代码的错误字符串 与最后一个CCT功能关联 失败。返回值:此函数 返回类型为的整数值 这是错误代码 与最后一个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);
还是一样的错误。通过谷歌搜索,我发现了这篇文章:

如果您查看第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)