请大家教教我,我想修改MFC源码来让MFC增加一些逻辑来实现功能,有兴趣的请进(--》)!

softworms 2003-08-19 02:52:09
我看了《深入浅出MFC》最后几章里提到的将TRACE宏中的字串导到调试器以外的一个小程序窗口里。

书中绍介了Hook API或加一个派生类的方法,我都觉得很麻烦,而且还有一些方法对技术要求又太高了。

我想如果能在MFC源码中就地做一些修改,增加一些判断逻辑代码,那该多好啊。
可是我发现我修改了源码后,程序还是按未修改时运行,在调试器里观察运行次序时更发现编译器对我添加的代码视而不见。

我试着跳到添加了代码的一个MFC源文件中将按下编译键,发现VC IDE将这个文件添加到工程里并进行了编译,但很失败,编译器报某个宏未定义。看来这种办法不行。

不过我曾用vckbase网站上down的一个MFC程序也做这个试验,却可以通过,并发现程序是按照我添加的逻辑进行的,但在VC IDE向导生成其它MFC程序上就不行。down的MFC程序很奇怪,可能是手工编写。

我用这个down的程序做试验时也跳到那个MFC源代码文件中并按下了编译键,但在这个程序编译中却没有报任何错,一路OK。

好了我的知道的线索就这么多,请各路神仙大侠不吝指教一二,小弟自当大分相赠。
...全文
191 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcforever 2003-08-24
  • 打赏
  • 举报
回复
那改了就没事了,呵呵……
高手啊!
__________________ 2003-08-20
  • 打赏
  • 举报
回复
ok!
明白!
学习!
softworms 2003-08-20
  • 打赏
  • 举报
回复
我下的只是一个用MFC写的应用程序,不是MFC源码。
StdAfx 2003-08-19
  • 打赏
  • 举报
回复
3、有四个MAK文件是我们需要的:
MFCDLL.MAK 负责 MFC42U.DLL和MFC42UD.DLL
MFCNET.MAK 负责 MFCN42UD.DLL
MFCOLE.MAK 负责 MFCO42UD.DLL
MFCDB.MAK 负责 MFCD42UD.DLL
在MFCDLL.MAK的第206行,
MFCNET.MAK的第134行,
MFCOLE.MAK的第134行,
MFCDB.MAK的第140行处有如下语句:
link @<<
在其后加上如下两句:

/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib
/nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib
/nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib
unicows.lib kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib mpr.lib
rasapi32.lib winmm.lib winspool.lib vfw32.lib oleacc.lib oledlg.lib
4、修改用LoadLibrary动态链接MFC库的硬编码定义:
DLLDB.CPP,第38-39行改为:
#define MFC42_DLL "MSLU_MFC42UD.DLL"
#define MFCO42_DLL "MSLU_MFCO42UD.DLL"

DLLDB.CPP,第46-47行改为:
#define MFC42_DLL "MSLU_MFC42U.DLL"
#define MFCO42_DLL "MSLU_MFCO42U.DLL"

DLLNET.CPP,第37行改为:
#define MFC42_DLL "MSLU_MFC42UD.DLL"

DLLNET.CPP,第43行改为:
#define MFC42_DLL "MSLU_MFC42U.DLL"

DLLOLE.CPP,第38行改为:
#define MFC42_DLL "MSLU_MFC42UD.DLL"

DLLOLE.CPP,第44行改为:
#define MFC42_DLL "MSLU_MFC42U.DLL"

5、修改用LoadLibrary动态链接CRT的硬编码定义:
DLLINIT.CPP,第371行改为:
#define MSVCRT_DLL "MSLU_MSVCRTD.DLL"

DLLINIT.CPP,第373行改为:
#define MSVCRT_DLL "MSLU_MSVCRT.DLL"
6、通常,在Win95及更低版本中运行Unicode程序时会弹出消息框,说不能在该系统下运行Unicode程序,我们要删掉这段代码:
DLLINIT.CPP,第391行改为:
#if 0 // 原代码是#ifdef _UNICODE
(该Bug在VC7中已经更正)

7、修改viewedit.cpp中CEditView的实现代码:
把CEditView::ReadFromArchive、CEditView::LockBuffer和CEditView::UnlockBuffer中的
#ifndef _UNICODE
改为:
#if 1
(该Bug在VC7中已经更正)

