C ++ _tmain不会开始运行

时间:2013-07-10 14:53:51

标签: c++ mfc vc6

我有一个mfc项目,它是由windows服务生成的进程。由于某种原因,该过程在开始之前就已经死亡创建全局值但该进程不会启动_tmain。从VC6迁移到VS2012时出现了这个问题。

这是一个代码示例,我可以设置一个断点并停在此行CWinApp theApp;但我不能停在_tmain的第一行。该程序找不到入口点并且存在。

// prog.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

    try {
        SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
        int nRetCode = 0;

        // initialize MFC and print and error on failure
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            nRetCode = 1;
        }
        else
        {           
            //Some propietry code which  runs here
        }

        return nRetCode;
    }
    catch(...) {
        return 147;
    }
}

最初我认为这个问题是由VS2012伴随的MFC引起的。但是我注意到我们在移动之前的开发版本具有相同的效果。这看起来很奇怪,因为以前的版本具有相同的代码,并且它找到了入口点就好了。

我能够通过以下方式启动该程序:

// prog.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

using namespace std;

class MyApp : public CWinApp {
public:
    MyApp() : CWinApp(_T("VCP")){}
    int init(LPTSTR  CommandLine);

    virtual int Run()
    {
        return init(m_lpCmdLine);
    }
};

MyApp theApp;

//int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
int MyApp::init(LPTSTR CommandLine)
{

    int argc = 2;
    TCHAR* argv[] = {_T(""),_T("")};
    argv[1]= CommandLine;

    try {
        SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
        int nRetCode = 0;

        // initialize MFC and print and error on failure
        int r=1;
        if (r>1)//(!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
        {
            // TODO: change error code to suit your needs
            nRetCode = 1;
        }
        else
        {
            // some propietry code
        }

        return nRetCode;
    }
    catch(...) {
        return 147;
    }
}

总结一下,我有3个版本的代码。一个很好的代码的发布版本。不同Visual Studio上的两个开发版本具有相同的未找到入口点的影响。一个新的mfc项目包含类似于错误代码的代码,它找到_tmain。

我的问题是:

  1. 为什么会这样?

  2. 如何使用_tmain运行?

1 个答案:

答案 0 :(得分:1)

只有将EXE链接为控制台模式应用程序时,原始代码才能生效。 MFC应用程序很不寻常,但它受支持。确实需要通过调用AfxWinInit()来初始化MFC。

但很明显,你的EXE没有作为控制台模式应用程序链接,或者你的第二个片段不起作用。它依赖于MFC中嵌入的WinMain()实现。完成MFC应用程序的正常方式。

Linker + System,SubSystem设置。如果确实需要控制台模式应用程序,并且您希望自己的main()函数成为入口点,则需要将其设置为“Console”。