C#调用C++双重指针的问题(高分求救)

飞天鹰 2008-01-15 08:18:39
我要把下面这段代码转换为C#的方法:
ihuReadRawDataByTime(
in int serverhandle,
in char *Tagname,
in IHU_TIMESTAMP *StartTime,
in IHU_TIMESTAMP *EndTime,
out int *number_of_samples,
out IHU_DATA_SAMPLE **data_values
);
我写的是:
[DllImport("ihuAPI", EntryPoint="ihuReadRawDataByTime@24",
CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Ansi)]
public static extern ReadRawDataByTime(
int serverhandle,
string Tagname,
ref IHU_TIMESTAMP StartTime,
ref IHU_TIMESTAMP EndTime,
ref int number_of_samples,
ref IHU_DATA_SAMPLE []data_values
);
然后用:
ret = ReadRawDataByTime(serverhandle,Tagname,ref StartTime,ref EndTime,ref number_of_samples,ref data_values);
来调用,本来根据时间出来的应该是number_of_samples个数值,但我调用后data_values的length始终只是1。
求教高手,这到底是怎么回事啊?我感觉应该是我把out IHU_DATA_SAMPLE **data_values
转化到ref IHU_DATA_SAMPLE []data_values的方式有错!这里是双重指针!谢谢了!
...全文
765 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyc_xiaoben 2008-07-24
  • 打赏
  • 举报
回复
mark ~
飞天鹰 2008-01-17
  • 打赏
  • 举报
回复
哦,我知道了!谢谢!
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
try.............

ref IHU_DATA_SAMPLE []data_values

this location replaced by ref IntPtr data_values;

then IntPtr pt = Marshal.ReadIntPtr (data_values);

then Marshal.PtrToStructure(pt,typeof(IHU_DATA_SAMPLE ));


try it
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
问题出在这里,, public string Tagname; 是托管类型,这里会有问题.
其实还有一个方法,你可以C++代码中用sizeof得到这个结构的大小.比如是64,然后在C#中每次 ip += 64..
这样可以工作,但代码写死了..你明白吗
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
楼上的我不太明白,能讲的再详细点吗?谢谢了!
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
不好意思,又要麻烦你们了!
我觉得应该是IHU_DATA_SAMPLE的问题
public struct IHU_DATA_SAMPLE
{
public IHU_TIMESTAMP TimeStamp;
public string Tagname;
public ihuDataType DataType;
public ihuValue Value;
public IHU_RAW_QUALITY Quality;
public IntPtr Comments;
};
在IHU_DATA_SAMPLE结构体里还有结构体和枚举:IHU_TIMESTAMP ,IHU_RAW_QUALITY 是结构体,ihuDataType ,ihuValue 是枚举!
所以在这里好像 sizeof(IHU_DATA_SAMPLE)得不到大小。
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
好的!非常感谢你们的帮助!下面应该是我自己的问题了!祝你们新年快乐!
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
定义了的话,可以sizeof的。。你要找下是哪里不对。
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
定义过了,它是个结构体
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
IHU_DATA_SAMPLE 在你的C#代码中定义过了吗?
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
运行时说无法获取IHU_DATA_SAMPLE的变量地址和大小!
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
mark your function using unsafe...
haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
you should

int ip = pt.ToInt32();
ip += sizeof(IHU_DATA_SAMPLE);
pt = new IntPtr(ip);..

loop....\

haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
yaolifei1111 sorry just I gave you is pseudocode

飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
是啊,是从数据库输出1组数据
真相重于对错 2008-01-16
  • 打赏
  • 举报
回复
out IHU_DATA_SAMPLE **data_values //这个是指定为数组吗??

飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
pt += sizeof(IHU_DATA_SAMPLE);
上面这句报错:
1.pt和sizeof(IHU_DATA_SAMPLE)类型不一样(前者为IntPtr,后者为int);
2.sizeof只能用于不安全的上下文。
我改为:pt += Marshal.SizeOf(IHU_DATA_SAMPLE); 后又报错说IHU_DATA_SAMPLE是类,这里有关是变量!

麻烦haiwangstar大哥再帮我看一下!谢谢了!

haiwangstar 2008-01-16
  • 打赏
  • 举报
回复
I forgot ,to get array just

Marshal.PtrToStructure(pt,typeof(IHU_DATA_SAMPLE ));
pt += sizeof(IHU_DATA_SAMPLE);
Marshal.PtrToStructure(pt,typeof(IHU_DATA_SAMPLE ));
array[i] = ....
飞天鹰 2008-01-16
  • 打赏
  • 举报
回复
谢谢两位了,现在可以了,不过我还有个问题!在调用的时候,pt怎样转成数组呢?
晚上回去后就给2位加分!真诚的感谢!
真相重于对错 2008-01-15
  • 打赏
  • 举报
回复
structlayout
ref intptr
marshal.structuretoptr;
marshal.ptrtostructure

111,092

社区成员

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

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

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