求教,数组指针如何发送? 你到底问delphi的问题,还是问C#的问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好意思,delphi的这个函数在C#下如何处理那个数组指针,谢谢 我是这么调用,不行,麻烦帮看下哪里的问题,对C#不熟[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool LaunchOnline(IntPtr[] POnlineClock)int num = listView2.Items.CountTOnlineClock[] pclks = new TOnlineClock[num];IntPtr[] pBuf = new IntPtr[1];pBuf[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TOnlineClock)) * num); //分配包含两个元素的数组 for (int i = 0; i < num; i++){ pclks[i] = new TOnlineClock(); pclks[i].Clock_id = int.Parse(listView2.Items[i].Text); pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text; pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text); Marshal.StructureToPtr(pclks[i], pBuf[i], true); } if (EastRiver_API.LaunchOnline(pBuf)) IntPtr[] 这是啥?要么定义个数组来接,要么定义个指针来接你定义个指针数组是想干啥? array of POnlineClock到底是个什么类型的数组?你需要在C#里找到对应类型的数组来与它对应 不要用IntPtr[]····直接使用一个指针就足够了··IntPtr····就够了···· [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct TOnlineClock { public Int32 Clock_id; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string IPAddr; public Int32 Port; public Byte Connected; public Int32 kModel; public Double LastHeartTime; } [DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool LaunchOnline(IntPtr POnlineClock);这个函数作用就是传一个设备的指针数组给delphi写的dll调用代码,测试通不过int num = listView2.Items.Count; //设备个数 TOnlineClock[] pclks = new TOnlineClock[num]; int size = Marshal.SizeOf(typeof(TOnlineClock)) * num; IntPtr pBuf = Marshal.AllocHGlobal(size); long ptr = pBuf.ToInt64(); for (int i = 0; i < num; i++) { IntPtr RPtr = new IntPtr(ptr); pclks[i] = new EastRiver_API.TOnlineClock(); pclks[i].Clock_id = int.Parse(listView2.Items[i].Text); pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text; pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text); Marshal.StructureToPtr(pclks[i], RPtr, false); ptr += Marshal.SizeOf(typeof(TOnlineClock)); } if (LaunchOnline(pBuf)) 看不懂你的代码都在干啥定义了个pBuf,循环里根本没用到啊从定义开始,这个pBuf就没变过,你循环完把它传递给dll,有用? pBuf有变的,你可以自己测试下,还原出来是对的,不过不清楚为什么穿给delphi后那个参数的数组变得很大,本来是一个设备,到了动态库那边就变成了几千个数组 Marshal.StructureToPtr(pclks[i], RPtr, false); 把数组循环写到以pBuf为首地址的非托管内存里了把导入的函数声明改一下试试[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]public static extern bool LaunchOnline( [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] IntPtr POnlineClock) [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock) 不过看MS的例子上,并没有指定ArraySubType,你可以去掉试试http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex.aspx 这样试了还是不行,把ArraySubType 去掉也不行,申明里是要指明SizeParamIndex 的位置,但是函数里又没有这个参数[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern bool LaunchOnline([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1, ArraySubType = UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock);int num = listView2.Items.Count; EastRiver_API.TOnlineClock[] pclks = new EastRiver_API.TOnlineClock[num]; for (int i = 0; i < num; i++) { pclks[i] = new EastRiver_API.TOnlineClock(); pclks[i].Clock_id = int.Parse(listView2.Items[i].Text); pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text; pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text); }if (EastRiver_API.LaunchOnline(pclks) 本人初学者! 就解答! Wince5.0+CompactFramework2.0下,触摸屏长时间无操作的情况下自动退出登录 [AjaxPro.AjaxMethod] 关于dataGridView的小小问题 请问大家用js怎么控制一个checkbox的状态总是选中啊,在线等 IIS重启时,C#类的析构函数是否会被执行? 请问C#有没有什么美化窗体的控件啊? 多线程 能不能介绍几个好的下载电子书籍的网站和FTP 帮忙看段代码??? 程序崩溃问题 无法绑定由多个部分组成的标识符---这是什么错误
[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool LaunchOnline(IntPtr[] POnlineClock)int num = listView2.Items.Count
TOnlineClock[] pclks = new TOnlineClock[num];
IntPtr[] pBuf = new IntPtr[1];
pBuf[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TOnlineClock)) * num); //分配包含两个元素的数组
for (int i = 0; i < num; i++)
{
pclks[i] = new TOnlineClock();
pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);
Marshal.StructureToPtr(pclks[i], pBuf[i], true);
} if (EastRiver_API.LaunchOnline(pBuf))
要么定义个数组来接,要么定义个指针来接
你定义个指针数组是想干啥?
你需要在C#里找到对应类型的数组来与它对应
直接使用一个指针就足够了··
IntPtr····就够了····
public struct TOnlineClock
{
public Int32 Clock_id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string IPAddr;
public Int32 Port;
public Byte Connected;
public Int32 kModel;
public Double LastHeartTime;
}
[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool LaunchOnline(IntPtr POnlineClock);这个函数作用就是传一个设备的指针数组给delphi写的dll
调用代码,测试通不过
int num = listView2.Items.Count; //设备个数
TOnlineClock[] pclks = new TOnlineClock[num];
int size = Marshal.SizeOf(typeof(TOnlineClock)) * num;
IntPtr pBuf = Marshal.AllocHGlobal(size);
long ptr = pBuf.ToInt64();
for (int i = 0; i < num; i++)
{
IntPtr RPtr = new IntPtr(ptr);
pclks[i] = new EastRiver_API.TOnlineClock();
pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);
Marshal.StructureToPtr(pclks[i], RPtr, false);
ptr += Marshal.SizeOf(typeof(TOnlineClock));
} if (LaunchOnline(pBuf))
定义了个pBuf,循环里根本没用到啊
从定义开始,这个pBuf就没变过,你循环完把它传递给dll,有用?
Marshal.StructureToPtr(pclks[i], RPtr, false); 把数组循环写到以pBuf为首地址的非托管内存里了
把导入的函数声明改一下试试
[DllImport("TradeOnline", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool LaunchOnline(
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] IntPtr POnlineClock)
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex.aspx
public static extern bool LaunchOnline([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1, ArraySubType = UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock);int num = listView2.Items.Count;
EastRiver_API.TOnlineClock[] pclks = new EastRiver_API.TOnlineClock[num];
for (int i = 0; i < num; i++)
{
pclks[i] = new EastRiver_API.TOnlineClock();
pclks[i].Clock_id = int.Parse(listView2.Items[i].Text);
pclks[i].IPAddr = listView2.Items[i].SubItems[1].Text;
pclks[i].Port = int.Parse(listView2.Items[i].SubItems[2].Text);
}
if (EastRiver_API.LaunchOnline(pclks)