VC类型转换成C#类型问题,在线等,急! char recbuf[4096] 这个是VC代码我要把他转换成C#代码我用C#尝试了很多类型都解决了不这个问题,如 string[],char[],ushort[],uint[],ulong都不行希望高手能出现,急! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 byte[] recbuf = new byte[4096]; 你这样的态度,不值得别人帮你回答问题.gomoku能帮你回答问题,是你的荣幸.你可以找一下gomoku回复的问题,他的答案基本上就是准确解答. 但是,像他那样确实不行,你知道我为什么把那些数据类型列出来吗?就是不想让大家重复发表一些内容。我那样说确实有点过急了一点,唉,最近搞程序有点心情烦,向你说声I'm Sorry! 明显是错误的,居然还贴出来。正确的对应是:[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]string recbuf;注意上面的属性标志,指定了一个定长的字符串。VC中的字符数组就是C#中的字符串 [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst = 60)]public string csharpString变量名; 我把代码贴出来: [DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)] public static extern int CLIENTDLL_GetDeviceList(IntPtr handle, string recvBufs, int iBuflen);调用: [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)] string recvBuf; Ret = MapGooSdk.NetWorkSdk.CLIENTDLL_GetDeviceList(hServerHandle, recvBuf, 4096); 你的VS函数原型是如何的?那个参数部分就是char recbuf[4096]吗?试试这种写法:[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)] public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] string recvBufs, int iBuflen);如果你的recvBufs不需要输入,只要输出,可以把“In”标志去掉 你再试试UnmanagedType.LPStr和UnmanagedType.LPWStr,总之方式应该就是那样的,注意IN、OUT标志,另外还有UnmanagedType.LPArray,是用在数组上的,你可以在char[]上使用它,例如:[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 4096)] char[] recvBufs, int iBuflen);总之,指定长度是必须的,也只有通过那个方式来在函数参数中指定,至于数据类型就这些了,你一个个试试吧。 你没看到那个是定长数组吗?如果是指针,我肯定想到StringBuilder,但是既然是定长数组,就需要先开辟一个定长空间,这时就不能用StringBuilder了。另外不知道[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] ref string recvBufs行不行(加个ref关键字试试),反正我没测试环境,我只能给你各种可能的方式测试。 貌似在进行硬盘录像机的开发,在封装DLL?如果是加群104852006 群空间有个CLRInsideOut.rar工具,专门从c++库转c#代码的工具进群提我的ID好用 求助asp.net 和sqlserver C#中Socket里都有那些异常呢 急啊 急啊,关于ASP.NET发送邮件的问题 【紧急求助】MDI子窗体最大化时合并问题。各位同僚帮忙~~ 怎么样用代码模拟进行TREEVIEW的点选操作? 请大家帮我看看这个TreeView控件的显示问题怎么解决?? c#读取windows2000服务器版下active directory问题 初学者高分求救:winform程序部署问题 .Net中怎样不用安装Oracle客户端访问Oracle? 到底什么时候,函数声明前面要加new关键字? C# dynamic返回类型问题 模拟点击
你这样的态度,不值得别人帮你回答问题.
gomoku能帮你回答问题,是你的荣幸.
你可以找一下gomoku回复的问题,他的答案基本上就是准确解答.
但是,像他那样确实不行,你知道我为什么把那些数据类型列出来吗?
就是不想让大家重复发表一些内容。我那样说确实有点过急了一点,唉,最近搞程序有点心情烦,向你说声I'm Sorry!
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
string recbuf;
注意上面的属性标志,指定了一个定长的字符串。VC中的字符数组就是C#中的字符串
public string csharpString变量名;
[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
public static extern int CLIENTDLL_GetDeviceList(IntPtr handle, string recvBufs, int iBuflen);调用:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4096)]
string recvBuf; Ret = MapGooSdk.NetWorkSdk.CLIENTDLL_GetDeviceList(hServerHandle, recvBuf, 4096);
试试这种写法:[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] string recvBufs, int iBuflen);如果你的recvBufs不需要输入,只要输出,可以把“In”标志去掉
[DllImport("ClientDll.dll", EntryPoint = "CLIENTDLL_GetDeviceList", ExactSpelling = false, CallingConvention = CallingConvention.Winapi)]
public static extern int CLIENTDLL_GetDeviceList(IntPtr handle,[In, Out, MarshalAs(UnmanagedType.LPArray, SizeConst = 4096)] char[] recvBufs, int iBuflen);
总之,指定长度是必须的,也只有通过那个方式来在函数参数中指定,至于数据类型就这些了,你一个个试试吧。
另外不知道[In, Out, MarshalAs(UnmanagedType.LPTStr, SizeConst = 4096)] ref string recvBufs行不行(加个ref关键字试试),反正我没测试环境,我只能给你各种可能的方式测试。
如果是加群104852006 群空间有个CLRInsideOut.rar工具,专门从c++库转c#代码的工具
进群提我的ID好用