把你这部分程序 c++驱动程序库,及测试代码发出来,我测试一下 EMAIL : [email protected]

解决方案 »

  1.   

    我可以直接把ocx控件以及VC++版Demo提供给你,但是运行这个程序还是比较麻烦,还得装厂商的软件,软件当作服务程序,demo才能运行。
      

  2.   

    Demo已发,但是Demo肯定无法运行看到效果,因为你需要安装一个程序,程序太大了,我没发。
      

  3.   

    参考下面两个文章,C#中object和Object还不是完全相同的,请把
    [DispId(338)]
    int AddOnePerson(object PersonInfo);//这个方法是VS自动生成的
    改成:
    [DispId(338)]
            int AddOnePerson(Object PersonInfo);//这个方法是VS自动生成的http://mochou123456.blog.163.com/blog/static/4605764620100334325874/
    http://stackoverflow.com/questions/1137838/system-argumentexception-variantwrappers-cannot-be-stored-in-variants看看这样可不可以
      

  4.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。
      

  5.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。

    帖子里可能写错了调用: TPersonInfo tPerson = new TPersonInfo();             VariantWrapper vv = new VariantWrapper(tPerson);                       int iii = client.AddOnePerson(vv);调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。   在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”
    如果我直接这样调用 int iii = client.AddOnePerson(tPerson );会提示另外一个错误"值不在预期范围"
      

  6.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。

    帖子里可能写错了调用: TPersonInfo tPerson = new TPersonInfo();             VariantWrapper vv = new VariantWrapper(tPerson);                       int iii = client.AddOnePerson(vv);调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。   在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”
    如果我直接这样调用 int iii = client.AddOnePerson(tPerson );会提示另外一个错误"值不在预期范围"我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?
      

  7.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。

    帖子里可能写错了调用: TPersonInfo tPerson = new TPersonInfo();             VariantWrapper vv = new VariantWrapper(tPerson);                       int iii = client.AddOnePerson(vv);调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。   在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”
    如果我直接这样调用 int iii = client.AddOnePerson(tPerson );会提示另外一个错误"值不在预期范围"我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?
    不会,C++里的long类型32位的,对应C#就是int32
      

  8.   

      typedef struct _PersonInfo
      {  
        long PersonnelID;
        long DeptID;
        long GroupID;   <--C#结构中未声明
      

  9.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。

    帖子里可能写错了调用: TPersonInfo tPerson = new TPersonInfo();             VariantWrapper vv = new VariantWrapper(tPerson);                       int iii = client.AddOnePerson(vv);调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。   在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”
    如果我直接这样调用 int iii = client.AddOnePerson(tPerson );会提示另外一个错误"值不在预期范围"我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?
    不会,C++里的long类型32位的,对应C#就是int32另外一个数据类型wchar_t,在PersonInfo结构厂商Demo中定义PersonInfo中是有长度的,你使用的是UnmanagedType.LPWStr,MSDN定义是UnmanagedType.LPWStr: 指向以 null 终止的 Unicode 字符数组的指针。
    另外还有一个是
    UnmanagedType.ByValTStr: 定长的字符数组;数组的类型由包含数组的结构的字符集确定。在下面的这个MSDN链接中,它把没有长度的转成UnmanagedType.LPWStr,有长度的转成UnmanagedType.ByValTStr
    http://msdn.microsoft.com/en-us/library/ms172512(v=vs.90).aspx如果还没有找到其他原因,那就再试试改下这个
      

  10.   


    请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。

    帖子里可能写错了调用: TPersonInfo tPerson = new TPersonInfo();             VariantWrapper vv = new VariantWrapper(tPerson);                       int iii = client.AddOnePerson(vv);调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。   在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”
    如果我直接这样调用 int iii = client.AddOnePerson(tPerson );会提示另外一个错误"值不在预期范围"我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?
    不会,C++里的long类型32位的,对应C#就是int32另外一个数据类型wchar_t,在PersonInfo结构厂商Demo中定义PersonInfo中是有长度的,你使用的是UnmanagedType.LPWStr,MSDN定义是UnmanagedType.LPWStr: 指向以 null 终止的 Unicode 字符数组的指针。
    另外还有一个是
    UnmanagedType.ByValTStr: 定长的字符数组;数组的类型由包含数组的结构的字符集确定。在下面的这个MSDN链接中,它把没有长度的转成UnmanagedType.LPWStr,有长度的转成UnmanagedType.ByValTStr
    http://msdn.microsoft.com/en-us/library/ms172512(v=vs.90).aspx如果还没有找到其他原因,那就再试试改下这个

    结构里类型什么的,我都已经试遍了。
    现在关键是不知道问题所在,或许调用的时候哪个地方有稍稍不同。
      

  11.   

    try 
        int iii = client.AddOnePerson(ref vv);
      

  12.   

    不知道有没有解决问题,如果还没有又不涉及机密的,是不是可以把控件和你的Demo的代码你发我QQ邮箱,191 327 0724去掉空格后加@qq.com。 
      

  13.   

    已经搞定了,
    不应该用微软提供的VariantWrapper,直接使用Marshal.StructToInptr就行。