【求助】C#调用ocx控件遇到错误

xupeihuagudulei 2014-05-21 10:49:41
我现在需要调用厂家提供的一个ocx控件,注册完之后,然后VS里添加com引用,其中有一个方法


[DispId(338)]
int AddOnePerson(object PersonInfo);//这个方法是VS自动生成的


其中PersonInfo结构厂商Demo中有定义:

//Personnel Info
typedef struct _PersonInfo
{
long PersonnelID;
long DeptID;
long GroupID;
TMyNameWideString LastName;
TMyNameWideString FirstName;
TMyNameWideString PersonnelCode;
TMyNameWideString Gander;
TMyNameWideString IDCard;
SYSTEMTIME Birthday;
TMyNameWideString Marriage;
wchar_t Nativeplace[30];
wchar_t Nation[30];
SYSTEMTIME AccessionDate;
SYSTEMTIME DimissionDate;
wchar_t Duty[30];
TMyNameWideString Diploma;
wchar_t School[30];
wchar_t Speciality[30];
TMyLongNameWideString Address;
TMyNameWideString Phone;
TMyNameWideString Email;
TMyLongNameWideString Remark;
long FloorNumber;
TMyLongNameWideString CustomField1;
TMyLongNameWideString CustomField2;
TMyLongNameWideString CustomField3;
TMyLongNameWideString CustomField4;
TMyLongNameWideString CustomField5;
TMyLongNameWideString CustomDict1;
TMyLongNameWideString CustomDict2;
TMyLongNameWideString CustomDict3;
TMyLongNameWideString CustomDict4;
TMyLongNameWideString CustomDict5;
boolean HasPhoto;
boolean IsLose;
boolean IsStop;
boolean Reserve;
} TPersonInfo, *PPersonInfo;

TMyLongNameWideString 结构定义:
typedef struct _MyLongNameWideString
{
wchar_t Names[50];
} TMyLongNameWideString, *PMyLongNameWideString;

TMyNameWideString 结构定义:
typedef struct _MyNameWideString
{
wchar_t Names[20];
} TMyNameWideString, *PMyNameWideString;



Demo中调用是这样的:
long CSphinxOPCClientX::AddOnePerson(const VARIANT& PersonInfo)
{
long result;
static BYTE parms[] =
VTS_VARIANT;
InvokeHelper(0x152, DISPATCH_METHOD, VT_I4, (void*)&result, parms,
&PersonInfo);
return result;
}



我自己写的一个C#程序是这样使用的:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TPersonInfo
{
public int PersonnelID;
public int DeptID;
public TMyNameWideString LastName;
public TMyNameWideString FirstName;
public TMyNameWideString PersonnelCode;
public TMyNameWideString Gander;
public TMyNameWideString IDCard;
public SYSTEMTIME Birthday;
public TMyNameWideString Marriage;
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 30)]
public string Nativeplace;
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 30)]
public string Nation;
public SYSTEMTIME AccessionDate;
public SYSTEMTIME DimissionDate;
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 30)]
public string Duty;
public TMyNameWideString Diploma;
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 30)]
public string School;
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 30)]
public string Speciality;
public TMyLongNameWideString Address;
public TMyLongNameWideString Phone;
public TMyLongNameWideString Email;
public TMyLongNameWideString Remark;
public int FloorNumber;
public TMyLongNameWideString CustomField1;
public TMyLongNameWideString CustomField2;
public TMyLongNameWideString CustomField3;
public TMyLongNameWideString CustomField4;
public TMyLongNameWideString CustomField5;
public TMyLongNameWideString CustomDict1;
public TMyLongNameWideString CustomDict2;
public TMyLongNameWideString CustomDict3;
public TMyLongNameWideString CustomDict4;
public TMyLongNameWideString CustomDict5;
public bool HasPhoto;
public bool IsLose;
public bool IsStop;
public bool Reserve;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TMyNameWideString
{
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 50)]
public string Names;
}


/// <summary>
///
/// </summary>
///
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TMyLongNameWideString
{
[MarshalAs(UnmanagedType.LPWStr, SizeConst = 50)]
public string Names;
}


[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public int wYear;
public int wMonth;
public int wDayOfWeek;
public int wDay;
public int wHour;
public int wMinute;
public int wSecond;
public int wMilliseconds;
}



调用:
TPersonInfo tPerson = new TPersonInfo();

VariantWrapper vv = new VariantWrapper(o);
int iii = client.AddOnePerson(vv);
调用时候就出错 了,提示“System.ArgumentException: VariantWrappers 不能存储在 Variant 中。
在 System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc, IntPtr pDstVariant)”



有谁知道怎么解决吗????
...全文
353 22 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xupeihuagudulei 2014-05-23
引用 20 楼 save4me 的回复:
不知道有没有解决问题,如果还没有又不涉及机密的,是不是可以把控件和你的Demo的代码你发我QQ邮箱,191 327 0724去掉空格后加@qq.com。
已经搞定了, 不应该用微软提供的VariantWrapper,直接使用Marshal.StructToInptr就行。
  • 打赏
  • 举报
