VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 9703|回复: 25

[求助] 原谅我这个脑残,又来研究VB多线程了。

[复制链接]
发表于 2014-7-25 22:04:46 | 显示全部楼层 |阅读模式
又抽风研究VB多线程技术了。

简单的说一下实现方法。

用数组存储 字节,来构造一个小型函数
函数里面调用VB类中的函数。

遇到了一个问题。

在IDE下完美执行多线程,但是生成出EXE 就不行了。不知道怎么回事。
求大家帮助!
附部分代码
  1. Option Explicit

  2. Private Declare Function CallWindowProcA Lib "user32.dll" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  3. Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (ByRef Destination As Any, ByRef Source As Any, Optional ByVal Length As Long = 4)
  4. Private Declare Function CreateThread Lib "kernel32.dll" (ByVal lpThreadAttributes As Long, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, ByVal lpThreadId As Long) As Long
  5. 'Private Declare Function CreateThread Lib "kernel32.dll" (ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, ByRef lpStartAddress As Long, ByRef lpParameter As Any, ByVal dwCreationFlags As Long, ByRef lpThreadId As Long) As Long
  6. Private Declare Function TerminateThread Lib "kernel32.dll" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long

  7. Private Type SECURITY_ATTRIBUTES
  8.     nLength As Long
  9.     lpSecurityDescriptor As Long
  10.     bInheritHandle As Long
  11. End Type



  12. Private m_hThread As Long '线程句柄
  13. Private m_pObjMe As Long '本模块指针
  14. Private m_pThreadProc As Long '线程函数指针
  15. Private m_ShellCode() As Byte '自己构造一段小函数

  16. Private Const ThreadProcPos As Long = 3 '保存了线程过程的位置


  17. Private Function ThreadProc(ByVal lpParamer As Long) As Long
  18.    
  19.         MsgBox 2

  20. End Function


  21. Public Function Create() As Long

  22.     CreateThread 0, 0, VarPtr(m_ShellCode(1)), 0, 0, 0
  23.     'CallWindowProcA VarPtr(m_ShellCode(1)), 0, 0, 0, 0
  24. End Function



  25. Private Sub Class_Initialize()
  26.     '获取类模块指针
  27.     m_pObjMe = ObjPtr(Me)
  28.     RtlMoveMemory m_pThreadProc, ByVal m_pObjMe
  29.     RtlMoveMemory m_pThreadProc, ByVal m_pThreadProc + 32
  30.    
  31.     ReDim m_ShellCode(1 To 32) As Byte
  32.     m_ShellCode(1) = &H55 ' push ebp
  33.     m_ShellCode(2) = &H8B ' mov  ebx,esp
  34.     m_ShellCode(3) = &HEC
  35.     m_ShellCode(4) = &H83 ' add  esp,-0x4
  36.     m_ShellCode(5) = &HC4
  37.     m_ShellCode(6) = &HFC
  38.     m_ShellCode(7) = &H8D ' lea  eax,[ebp-0x4]
  39.     m_ShellCode(8) = &H45
  40.     m_ShellCode(9) = &HFC
  41.     m_ShellCode(10) = &H50  'push eax
  42.     m_ShellCode(11) = &HFF 'push [ebp+0x8]
  43.     m_ShellCode(12) = &H75
  44.     m_ShellCode(13) = &H8
  45.    
  46.     m_ShellCode(14) = &H68 'push m_pObjMe
  47.     m_ShellCode(15) = &H0
  48.     m_ShellCode(16) = &H0
  49.     m_ShellCode(17) = &H0
  50.     m_ShellCode(18) = &H0

  51.     m_ShellCode(19) = &HB8 'mov eax,m_pThreadProc
  52.     m_ShellCode(20) = &H0
  53.     m_ShellCode(21) = &H0
  54.     m_ShellCode(22) = &H0
  55.     m_ShellCode(23) = &H0
  56.     m_ShellCode(24) = &HFF 'call eax
  57.     m_ShellCode(25) = &HD0
  58.     m_ShellCode(26) = &H8B 'mov  eax,[ebp-0x4]
  59.     m_ShellCode(27) = &H45
  60.     m_ShellCode(28) = &HFC
  61.     m_ShellCode(29) = &HC9 'leave
  62.     m_ShellCode(30) = &HC2 'retn 0x4
  63.     m_ShellCode(31) = &H4
  64.     m_ShellCode(32) = &H0
  65.    

  66.     RtlMoveMemory ByVal VarPtr(m_ShellCode(15)), m_pObjMe
  67.     RtlMoveMemory ByVal VarPtr(m_ShellCode(20)), m_pThreadProc
  68.    
  69. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

