C#调用非托管DLL接口后通过参数返回的结构中有一个整型数据int,非托管是long,即32位整数,当这个整数是0~比较小的整数时返回一律是1,当这个整数是0~-N时返回是-255,如果把数值设得很大,返回的好像是正确的,例如112343455。
有人知道这是什么原因吗?有什么解决方法?谢谢
有人知道这是什么原因吗?有什么解决方法?谢谢
解决方案 »
- 用过飞天诚信ePass2000的请进
- 关于c#编程删除继承的目录权限
- 打印选项卡里的内容(有滚动条)
- 有没有方法能在string型的字符串后面加符号(比如*)
- VS 2005Pro 中新建窗体只生成.cs文件,没有resx文件
- 我就不信没有人能解决
- 怎么使MessageBox中的信息字符串换行显示??
- 把dataset中的数据按照一定格式倒入到word文档中
- Webservice的方法如何与客户端调用的方法形成一个事务呢?百分百结贴,求围观!
- SDK,API,dll等之间的关系是怎么样的
- C#连接远程数据库,在数据提交时,网络断开,程序出错自动关闭,怎么解决?谢谢!!!
- 使用socket收邮件出现的编码问题?
用 int
我是用的int,但还是这样的错误,可能是字节之间的顺序的问题。
个位高手帮忙看看
typedef struct struTagValue{
_TCHARTagName[C_FULL_TAGNAME_LEN];
longTimestamp;
longTagState;
BYTETagType;
union {
floatrval;
longlval;
BOOLbval;
_TCHARsval[C_STRINGVALUE_LEN];
};
}TAGVAL, *LPTAGVAL;
C#中重新封送声明:
(主意:C#没有union,而且对象类型不能和非对象类型对齐,而union中所有变量偏移量是相同的,都是0,所以封送成两个结构,函数调用时也重载两个函数,参数分别对应不同的结构)
[[StructLayout(LayoutKind.Sequential)]
public struct TAGVAL
{
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_FULL_TAGNAME_LEN)]
public string TagName;
public System.Int32 Timestamp;
public System.Int32 TagState;
public System.Byte TagType;
[ StructLayout( LayoutKind.Explicit ,Size=C_STRINGVALUE_LEN )]
public struct strcurrvalue
{
[ FieldOffset( 0 )]
public float rval;
[ FieldOffset( 0 )]
public int lval;
[ FieldOffset( 0 )]
public bool bval;
};
public strcurrvalue currvalue;
};[StructLayout(LayoutKind.Sequential)]
public struct TAGVAL_S
{
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_FULL_TAGNAME_LEN)]
public string TagName;
public System.Int32 Timestamp;
public System.Int32 TagState;
public System.Byte TagType;
[ StructLayout( LayoutKind.Sequential )]
public struct strcurrvalue
{
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=C_STRINGVALUE_LEN)]
public string sval;
};
public strcurrvalue currvalue;};
由于string在C#里面是对象类型所以不能和基本类型放在偏移量相同的地方,VALUE_S专门为需要string值时使用
出问题的值是union里面的lval其他没有错误,timestamp也是长整型,但因为它是表示时间的,数值比较大,转换成标准时间表示后没有错误。
extern "C" BOOL PASCAL EXPORT Agda_GetNextTagValue(HRECORDSET hRecordset, TAGVAL * pTagVal, BOOL bRemoved=TRUE);
托管封送声明:
[DllImport("AgilorAPI.dll")]
public static extern bool Agda_GetNextTagValue(System.Int32 hRecordset,ref TAGVAL pTagVal,bool bRemoved);
“调用约定”?调用应该没有问题,因为返回的一个结构里面的其他数值是正确的,只有一个对不上。