程序是2部分,一部分是DLL,另一部分是MFC写的界面,很简单的。
DLL用来处理一个目录下的所有txt文档。现在由于文档较多,需要在界面上显示程序正在处理哪一篇文档,防止死机了,没反应。
我目前的想法是:在DLL中写一个函数,将正在处理的文档名字传出来,但是如何在MFC中调用呢?
而且一般是界面函数调用DLL,如何将DLL中的函数触发界面改变呢?
请各位高手帮帮忙,提供一点思路。

解决方案 »

  1.   

    UI层为DLL提供一个回调,如:
    // EXE
    void call( LPCTSTR lpszFileName )
    {
        MessageBox( lpszFileName );
    }
    // dll
    typedef void *PFUNC( LPCTSTR );
    PFUNC g_pfunc;
    void SetCallBack( PFUNC p );
    {
        g_pfunc = p;
    }
    void DoWork( LPCTSTR lpszFileName )
    {
        g_pfunc( lpszFileName );
    }
      

  2.   

    titilima(李马)(www.titilima.cn)
    你的代码我不大懂。能不能再详细一点啊?
      

  3.   

    你可以在DLL中处理TXT文件的函数体内通过SendMessage()向你的应用程序发送自定义消息,在消息中包括文件名,应用程序处理消息,显示文件名
      

  4.   

    比如说,在EXE启动你的工作之前调用DLL的SetCallBack将EXE的回调提供给DLL,在DLL处理文件的时候,每次更换文件时则调用这个回调,这样就实现了由DLL触发EXE的效果。
      

  5.   

    titilima(李马)。你的原理我懂,但是我不会写代码。我感觉很复杂qingz:你的方法好像挺简单的。以上两位,谢谢你们的答复。我再把问题将具体一点。在dll中有下函数 DIR* dir = opendir(directory); if ( dir != NULL ){


    。。
    fl = readdir(dir);      // fl->d_name = "C3-Art0001.txt"    
    while ( fl != NULL )
    {
    if ( (strcmp(fl->d_name, ".")) && (strcmp(fl->d_name, "..")) )
    {
          处理文档
    }

    fl = readdir(dir);
    }
    closedir(dir);
    }在上面这个while函数中我要添加一个回掉函数,把此时正在处理的txt文件名传出去。
    在我的EXE界面上,
    void CxxDlg::OnIndexButton() 
    {
    // TODO: Add your control notification handler code here
    DWORD dwStart1 = GetTickCount();
    IndexFiles("f:\\testdata\\data","f:\\testdata\\index",false);//indexfile函数就是dll输出函数,这个函数触发了上面的函数。在上面函数的处理过程中,我要把文件名显示在界面上
    DWORD dwEnd1 = GetTickCount();
    UpdateData(false);
    }
      

  6.   

    在DLL中:typedef void (*lpfnShow)(char *pFileName);
    lpfnShow pCallbackFunc;     //定义全局变量,指定你的EXE中的显示函数
    void __declspec(dllexport) SetFuncPointer(lpfnShow lpShowFileName)
    {
       pCallbackFunc = lpShowFileName;
    }在EXE程序中:
    //typedef void (*lpfnShow)(char *pFileName);
    typedef void (*pSetFuncPointer)(lpfnShow p);pSetFuncPointer pFunc = (pSetFuncPointer)GetProcAddress(hIns, "SetFuncPointer"); 
    if( pFunc != NULL)
      pFunc(ShowFileName);//ShowFileName为下面的函数的名称
    // 显示文件名
     void ShowFileName(char *pFileName) 
    {
    ...
    }在你的上面的DLL中处理文件的地方调用:
    pCallbackFunc (fl->d_name); //调用EXE中的ShowFileName(..)显示文件名
    if ( (strcmp(fl->d_name, ".")) && (strcmp(fl->d_name, "..")) )
    {
          处理文档
    }
    我也是刚学,只知皮毛,不知行不行
      

  7.   

    如果用自定义消息来处理则:
    在DLL中:
    HWND hWnd;  //定义一个全局变量,指向你的EXE程序窗口句柄,在EXE执行时传给DLL#define MY_MESSAGE WM_USER + 100
    然后在你处理文件时调用:
    ::SendMessage(MY_MESSAGE, 0, (LPARAM)f1->d_name);//将你正在处理的文件名以消息的形式传给EXE
    if ( (strcmp(fl->d_name, ".")) && (strcmp(fl->d_name, "..")) )
    {
          处理文档
    }在EXE程序中:
    在.h中加入
    #define MY_MESSAGE WM_USER + 100
    afx_msg void OnMymessage(WPARAM wParam, LPARAM lParam);然后在.cpp中添加函数
    void OnMymessage(WPARAM wParam, LPARAM lParam)
    { CString strFileName = (TCHAR *)lParam;//假定fl->d_name是一个字符指针
     ...   //显示strFileName }
    在.cpp文件中加入消息映射
    ON_MESSAGE(MY_MESSAGE, OnMymessage)
    大概是这样
      

  8.   

    qingz(一只来自北方的*) 
    太感激了
    我试试。