解決策は、使用するコンパイラとリンカによって異なります。常に、それはアプリケーションの実際のエントリポイントではありません。 main
実際のエントリポイントは、いくつかの初期化を行い、たとえばを呼び出しますmain
。Visual Studioを使用してWindows用のプログラムを作成する場合は、リンカーの/ ENTRYスイッチを使用して、デフォルトのエントリポイントを上書きし、次の代わりにmainCRTStartup
呼び出すことができます。func()
main()
#ifdef NDEBUG
void mainCRTStartup()
{
ExitProcess (func());
}
#endif
最も小さなアプリケーションを作成する場合は、これが標準的な方法です。この場合、C-Runtime関数の使用に制限があります。C-Runtime関数の代わりにWindowsAPI関数を使用する必要があります。たとえば、代わりに、または:に関してのみ実装されている場所printf("This is func \n")
を使用する必要があります。OutputString(TEXT("This is func \n"))
OutputString
WriteFile
WriteConsole
static HANDLE g_hStdOutput = INVALID_HANDLE_VALUE;
static BOOL g_bConsoleOutput = TRUE;
BOOL InitializeStdOutput()
{
g_hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
if (g_hStdOutput == INVALID_HANDLE_VALUE)
return FALSE;
g_bConsoleOutput = (GetFileType (g_hStdOutput) & ~FILE_TYPE_REMOTE) != FILE_TYPE_DISK;
#ifdef UNICODE
if (!g_bConsoleOutput && GetFileSize (g_hStdOutput, NULL) == 0) {
DWORD n;
WriteFile (g_hStdOutput, "\xFF\xFE", 2, &n, NULL);
}
#endif
return TRUE;
}
void Output (LPCTSTR pszString, UINT uStringLength)
{
DWORD n;
if (g_bConsoleOutput) {
#ifdef UNICODE
WriteConsole (g_hStdOutput, pszString, uStringLength, &n, NULL);
#else
CHAR szOemString[MAX_PATH];
CharToOem (pszString, szOemString);
WriteConsole (g_hStdOutput, szOemString, uStringLength, &n, NULL);
#endif
}
else
#ifdef UNICODE
WriteFile (g_hStdOutput, pszString, uStringLength * sizeof (TCHAR), &n, NULL);
#else
{
//PSTR pszOemString = _alloca ((uStringLength + sizeof(DWORD)));
CHAR szOemString[MAX_PATH];
CharToOem (pszString, szOemString);
WriteFile (g_hStdOutput, szOemString, uStringLength, &n, NULL);
}
#endif
}
void OutputString (LPCTSTR pszString)
{
Output (pszString, lstrlen (pszString));
}