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 の 2 つの開発バージョン。新しい mfc プロジェクトには、問題のあるコードに似たコードが含まれており、_tmain.
私の質問は次のとおりです。
なぜこうなった?
_tmain を使用して実行するにはどうすればよいですか?