C++ _tmain 不会开始运行

Posted

技术标签:

【中文标题】C++ _tmain 不会开始运行【英文标题】:C++ _tmain would not start running 【发布时间】:2013-07-10 14:53:51 【问题描述】:

我有一个由 Windows 服务生成的进程的 mfc 项目。由于某种原因,该过程在开始之前就死了。全局值被创建,但进程不会启动 _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。

我的问题是:

    为什么会这样?

    如何使用 _tmain 运行?

【问题讨论】:

您可以尝试包含 tchar.h 吗?它定义了 _tmain 我没有 tchar 的编译问题,虽然它没有帮助 【参考方案1】:

只有当 EXE 作为控制台模式应用程序链接时,您的原始代码才能工作。对于 MFC 应用程序来说非常不寻常,但它是受支持的。确实需要调用 AfxWinInit() 来初始化 MFC。

但显然您的 EXE 没有作为控制台模式应用程序链接,否则您的第二个 sn-p 将无法工作。它依赖于嵌入在 MFC 中的 WinMain() 实现。 MFC 应用程序的正常完成方式。

链接器 + 系统,子系统设置。如果确实打算使用控制台模式应用程序并且您希望自己的 main() 函数作为入口点,则需要将其设置为“控制台”。

【讨论】:

以上是关于C++ _tmain 不会开始运行的主要内容,如果未能解决你的问题,请参考以下文章

C笔记A01 _tmain() 和 main() 的区别,

C++ - 以管理员身份运行进程时的 GetUserName()

main()和_tmain()的区别

VS 2017 & 2019 运行 c++ 真的很慢

在 VS (2010) 中使用标准“主”条目构建和运行 C++ 控制台应用程序

稍后在 C++ 中安排事件:如何传递要运行的任务