C#指针如何定义

飞吧222 2017-07-13 01:41:27
ShareMemDll.dll文件的原型如下:

extern "C" PUB_FUNC_EXPORT_TYPE __stdcall int read_pump_status(int nPumpPort,void *pPumpStatus);
/*
函数功能:PC发送命令给加油机
输入参数:
nPumpNo:需要发送命令加油机机端口号
输出参数:
pPumpCommand:加油机命令数据指针
返回值:
>1=命令区有命令未执行完毕,请稍后再重发
0=成功;
-1=加油机未找到
-2=参数无效
-3=系统未启动
-4=执行命令超时
*/

转成C#是什么?
这是我转的C#
[DllImport("ShareMemDll.dll")]
unsafe private static extern Int32 read_pump_status(int nPumpPort, IntPtr pPumpStatus);

这样对么?我需要怎么调用这个指针
...全文
884 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞吧222 2017-07-18
  • 打赏
  • 举报
回复
引用 8 楼 From_TaiWan 的回复:
pPumpStatus在C++里是什么类型,就用C#对应的类型实现;如果在C++里是自定义类型(如struct),那么你在C#里也定义一个相同结构的struct, 细看了下,C++函数中,第二个参数类型是void,意思是可以接受任何数据类型的实例,那这样,你必须要知道他这第二个参数到底是什么类型,假如是string类型,那么应该像下面这样做 private static extern Int32 read_pump_status(int nPumpPort, IntPtr pPumpStatus);


string ps="内容";
GCHandle C_ps = GCHandle.Alloc(ps, GCHandleType.Pinned);
 read_pump_status(nPumpPort,C_ps.AddrOfPinnedObject()); 
C_ps.Free();

没有测试环境,凭印象写的
VOid是个结构体 struct pump_real_status { unsigned char pump_port; //加油机端口号唯一标识 unsigned char comm_status; //加油机通讯状态0x00=系统未启动,0x01=数据未回,0x55=正常数据 unsigned char pump_qty[4]; //加油数量(3hex) unsigned char pump_money[4]; //加油金额(3hex) unsigned char pump_status; //加油机状态 };
xian_wwq 2017-07-14
  • 打赏
  • 举报
回复
指针只是个地址,指针指向的对象需要函数调用者创建 看这个示例,TagAttr是个自定义结构体,如果是基本类型,就更简单了

int size = Marshal.SizeOf(typedef(TagAttr)) ;    /* 根据需要计算分配空间的大小 */
IntPtr attrInput = Mashal.AllocHGlobal(count*size); /* 申请空间 */
DBPT.GetTagsAttributeWithPtr(nHandle,count,out errors,ids, attrInput);  /* 调用函数*/
for(int i = 0;i< count;i++)
{
    IntPtr ptr = (IntPtr)((UInt32)attrInput + i* size);  /* 通过指针来返回对象 */
    tagsArray[i] = (TagAttr)Mashal.PtrToStructure(ptr,typeof(TagAttr)); /* 指针转回结构体 */
}
Marshal.FreeHGlobal(attrInput); /*释放空间*/

秋的红果实 2017-07-13
  • 打赏
  • 举报
回复
pPumpStatus在C++里是什么类型,就用C#对应的类型实现;如果在C++里是自定义类型(如struct),那么你在C#里也定义一个相同结构的struct, 细看了下,C++函数中,第二个参数类型是void,意思是可以接受任何数据类型的实例,那这样,你必须要知道他这第二个参数到底是什么类型,假如是string类型,那么应该像下面这样做 private static extern Int32 read_pump_status(int nPumpPort, IntPtr pPumpStatus);


string ps="内容";
GCHandle C_ps = GCHandle.Alloc(ps, GCHandleType.Pinned);
 read_pump_status(nPumpPort,C_ps.AddrOfPinnedObject()); 
C_ps.Free();

没有测试环境,凭印象写的
飞吧222 2017-07-13
  • 打赏
  • 举报
回复
引用 6 楼 From_TaiWan 的回复:
[DllImport("ShareMemDll.dll")] private static extern Int32 read_pump_status(int nPumpPort, ref pPumpStatus);
您好 那我在调用的时候怎么调用呢?
秋的红果实 2017-07-13
  • 打赏
  • 举报
回复
[DllImport("ShareMemDll.dll")] private static extern Int32 read_pump_status(int nPumpPort, ref pPumpStatus);
飞吧222 2017-07-13
  • 打赏
  • 举报
回复
引用 4 楼 From_TaiWan 的回复:
int read_pump_status(int nPumpPort,void *pPumpStatus); 在C#里,第一个参数就用int,后面C++指针参数,需要在C#里做地址固定,请参考http://bbs.csdn.net/topics/392191445 看看我的回复
那我定义的这个对么 新手不太懂
秋的红果实 2017-07-13
  • 打赏
  • 举报
回复
int read_pump_status(int nPumpPort,void *pPumpStatus); 在C#里,第一个参数就用int,后面C++指针参数,需要在C#里做地址固定,请参考http://bbs.csdn.net/topics/392191445 看看我的回复
飞吧222 2017-07-13
  • 打赏
  • 举报
回复
飞吧222 2017-07-13
  • 打赏
  • 举报
回复
人呢 帮帮我
飞吧222 2017-07-13
  • 打赏
  • 举报
回复
在线等 挺急的

110,533

社区成员

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

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

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