我用API函数CreateThread()时,如下:
    hThread = CreateThread(0, 0, thDownload, 0, 0, dwThread)其中thDownLoad为函数名。
运行时提示:
    compile error
    Argment not optional.
请问如何修改?

解决方案 »

  1.   

    Declare Function CreateThread Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long数据类型对吗?你的thDownload传参了吗?
      

  2.   

    hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf thDownload, ByVal 0&, ByVal 0&, dwThread)注意,要传的是thDownload的函数地址,不是传函数本身。
      

  3.   

    Public Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpParameter As Long, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
    Public Function BeginThread(ByVal lpStartAddress As Long, lpThreadId As Long, ByVal lpParam As Long) As Long
        Dim sa As SECURITY_ATTRIBUTES
        
        sa.nLength = Len(sa)
        sa.bInheritHandle = 0
        
        BeginThread = CreateThread(sa, 0, lpStartAddress, lpParam, 0, lpThreadId)
    End Function我把CreateThread 封装成BeginThread,便于调用,createThread的lpStartAddress参数必须传值,所以必须定义成byval ,或者在传递参数时加上byval
      

  4.   

    vb中的线程不是很好使用,用softice跟踪可以发现tlsGetValue经常返回0,而返回值又被作为地址使用,导致出现异常,所以会出现程序飞掉的现象,解决的办法之一是hook 技术,对tlsGetValue进行hook,使其返回似乎正确的地址值,我试了一下,效果还可以,但总之不是很好,解决的办法之二是使用多进程来解决多线程的问题,解决的办法之三改用其他语言吧