111,097
社区成员




[DispId(338)]
int AddOnePerson(object PersonInfo);//这个方法是VS自动生成的
//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;
}
[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)”
调用: 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]
结构里类型什么的,我都已经试遍了。
现在关键是不知道问题所在,或许调用的时候哪个地方有稍稍不同。
调用: 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
如果还没有找到其他原因,那就再试试改下这个
调用: 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
调用: 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,这个会不会有影响?
调用: 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 );
会提示另外一个错误"值不在预期范围"
[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
看看这样可不可以