CSocketMaster1.3下载网址
http://www.rayfile.com/zh-cn/files/def25b5c-9100-11e0-ad7d-0015c55db73d/此类在VB中以代码方式运行完全正常但是VB代码如果编译为程序后.它的子类化似乎会引起程序崩溃
已经调试发现是它的子类化代码与系统的DEP设置有冲突导致.
DEP即
我的电脑->右键属性->高级->"性能" 设置->数据执行保护如果设置为"为除下列选定程序之外的所有程序和服务启用DEP"
则使用了CSocketMaster类而编译出来的exe会崩溃或卡死无响应如果设置为"仅为基本 Windows程序和服务启用DEP"
则程序可正常运行为了使程序有更好的兼容性,希望有高手能帮助修改代码,使CSocketMaster类能在开启DEP的情况下也正常运行

解决方案 »

  1.   

    其实 ms的控件做的比CSocketMaster好多了CSocketMaster也可以用,把API摘出来自己写就是了……
      

  2.   

    winsock控件是比较好用。但毕竟在绿色环保的今天,能少一个控件肯定是好的o上面的CSocketMaster是原版代码,小弟在实用前进行了大符度修改,简化很多。
    实际测试感觉用在单对单的通讯上可靠性及性能还是不错的.目前就是CSocketMaster的子类化跟系统DEP冲突不知该怎么解决,希望有高手能帮助修改一下代码
      

  3.   

    Private Declare Function api_GlobalLock Lib "kernel32" Alias "GlobalLock" (ByVal hMem As Long) As Long
    Private Declare Function api_GlobalUnlock Lib "kernel32" Alias "GlobalUnlock" (ByVal hMem As Long) As Long
    我觉得是这两个函数有问题,有违 DEP
      

  4.   

    以前用vboost也出现一些莫名其妙的问题,比如开机竟然自动启动了vb,但没有界面(只有进程)。。
    所以以后对于没有吃透、没把握的第三方控件/源码,还是尽量少用。
      

  5.   

    主要是我们调试修改时没发现这问题,现在已经应用上了才发现。(我们自己用的系统DEP都是关闭的)
      

  6.   

    等你做了大点的项目时就会发现......绿色软件思想会害得你很惨的,HOHO.建议,能使用成熟方案的尽量使用成熟方案.哪怕有代码,方案不确定成熟的话尽量不用.DEP的原理是将内存中非执行代码的内存标记为不可执行,比如变量区.因此使用内嵌汇编技术的代码应该都会出问题.用控件吧.
      

  7.   

    +1其实 thunk 也是可以过 dep 的,需要给对应的内存块执行的权限,以前看到有文章介绍的。但是初学者不建议搞,以免走火入魔。
      

  8.   


    小弟一直也是能用可靠方案的尽量用现有可靠方案,不过不能总在原地兜圈,技术总得进步啊.所以这次才尝试想用Csocket替代Winsock.经过修改后的Csocket修正了原版代码中的二进制传输丢数据,去掉了二进制,字符串以外平常用的变量传输支持,精简了程序结构.效果还是不错的.10000个包,在一个窗体中两个Csocket对像对发,不sleep的情况下只掉9个.意思是每秒能处理几百个包(当然都是控制指令一类比较小的)感觉用来做1对1通讯替代Winsock的确是可能的.
      

  9.   


    超级感谢你的提示o朋友~~~~,经过测试确实处理后不会触发DEP了!3Q朋友,你的提示帮了大忙了
      

  10.   

    hehe这次就是最后关头才发现这故障.搞惨了。根据caozhy的提示。做了修改后能在DEP环境下跑了。但多跑跑还是会触发DEP正在研究原因
      

  11.   

    现在彻底确定代码稳定了.再次感谢大家的帮助.
    想来是因为CSocketMaster最早出来时还没DEP这东西.所以后来一直作者也没针对性的处理.
    经过这几天的调试确认修改内存代码执行权限是有效的.当然我最终选择的方案是VirtualAlloc直接划分出具有可执行权限的内存出来.谢谢大家的指点!