- PR -

Windowsシャットダウン時のフリーズ

1
投稿者投稿内容
チェイス
常連さん
会議室デビュー日: 2005/02/23
投稿数: 27
投稿日時: 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 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-12-04 16:36
引用:

チェイスさんの書き込み (2006-12-04 15:32) より:
何か他に無理矢理にでも再起動させる方法はありませんでしょうか?


ありません。

引用:

ただしDBへの書込み処理後という条件は必要です。


と言う用件を満たすためには、プロセスを正常に終了しなくてはならない筈です。「フリーズしている?」プロセスを正常に処理完了させつつ、強制終了させる方法なんてあるわけないでしょう。

と言うわけで、根本的な問題である「自身のアプリケーションがフリーズする」と言うバグを直す以外に無いでしょう。データベースへの書き込みや、終了処理をどの様に実装しているのですか?またどんな命令でフリーズするのですか?
めろん
会議室デビュー日: 2006/09/05
投稿数: 5
投稿日時: 2007-02-03 22:58
こんにちは。

そのアプリに再起動をするボタンを作って、
それを押すと定期的(1〜3秒程度)に動いているループを停止して、
1回だけデータ書込み関数を動かして、Shell関数でコマンドプロンプトのShutdownコマンドを
実行するって形で良いのではないでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)