想实现的功能:
在DLL中封装一个函数func,该函数会不定时地返回一些信息。调用该DLL中的func函数时,想通过回调函数来接收func返回的消息。封装DLL时,好象要用到函数指针,具体不太清楚如何实现,
请熟悉的朋友帮忙介绍下,谢谢

解决方案 »

  1.   

    在头文件里声明回调函数,在接口里传入回调函数
    typedef int (CALLBACK *SomeFunCallback)(参数列表);void SetSomeCallback(SomeFunCallback pfnCallback);
      

  2.   

    回调函数的方法同楼上,你可以看看回调函数的用法另外你也可以通过将窗口句柄作为参数传入DLL,然后DLL中给窗口发消息,窗口中响应消息
      

  3.   

    //测试DLL的主要代码
    //提示无法从__cdecl向__stdcall类型//该回调函数中接收消息
    /*static*/ int CALLBACK OnCBFunc(int Param1, int Param2, int *outParam) 
    {   
        AfxMessageBox("回调函数CBFunc接收消息");
        return 0;
    }   //接收消息的函数原型
    extern "C" __declspec(dllexport) int CBFunc(int Param1, int Param2, int *outParam);//设置回调函数
    typedef int(__stdcall *PFCALLBACK)(int Param1, int Param2, int *outParam);//定义函数指针
    PFCALLBACK gCallBack;extern "C" __declspec(dllexport) void TestCallBack(PFCALLBACK Func);//测试调用DLL中的函数
    void CTestDLLDlg::OnButton1() 
    {
    HINSTANCE hInstance;
    VERIFY(hInstance=::LoadLibrary("myDLL.dll"));
        gCallBack=0; //初始化函数指针 typedef int (CBFuncType)(int Param1, int Param2, int *outParam);
    CBFuncType* CBFunc; CBFunc = (CBFuncType*)::GetProcAddress(hInstance,"CBFunc"); //这里提示关于从__cdecl向__stdcall类型转换的问题!!!!!!
    //cannot convert parameter 1 from 'int (__cdecl *)(int,int,int *)' to 'int (__stdcall *)(int,int,int *)'
    //gCallBack = CBFunc;
        TestCallBack(CBFunc);
    }
      

  4.   

    //====== 封装DLL的主要代码 ======
    typedef int(__stdcall *PFCALLBACK)(int Param1, int Param2, int *outParam);extern "C" __declspec(dllexport) int /*WINAPI*/ CBFunc(int Param1, int Param2, int *outParam);//演示回调函数被调用
    extern "C" __declspec(dllexport) int /*WINAPI*/ /*extern "C" __declspec(dllexport) int*/ CBFunc(int Param1, int Param2, int *outParam) 

    int sum = Param1 + Param2;
    *outParam = sum; CString s;
    s.Format("计算结果:%d", sum);
    //AfxMessageBox(s);  return sum;                
    } //全局变量,用来保存传入的函数地址
    PFCALLBACK gCallBack=0; static int i = 0;
    ULONG WINAPI Thread1(LPVOID   Param) 

         for (i = 0; i < 10; i++)
     {
     int *p = new int[10];
         (*gCallBack)(i, 1, p); //p用来异步传出返回值
     Sleep(3000);
     delete p;
     p = NULL;
     }
     
    return   0; 
    } //设置回调函数
    /*void WINAPI*/ extern "C" void __stdcall TestCallBack(PFCALLBACK Func) 

    if(Func==NULL)
    return; 

    gCallBack = Func; //保存函数地址

    //启动线程
    DWORD   ThreadID = 0;
    HANDLE hThread = CreateThread(NULL, 0, Thread1, NULL, 0, &ThreadID);

    return;