问题:在跟踪VC-MFC应用程序的执行过程中,发现每个MFC程序在编译运行的时候都会调用VC装目录中的\VC98\MFC\SRC\WINMAIN.CPP 文件,因为这个CPP文件中的AfxWinMain函数会被MFC程序调用.于是我想在这个函数中完成一些功能,然后以后的每个程序在编译的时候自动的把这个功能加入到编译的EXE程序当中去.在加入功能后,调试的时候发现MFC根本不运行我所加入的代码段,而且在生成的EXE文件也没有运行我加入的代码段,这是为什么呢?有什么办法可以解决呢?前提是有很多工程都要这个功能,如果每个工程单独加入麻烦,于是就想在编译的时候自动的加入这个功能.

解决方案 »

  1.   

    ///////////////////////////////WINMAIN.CPP原文件//////////////////////////////////////#include "stdafx.h"#ifdef AFX_CORE1_SEG
    #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 都没有执行..............
      

  2.   

    MFC链接的时候用的是已经编译好的库文件,不是重新由源代码开始泄洪新编译链接,所以你添加的代码自然是无效的。不过你可以自定义入口,然后再入口里调用MFC的入口,相信应该是可行的。
      

  3.   

    booklove(纳海行云) ( ) 信誉:100  2006-06-07 09:49:00  得分: 0  
     
     
       在你加代码的地方设个断点,看能不能过去就知道有没有用你那个文件了。
      
    /////////////////// 
    打断点了,也过去了可是编译的时候就是没有执行..
      

  4.   

    wangk(倒之) ( ) 信誉:102  2006-06-07 08:52:00  得分: 0  
     
     
       MFC链接的时候用的是已经编译好的库文件,不是重新由源代码开始泄洪新编译链接,所以你添加的代码自然是无效的。不过你可以自定义入口,然后再入口里调用MFC的入口,相信应该是可行的。
      
     
    ////////////////
    怎么定义入口呢?能否详细一点.谢谢了...
      

  5.   

    新建一个类似winmain.cpp的cpp文件,在该文件中实现自定义的
    int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nCmdShow)函数,再把该文件加入到工程中即可
      

  6.   

    呵呵
    vc只用lib库
    当然不会编译所有源文件,那得多少时间啊
    不过可以通过自定义stdafx.h实现这个功能
    网上有类似改法,试试看吧
      

  7.   

    pripor(GDI+真是好) ( ) 信誉:100  2006-06-07 10:54:00  得分: 0  
    麻烦大哥发下那个地方的哦?
      

  8.   

    修改文件没用的,因为链接的还是原来的库文件,除非你重新编译一下MFC。
      

  9.   

    在Project settings->Link->output->Entry-point symbol,可以自定义入口。
      

  10.   

    新建一个类似winmain.cpp的cpp文件,在该文件中实现自定义的
    int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nCmdShow)函数,再把该文件加入到工程中即可怎么会不行呢,我已经在我的程序里编译通过,并按自定义的功能运行了,你有没有试啊
      

  11.   

    要不然就是你的程序入口不是AfxWinMain函数,那你就重写相应的入口函数就可以的,这跟链接lib没关系的
      

  12.   

    一点想法:是否可以做一个dll,然后随时调用,这样也很方便!
      

  13.   

    修改文件没有用,好像是因为这个WINMAIN.CPP没有参与编译,大家能不能提出一些可行的办法呢?不修改原工程任何文件,从MFC调用下手.........
    先谢谢了.
      

  14.   

    同意倒之的看法,MFC用的已经编译好的库。没有用你看到的源文件再进行编译。
      

  15.   

    Creamdog建议:不要随便改系统库!
      

  16.   


    MFC链接的时候用的是已经编译好的库文件,不是重新由源代码开始泄洪新编译链接,所以你添加的代码自然是无效的。不过你可以自定义入口,然后再入口里调用MFC的入口,相信应该是可行的。
    非常正确
      

  17.   

    很明显,调用库文件更源文件是不一样的。 你可以 hook 这个函数 。改写他。
      

  18.   

    修改WINMAIN.CPP 只是你想到的一个方法,但实际上是不可行的,上面人的都说的很清楚。你也不要钻下去了,另想方法吧。我有一个建议是:开一个LIB,写一个CLASS,在构造函数里另开一条线程来完成该功能。然后就简单了,每个程序都LINK这个LIB,定义一个这样的STATIC的object,问题就解决了,功夫也不会多,考虑一下把。
      

  19.   

    ggw(格格巫) ( ) 信誉:90  2006-06-08 08:22:00  得分: 0  
     
     
       建议修改appwizard。
      
     
    请问怎么修改呢?
      

  20.   

    把MFC的工程改改,重新编译一下就可以了吧,发布时把编译出的MFC dll拷贝到自己程序的目录下
      

  21.   

    同意 倒之
    你能从MFC 的源文件中看到,那是因为是在DEBUG阶段,
     一是你可以重定义程序入口
     二是你需要重新编译MFC的库文件
     三是你需要重新思考一下,真的必须要将代码放到那里吗?难道放在InitInstance中处理不可以吗?
      

  22.   

    哎呀,自己做一个向导就行了.
    你在他那里加根本不管事,那都是编译好了的东西,
    你不信去改一改strcpy试一试看看,也不管用的
      

  23.   

    rebuild your mfcVC 6
    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.
      

  24.   

    呵呵,应该是你没写对地方.
    其实这个事情有一个更好的办法,写一个宏!
    用宏来实现你的功能.这样更科学.那个文件好象是mfc的东西,应该是你安装了mfc source,所以你才能看见他的代码,那是MS给你研究用的,不是让你改他的,如果改了,很可能你的程序就运行不起来了.建议,用宏.
      

  25.   

    首先想说下的是,在不改变我所有工程的前提下,修改程序功能,也就是改工程编译的其它外围文件来打倒目的.所以增加LIB DLL 或在工程里重定义入口等我都知道可以实现的,
    关键是想改外围文件来打倒更改程序的目的,谢谢各位了,有没有办法呢?
      

  26.   

    倒之的方法有试过没?关注中,我认为重新写一个宏或者在看情况写一个派生类多次调用是一般的可行的处理方法,但是没有见过怎样更改MFC里的东西,所以期待结果
      

  27.   

    把WinMain.cpp添加到工程就OK了,很简单的
      

  28.   

    MFC -->MFC42U.DLL 重新编译成功,MFCS42U.lib MFC42U.LIB 也生成成功,经测试WinMain.cpp确实参与编译.可就是重新编译工程生成EXE后,还是没有弹出MessageBox对话框,
      

  29.   

    你把WinMain.cpp添加到项目了?
      

  30.   

    自己没有实践,以下只是猜测
    不太同意楼上多数人的说法,如果你用到的只是lib和dll,那mfc就没有必要给你提供.cpp,因为.h就够了你可以试试这样:
    1去掉预编译
    2把你修改过的.cpp文件加到工程里面按理说有第二步就可以了,你可以自己再试试
      

  31.   

    赞同wangk(倒之) 的意见!!!
      

  32.   

    恩,楼上和我说的一样,把CPP文件加到项目里就OK的
      

  33.   

    bobob(静思)(PDFViewer2.0 Release拉!) ( ) 信誉:156  2006-06-08 22:38:00  得分: 0  
     
     
       自己没有实践,以下只是猜测
    不太同意楼上多数人的说法,如果你用到的只是lib和dll,那mfc就没有必要给你提供.cpp,因为.h就够了你可以试试这样:
    1去掉预编译
    2把你修改过的.cpp文件加到工程里面按理说有第二步就可以了,你可以自己再试试  
     
    你说的把修改的CPP添加到工程是可以的,这个我测试过了.我发现如果不添加到工程的情况下,编译的时候其它语句执行了,但是当到添加的语句的时候就跳过去了,更奇怪的是,我重编译了MFC的基本DLL和LIB还是不行.
      

  34.   

    kugou123(酷狗)(君看一叶舟,出没风波里) ( ) 信誉:156  2006-6-7 21:50:57  得分: 0  
     
     
       
    同意倒之的看法,MFC用的已经编译好的库。没有用你看到的源文件再进行编译。  
     
    你的说法好想也不成立,我对MFC SRC 重新编译生成的基本的那几个MFC42*.dll和 LIB,还是不行..