求助!关于调用非托管Dll函数的问题~100分送上!!

losthold 2004-09-10 05:46:04
dll引用的定义:
public struct stSchBaseInfo
{
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=5 )]
public byte[] szDepot;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=9 )]
public byte[] szNo;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=21 )]
public byte[] szName;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=6 )]
public byte[] szTime;
public byte szNature;
public byte szType;
public byte szFaretype;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=21 )]
public byte[] szLevel;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=7 )]
public byte[] szStCode;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=21 )]
public byte[] szStName;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=21 )]
public byte[] szTStation;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=101 )]
public byte[] szSeat;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=21 )]
public byte[] szArea;
public System.UInt32 iTickets;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=5 )]
public byte[] szAreaDepot;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=5 )]
public byte[] szOwnerDepot;
}

[DllImport("kplwlib.dll")]
unsafe private static extern uint SchBaseInfo(byte *szDate,byte *szStation,byte *szOwnerDepot,byte *szTime,int *piNum,
[ MarshalAs( UnmanagedType.LPArray, SizeConst=60)] [In,Out] stSchBaseInfo[] SchBaseInfos);

参数说明:*piNum,SchBaseInfos是输出参数,其他的是输入参数;*piNum是SchBaseInfos中的有效元素数。

问题说明:
调用此dll函数后,可以返回数据,并且第一条数据是正确的,但是接下来的其他数据都比上一条数据向前偏移了2个字节,如何解决这个问题?请各位高手帮下忙,在这里先谢谢了!

...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
losthold 2004-09-11
  • 打赏
  • 举报
回复
这么快就掉后面来了。。。,自己顶一下。
高手帮帮忙啊~~!!
losthold 2004-09-11
  • 打赏
  • 举报
回复
To:楼上2位
你们所用的方式我都试过是不行的,我自己的定义已经可以调用dll,但是返回的数据除了第一条以外其他的数据都比上一条向前偏移了2个字节,我觉得你们没有说到点子上。
希望各位高手帮下忙,谢谢!!
losthold 2004-09-11
  • 打赏
  • 举报
回复
补充:
dll中的结构定义:
typedef struct stSchBaseInfo {
char szDepot[5];
char szNo[9];
char szName[21];
char szTime[6];
char szNature;
char szType;
Char szFaretype;
char szLevel[21];
char szStCode[7];
char szStName[21];
char szTStation[21];
char szSeat[101];
char szArea[21];
UINT iTickets;
char szAreaDepot[5];
char szOwnerDepot[5];
};
dll函数定义:
UINT SchBaseInfo(char *szDate,char * szStation, char * szOwnerDepot,char * szTime,int * piNum,stSchBaseInfo stSchBaseInfo[60])
passacaglia 2004-09-10
  • 打赏
  • 举报
回复
指定
[StructLayout(LayoutKind.Explicit]
public struct
。。。。

结构内字段用类似[FieldOffset(4)] 指定该字段在结构中的位置
sundy26 2004-09-10
  • 打赏
  • 举报
回复
我有个取本地端口的例子可以参考一下
[DllImport("TcpUdpPort.dll",EntryPoint="GetPortInfo")]
public extern static void GetPortInfo(IntPtr outBuf, out int portNumber);

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct PortStruct
{
[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string szType;//名称

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string Status;//状态

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string localIP;//本地IP

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string localPort;//本地IP

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string remoteIP;//远程IP

[MarshalAs( UnmanagedType.ByValTStr, SizeConst=128 )]
public string remotePort;//远程端口

}

private void button1_Click(object sender, System.EventArgs e)
{
//清空列表
portListView.Items.Clear();
//从DLL中取的所有的TCP和UDP端口信息
ArrayList PortList = new ArrayList();
GetAllPortInfo(ref PortList);

//在列表中显示出来
for(int i=0;i<PortList.Count;i++)
{
PortStruct port = (PortStruct)PortList[i];
string[] myItems = new string[]
{
port.szType,
port.localIP,
port.localPort,
port.remoteIP,
port.remotePort,
port.Status
};
ListViewItem lvi = new ListViewItem(myItems);
portListView.Items.Add(lvi);
}
}

/**************************************************************
* 函数名称:GetAllPortInfo
* 功能:从DLL中获取所有的UDP和TCP端口信息
* 参数:portList:数据列表,用来保存所有的端口信息
***************************************************************/
void GetAllPortInfo(ref ArrayList portList)
{
IntPtr portInfor = (IntPtr)Marshal.AllocHGlobal(Marshal.SizeOf(typeof(PortStruct)) * 512);
int PortCount = 0;
GetPortInfo(portInfor, out PortCount);
if(PortCount>0)
{
PortStruct[] Ports = new PortStruct[PortCount];
IntPtr current = portInfor;
for (int i=0; i<PortCount; i++)
{
Ports[i] = (PortStruct)Marshal.PtrToStructure(current,typeof(PortStruct));
current=(IntPtr)((int)current+Marshal.SizeOf(typeof(PortStruct)));
portList.Add(Ports[i]);
}
}
Marshal.FreeHGlobal(portInfor);
}

110,539

社区成员

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

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

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