好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 zylc369 于 2012-1-1 17:46 编辑
写程序过驱动保护的时候,难免要写一个应用程序的界面,要是用MFC写,那就太累了。
所以可以用C语言写驱动实现,E语言写界面,大致步骤如下:
1. 用VC把驱动写出来。
2. 写一个程序可以调用驱动,并封装成DLL。
3. 用易语言调用DLL。
初次用这种方法写程序的步骤:
1. 将写好的驱动程序在虚拟机测试,看有无问题
2. 在VC中建一个控制台程序,检测写出的调用方法是否可用(不一定要调用DLL,可以把DLL中的方法直接复制过来,因为调用DLL也挺麻烦的)。
3. 前两步成功后,再在易语言中测试。
熟练后,第二步可省。
细节注意:
1. 如果你使用的是Unicode字符集(即wchar_t类型)编写DLL,那么因为E语言的字符串默认是多字节字符集(即char类型)的,如果你要向DLL中传递字符串,字符串不转换的话,那么调用函数就不会得到想要的结果。
解决办法:转换。E语言有很多模块提供了从是多字节字符集到Unicode字符集的转换功能,从网上下载一个即可。
2. 如果不想让别人看见你的DLL,可以用MoleBox Pro这个软件,将你的EXE和DLL一起封装起来变成一个文件。经亲测调用DLL中的函数没问题。驱动封装以后调用不了驱动。
3. DLL中的方法必须是__stdcall的调用约定。
4. 不要在方法那里直接写__stdcall,这样的话如果你的C语言要调用你这个DLL就要出问题,因为C语言是__cdecl的调用约定(调用约定之间的区别,我没记错的话《INTEL汇编语言程序设计第5版》这本书里面有讲到,要不就是《琢石成器:Windows环境下32位汇编语言程序设计(第3版)》)。
解决办法:定义一个宏,#define __WINCALL__ __stdcall,把这个宏放在函数写调用约定的地方,如果C语言要调用这个DLL的话,直接把宏改成#define __WINCALL__ __cdecl,就行了,如果不这样做,那你就一个一个的改吧!
为什么不用VB:
我看过《Windows程序设计》这本书,书中讲到win 2000以后的系统,如果用xxxxxxA这样的函数,那么在底层经过转换后都会调用xxxxxxW这样的函数,例如:MessageA会调用MessageW这个函数,而这样就会有一个效率问题。虽然现在大家电脑都快了,而且咱们写的程序都不大,根本应该是感觉不到有什么区别的,但是我有效率癖,所以写VC程序的时候用的是xxxxxxW这样的函数(当然都是用宏调用的,如Message,但是你指定的是Unicode字符集的话底层就调用MessageW函数了),这样就必须使用Unicode字符集。
VB我只是偶尔偶尔的写写,而VB的字符串是多字节字符集的,所以我用的时候就必须把字符串转换成Unicode字符集,其转换之麻烦繁琐,实在都是血泪史啊,而且用VB写程序,很有肯能别的没有安装VB的电脑上根本用不了,关键是看你用什么控件了。比如,你用选择文件的控件,那么你要同时打包这个控件相应的.ocx文件,实在麻烦。
而易语言就不同,虽然易语言的字符串也是多字节字符集,但是很多易语言模块就提供多字节字符集和Unicode字符集的互相转换,方便。
易语言是用VC的链接器编译的,我猜测易语言写出的程序在底层其实都转换成了C/C++,然后用VC链接器进行链接,要不用VC的连接器干什么?不是一家人,不走一个门。
那么这就好说了,VC的程序进行“静态”编译,注意必须是静态,就可以在任何windows操作系统上运行,那么易语言也应该一样,经测试,的确如此。
我看有朋友说,易语言报毒,可以从网上下载一个
易语言特征码免杀UPX加壳VC连接器切换多功能插件.7z
用这个插件加上UPX壳后,就不报毒了
这些细节是我熬了两次夜试验出来的结果,希望各位给个掌声吧~!
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|