C# 拿结构体数组中结构体成员值的问题

ericyi 2009-03-21 01:01:19
外部DLL 中有一个function : GetPossibleMode(int AdapterIndex,* int lpNumModes, Mode **lppModes), 功能: 输入 AdapterIndex ,拿到指向这个Adapter所支持的所有Mode组成的数组首地址的指针: lppModes 以及 指向这个数组中Mode个数的指针: lpNumModes, 数组成员Mode 是一个结构体 Mode {int X, int Y, int Z} .
现在C# code中 想要调用这个function(),

1. 怎么调用? 几个参数如何设,比如第三个参数?
// 举个例子 好像指向结构体的指针 作为参数 ,可以如下初始化,然后把Buffer作为参数 传给函数
Mode mode_tmp = new Mode();
InPtr Buffer = (IntPtr)MarshalHelpers.structureToPtr(mode_tmp)
//但我不知道 像本例中指向数组地址的指针 怎么初始化?

2. 调用这个函数后 拿到的buffer 怎么解析拿到数组里每个Mode结构体的值?
//如果像上面那样,第三个参数是指向结构体的指针的话 好像可以
// mode_tmp = (Mode)Marshal.PtrToStructure(Buffer, mode_tmp.GetType())
// 然后Mode结构体成员就可以拿出来了 mode_tmp.X, mode_tmp.Y
//但我不知道这个例子中如何拿出来


谢谢高手解答我得初级问题,如有疑问可以提出 我马上补充
...全文
417 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericyi 2009-03-23
  • 打赏
  • 举报
回复
谢谢回答 我可能没写清楚
返回的lppModes 存放的是指向那个数组首地址指针的地址 ,即指针的指针,GetPossibleMode(int AdapterIndex,* int lpNumModes, Mode **lppModes),
请问怎么转换返回值才能拿到我想要的值?
ericyi 2009-03-23
  • 打赏
  • 举报
回复
只要拿到数组首地址 s[] s1 = ....
我好像就可以用
int ptr=marshal UnsafeAddrOfPinnedArrayElement(s1, Index)命令拿到每个结构体了
ericyi 2009-03-23
  • 打赏
  • 举报
回复
那如果我拿到了IntPtr d ,它存放的是数组首地址指针的地址,我怎么才能拿到数组首地址呢?
用Marshal.PtrToStructure?里面的type怎么写啊?
jjcheung 2009-03-23
  • 打赏
  • 举报
回复
单IntPtr就表示指针
jjcheung 2009-03-23
  • 打赏
  • 举报
回复
指针的指针可以使用ref IntPtr或者out IntPtr来表示
jjcheung 2009-03-22
  • 打赏
  • 举报
回复
你这个函数后两个参数应该都是输出用的。C#中可以这样写:
GetPossibleMode(int AdapterIndex,out int lpNumModes, out IntPtr lppModes);
调用语句:
int num;
IntPtr lppModes;
GetPossibleMode(1, out num, out lppModes);
然后可以通过:
for (int i=0; i < num; i++)
{
Mode m = (Mode)Marshal.PtrToStructure(new IntPtr(lppModes.ToInt32() + i * sizeof(Mode)), typeof(Mode));
......
}
注意这只能工作在32位的系统上。
ericyi 2009-03-22
  • 打赏
  • 举报
回复
有没有高手回答啊?
EveryCase 2009-03-21
  • 打赏
  • 举报
回复
顶~~~~~~~~~~~~~
ericyi 2009-03-21
  • 打赏
  • 举报
回复

111,126

社区成员

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

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

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