我有一个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。
我的问题是:
为什么会这样?
如何使用_tmain运行?
答案 0 :(得分:1)
只有将EXE链接为控制台模式应用程序时,原始代码才能生效。 MFC应用程序很不寻常,但它受支持。确实需要通过调用AfxWinInit()来初始化MFC。
但很明显,你的EXE没有作为控制台模式应用程序链接,或者你的第二个片段不起作用。它依赖于MFC中嵌入的WinMain()实现。完成MFC应用程序的正常方式。
Linker + System,SubSystem设置。如果确实需要控制台模式应用程序,并且您希望自己的main()函数成为入口点,则需要将其设置为“Console”。