您的位置:程序门 -> .net技术 -> c#



刚刚实习,公司的代码实在看不懂


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


刚刚实习,公司的代码实在看不懂[已结贴,结贴人:freedomallen]
发表于:2007-10-10 14:52:52 楼主
public   void   addparastring(string   paraname,   string   vi,   string   vo)
                {
                        int   span   =   intptr.size;
                        //public   intptr   paraname;
                        intptr   ptr   =   (intptr)((int)callinginfo.parainfolist   +   callinginfo.cnt   *   sizeofparainfo);
                        marshal.writeintptr(ptr,   marshal.stringtocotaskmemansi(paraname));
                        //public   intptr   lpvvie;
                        ptr   =   (intptr)((int)ptr   +   span);
                        marshal.writeintptr(ptr,   marshal.stringtocotaskmemansi(vi));
                       
                        //public   intptr   lpdwsizevie;
                        ptr   =   (intptr)((int)ptr   +   span);
                        //public   intptr   lpvvir;
                        ptr   =   (intptr)((int)ptr   +   span);
                        int   size   =   encoding.getencoding(932).getbytecount(vi);
                        marshal.writeintptr(ptr,   marshal.alloccotaskmem(size));
                        //public   intptr   lpdwsizevir;
                        ptr   =   (intptr)((int)ptr   +   span);
                        marshal.writeint32(ptr,   size);

                        //public   intptr   lpvvoe;
                        //public   intptr   lpdwsizevoe;
                        //public   intptr   lpvvor
                        //public   intptr   lpdwsizevor
                        callinginfo.cnt++;
                }
我知道这是marshal管理内存....但是,这是什么意思,真的不知道
望各位牛人指教
发表于:2007-10-10 15:03:431楼 得分:0
go   to   definition   去看这个函数的方法说明喽
发表于:2007-10-10 15:19:082楼 得分:0
帮lz顶
发表于:2007-10-10 15:24:483楼 得分:30
直接对内容数据进行操作,如果这样操作很多,不如使用c++来写了。
发表于:2007-10-10 17:38:424楼 得分:0
对日外包?
发表于:2007-10-10 20:25:385楼 得分:0
帮楼主顶   不要沉啊    
发表于:2007-10-10 20:28:326楼 得分:0
帮楼主顶起来啊!
发表于:2007-10-10 20:37:307楼 得分:0
直接在内存地址上操作数据?
干吗用c#作这种事情...
发表于:2007-10-10 20:42:218楼 得分:0
不懂,帮顶
发表于:2007-10-10 22:39:069楼 得分:10
关键是了解知道callinginfo是啥,其他都不是重要,就是写写数据到非托管的地方
发表于:2007-10-10 23:18:0110楼 得分:0
帮顶,希望高手帮楼主.
发表于:2007-10-10 23:59:4511楼 得分:10
encoding.getencoding(932)这样写
纯粹就是故意搞些不好维护的东西,写成类似encoding.getencoding("gb2312")这样的代码不是更好理解?

有病
谁没事去记那一串数字?
发表于:2007-10-11 00:47:1612楼 得分:0
纯粹是对内存数据的操作...

这种动作.   感觉用vc++做比较好...
发表于:2007-10-11 09:02:1013楼 得分:0
好!~
发表于:2007-10-11 09:07:1814楼 得分:0
友情up一下
发表于:2007-10-11 09:16:2415楼 得分:0
搞不清哎
发表于:2007-10-11 09:17:2316楼 得分:0
感觉用vc++做比较好...好!~
发表于:2007-10-11 09:22:0517楼 得分:0
帮顶,不懂就问,如果公司没人告诉你就跳槽。
发表于:2007-10-11 09:23:5618楼 得分:0
顶起!学习!
发表于:2007-10-11 09:50:5419楼 得分:0
encoding.getencoding(932)这样写  
纯粹就是故意搞些不好维护的东西,写成类似encoding.getencoding("gb2312")这样的代码不是更好理解?  

有病  
谁没事去记那一串数字?

-----------------------------------------------------

其实很是有些程序员喜欢装b的....
发表于:2007-10-11 09:57:1820楼 得分:0
有的公司就是这样
代码比学校里学的难看多了!
发表于:2007-10-11 10:08:1021楼 得分:0
。。。。。。。。。
发表于:2007-10-11 10:14:2822楼 得分:0
这段代码还不如用unsafe写呢,真晕,
发表于:2007-10-11 10:38:5123楼 得分:0
考,这样写代码的家伙应该被踢出开发团队
发表于:2007-10-11 11:23:0924楼 得分:0
总之   这样的代码想读懂有点困难啊
要是工作的话   只有闷下头来慢慢理解了  
别无它法
发表于:2007-10-11 11:54:1025楼 得分:0
学习!
发表于:2007-10-11 12:09:2526楼 得分:0
这项目肯定是从c升级上来的,最初升级的时候或者是考虑其他的兼容性,或者是根本就狗屁不懂

看着像是鬼子的编译器之类的项目
发表于:2007-10-11 12:28:1727楼 得分:0
无语。
发表于:2007-10-11 14:55:3428楼 得分:0
不明白
发表于: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没有用,大概不全。
发表于:2007-10-11 21:00:1030楼 得分:0
比较费劲!顶起
发表于:2007-10-11 21:23:1931楼 得分:0
还是有女人
发表于:2007-10-11 22:58:5232楼 得分:0
互操作是一个比c++还要复杂的玩意儿


快速检索

最新资讯
热门点击