| 发表于:2007-10-11 15:35:4029楼 得分:0 |
逐行解释 // 获取win32指针的大小 int span = intptr.size; // 下面代码含义是从callinginfo类中获取名为parainfolist字段的值, // 而para 可能也是一个结构,用于与win32直接交互 // sizeofparainfo实际上是marshal.sizeof(para) 的值。 //这样,callinginfo.cnt * sizeofparainfo 就很好理解了,它是获取 // 保存在callinginfo中 para结构数组的数量 与 单个para 结构的大小的乘积 // 但是 (int)callinginfo.parainfolist 难以理解, // 我猜想 前面的 (int) 强制转换告诉我们 parainfolist 属性应该是 intptr 类型 // 这个 parainfolist 是 para 结构数组在内存中的起始指针 // 所以,用起始指针加上para大小与para数量的乘积,这个明显是指针运算 // 得到的 ptr 地址就是parainfolist 数组中下一个元素的位置。 intptr ptr = (intptr)((int)callinginfo.parainfolist + callinginfo.cnt * sizeofparainfo); // marshal.stringtocotaskmemansi(paraname) 很简单,把paraname 这个字符串写入非托管地址 // 返回值是一个临时变量,变量类型是intptr指针,指向的是写入字符串地址的位置。 // marshal.writeintptr(ptr, [临时变量]) // 用于将这个刚写入字符串的地址添加到上面说的那个para数组最后一位指针指向的位置。 marshal.writeintptr(ptr, marshal.stringtocotaskmemansi(paraname)); //public intptr lpvvie; // 这个极佳男,把指针下移一位, ptr = (intptr)((int)ptr + span); // 与上面的语句类似,把vi 写入 marshal.writeintptr(ptr, marshal.stringtocotaskmemansi(vi)); // 注意,还是指针运算,这次是下移两位 //public intptr lpdwsizevie; ptr = (intptr)((int)ptr + span); //public intptr lpvvir; ptr = (intptr)((int)ptr + span); // 看出来了,vi字符串内容大概是中文,所以必须获取字符串长度 int size = encoding.getencoding(932).getbytecount(vi); // 分配 与 vi 字符串相等的长度, // 然后把刚分配的地址的起始指针写入刚才经过指针运算的 ptr 指向的位置中 marshal.writeintptr(ptr, marshal.alloccotaskmem(size)); // 指针运算,ptr 指针再次下移一位。 //public intptr lpdwsizevir; ptr = (intptr)((int)ptr + span); // 把刚才计算的vi字符串的大小写入 ptr 指针指向的内存 marshal.writeint32(ptr, size); //public intptr lpvvoe; //public intptr lpdwsizevoe; //public intptr lpvvor //public intptr lpdwsizevor // 告诉 callinginfo 类,他包含的para 集合又多了一个 count++ callinginfo.cnt++; // ------ ****************** ------------ 这个代码如果不使用win32的代码方式的话,用c# 就一行代码。大概意思是, callinginfo 里头有一个数组,数组是para的数组,以上代码操作是将 para数组的内容就是三个字符串 paraname, vi, vo,这个代码的作用就是将三个字符串加入数组,形成一个新的para结构。并修改指针。 但是非常奇怪,方法参数本来有 paraname, vi, vo 三个参数,但仅仅使用了前两个,vo没有用,大概不全。 | | |
|