質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4870閲覧

visual studio winapi LNK2019未解決の外部シンボル _WinMain@16 が関数 "int __cdecl invoke_main(void)"

mercurian-teto

総合スコア75

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/04/09 23:52

###環境
windows10 pro
visual studio 2017

###試したこと

ファイル→新規作成→プロジェクト→visual C ++→

visual studio2017ではwinAPIはwindowsデスクトップウィザードを選ぶそうなので、

こちらを選びました。
次のダイアログですが、
以下のように設定しました。

ソースファイルに目的のcppファイル(こちらのサイトにあるもの改良したもの
を追加して、
ビルドしましたが、
エラーが発生しました。

①C4996 'GetVersionExW': が古い形式として宣言されました

②エラー LNK2019 未解決の外部シンボル _WinMain@16 が関数 "int __cdecl invoke_main(void)"
(?invoke_main@@YAHXZ) で参照されました。

③エラー LNK1120 1 件の未解決の外部参照

visual studio
実際に追加したcppファイルは一番下に記載しております。

①に関してはこちらのサイトを見て自己解決しました。

②と③ですが、いろんなサイトを見てもプロトタイプ宣言が間違いえているとか、
新規作成の時にテンプレの選択を間違えたの訂正などの方法がありましたが、
どれを試しても、②③のエラーが発生します。

エラーの訂正方法を教えてください。

#include <windows.h> #include <tchar.h> #include <stdarg.h> #pragma warning(disable: 4996) #define ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) HWND hMainWnd = NULL; void SetupShutdownBlock(bool noStandby, bool noScreenSaver); void OutputDebugLog(LPCTSTR format, ...); // Block Windows standby / screensaver. // スタンバイや画面オフを無効化 void SetupPowerOffBlock(bool noStandby, bool noScreenSaver) { // Get OS version // OS のバージョンを取得 OSVERSIONINFO osVersion; osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osVersion); // Set shutdown order (highest priority) // シャットダウン時の処理順序を最高にする DWORD priorityLevels[5] = { 0x4FF, 0x4F0, 0x3FF, 0x3F0, 0x300 }; for (int i = 0; i < ARRAY_LENGTH(priorityLevels); i++) { if (SetProcessShutdownParameters(priorityLevels[i], 0) != FALSE) { break; } } if (noScreenSaver) { // Windows 7 or later? if (osVersion.dwMajorVersion == 6 && osVersion.dwMinorVersion >= 1) { // Cast a magic spell, I'm not sure why it is needed. // なんだろうこれ、おまじない BOOL screenSaveActive; SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &screenSaveActive, 0); SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, screenSaveActive, NULL, SPIF_SENDWININICHANGE); } } // Protect process from standby or screensaver. // プロセスをスタンバイや画面オフから守るように命じる EXECUTION_STATE state = ES_CONTINUOUS | (noStandby ? ES_SYSTEM_REQUIRED : 0) | (noScreenSaver ? ES_DISPLAY_REQUIRED : 0) | ES_AWAYMODE_REQUIRED; SetThreadExecutionState(ES_CONTINUOUS); SetThreadExecutionState(state); } INT_PTR CALLBACK MainDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: OutputDebugLog(TEXT("WM_INITDIALOG(wParam: %ld, lParam: %ld)"), wParam, lParam); // Adjust process info to block shutdown. // スタンバイ等を抑制するためにプロセスの情報をあれこれ変更 SetupPowerOffBlock(true, true); // Vista or later: You can display the reason of block (optional) // Vista 以降: シャットダウンできない理由を表示できます //ShutdownBlockReasonCreate(hDlg, TEXT("Hey! You should work more harder! ;)")); return (INT_PTR)TRUE; case WM_QUERYENDSESSION: OutputDebugLog(TEXT("WM_QUERYENDSESSION(wParam: %ld, lParam: %ld)"), wParam, lParam); // Prevent shutdown. Return FALSE as a return value for WM_QUERYENDSESSION. // If your window is not a dialog, you can simply use `return FALSE`. // シャットダウンを抑制するために FALSE を返します。 // 通常のウィンドウなら `return FALSE` で構いません。 SetWindowLong(hDlg, DWL_MSGRESULT, (LPARAM)FALSE); return (INT_PTR)TRUE; case WM_ENDSESSION: OutputDebugLog(TEXT("WM_ENDSESSION(wParam: %ld, lParam: %ld)"), wParam, lParam); // Do nothing. break; // Following handlers are trivial. // 以下、本質とは無関係なメッセージ処理 case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { DestroyWindow(hDlg); return (INT_PTR)TRUE; } break; case WM_DESTROY: PostQuitMessage(0); break; } return (INT_PTR)FALSE; } // Simple OutputDebugString wrapper which supports formatting and timestamp (datetime). void OutputDebugLog(LPCTSTR format, ...) { va_list args; TCHAR message[4096]; TCHAR header[64]; va_start(args, format); wvsprintf(message, format, args); va_end(args); SYSTEMTIME st; GetLocalTime(&st); wsprintf(header, TEXT("%04d/%02d/%02d %02d:%02d:%02d: "), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); OutputDebugString(header); OutputDebugString(message); OutputDebugString(TEXT("\n")); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Windowsデスクトップアプリケーションでは、起動するのにWinMain関数が呼ばれます。
その関数を削除したために、そのエラーが出ています

ということで、WinMain関数を追加する、というのが解決法となります


ちなみに、コマンドラインアプリケーションでは、main関数が起動時に呼ばれますねー

投稿2018/04/09 23:57

編集2018/04/09 23:59
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mercurian-teto

2018/04/10 11:21

int WINAPI WinMainですね!解決できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問