在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
其实,C# 里可以直接使用结构型的变量引用进API,但是毕竟它不是指针在对一些涉及以结构数组存放的内存区操作可能就力有不及了,我举一个例子要使用到结构数组的一个API(对这个API 不必加以了解,我们不是主说API): net_api_status netshareenum( LPWSTR servername, DWORD level, LPBYTE* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle ); 及它要用到的结构 (设 level 为1): typedef struct _share_info_1 {
[structlayout(layoutkind.sequential)] [dllimport("netapi32.dll", entrypoint="netshareenum")] 在上面的函数执行完成后,会在指针 bufptr 所指的位置存在一个数据块,此内存块的数据格式是以 share_info_1 结构排列的(假设level为1),并且在 entriesread 中指示该块的结构个数,那么我们要如何将它转成真正可用的类型到 share_info_1[] shareinfo; 变量中去呢,其实 c# 提供了一种 marshal.ptrtostructure 的方法,它就是专门将指针所指的非托管内存块搬到托管内存中的指定的结构中去,可它不支持结构数组(目前.net 1.1 还没有该重载实现过),所以只好也最好一个一个的搬(而且一个一个搬更形象些),例子如下: int32 ptr = bufptr.toint32(); //todo: 操作当前的 shareinfo 上面的例子很明显了,bufptr 就是指针,该例子就是将内存中的指针所指的内存块(非托管内存)以一个指定结构的大小和排列格式移动.net 内存(托管内存)中的一个变量去,然后将指针向后移一个位置(ptr += marshal.sizeof(shareinfo)),此位置由指针当前位置加上 marshal.sizeof(shareinfo) 也就是已经移完的大小获得,它的意思其实就是将指针移到已经搬完的数据的后面去准备搬一下结构块 这个例子只是说明指针的用法,并不是主要说api 对该api 及它的参数不必细加研究 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论