SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VS.NET C 言語編6 - win32 DLL、Windows 終了、ExitWindowsEx

Windows2000、XP のシャットダウンには特権モードの獲得が必要で、VB では
とっても面倒なので、C の sakinfo.dll に Windows 終了関数を追加した。

PC 情報、その他 sakinfo.dll - sakif110.lzh のダウンロードは、次のリンクから
行って下さい。『sakif110.lzh 22,247 bytes』

VB からの呼び出しについては、
『VB テクニック編39 - Windows 終了、ExitWindowsEx、EWX_POWEROFF』
を参照して下さい。

■sakinfo.dll - ExitWin()

  ・Windows 終了 - ExitWin() は、次のように呼び出します。
    NT、2000、XP で特権獲得に失敗した場合は、戻り値に FALSE が返ります。
    95、98、Me では、常に TRUE が返ります。
    戻り値が FALSE のとき、errmsg にエラー内容がセットされます。
    C の TRUE と VB の TRUE は違うので、VB で戻り値を判定する場合は注意
    して下さい。

    rcd = ExitWin(mode, errmsg);
    |             |     |
    |             |     |_ エラーメッセージ格納文字列ポインタ(LPTSTR)
    |             |_ ExitWindowsEx 用定数(UINT)
    |                EWX_LOGOFF   = 0  ログオフ
    |                EWX_SHUTDOWN = 1  シャットダウン
    |                EWX_REBOOT   = 2  リブート
    |                EWX_FORCE    = 4  強制
    |                EWX_POWEROFF = 8  パワーオフ
    |_ 戻り値(BOOL)
       TRUE  正常
       FALSE エラー

    rcd = ExitWin(EWX_LOGOFF, errmsg);                // ログオフ
    rcd = ExitWin(EWX_REBOOT, errmsg);                // リブート
    rcd = ExitWin(EWX_POWEROFF, errmsg);              // パワーオフ
    rcd = ExitWin(EWX_POWEROFF | EWX_FORCE, errmsg);  // 強制パワーオフ

  ・引数に渡す文字列ポインタの実態には十分な領域を確保しておく必要があり
    ます。ExitWin() 関数内でバッファが足りるかチェックしていません。
    C なら TCHAR buf[300]; 程度、VB なら、dim buf as string の後、
    buf = space(300) 程度を確保して下さい。

■C ソース

/*
========================================================================
  Windows 終了
========================================================================
*/
DllExport BOOL WINAPI ExitWin(UINT mode, LPTSTR errmsg)
{
  OSVERSIONINFO    oi;
  HANDLE           hToken;
  TOKEN_PRIVILEGES tp;
  TOKEN_PRIVILEGES tpold;
  DWORD            ReturnLength;

// OS 種別取得
  oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  if (!GetVersionEx(&oi)) {
    lstrcpy(errmsg, "GetVersionEx エラー  ");
    return FALSE;
  }

// 特権獲得
  if (oi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
      lstrcpy(errmsg, "OpenProcessToken エラー  ");
      return FALSE;
    }
    if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid)) {
      lstrcpy(errmsg, "LookupPrivilegeValue エラー  ");
      return FALSE;
    }
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpold, &ReturnLength)) {
      lstrcpy(errmsg, "AdjustTokenPrivileges エラー  ");
      return FALSE;
    }
  }

// Windows 終了
  ExitWindowsEx(mode, 0xffffffff);

// 戻り値セット
  return TRUE;
}

■パソコン基礎知識 C 言語編資料
■プログラミング言語資料
■パソコン基礎知識 ハード編資料
■パソコン基礎知識 画像編資料
■パソコン基礎知識 Windows 編資料
■コンピュータシステム導入編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2024 Y.SAK