这样的,DLL文件里多线程
DWORD _stdcall ChatRecvThread(LPVOID lpparam,char* ChatRecv)//聊天信息接受线程,注意有带2个参数。char* ChatRecv目的是我要在窗体里读出来显示到RichEdit里。
{
SOCKET m_socket=(SOCKET)lpparam;
char buff[256];
if (recv(m_socket,buff,256,0)==SOCKET_ERROR)
{
return -1;
}
char hostname,hostip;
gethostname(&hostname,strlen(&hostname));//计算机名
gethostbyaddr(&hostip,strlen(&hostip),AF_INET);//IP
         ChatRecv=hostname+'('+hostip+')'+buff;
return 0;
}//而且我感觉这里面gethostname,gethostbyaddr似乎会出问题。所有这些东西都是为给Delphi调用的。然后我在我的另外一个函数里这样创建上面这个线程:
::CreateThread(NULL,0,ChatRecvThread,(LPVOID)s,0,&dwthread);//这里面的s声明是SOCKET s;
编译器报错:
 error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *,char *)' to 'unsigned long (__stdcall *)(void *)'
        None of the functions with this name in scope match the target type那我对::CreateThread(NULL,0,ChatRecvThread,(LPVOID)s,0,&dwthread);要怎么进行修改?
我要线程带2个参数。请大侠指教!

解决方案 »

  1.   

    typedef struct parm
    {
      .....
    } THREAD_PARAM;DWORD WINAPI thread(LPVOID lParam)
    {
        THREAD_PARAM *Par=(THREAD_PARAM *)lParam;
    .......
    }int main(int argc,char **argv)
    {
        DWORD ThreadId;
        THREAD_PARAM Par;
        HANDLE hThread;
    ......
        hThread=CreateThread(NULL,0,thread,(LPVOID *)&Par,0,&ThreadId);......
    }
      

  2.   

    我把我写完的代码贴上来,大家看一下有没有问题。
    SOCKET m_hSocket;
    DWORD _stdcall ListenThread(LPVOID lpparam);
    DWORD _stdcall ChatRecvThread(LPVOID lpparam);
    typedef struct parm
    {
    SOCKET s;             
    char* ChatRecv;
      
    } THREAD_PARAM;//线程参数结构体DWORD _stdcall ListenThread(LPVOID lpparam)//Socket监听线程
    {
    SOCKET m_socket=(SOCKET)lpparam;
    if (listen(m_socket,0)==SOCKET_ERROR)
    return 0;
         THREAD_PARAM *Par=(THREAD_PARAM *)lpparam;
    Par->s=accept(m_socket,NULL,NULL);
    s=accept(m_socket,NULL,NULL);
    DWORD dwthread;
    ::CreateThread(NULL,0,ChatRecvThread,(LPVOID*)&Par,0,&dwthread);//这里(LPVOID*)&Par这样写对吗?能传给ChatRecvThread线程SOCKET s参数吗?还有结构体中的SOCKET s和其他参数要不要释放变量?不管它了?
    return 0;
    }DWORD _stdcall ChatRecvThread(LPVOID lpparam)//聊天信息接受线程
    {
    THREAD_PARAM *Par=(THREAD_PARAM *)lpparam;//Thread Struct,2个参数
    SOCKET m_socket=Par->s;
    char buff[256];
    if (recv(m_socket,buff,256,0)==SOCKET_ERROR)
    {
    return -1;
    }
    char hostname,hostip;
    gethostname(&hostname,strlen(&hostname));//计算机名
    gethostbyaddr(&hostip,strlen(&hostip),AF_INET);//IP
        Par->ChatRecv=hostname+'('+hostip+')'+buff;
    return 0;
    }
    代码比较多,耐心的人请留意一下。