8、如果重命名了DLL,则需要重命名相应的DEF文件,它们在VC98\MFC\SRC\INTEL目录下:
copy MFC42U.DEF MSLU_MFC42U.DEF
copy MFC42UD.DEF MSLU_MFC42UD.DEF
copy MFCN42UD.DEF MSLU_MFCN42UD.DEF
copy MFCO42UD.DEF MSLU_MFCO42UD.DEF
copy MFCD42UD.DEF MSLU_MFCD42UD.DEF
然后,需要修改上述每个DEF文件中的'Library':
打开MSLU_MFC42U.DEF,修改'LIBRARY MFC42u'为'LIBRARY MSLU_MFC42u';
打开MSLU_MFC42UD.DEF,修改'LIBRARY MFC42uD'为'LIBRARY MSLU_MFC42uD';
打开MSLU_MFCN42UD.DEF,修改'LIBRARY MFCN42uD'为'LIBRARY MSLU_MFCN42uD';
打开MSLU_MFCO42UD.DEF,修改'LIBRARY MFCO42uD'为'LIBRARY MSLU_MFCO42uD';
打开MSLU_MFCD42UD.DEF,修改'LIBRARY MFCD42uD'为'LIBRARY MSLU_MFCD42uD';

9、现在准备工作结束,可以进行编译了。
在VC98\MFC\SRC下创建一个BAT文件叫buildmfc.bat:
nmake -f mfcdll.mak libname=MSLU_MFC42 DEBUG=0 UNICODE=1 /a
copy /Y ..\lib\MSLU_MFC42U.LIB ..\lib\MFC42U.LIB


nmake -f mfcdll.mak libname=MSLU_MFC42 DEBUG=1 UNICODE=1 /a
copy /Y ..\lib\MSLU_MFC42UD.LIB ..\lib\MFC42UD.LIB


nmake -f mfcnet.mak libname=MSLU_MFCN42 DEBUG=1 UNICODE=1 /a
copy /Y ..\lib\MSLU_MFCN42UD.LIB ..\lib\MFCN42UD.LIB


nmake -f mfcole.mak libname=MSLU_MFCO42 DEBUG=1 UNICODE=1 /a
copy /Y ..\lib\MSLU_MFCO42UD.LIB ..\lib\MFCO42UD.LIB


nmake -f mfcdb.mak libname=MSLU_MFCD42 DEBUG=1 UNICODE=1 /a
copy /Y ..\lib\MSLU_MFCD42UD.LIB ..\lib\MFCD42UD.LIB
(这里每个nmake后面都加上了copy命令,这是因为在编译后面的DLL时有可能需要链接前面的DLL, 通过用Dependency可以细细观察。所以及时的改变LIB名字可确保链接到正确的DLL,这非常重要! )
运行buildmfc.bat,OK! 新的DLL将生成在VC98\MFC\SRC下,LIB将生成在VC98\MFC\LIB下。

10、为了方便与已有的程序链接,把新生成的MSLU_MSVCRTxxx.LIB改回缺省的文件名MSVCRTxxx.LIB:
copy MSLU_MFC42U.LIB MFC42U.LIB
copy MSLU_MFC42UD.LIB MFC42UD.LIB
copy MSLU_MFCN42UD.LIB MFCN42UD.LIB
copy MSLU_MFCO42UD.LIB MFCO42UD.LIB
copy MSLU_MFCD42UD.LIB MFCD42UD.LIB
(DLL的名字不需要改,程序会自动链接到MSLU_MSVCRTxxx.DLL)

特别注意:
因为在编译MFC库时需要静态链接CRT,所以一定要确保在编译MFC之前,先把新的CRT的LIB拷到正确的位置!!!否则,生成的MFC DLL仍是链接旧的CRT库。

测试:
把新的LIB文件拷到相应的目录,把新的DLL拷到测试程序的目录。编译后一定要用View Dependency观察链接是否正确。(最好把所有的MSLU_XXX.DLL都拷到系统目录下)
五、编译MFC静态链接库

为使用MSLU,并不需要重编译MFC静态库,这里只是顺便提提。
在命令行下,用NMAKE编译MFC静态库非常容易,进入VC98\MFC\SRC
(a) Debug
nmake DEBUG=1 CODEVIEW=1 BROWSE=1
(b) Release
nmake DEBUG=0
(c) Unicode Debug
nmake DEBUG=1 CODEVIEW=1 BROWSE=1 UNICODE=1
(d) Unicode Release
nmake DEBUG=0 UNICODE=1
详细的NMAKE的选项说明可以参考VC98\MFC\SRC下的readme.txt文件。
参考资料

1、How to build the 6.0 MFC and the CRT DLLs with MSLU,本文大部分内容来源于此。
2、VC98\MFC\SRC\readme.txt。
StdAfx 2003-08-19
  • 打赏
  • 举报
回复
可以实现,请参考下面的文章:

一、前言

1、如果想在Win95/98/ME上运行动态链接MFC库的Unicode程序,必须重新编译MFC和CRT。
2、相信在不远的将来,微软将提供给我们已编译好的MFC和CRT。
二、准备