非常感谢  发表于 2015-1-8 19:08

本帖被以下淘专辑推荐:

 楼主| 发表于 2014-7-25 22:05:07 | 显示全部楼层
求大家用口水吐我,淹死我。

点评

那些汇编代码的意思就是构造一个小函数,然后小函数调用类中的函数  发表于 2014-7-26 22:56
回复 支持 反对

使用道具 举报

发表于 2014-7-25 23:07:22 | 显示全部楼层
这东西,就是玩玩,不可能用于实际工程中,无意义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-25 23:26:47 | 显示全部楼层
zzyong00 发表于 2014-7-25 23:07
这东西,就是玩玩,不可能用于实际工程中,无意义

就是想玩玩的 ,嘿嘿
回复 支持 反对

使用道具 举报

发表于 2014-7-25 23:39:58 | 显示全部楼层
不会汇编啊。。。
汇编难学吗?
回复 支持 反对

使用道具 举报

发表于 2014-7-26 08:44:11 | 显示全部楼层
lz真想玩玩,建议去玩 并行编程,昨天看了下那玩意,感觉多线程太可爱了
回复 支持 反对

使用道具 举报

发表于 2014-7-26 09:56:56 | 显示全部楼层
数组没有执行权限,会触发dep,要用virtualprotect加上执行权限才行。而且,你没有初始化vb库,运行复杂函数肯定会出错。至于ide里...或许vb自动加上执行权限了

点评

如何初始化VB的库  发表于 2014-7-26 22:39
就一个MsgBox 也不复杂啊,我非得弄明白它  发表于 2014-7-26 22:22
不应该啊,我那个类模块中实现回调函数 也没加权限,就能运行  发表于 2014-7-26 22:12
回复 支持 反对

使用道具 举报

发表于 2014-7-26 12:19:38 | 显示全部楼层
不要这样玩呀!用内嵌汇编已经走错路了,划不来!就是多加一代码的事,其余的使用方法可以照搬C的API多线程。我专门研究过了:http://tieba.baidu.com/p/2911856363
VB多线程完全可以应用于实践!不要在里面调用非线程安全的控件就行了。API和数学计算绝对是稳的~!
我的代码经测试可以优化全开编译为本机代码运行!和你的方法弊端相反:最好不要在IDE下运行。

点评

很久以前就有这个方法了,之前download还做过一个可以用msgbox的  发表于 2014-7-26 18:08
回复 支持 反对

使用道具 举报

发表于 2014-7-26 12:26:28 | 显示全部楼层
zzyong00 发表于 2014-7-25 23:07
这东西,就是玩玩,不可能用于实际工程中,无意义

你肯定没有遇到过需要大量的数学运算的项目。现在的电脑很多都是多核,至少双核满地都是了,不用多线程白白浪费电脑性能和运行时间。纯数学运算在VB多线程中是绝对稳定的,没有问题。API和ACTIVEX DLL的调用方面我还在仔细研究中~
详情请看 http://tieba.baidu.com/p/2911856363

点评

我只是在网络等待中用过多线程!你说的数学运算用多线程,不可思意,哪不是效率更低吗? 多核和多线程根本不是一回事儿!请不要混淆  发表于 2014-7-28 22:29
研究完了别忘了分享一下 @ 我哦  发表于 2014-7-26 22:14
回复 支持 反对

使用道具 举报

发表于 2014-7-26 12:30:23 | 显示全部楼层
我觉得又有人要说我为什么不直接用C或者VB.NET算了。。。 现在的程序员/编程爱好者的探索精神都死光了吗?

点评

我就想这么调用,唯一不解的是,为毛编译后就挂了  发表于 2014-7-26 22:15
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-5-18 21:33

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表