我在一个DLL里面封装了SOCKET,在recv 接受到消息的时候,想把接受到的内容通过回调函数来传递给调用者也就是exe程序。这要如何实现呢
也就是这个回调函数要自己定义 和触发 以及接受。没自己定义过回调函数,不知道如何下手。不知道哪位大侠有空能够做个例子出来! 如何自定义回调函数万分感谢!!!

解决方案 »

  1.   

    关键字:
    static
    callback参数传指针
      

  2.   

    dll的头文件声明了回调函数已及接口:
    typedef void (CALLBACK *fCallBack)(...,void*); //回调函数声明
    CLIENT_API void SetCallBack(fCallBack, void *);exe调用SetCallBack传入回调函数
      

  3.   


    例如:
    exe中定义回调函数// 回调函数
    typedef void (CALLBACK *fCallBack)(PVOID,DWORD); 
    VOID CALLBACK RecvDataByCallback(_IN PVOID pvBuffer, _IN DWORD dwSize)
    {
        // 在exe中分配内存
         PBYTE pBuf = new BYTE[dwSize];
         memcpy(pBuf , pvBuffer, dwSize); // 拷贝DLL中pvBuffer里的数据到EXE中pBuf里
    }
    // 设置函数
    // 该函数在DLL中定义并导出
    SetRecvCallback((PVOID)&RecvDataByCallback);
    dll中定义回调函数// 接收回调函数地址并保存
    typedef void (CALLBACK *fCallBack)(PVOID,DWORD);
    fCallBack g_pCallback = NULL; 
    VOID SetRecvCallback((PVOID)&RecvDataByCallback)
    {
         g_pCallback = (fCallBack)RecvDataByCallback;
    }// 接收是对操作
    // 例如使用SOCKET,采用事件驱动时
        case FD_READ // 抱歉,我好久没用SOCKET了,消息记不清了,这里是一个消息表示有数据到达
             // 如接收UDP的数据
             nLen=recvfrom(hSocket,buf,4096,0,(struct sockaddr*)&from,&nLength);
            // 使用回调
            g_pCallback((PVOID)buf, (DWORD)nLen); 
    基本上就是这样子……
    你自己在完善一下……
      

  4.   

    SetTimer的第三个函数就是回调函数。static void CALLBACK TimeProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime);void  CALLBACK CPaint::TimeProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
    {
    if (iTimerID == 3)
    {
    //////处理
    ::PostMessage(hwnd,WM_TIMER3,NULL,NULL);
    }

    }
    void CPaint::OnStart() 
    {
    // TODO: Add your control notification handler code here
    SetTimer(3,150,TimeProc);
    }
      

  5.   

    SetTimer的第三个函数就是回调函数。static void CALLBACK TimeProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime);void  CALLBACK CPaint::TimeProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
    {
    if (iTimerID == 3)
    {
    //////处理
    ::PostMessage(hwnd,WM_TIMER3,NULL,NULL);
    }

    }
    void CPaint::OnStart() 
    {
    // TODO: Add your control notification handler code here
    SetTimer(3,150,TimeProc);
    }
      

  6.   

    有几个问题问下,回调函数的参数 PVOID,DWORD 也可以是其他类型把?比如 LPCSTR。或者CHAR* 为啥要用PVOID呢。
     RecvDataByCallback 这个是在EXE中定义的。DLL里面如何声明或定义他呢?最后一个问题。EXE中是否应该 改成下面这样?
    typedef void (CALLBACK *RecvDataByCallback)(PVOID,DWORD); 
    VOID CALLBACK RecvDataByCallback(_IN PVOID pvBuffer, _IN DWORD dwSize)
    {
        // 在exe中分配内存
         PBYTE pBuf = new BYTE[dwSize];
         memcpy(pBuf , pvBuffer, dwSize); // 拷贝DLL中pvBuffer里的数据到EXE中pBuf里
    }
    看糊涂了。希望解答下
      

  7.   

    1、回调函数的参数可以是任何类型,甚至为void都没有问题,PVOID类型的参数和线程函数一样的,可以很方便对传入任何类型的数据进行转换。2、在DLL中也是这样定义的typedef void (CALLBACK *RecvDataByCallback)(PVOID,DWORD);
    RecvDataByCallback fun;//申明一个函数指针
    fun(?, ?); //调用EXE中的函数3、是的,你要把函数指针(地址)传给DLL,那样DLL才能正确调用