1、安装Visual C++ 6.0,选中安装Unicode MFC Version和CRT Source Codes。
2、安装Visual Studio 6.0 Service Pack 5。
3、把unicows.lib拷贝到VC98\LIB下,unicows.lib在Platform SDK中有,也可从网上下载。
4、最好先备份VC98目录,以便需要时恢复。
(这里假设的VC98所在的目录是C:\Program Files\Microsoft Visual Studio\VC98)
三、编译CRT库

1、进入VC98\CRT\SRC,要编译的文件都在这里。

2、我们的编译目标是6个DLLs:
(Debug)MSVCRTD.DLL, MSVCP60D.DLL, MSVCIRTD.DLL (Release)MSVCRT.DLL, MSVCP60.DLL, MSVCIRT.DLL
为避免与原来的DLLs混淆,我们将重新命名(当然也可以不改):
(Debug)MSLU_MSVCRTD.DLL, MSLU_MSVCP60D.DLL, MSLU_MSVCIRTD.DLL (Release)MSLU_MSVCRT.DLL, MSLU_MSVCP60.DLL, MSLU_MSVCIRT.DLL
3、MS提供了bldwin95.bat可以编译所有的CRT DLLs,但它隐藏了必要的makefile,把它变回来:
copy ext_mkf Makefile copy ext_mkf.inc Makefile.inc copy ext_mkf.sub Makefile.sub
4、MS缺省用的名字是_SAMPLE_,SAMPLE_I和SAMPLE_P,如果重命名DLL的话,相应的文件名也要改:
copy _SAMPLE_.RC MSLU_MSVCRT.RC copy SAMPLE_I.RC MSLU_MSVCIRT.RC copy SAMPLE_P.RC MSLU_MSVCP60.RC
copy SAMPLE_I.DEF MSLU_MSVCIRT.DEF
copy SAMPLD_I.DEF MSLU_MSVCIRTD.DEF copy SAMPLE_P.DEF MSLU_MSVCP60.DEF
copy SAMPLD_P.DEF MSLU_MSVCP60D.DEF
copy Intel\_SAMPLE_.DEF Intel\MSLU_MSVCRT.DEF
copy Intel\_SAMPLD_.DEF Intel\MSLU_MSVCRTD.DEF
然后,需要修改上述每个DEF文件中的'Library':
打开MSLU_MSVCIRT.DEF,修改'LIBRARY SAMPLE_I'为'LIBRARY MSLU_MSVCIRT';
打开MSLU_MSVCIRTD.DEF,修改'LIBRARY SAMPLD_I'为'LIBRARY MSLU_MSVCIRTD';
打开MSLU_MSVCP60.DEF,修改'LIBRARY SAMPLE_P'为'LIBRARY MSLU_MSVCP60';
打开MSLU_MSVCP60D.DEF,修改'LIBRARY SAMPLD_P'为'LIBRARY MSLU_MSVCP60D';
打开Intel\MSLU_MSVCRT.DEF,修改'LIBRARY _SAMPLE_'为'LIBRARY MSLU_MSVCRT';
打开Intel\MSLU_MSVCRTD.DEF,修改'LIBRARY _SAMPLD_'为'LIBRARY MSLU_MSVCRTD';

5、打开文件makefile,做如下修改:
(1)文件顶部有如下这段文字:
RETAIL_DLL_NAME=_sample_
RETAIL_LIB_NAME=_sample_
RETAIL_DLLCPP_NAME=sample_p RETAIL_LIBCPP_NAME=sample_p RETAIL_DLLIOS_NAME=sample_i RETAIL_LIBIOS_NAME=sample_i DEBUG_DLL_NAME=_sampld_
DEBUG_LIB_NAME=_sampld_
DEBUG_DLLCPP_NAME=sampld_p DEBUG_LIBCPP_NAME=sampld_p DEBUG_DLLIOS_NAME=sampld_i DEBUG_LIBIOS_NAME=sampld_i
将其修改为:
RETAIL_DLL_NAME=MSLU_MSVCRT RETAIL_LIB_NAME=MSLU_MSVCRT RETAIL_DLLCPP_NAME=MSLU_MSVCP60
RETAIL_LIBCPP_NAME=MSLU_MSVCP60
RETAIL_DLLIOS_NAME=MSLU_MSVCIRT RETAIL_LIBIOS_NAME=MSLU_MSVCIRT DEBUG_DLL_NAME=MSLU_MSVCRTD DEBUG_LIB_NAME=MSLU_MSVCRTD DEBUG_DLLCPP_NAME=MSLU_MSVCP60D
DEBUG_LIBCPP_NAME=MSLU_MSVCP60D
DEBUG_DLLIOS_NAME=MSLU_MSVCIRTD DEBUG_LIBIOS_NAME=MSLU_MSVCIRTD
(缺省生成的是samplxx.lib和samplxx.dll,这是MS玩的小把戏吗?)
(2)第39行改为:
V6TOOLS=C:\Program Files\Microsoft Visual Studio\VC98
(由实际的安装路径决定,注意看第34-36行之间的注释)
(3)第331行改为:
RC_INCS="-I$(V6TOOLS)\include"
第1728, 1770, 1810, 1853, 1898, 1941行改为:
"$(V6TOOLS)\include\winver.h" \ (以上只是加上引号,因为V6TOOLS中含有空格)

