急急急!请各位高手帮忙

ld8888 2005-12-21 09:18:10
程序是2部分,一部分是DLL,另一部分是MFC写的界面,很简单的。
DLL用来处理一个目录下的所有txt文档。现在由于文档较多,需要在界面上显示程序正在处理哪一篇文档,防止死机了,没反应。
我目前的想法是:在DLL中写一个函数,将正在处理的文档名字传出来,但是如何在MFC中调用呢?
而且一般是界面函数调用DLL,如何将DLL中的函数触发界面改变呢?
请各位高手帮帮忙,提供一点思路。
...全文
115 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ld8888 2005-12-22
  • 打赏
  • 举报
回复
qingz(一只来自北方的*)
太感激了
我试试。
qingz 2005-12-22
  • 打赏
  • 举报
回复
如果用自定义消息来处理则:
在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)


大概是这样
qingz 2005-12-22
  • 打赏
  • 举报
回复
在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, "..")) )
{
处理文档。。。
}


我也是刚学,只知皮毛,不知行不行
ld8888 2005-12-21
  • 打赏
  • 举报
回复
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);
}

李马 2005-12-21
  • 打赏
  • 举报
回复
比如说,在EXE启动你的工作之前调用DLL的SetCallBack将EXE的回调提供给DLL,在DLL处理文件的时候,每次更换文件时则调用这个回调,这样就实现了由DLL触发EXE的效果。
qingz 2005-12-21
  • 打赏
  • 举报
回复
你可以在DLL中处理TXT文件的函数体内通过SendMessage()向你的应用程序发送自定义消息,在消息中包括文件名,应用程序处理消息,显示文件名
ld8888 2005-12-21
  • 打赏
  • 举报
回复
titilima(李马)(www.titilima.cn)
你的代码我不大懂。能不能再详细一点啊?
weiyongzhao 2005-12-21
  • 打赏
  • 举报
回复
顶一下
李马 2005-12-21
  • 打赏
  • 举报
回复
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 );
}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