###環境
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")); }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/10 11:21