(4)第381-383行改为:
RELEASE_DLL_DBG_PDB = $(PDBDIR_CPU)\$(DEBUG_DLL_NAME).pdb
RELEASE_DLLCPP_DBG_PDB = $(PDBDIR_CPU)\$(DEBUG_DLLCPP_NAME).pdb RELEASE_DLLIOS_DBG_PDB = $(PDBDIR_CPU)\$(DEBUG_DLLIOS_NAME).pdb
第474行改为:
$(CRT_RELDIR) $(RELDIR_CPU) :
第987行改为:
xdll : $(OBJROOT) $(OBJCPUDIR) $(OBJDIR_DLL_DBG) $(RELDIR_CPU) xothers \
在第1746行后加上:
-pdb:$(RELEASE_DLL_PDB)
在第1789行后加上:
-pdb:$(RELEASE_DLLCPP_PDB)
在第1829行后加上:
-pdb:$(RELEASE_DLLIOS_PDB)
(5)第1750, 1794, 1835, 1878, 1925, 1969行

kernel32.lib
改为:
unicows.lib kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib
mpr.lib rasapi32.lib winmm.lib winspool.lib vfw32.lib oleacc.lib oledlg.lib
6、现在准备工作结束,可以进行编译了。
(1)进入命令行模式,
(2)运行VC98\BIN\下的VCVARS32.bat文件,
(3)进入VC98\CRT\SRC下,敲命令行set V6TOOLS=C:\Program Files\Microsoft Visual Studio\VC98,
(4)运行BLDWIN95.bat文件。
(5)一旦完成编译,新生成的文件都在子目录CRT\SRC\BUILD\INTEL下。

7、为了方便与已有的程序链接,把新生成的MSLU_MSVCRTxxx.LIB改回缺省的文件名MSVCRTxxx.LIB:
copy MSLU_MSVCRT.LIB MSVCRT.LIB copy MSLU_MSVCRTD.LIB MSVCRTD.LIB copy MSLU_MSVCP60.LIB MSVCPRT.LIB copy MSLU_MSVCP60D.LIB MSVCPRTD.LIB copy MSLU_MSVCIRT.LIB MSVCIRT.LIB copy MSLU_MSVCIRTD.LIB MSVCIRTD.LIB
将这些LIB文件拷到VC98\LIB目录下。 (DLL的名字不需要改,程序会自动链接到MSLU_MSVCRTxxx.DLL)
四、编译MFC动态链接库

1、进入VC98\MFC\SRC,要编译的文件都在这里。

2、我们的编译目标是5个DLLs:
MFC42U.DLL (Unicode Release,它是几个部分之和)
MFC42UD.DLL (Unicode Debug)
MFCN42UD.DLL (Unicode Debug - Network classes)
MFCO42UD.DLL (Unicode Debug - OLE classes)
MFCD42UD.DLL (Unicode Debug - Database classes)
为避免与原来的DLLs混淆,我们将重新命名(当然也可以不改):
MSLU_MFC42U.DLL
MSLU_MFC42UD.DLL
MSLU_MFCN42UD.DLL
MSLU_MFCO42UD.DLL
MSLU_MFCD42UD.DLL

harrypotter 2003-08-19
  • 打赏
  • 举报
回复
难实现,即使实现,也难移植。
yinx 2003-08-19
  • 打赏
  • 举报
回复
只能把MFC库从新编一遍,不过好像MFC库的源码并不是很全,毕竟人家只是让你看,不是让你改的
__________________ 2003-08-19
  • 打赏
  • 举报
回复
mfc的源码?mfc程序的源码!源码!
这个东西你可能不太清楚它们!

你down的是mfc程序的源码!
你自己写的是你的源码!
mfc的源码分为程序自动生成的,与原有的内部源码。

自动生成的mfc源码,一般可自行修改!

内部源码是绝对不可能让你改的。你想想!你的mfc程序运行起来要调mfc42.dll。你可能通过改mfc内部源码而改变mfc42.dll中的东西吗?
ruihuahan 2003-08-19
  • 打赏
  • 举报
回复
不要修改源码,从它的类派生你的类。
ruihuahan 2003-08-19
  • 打赏
  • 举报
回复
不要修改源码,从它的类派生你的类。
mfc168 2003-08-19
  • 打赏
  • 举报
回复
其实很简单,你只要重载那些虚函数,添加你所要完成的功能代码就可以了
xghost 2003-08-19
  • 打赏
  • 举报
回复
up

16,466

社区成员

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

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

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