问题:在跟踪VC-MFC应用程序的执行过程中,发现每个MFC程序在编译运行的时候都会调用VC装目录中的\VC98\MFC\SRC\WINMAIN.CPP 文件,因为这个CPP文件中的AfxWinMain函数会被MFC程序调用.于是我想在这个函数中完成一些功能,然后以后的每个程序在编译的时候自动的把这个功能加入到编译的EXE程序当中去.在加入功能后,调试的时候发现MFC根本不运行我所加入的代码段,而且在生成的EXE文件也没有运行我加入的代码段,这是为什么呢?有什么办法可以解决呢?前提是有很多工程都要这个功能,如果每个工程单独加入麻烦,于是就想在编译的时候自动的加入这个功能.
#pragma code_seg(AFX_CORE1_SEG)
#endif/////////////////////////////////////////////////////////////////////////////
// Standard WinMain implementation
// Can be replaced as long as 'AfxWinInit' is called firstint AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL); int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
////////////////////////加入位置1/////////////////////////////////
AfxMessageBox("aaaaaaaaaaaaaaa");
///////////////////////////////////////////////////////////////// // AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
////////////////////////加入位置2/////////////////////////////////
AfxMessageBox("bbbbbbbbbbbbbbbbb");
///////////////////////////////////////////////////////////////// // Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif AfxWinTerm();
return nReturnCode;
}可是我的AfxMessageBox 都没有执行..............
在你加代码的地方设个断点,看能不能过去就知道有没有用你那个文件了。
///////////////////
打断点了,也过去了可是编译的时候就是没有执行..
MFC链接的时候用的是已经编译好的库文件,不是重新由源代码开始泄洪新编译链接,所以你添加的代码自然是无效的。不过你可以自定义入口,然后再入口里调用MFC的入口,相信应该是可行的。
////////////////
怎么定义入口呢?能否详细一点.谢谢了...
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)函数,再把该文件加入到工程中即可
vc只用lib库
当然不会编译所有源文件,那得多少时间啊
不过可以通过自定义stdafx.h实现这个功能
网上有类似改法,试试看吧
麻烦大哥发下那个地方的哦?
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)函数,再把该文件加入到工程中即可怎么会不行呢,我已经在我的程序里编译通过,并按自定义的功能运行了,你有没有试啊
先谢谢了.
MFC链接的时候用的是已经编译好的库文件,不是重新由源代码开始泄洪新编译链接,所以你添加的代码自然是无效的。不过你可以自定义入口,然后再入口里调用MFC的入口,相信应该是可行的。
非常正确
建议修改appwizard。
请问怎么修改呢?
你能从MFC 的源文件中看到,那是因为是在DEBUG阶段,
一是你可以重定义程序入口
二是你需要重新编译MFC的库文件
三是你需要重新思考一下,真的必须要将代码放到那里吗?难道放在InitInstance中处理不可以吗?
你在他那里加根本不管事,那都是编译好了的东西,
你不信去改一改strcpy试一试看看,也不管用的
into \Program Files\Microsoft Visual Studio\VC98\MFC\SRC\
open README.TXT. Here is the details about how to rebuild your mfc library.for example:
nmake DEBUG=0VC 7.1
into \Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src
read readme.txt first.
其实这个事情有一个更好的办法,写一个宏!
用宏来实现你的功能.这样更科学.那个文件好象是mfc的东西,应该是你安装了mfc source,所以你才能看见他的代码,那是MS给你研究用的,不是让你改他的,如果改了,很可能你的程序就运行不起来了.建议,用宏.
关键是想改外围文件来打倒更改程序的目的,谢谢各位了,有没有办法呢?
不太同意楼上多数人的说法,如果你用到的只是lib和dll,那mfc就没有必要给你提供.cpp,因为.h就够了你可以试试这样:
1去掉预编译
2把你修改过的.cpp文件加到工程里面按理说有第二步就可以了,你可以自己再试试
自己没有实践,以下只是猜测
不太同意楼上多数人的说法,如果你用到的只是lib和dll,那mfc就没有必要给你提供.cpp,因为.h就够了你可以试试这样:
1去掉预编译
2把你修改过的.cpp文件加到工程里面按理说有第二步就可以了,你可以自己再试试
你说的把修改的CPP添加到工程是可以的,这个我测试过了.我发现如果不添加到工程的情况下,编译的时候其它语句执行了,但是当到添加的语句的时候就跳过去了,更奇怪的是,我重编译了MFC的基本DLL和LIB还是不行.
同意倒之的看法,MFC用的已经编译好的库。没有用你看到的源文件再进行编译。
你的说法好想也不成立,我对MFC SRC 重新编译生成的基本的那几个MFC42*.dll和 LIB,还是不行..