【问题标题】:C# late binding to com/activeX server, trouble with one methodC#后期绑定到com/activeX服务器,一种方法有问题
【发布时间】: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(毫秒)

标签: c# com interop reference


【解决方案1】:

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

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

因此,在某种程度上,您不是传入字符串引用,而是传入文字 - 就像在您的示例中那样永远不会是“输出”参数......所以编组不会按照它的想法(知道)会是个坏主意。

我怀疑 Andrew D 是对的。

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

StringBuilder errorMessage = new StringBuilder();

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

this.LastErrorString = errorMessage.ToString();

问候,

Aidanapword

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多