回复
save4me 2014-05-23
引用 21 楼 xupeihuagudulei 的回复:
[quote=引用 20 楼 save4me 的回复:] 不知道有没有解决问题,如果还没有又不涉及机密的,是不是可以把控件和你的Demo的代码你发我QQ邮箱,191 327 0724去掉空格后加@qq.com。
已经搞定了, 不应该用微软提供的VariantWrapper,直接使用Marshal.StructToInptr就行。[/quote] 谢谢分享原因和解决方法
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-22
引用 17 楼 save4me 的回复:
[quote=引用 14 楼 xupeihuagudulei 的回复:] [quote=引用 13 楼 save4me 的回复:] [quote=引用 12 楼 xupeihuagudulei 的回复:] [quote=引用 11 楼 save4me 的回复:] [quote=引用 10 楼 xupeihuagudulei 的回复:] [quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。 [/quote] 帖子里可能写错了

调用: 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 );
会提示另外一个错误"值不在预期范围"[/quote] 我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?[/quote] 不会,C++里的long类型32位的,对应C#就是int32[/quote] 另外一个数据类型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 如果还没有找到其他原因,那就再试试改下这个 [/quote] 结构里类型什么的,我都已经试遍了。 现在关键是不知道问题所在,或许调用的时候哪个地方有稍稍不同。
  • 打赏
  • 举报
回复
save4me 2014-05-22
引用 14 楼 xupeihuagudulei 的回复:
[quote=引用 13 楼 save4me 的回复:] [quote=引用 12 楼 xupeihuagudulei 的回复:] [quote=引用 11 楼 save4me 的回复:] [quote=引用 10 楼 xupeihuagudulei 的回复:] [quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。 [/quote] 帖子里可能写错了

调用: 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 );
会提示另外一个错误"值不在预期范围"[/quote] 我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?[/quote] 不会,C++里的long类型32位的,对应C#就是int32[/quote] 另外一个数据类型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 如果还没有找到其他原因,那就再试试改下这个
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-22
引用 15 楼 xfyxq 的回复:
typedef struct _PersonInfo { long PersonnelID; long DeptID; long GroupID; <--C#结构中未声明
加上也还是一样错误
  • 打赏
  • 举报
回复
save4me 2014-05-22
不知道有没有解决问题,如果还没有又不涉及机密的,是不是可以把控件和你的Demo的代码你发我QQ邮箱,191 327 0724去掉空格后加@qq.com。
  • 打赏
  • 举报
回复
xfyxq 2014-05-22
typedef struct _PersonInfo { long PersonnelID; long DeptID; long GroupID; <--C#结构中未声明
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-22
引用 13 楼 save4me 的回复:
[quote=引用 12 楼 xupeihuagudulei 的回复:] [quote=引用 11 楼 save4me 的回复:] [quote=引用 10 楼 xupeihuagudulei 的回复:] [quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。 [/quote] 帖子里可能写错了

调用: 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 );
会提示另外一个错误"值不在预期范围"[/quote] 我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?[/quote] 不会,C++里的long类型32位的,对应C#就是int32
  • 打赏
  • 举报
回复
save4me 2014-05-22
引用 12 楼 xupeihuagudulei 的回复:
[quote=引用 11 楼 save4me 的回复:] [quote=引用 10 楼 xupeihuagudulei 的回复:] [quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。 [/quote] 帖子里可能写错了

调用: 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 );
会提示另外一个错误"值不在预期范围"[/quote] 我看PersonInfo结构厂商Demo中定义PersonInfo中的long类型,你在C#中转成int,比如long PersonnelID你用的是public int PersonnelID,这个会不会有影响?
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-22
引用 11 楼 save4me 的回复:
[quote=引用 10 楼 xupeihuagudulei 的回复:] [quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。 [/quote] 帖子里可能写错了

调用: 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 );
会提示另外一个错误"值不在预期范围"
  • 打赏
  • 举报
回复
save4me 2014-05-22
引用 10 楼 xupeihuagudulei 的回复:
[quote=引用 9 楼 save4me 的回复:] 参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改[/quote]
引用
TPersonInfo tPerson = new TPersonInfo(); VariantWrapper vv = new VariantWrapper(o); int iii = client.AddOnePerson(vv);
请问一下你调用代码里面的vv是不是TPersonInfo数据类型的?因为这点代码中的tPersion, o和VariantWrapper有点孤立,所以不知道他们之间的关系到底是什么。因为虽然AddOnePerson函数的参数是object,但是它需要的还是TPersonInfo结构,所以猜想会不会是vv不是TPersonInfo结构,在程序从vv转换为TPersonInfo的过程中失败,才出现了你上面描述的错误。如果能把你调用的代码稍微详细的贴出来,至少能看出各个变量的类型和关系,可以帮助查找原因和解决方法。
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-22
引用 9 楼 save4me 的回复:
参考下面两个文章,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 看看这样可不可以
大写和小写一样的。最关键的是这方法是元数据,压根没法改
  • 打赏
  • 举报
回复
try int iii = client.AddOnePerson(ref vv);
  • 打赏
  • 举报
回复
菁菁报表 2014-05-21
VariantWrapper 是什么东西
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-21
看样子是没人知道,要沉大海了
  • 打赏
  • 举报
回复
save4me 2014-05-21
参考下面两个文章,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 看看这样可不可以
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-21
置顶一下,网上相关内容也太少了
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-21
引用 5 楼 wl58796351 的回复:
把你这部分程序 c++驱动程序库,及测试代码发出来,我测试一下 EMAIL : 475327011@qq.com
Demo已发,但是Demo肯定无法运行看到效果,因为你需要安装一个程序,程序太大了,我没发。
  • 打赏
  • 举报
回复
xupeihuagudulei 2014-05-21
引用 5 楼 wl58796351 的回复:
把你这部分程序 c++驱动程序库,及测试代码发出来,我测试一下 EMAIL : 475327011@qq.com
我可以直接把ocx控件以及VC++版Demo提供给你,但是运行这个程序还是比较麻烦,还得装厂商的软件,软件当作服务程序,demo才能运行。
  • 打赏
  • 举报
回复
wl58796351 2014-05-21
把你这部分程序 c++驱动程序库,及测试代码发出来,我测试一下 EMAIL : 475327011@qq.com
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2014-05-21 10:49
社区公告

让您成为最强悍的C#开发者