HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0803
あいそとーぷシャットダウン時にエラーが出てしまう2解決


あいそとーぷ

リンク

2022/8/3(Wed) 23:49:20|NO.96900

充電が減っているのを感知するアプリを作っているのですがシャットダウン時に

0x000000000040687B の命令が 0x0000000000000342 のメモリを参照しました。 メモリがreadになることはできませんでした。 (後略)
と出てシャットダウンが止まってしまいます。
onerrorをつけているのになぜエラーが出てしまうのでしょうか?
またどうすれば出なくなりますか?

コードはこちらです。
(ACLineStatusを使ってないのはわざとです)

#include "kernel32.as" #include "shell32.as" #include "user32.as" title "zyu-den" RegisterWindowMessage "TaskbarCreated" onexit *error onerror *error oncmd gosub *OnTaskbarCreated, stat // "TaskbarCreated" oncmd gosub *OnDestroy, 0x0002 // WM_DESTROY oncmd gosub *OnTrayIcon, 0x0401 // WM_TRAYICON gosub *AddTaskbarIcon title "zyu-den" bgscr 0,450,80,2,ginfo(20)/2-225,ginfo(21)/2-25 pos 0,0 font "",50 mes "充電されていません" objsize 450,30 pos 0,50 button "OK",*btn dim SYSTEM_POWER_STATUS, 3 *btn gsel 0,-1 flug = 0 *looping GetSystemPowerStatus varptr(SYSTEM_POWER_STATUS) if peek(SYSTEM_POWER_STATUS.0,2) < log :flug = 1 if flug= 1 :gsel 0,2 log = peek(SYSTEM_POWER_STATUS.0,2) await 10 goto *looping *AddTaskbarIcon // 自身のアイコン取得 sdim FileName, 260 GetModuleFileName hModule, varptr(FileName), 260 ExtractIconEx varptr(FileName), 0, 0, varptr(hIconSmall), 1 hIcon = hIconSmall(0) // 自身のウィンドウタイトル取得 GetWindowTextLength hwnd sdim WindowTitle, stat + 1 GetWindowText hwnd, varptr(WindowTitle), stat + 1 // NOTIFYICONDATA 構造体 dim IconData,22 IconData(0) = 88 IconData(1) = hwnd IconData(2) = 1 IconData(3) = 0x0007 // NIF_MESSAGE | NIF_ICON | NIF_TIP IconData(4) = 0x0401 // WM_TRAYICON IconData(5) = hIcon poke IconData, 4 * 6, WindowTitle Shell_NotifyIcon 0x00000000, varptr(IconData) //タスクバーにアイコン表示 return *DeleteTaskbarIcon//タスクトレイのイコン削除 // NOTIFYICONDATA 構造体 dim IconData,22 IconData(0) = 88 IconData(1) = hwnd IconData(2) = 1 IconData(3) = 0x0002 // NIF_ICON Shell_NotifyIcon 0x00000002, varptr(IconData) return *OnTaskbarCreated// タスクトレイにアイコン表示 gosub *AddTaskbarIcon return *OnDestroy// タスクバーのアイコン削除 gosub *DeleteTaskbarIcon return *OnTrayIcon//アイコンが押されたとき if (wparam == 1) { switch (lparam) case 0x0201 ::swbreak// WM_LBUTTONDOWN case 0x0203 :goto *exit:swbreak// WM_LBUTTONDBLCLK case 0x0204 :dialog "残り"+log+"%":swbreak// WM_RBUTTONDOWN swend} return *error end *exit gosub *OnDestroy end



この記事に返信する


沢渡

リンク

2022/8/4(Thu) 11:58:44|NO.96902

以下のように
・onexitとonerrorの飛び先を*errorではなく*exitにする。
・*exitでは最初にoncmd 0とし、oncmdでの割り込みが起きないようにする。
・終了前にDestroyIconでアイコンハンドルを破棄する。
と修正したら、当方ではエラーは起きなくなりました。
(推測ですが、どうもプログラムが終了処理が済んだ後になってWM_DESTROYの割り込みが発生し、
 それで動作がおかしくなっていた様子?)

#include "kernel32.as" #include "shell32.as" #include "user32.as" title "zyu-den" RegisterWindowMessage "TaskbarCreated" onexit *exit onerror *exit oncmd gosub *OnTaskbarCreated, stat // "TaskbarCreated" oncmd gosub *OnDestroy, 0x0002 // WM_DESTROY oncmd gosub *OnTrayIcon, 0x0401 // WM_TRAYICON gosub *AddTaskbarIcon title "zyu-den" bgscr 0,450,80,2,ginfo(20)/2-225,ginfo(21)/2-25 pos 0,0 font "",50 mes "充電されていません" objsize 450,30 pos 0,50 button "OK",*btn dim SYSTEM_POWER_STATUS, 3 *btn gsel 0,-1 flug = 0 *looping GetSystemPowerStatus varptr(SYSTEM_POWER_STATUS) if peek(SYSTEM_POWER_STATUS.0,2) < log :flug = 1 if flug= 1 :gsel 0,2 log = peek(SYSTEM_POWER_STATUS.0,2) await 10 goto *looping *AddTaskbarIcon // 自身のアイコン取得 sdim FileName, 260 GetModuleFileName hModule, varptr(FileName), 260 ExtractIconEx varptr(FileName), 0, 0, varptr(hIconSmall), 1 hIcon = hIconSmall(0) // 自身のウィンドウタイトル取得 GetWindowTextLength hwnd sdim WindowTitle, stat + 1 GetWindowText hwnd, varptr(WindowTitle), stat + 1 // NOTIFYICONDATA 構造体 dim IconData,22 IconData(0) = 88 IconData(1) = hwnd IconData(2) = 1 IconData(3) = 0x0007 // NIF_MESSAGE | NIF_ICON | NIF_TIP IconData(4) = 0x0401 // WM_TRAYICON IconData(5) = hIcon poke IconData, 4 * 6, WindowTitle Shell_NotifyIcon 0x00000000, varptr(IconData) //タスクバーにアイコン表示 return *DeleteTaskbarIcon//タスクトレイのイコン削除 // NOTIFYICONDATA 構造体 dim IconData,22 IconData(0) = 88 IconData(1) = hwnd IconData(2) = 1 IconData(3) = 0x0002 // NIF_ICON Shell_NotifyIcon 0x00000002, varptr(IconData) return *OnTaskbarCreated// タスクトレイにアイコン表示 gosub *AddTaskbarIcon return *OnDestroy// タスクバーのアイコン削除 gosub *DeleteTaskbarIcon return *OnTrayIcon//アイコンが押されたとき if (wparam == 1) { switch (lparam) case 0x0201 ::swbreak// WM_LBUTTONDOWN case 0x0203 :goto *exit:swbreak// WM_LBUTTONDBLCLK case 0x0204 :dialog "残り"+log+"%":swbreak// WM_RBUTTONDOWN swend} return *error end *exit oncmd 0 gosub *OnDestroy DestroyIcon hIcon end



あいそとーぷ

リンク

2022/8/4(Thu) 15:44:46|NO.96903

エラーが出なくなりました!
解答してくれてありがとうございます!



ONION software Copyright 1997-2023(c) All rights reserved.