【问题标题】:Getting ref parameter from COM with InvokeMember call使用 InvokeMember 调用从 COM 获取 ref 参数
【发布时间】:2015-01-19 11:10:33
【问题描述】:

我正在尝试使用 InvokeMember 调用 COM 服务器的方法。 该方法具有以下签名:

            void InsUpdOpInstance(
                        [in] long inIdOperDescr, 
                        [in] long inIsWait, 
                        [in] VARIANT stVariables, 
                        [in] long inIdProc, 
                        [in, out] VARIANT* inIdOperInst, 
                        [out] VARIANT* inReturnCode, 
                        [out] VARIANT* stErrorMessage);

我的问题是取回 inIdOperInst 参数值。 以下代码不起作用:

var parameters = new object[] {12,0,"test",25655,DBNull.Value,null,null};
ParameterModifier modifier = new ParameterModifier(parameters.Length);
modifier[4] = true;
modifier[5] = true;
modifier[6] = true;

var ret = WFType.InvokeMember("InsUpdOpInstance",BindingFlags.InvokeMethod,null,Server,parameters,new ParameterModifier[]{modifier},null,null);

调用参数[4]后不改变值

以下代码工作正常:

dynamic serv = Server;

object inError = null;
object stError = null;
object inId = DBNull.Value;
serv.InsUpdOpInstance(12,0,"test",25655,ref inId,out inError,out stError);

调用参数后inId的值发生了变化
为什么 InvokeMember 不起作用?

【问题讨论】:

    标签: c# com marshalling com-server


    【解决方案1】:

    以下代码工作正常:

    var parameters = new object[] {12,0,"test",25655,new System.Runtime.InteropServices.VariantWrapper(DBNull.Value),null,null};
    ParameterModifier modifier = new ParameterModifier(parameters.Length);
    modifier[4] = true;
    modifier[5] = true;
    modifier[6] = true;
    
    var ret = WFType.InvokeMember("InsUpdOpInstance",BindingFlags.InvokeMethod,null,Server,parameters,new ParameterModifier[]{modifier},null,null);
    

    修复将 ref 参数包装到 System.Runtime.InteropServices.VariantWrapper 类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2010-09-18
      • 2011-02-08
      相关资源
      最近更新 更多