シャットダウンプログラムのエラーについて


ポン太  2007-05-09 20:13:22  No: 136344

いつも参考にさせて頂いております。
シャットダウンプログラムを作成しました。
開発環境では、エラーが出ないのですが、
実行するパソコンでは、実行時エラー 429 Active・・・作成できません。
と出てしまいます。
ディストリビューションウィザードでセットアップを作成しましたが、
駄目みたいです。

宜しくお願いします。

<開発環境>
VB6 Sp6

<コード>
Option Explicit

Dim Res As String

Private Const LOCALE_SSHORTDATE As Long = &H1F  'short date format string
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
Private Declare Function SetLocaleInfo Lib "kernel32" Alias "SetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String) As Long

Private Type LUID
  UsedPart As Long
  IgnoredForNowHigh32BitPart As Long
End Type

Private Type TOKEN_PRIVILEGES
  PrivilegeCount As Long
  TheLuid As LUID
  Attributes As Long
End Type

'プロセスに関連付けられているアクセストークンを開きます。
Private Declare Function OpenProcessToken Lib "advapi32" _
    (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, _
    TokenHandle As Long) As Long

'ローカル一意識別子(LUID)を取得し、指定された特権名を表現します
Private Declare Function LookupPrivilegeValue Lib "advapi32" _
    Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, _
    ByVal lpName As String, lpLuid As LUID) As Long

'カレントプロセスの擬似ハンドルを返す(P656)
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

'指定したアクセストークン内の特権を有効または無効にします
Private 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)
Private Declare Function ExitWindowsEx Lib "user32" _
    (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Private Const TOKEN_QUERY = &H8
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
Private Const SE_PRIVILEGE_ENABLED = &H2

'uFlags  は終了の方法を指定する次の定数
Private Const EWX_FORCE = &H4       '応答のないプロセスを強制終了
Private Const EWX_LOGOFF = &H0      'ログオフ
Private Const EWX_REBOOT = &H2      '再起動
Private Const EWX_SHUTDOWN = &H1    'シャットダウン(ノートPCの終了)
Private Const EWX_POWEROFF = &H8    '電源をオフ

---------------------------------------------------------------------------------------
Private 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
---------------------------------------------------------------------------------------
Private Sub Command1_Click()
    Call sShutdown(EWX_POWEROFF)
    Unload Me
End Sub


まさ  2007-05-09 21:20:50  No: 136345

>実行時エラー 429 Active・・・作成できません。

どの行でエラーが起きているか調べましたか?


魔界の仮面弁士  2007-05-09 21:37:08  No: 136346

> If CreateObject("SYSINFO.Sysinfo").OSPlatform = 2 Then

システム情報コントロール(SysInfo)を使う場合は、CreateObject せず、
コントロールをフォームに貼りつけて使ってください。

動的生成する場合には、コントロールの実行時(ランタイム)ライセンスとは別に、
開発時(デザインタイム)ライセンスが要求されますので、開発環境が
インストールされていないと、実行できないというわけです。


大吉末吉  2007-05-09 21:38:17  No: 136347

>     If CreateObject("SYSINFO.Sysinfo").OSPlatform = 2 Then
システム情報コントロールを配布していないのでは?

> ディストリビューションウィザードでセットアップを作成しましたが、

フォームに貼り付けたりした場合は、ディストリビューションウィザードは、
「依存コンポーネント」と判断して、追加してくれますが、
CreateObjectで指定しただけだと自動的には判断してくれません(単なる文字列ですから)

手動で追加してください。
#又は、フォームに貼り付けて、普通の参照するか・・・


ポン太  2007-05-10 00:45:36  No: 136348

みなさんお返事ありがとうございます。
コントロールを使用し試してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加