求教,数组指针如何发送?

CCC的 2014-09-10 03:19:13
delphi中的声明
POnlineClock=^TOnlineClock;
TOnlineClock=packed record
Clock_id:Integer;
IPAddr:array[0..15] of char;
Port:Integer;
Connected:Boolean;
kModel:Integer;
LastHeartTime:TDateTime;
end;
function LaunchOnline(Pclks:array of POnlineClock):Boolean;stdcall;
主要是Pclks:array of POnlineClock这个参数怎么处理
...全文
198 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
CCC的 2014-09-11
  • 打赏
  • 举报
回复
这样试了还是不行,把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)
CCC的 2014-09-11
  • 打赏
  • 举报
回复
看来这是技术难题了,已经另外做了一个动态库接口实现了,传的字符串,有兴趣的可以继续研究
  • 打赏
  • 举报
回复
不过看MS的例子上,并没有指定ArraySubType,你可以去掉试试 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.sizeparamindex.aspx
  • 打赏
  • 举报
回复
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1, ArraySubType=UnmanagedType.LPStruct)] TOnlineClock[] POnlineClock)
  • 打赏
  • 举报
回复
引用 8 楼 yuekunge 的回复:
不要用IntPtr[]···· 直接使用一个指针就足够了·· IntPtr····就够了····
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)
CCC的 2014-09-10
  • 打赏
  • 举报
回复
pBuf有变的,你可以自己测试下,还原出来是对的,不过不清楚为什么穿给delphi后那个参数的数组变得很大,本来是一个设备,到了动态库那边就变成了几千个数组
於黾 2014-09-10
  • 打赏
  • 举报
回复
看不懂你的代码都在干啥 定义了个pBuf,循环里根本没用到啊 从定义开始,这个pBuf就没变过,你循环完把它传递给dll,有用?
CCC的 2014-09-10
  • 打赏
  • 举报
回复
[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))
敌敌畏耶 2014-09-10
  • 打赏
  • 举报
回复
不要用IntPtr[]···· 直接使用一个指针就足够了·· IntPtr····就够了····
於黾 2014-09-10
  • 打赏
  • 举报
回复
array of POnlineClock到底是个什么类型的数组? 你需要在C#里找到对应类型的数组来与它对应
於黾 2014-09-10
  • 打赏
  • 举报
回复
IntPtr[] 这是啥? 要么定义个数组来接,要么定义个指针来接 你定义个指针数组是想干啥?
CCC的 2014-09-10
  • 打赏
  • 举报
回复
我是这么调用,不行,麻烦帮看下哪里的问题,对C#不熟 [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))
於黾 2014-09-10
  • 打赏
  • 举报
回复
你直接定义个数组来接,试试
於黾 2014-09-10
  • 打赏
  • 举报
回复
C#里有指针啊,IntPtr
CCC的 2014-09-10
  • 打赏
  • 举报
回复
不好意思,delphi的这个函数在C#下如何处理那个数组指针,谢谢
於黾 2014-09-10
  • 打赏
  • 举报
回复
你到底问delphi的问题,还是问C#的问题

110,525

社区成员

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

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

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