|
本帖最后由 tgy 于 2011-10-16 15:45 编辑
最近又研究了几天多线程和DLL的问题,其实只要两个核心的未公开函数:CreateIExprSrvObj 和 VBDllGetClassObject 就可以很稳定地运行程序了,至于存在的一些小问题就不说了,主要还是实现的方法优劣、易用上,其实现方式很多,本人还使用了另一种找VB头的方法.关键是纯VB+API,不含汇编 不用TLB 不用copymemory 也不用open exe文件来找VB头(用打开EXE文件的方式来找,速度方面不占优势,且在标准DLL中写DllMain的时候,不方便),且此方法通用于写VB多线程和标准DLL中的DllMain的初始化,其实这两件事情是一个道理,都是对VB运行环境进行初始化。所以,线程初始化和DLL初始化可调用同一个初始化过程就行了.并很简单地可以用于注入dll的编写,注入成功后,几乎可以在绝大部份有窗体的EXE进程中以独立线程弹出窗体,并可正常使用对象、类等。当然杀软除外,呵呵,IE,explorer,QQ,office,记事本等等几乎所有带窗口的程序都能弹出。另外当然还解决了VB写的EXE程序调用提示找不到dll文件的问题。没有全部测试,但已经能正常被VC,delphi,VB等写的exe调用。虽然不能脱离MSVBVM60.dll,但,如果脱离了MSVBVM60.dll的话,那就不叫VB了,那还不如重新搞个面向对象的basic编译器之类,和C较量,呵呵。
总结:VB真的很强大了!
下面是一个VB写的弹窗测试DLL(内附VB写的注入工具):
补充内容 (2011-10-17 12:34):
核心模块代码放出,请上15楼.
补充内容 (2011-10-17 18:48):
也许得提醒一下新手,这里所说的DLL不是VB默认生成的,需要注册的DLL,而是非注册的,标准DLL。
补充内容 (2011-10-17 22:01):
莫非这就是传说的多线程第三季?
补充内容 (2011-10-17 22:11):
要玩VB dll注入的有福了...呵呵
补充内容 (2011-10-17 22:16):
至于如何与注入的DLL通信,我觉得使用DDE可能会很简单安全,不必HOOK 也不必子类化窗口截取消息,因为有些进程根本就没有窗口.
补充内容 (2011-10-17 23:41):
已经可以使用外部控件了,测试请上17楼。
补充内容 (2011-10-19 13:02):
VB控件使用多线程原则:尽可能避免多个线程同时访问控件对象.尽管只有一毫秒的时差,都会让程序安全运行,因为VB的控件不是线程安全的,也就是说控件内部没有进行多线程访问串行化处理.多线程同时访问将导致严重错误.
补充内容 (2011-10-19 13:04):
如果能使用上支持多线程访问的控件,应该就可以稳定运行多线程了.大家开始找VB用的线程安全控件吧!
补充内容 (2011-10-25 11:13):
VB控件访问的多线程同步很难做的,如果做好了线程同步,也将是用性能代价来换,还不如单线程来得快,单线程就不用考虑同步问题.
补充内容 (2011-10-31 09:10):
使用例子在30楼
补充内容 (2011-11-21 23:11):
已封装为DLL的API函数调用,使用更方便,请看:
http://www.vbgood.com/thread-108165-1-1.html
补充内容 (2011-11-27 23:19):
DLL方式创建线程,这个近乎完美的了:
http://www.vbgood.com/forum.php? ... &fromuid=231244
补充内容 (2011-11-29 15:59):
线程函数可不用写在标准模块中了,可直接写在类事件函数中了,详见软件发布区.
补充内容 (2011-11-30 20:55):
可以通过对象和函数名来创建线程了,不用写到线程函数到标准模块中.详见:
http://www.vbgood.com/forum.php? ... &fromuid=231244 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
评分
-
查看全部评分
|