关于调用C的动态链接库的问题(较难,老鸟不妨也进来看看)

962veiri 2005-06-23 09:54:48
我在C#工程里面调用C的一个动态链接库,它的函数原型是

Dll 中函数的原型
int iaTrapSend(const char* psEnterpriseOID, int iGerneric, int iSepecific,
STUPARAM *pTrapParam, int iCount);
其中STUPARAM 定义如下
结构类型STUPARAM定义为:
typedef struct
{
char m_szParamName[256]; //参数名
char m_szInstance[256];//参数事例号
unsigned char m_ucType;//参数类型
unsigned short m_usVLen;//参数长度
unsigned char m_szValue[256];//参数值
unsigned short m_usError;//读写参数时的错误信息
}STUPARAM

我的代码如下:
[StructLayout(LayoutKind.Sequential)]
public struct STUPARAM
{
public char[] m_szParamName; //参数名
public char[] m_szInstance; //参数事例号
public char m_ucType; //参数类型
public ushort m_usVLen; //参数长度
public char[] m_szValue;//参数值
public ushort m_usError; //读写参数时的错误信息
}
public static extern int iaTrapSend(string psEnterpriseOID, int iGerneric, int iSepecific,
ref STUPARAM[] pTrapParam, int iCount);

但是每次调用都不成功,我单独写了一个类似的东西来测试发现应该是STUPARAM类型转换的问题,不知道哪位有办法??
...全文
202 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
962veiri 2005-06-24
  • 打赏
  • 举报
回复
多谢 Jim3(Jim) 和 Sunmast(速马.上海),给分了
速马 2005-06-23
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
public struct STUPARAM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
public string m_szParamName; //参数名
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)]
public string m_szInstance; //参数事例号
public byte m_ucType; //参数类型
public ushort m_usVLen; //参数长度
[MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public byte[] m_szValue;//参数值
public ushort m_usError; //读写参数时的错误信息
}
[DllImport(dllPath)]
static extern int iaTrapSend(string psEnterpriseOID, int iGerneric, int iSepecific,
STUPARAM[] pTrapParam, int iCount);
速马 2005-06-23
  • 打赏
  • 举报
回复
public static extern int iaTrapSend(string psEnterpriseOID, int iGerneric, int iSepecific,
STUPARAM[] pTrapParam, int iCount); // 去掉ref,数组本来就是按照引用传递的
leo_asp 2005-06-23
  • 打赏
  • 举报
回复
学习
962veiri 2005-06-23
  • 打赏
  • 举报
回复
Jim3(Jim) ( ):你能否你那边试一下看? 我自己做了一个动态链接库函数,返回 STUPARAM.usError都不行,另外,在数组定义前面加了[MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]的话,使用的时候还需要创建这个数组马?如:
STUPARAM stuparam = new STUPARAM ();
stuparam.usError = new char[256]; // 这句还要吗?
tigerwen01 2005-06-23
  • 打赏
  • 举报
回复
C#是托管代码,而C是非托管代码。两这之间的调用需要一些转换。例如托管组件调用非托管(COM组件)组件需要RCW作为中间件,反之需要CCW机制。在GOOGLE里输入“COM组件对象与_NET类对象的相互转换”会有很多资料。
Jim3 2005-06-23
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)]
public struct STUPARAM
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public char[] m_szParamName; //参数名
[MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public char[] m_szInstance; //参数事例号
public char m_ucType; //参数类型
public ushort m_usVLen; //参数长度
[MarshalAs(UnmanagedType.ByValArray, SizeConst=256)]
public char[] m_szValue;//参数值
public ushort m_usError; //读写参数时的错误信息
}
marvelstack 2005-06-23
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/ousNET.mspx
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/MemoryOptim.mspx
itoltgvi 2005-06-23
  • 打赏
  • 举报
回复
关注中。。。。
Jim3 2005-06-23
  • 打赏
  • 举报
回复
stuparam.m_szParamName = new char[256]; // 这句要


我单独写了一个类似的东西来测试
-------------------------------------
把那个代码以及在非托管中的调用代码贴出来

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