- - PR -
Windowsシャットダウン時のフリーズ
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-04 15:32
いつもお世話になっております。
(環境) Windows2000 SP4 SQL Server2000 SP4 VB6.0 SP5 上記の環境でアプリを構築しております。 VBのアプリで定期的(1〜3秒程度)に外部(機械)からデータを取得し、DBにデータを書き込んでおります。 機械のメンテナンス時ぐらいにしか再起動させるタイミングがありませんので、 機械メンテナンスのボタンを押されたら再起動するようにしているのですが この再起動処理時に自身のアプリケーションがフリーズしWindows自体の再起動が 途中で停止してしまいます。 (再起動時にはデータベースの書込み処理終了後再起動) 再起動させるロジックはネットで見つけた以下のものを流用しているのですが Option Explicit '************************************************************************************************** '* Windowsの再起動に仕様 '************************************************************************************************** Public Type LUID UsedPart As Long IgnoredForNowHigh32BitPart As Long End Type Public Type TOKEN_PRIVILEGES PrivilegeCount As Long TheLuid As LUID Attributes As Long End Type 'プロセスに関連付けられているアクセストークンを開きます。 Public Declare Function OpenProcessToken Lib "advapi32" _ (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _ TokenHandle As Long) As Long 'ローカル一意識別子(LUID)を取得し、指定された特権名を表現します Public Declare Function LookupPrivilegeValue Lib "advapi32" _ Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _ ByVal lpName As String, lpLuid As LUID) As Long 'カレントプロセスの擬似ハンドルを返す(P656) Public Declare Function GetCurrentProcess Lib "kernel32" () As Long '指定したアクセストークン内の特権を有効または無効にします Public Declare Function AdjustTokenPrivileges Lib "advapi32" _ (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, _ NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, _ PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long 'カレントユーザーのログオフ、Windowsの終了、再スタートを行う(P1073) Public Declare Function ExitWindowsEx Lib "user32" _ (ByVal uFlags As Long, ByVal dwReserved As Long) As Long Public Const TOKEN_QUERY = &H8 Public Const TOKEN_ADJUST_PRIVILEGES = &H20 Public Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege" Public Const SE_PRIVILEGE_ENABLED = &H2 'uFlags は終了の方法を指定する次の定数 Public Const EWX_FORCE = &H4 '応答のないプロセスを強制終了 Public Const EWX_LOGOFF = &H0 'ログオフ Public Const EWX_REBOOT = &H2 '再起動 Public Const EWX_SHUTDOWN = &H1 'シャットダウン(ノートPCの終了) Public Const EWX_POWEROFF = &H8 '電源をオフ Public Sub sShutdown(myFlags As Long) If CreateObject("SYSINFO.Sysinfo").OSPlatform = 2 Then 'OSがNT4・Win2000・WinXP の場合 Dim lngResult As Long Dim hTokenHandle As Long Dim tmpLuid As LUID Dim tkpNew As TOKEN_PRIVILEGES Dim tkpPrevious As TOKEN_PRIVILEGES 'プロセスに関連づけアクセストークンのオープン lngResult = OpenProcessToken(GetCurrentProcess, TOKEN_QUERY Or _ TOKEN_ADJUST_PRIVILEGES, hTokenHandle) If lngResult = 0 Then Exit Sub 'ローカルシステムのシャットダウン特権の取得 lngResult = LookupPrivilegeValue(vbNullString, _ SE_SHUTDOWN_NAME, tmpLuid) If lngResult = 0 Then Exit Sub tkpNew.PrivilegeCount = 1 tkpNew.TheLuid = tmpLuid tkpNew.Attributes = SE_PRIVILEGE_ENABLED 'アクセストークンの特権を変更する lngResult = AdjustTokenPrivileges(hTokenHandle, False, _ tkpNew, Len(tkpPrevious), tkpPrevious, 0&) If lngResult = 0 Then Exit Sub End If lngResult = ExitWindowsEx(myFlags, 0&) End Sub 何か他に無理矢理にでも再起動させる方法はありませんでしょうか? ただしDBへの書込み処理後という条件は必要です。 以上ご教授よろしくお願いします。 [ メッセージ編集済み 編集者: チェイス 編集日時 2006-12-04 15:38 ] | ||||||||
|
投稿日時: 2006-12-04 16:36
ありません。
と言う用件を満たすためには、プロセスを正常に終了しなくてはならない筈です。「フリーズしている?」プロセスを正常に処理完了させつつ、強制終了させる方法なんてあるわけないでしょう。 と言うわけで、根本的な問題である「自身のアプリケーションがフリーズする」と言うバグを直す以外に無いでしょう。データベースへの書き込みや、終了処理をどの様に実装しているのですか?またどんな命令でフリーズするのですか? | ||||||||
|
投稿日時: 2007-02-03 22:58
こんにちは。
そのアプリに再起動をするボタンを作って、 それを押すと定期的(1〜3秒程度)に動いているループを停止して、 1回だけデータ書込み関数を動かして、Shell関数でコマンドプロンプトのShutdownコマンドを 実行するって形で良いのではないでしょうか? |
1