CreateThread创建线程成功,但是它调用的函数不能有API或VB的open等语句,否则会失败,其它普通VB语句或函数没问题,不知是何原因,望高人指点,谢谢。

解决方案 »

  1.   

    听某个很能YY的人说,是TLS(线程本地存储)造成的问题?你用单元模型线程应该没啥问题了.
      

  2.   

    是COM的原因,一个老外写的<VB高级编程>的书上有详细原因说明,并给出大致的可行方法,
    但千万不要在商业软件上应用,不然你会被用户骂到狗血淋头的^_^!
      

  3.   

    还有,用CreateRemoteThread函数情况更是如此,好像只有少量语句可用,函数一个也不能用,只能定义变量、if、for等少量语句,连静态变量也不能定义
      

  4.   

    函数内要调用其它的的函数只能是本进程内的代码(即使 API 调用也要先通过 VB 提供的一些通用动作来定位这个函数)。
    而你前面的帖子中提到,是通过 WriteProcessMemory 将一个函数的整块机器指令写入到目标进程中,但是被它调用所需的其它函数在目标进程中是没有的。
    所以仅限于可以独立执行的函数可以跨进程复制并成功调用。
      

  5.   

    '先看下你的工程属性是不是支持多线程方式
    'AsyncThread
    'Using the CreateThread function in Visual Basic
    'is very risky! VB5 is 'kinda' stable, but VB6
    'applications will probably crash when you
    'use the CreateThread function.Private Sub Command1_Click()
        hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)
        CloseHandle hThread
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
         If hThread <> 0 Then TerminateThread hThread, 0
    End Sub
    'In a module
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
    Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public hThread As Long, hThreadID As Long
    Public Sub AsyncThread()
         Sleep 10000
        hThread = 0
    End Sub