c++ com:
STDMETHODIMP XXX::testVariant(VARIANT v)
{
//这里什么都没做
}c#:
comClass OBJ = new comClass();
object o = new object();
OBJ.testVariant(o);//这里报错 Attempted to read or write protected memory. This is often an indication that other memory is corruptVARIANT不论是in还是out都出错,使用其他类型参数正常~

解决方案 »

  1.   

    C#调用COM组件时,经常会遇到Variant类型参数的方法,比如Variant返回值、Variant传入参数等。如果用IDE的工具将COM组件导入为互操作类,则这些类型会被转换为object型,在这里object和COM的variant类型确实很像:表示不确定具体的类型。
    一般情况下,解决办法如下:
    对于传入参数和引用传递参数(ref参数),调用方(C#代码片段)应该创建正确类型的变量,然后放在参数表对应的位置;
    对于传出参数(out参数)和返回参数,声明一个object类型的变量来接收,然后转换为正确的类型;
    对于默认值参数(default参数),因为C#没有默认值机制(参考C#语言规范的方法重载说明部分),所以还是需要有传入值,这时应该用.NET的System.Reflection.Missing类的静态实例Value,C#的互操作程序会把它Marshal为不传参数。
      

  2.   

    回楼上的 我在vs中加载这个com后 接口函数testVariant显示的参数类型就是 (out object)
    为什么我传入一个object会报错呢?
      

  3.   

    object o;
    不要实例化直接传送试试
      

  4.   

    c++ com: 
    STDMETHODIMP XXX::testVariant(VARIANT v) 

    //你试试在这里写点代码,然后将v传回去,看看可不可以
      

  5.   

    VARIANT v这个参数 我设置成【in】也会报错。。
      

  6.   

    因为非托管无法直接理解什么是 object ,设为别的类型参数,它会自动转换,而object不行,你让系统如何去理解你传得参数,它的内部是什么?尺寸多大?
      

  7.   

    回楼上的 不用object的话 要用参数什么类型呢?
      

  8.   

    这个主要是你在testVariant函数中是如何处理VARIANT v的,所以才让你在里面写些代码然后再尝试
      

  9.   


    你在testVariant方法中没有使用v,假设你在testVariant方法中是将v当作int来使用,那托管程序就会将object转换为int来传递,所以你在testVariant方法中是将v具体使用为什么类型,你就使用与之相对应的类型就好了。
      

  10.   

    我也碰到这样的问题,CSDN没人知道,这个论坛太让我失望了。