0

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.

私の質問は次のとおりです。

  1. なぜこうなった?

  2. _tmain を使用して実行するにはどうすればよいですか?

4

1 に答える 1