gpt4 book ai didi

C# 后期绑定(bind)到 com/activeX 服务器,一种方法有问题

转载 作者:行者123 更新时间:2023-11-30 12:53:02 25 4
gpt4 key购买 nike

我对 Interop/Com/ActiveX 等还很陌生,所以请多多包涵。

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

VT_INT GetLastCCTError (variant *error_string);

Description: This function is used to retrieve the last error generated by the CCT. The function may be called at any point as long as the CCT Server is initialized. If no error has occurred when the function is called, the returned code is ‘0’ (zero), and the error string will be empty. Only the last error that occurred during the current run of the CCT Server will be available.

Input: None

Output: The function returns a single output parameter, ‘error_string’ of type VARTYPE VT_BSTR | VT_BYREF. The parameter contains an error string for the error code associated with the last CCT function failure. Return Value: This function returns an integer value of type VT_INT. This is the error code associated with the last CCT function failure

我第一次尝试使用这段代码:

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];

这仍然会导致相同的异常。我现在认为问题可能不是引用传递而是其他问题。任何帮助将不胜感激。

最佳答案

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

"SomeString"将由编译器解析为托管内存上的不可更改的字符串(堆栈或堆在您的情况下基本上不相关)。

所以,在某种程度上你不是在传递一个字符串引用而是一个文字 - 在你的例子中永远不会是一个'out'参数......所以编码不会按照它的想法(知道)将是一个坏主意。

我怀疑 Andrew D 是对的。

可能会建议您尝试类似的方法:

StringBuilder errorMessage = new StringBuilder();

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

this.LastErrorString = errorMessage.ToString();

问候,

艾达纳普词

关于C# 后期绑定(bind)到 com/activeX 服务器,一种方法有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3082908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com