偷偷告诉你们,VC++十分强大,强大到你只要接触过C#,然后一定谁谁是开发游戏的你就觉得一定牛B到不行。
然后可能偷偷幻想着自己会点开发,自己又向那未知的黑客技术天才一样又进了一步。
但经过几年沉思之后你又会发现,其实你只是一个普通得不能再普通的码农。
你一定幻想过,你别说话,我也不会去猜你接下来想说什么。
当你接触了一些开发技巧,慢慢的觉得普通的开发业务貌似开始不满足你幻想中的技术的时候,你开始会慢慢的研究一些东西。
比如外挂,比如我自己做个游戏,比如你没做出来的任何东西,但他们都有一个共通点,那就是,你的NET完全无用武之地。
可能好在你在什么时间点知道了XNA也可以利用C#来开发游戏,确实网上也有一些不错的案例,但不多。
可能你上了吾爱破解天天瞎搞一些破解技巧,跟踪软件套件都藏进你的硬盘,OD,CE,IDA……一堆说不上,也无法深入(我也开发过外挂,而且也正常使用,但说白了还是不够高深)。
然后你捣鼓了大半年,浪费了最好的青春后才发现,这些都不在你的天才能理解的范围之内,但他们都可能会和C++之流的东西有交互,因为只有C++之流的东西或者Dephil或者更高级的东西才能满足你对系统的无限渴望。
但我知道,说了半天,你就是想WIN的一些API接口,因为C#的机制,你能能通过系统的底层API,所以由此而引申出,C#也可以很强大,基于什么理由,我不清楚,可能是你认为C#编写基础框架和界面,底层的东西就交个专业的系统API来实现的想法。
由此,就有上面的东西,托管和非托管,啥玩意我解释不清楚,你自己百度,就算我说错了,估计你也不知道,反正对你来说有什么意义,你能在开会的时候说我的项目就是要这样的一种模式,采用托管和非托管云云,你自己都觉得傻叉了不是,人家哪管你什么模式,人家只要你完成项目,爱用什么都可以,只要公司允许,你用汇编完成整个项目也没人会说什么。但前提你得考虑能够让别人维护得了你的这个奇葩项目就是了。
总之不管你的出发点是什么,这个绝对不可能存在的项目启动计划研讨会,会一辈子烂在你心里的。
可实际呢,大范围应用的可能性确实很低,但总归有会用上的时候,比如,隐藏窗体,别人的窗体,对,就是别人的窗体,我C#要隐藏自己算什么需求,加一句代码就行了,这什么烂需求,不知道哪里定的,我也不清楚,但就是要隐藏。
SPY++先了解一下,句柄啥的都能能够找到,句柄啥?这个解释不清楚,是微软一开始就有的,刻在骨子里的东西。
有没有用,当然有用,不过通常还是会利用代码进程去获取指定名称就是了,只是点一下,这个东西,自有它的用处。
然后你可能就随便抄起家伙,开始了各种WIN32的API声明和调用。
可以说你一开始肯定是玩得不亦乐乎,似乎就印证了我最开始提到的,你的任何天才般的想法。
顺我者昌,逆我者“屎”,黑客之道就这这条路上。
然后a few moments later……再过几年之后,你会发现,除了上面你得心应手的几个API,你好像也没有再用其他的多少啊,WIN32API千千万为何只有那几句常用的声明,几个甚至十几个呢。
Why...
不知道,我问我也回答不上来,路是你自己选的,没有人告诉你要这么用,但你就是这么用了。
这个完全没用吗,也不见得,至少你可能在某个项目上用过几句,甚至还高兴了好一阵子,我用它调用VC的动态库,Dephil的动态库,很好的把多个项目的衔接问题给解决了。
这技术是真香,你能说他不香吗。。。
知道a few moments later……在过几年,突然有一个项目,人家就让你对接一些私人开发的硬件,或者大公司开发的硬件,或者某某公司的奇葩软件接口,嘿嘿他们用的就是那些VC之流的东西,以前改搞的也搞了,没差。
然后你又深刻的体会到什么叫不规范,文档不规范,Demo不规范,连环境都不规范。
说好的非托管呢,我也是根据他们文档来的呀,转的没错啊
你就会开始接触更深层次的
Using System.Runtime.InteropServices;
byte[] ImgPlatePath = new byte[nImgPlatePathLen];
Marshal.Copy(szImgPlatePath, ImgPlatePath, 0, nImgPlatePathLen);
之类,甚至是委托,CallBack回调,回调指针,什么鬼的,还是一样的拼命的将各种托管与非托管之间的类型转换之间的博弈。
某个类似只要一对不上就开始找各种奇葩原因,然后类似这样的情形,查找了大半天这东西估计也用上了
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szFilePath;
各种结构体,各种指针在你身体里不断的骚动。
char szDirection[3][256]
=>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * 256)]
public byte[] szDirection;
骚不骚,很骚,但你总会一眼就能够猜出一大半,剩下的一大半就完全不懂了,就得想老师教的九九乘法表那样,一一对照,运气好,不出问题,运气不好……呵呵……
char * DevAddress
=》
public IntPtr DevAddress;
就像跟美女聊天一样,当对方打出呵呵的瞬间,你就快速关闭聊天窗,假装她还未发消息,等一天之后再若无其事的再次给她发消息,当然你会自动忽略昨天发的最后一句是啥。