反応ないので一部機能を省略したサンプルスクリプトを上げてみます(完全版はReleaseに含まれています)
#include "HSP3Service.as"
#define LOG_FILE "HSP3Service.log"
*AppMain
notesel bfLog
exist LOG_FILE
if (strsize != -1) : noteload LOG_FILE, -1
noteadd strf("\r\nHSP3Service 1.0 Debug %d-%d-%d %d:%d:%d", gettime(0), gettime(1), gettime(3), gettime(4), gettime(5), gettime(6)), -1, 0
notesave LOG_FILE
// DLLの有無を確認, 存在しない場合はERROR_DLL_NOT_FOUND (0x485)を通知して終了
exist dir_exe + "\\HSP3Service.dll"
if (strsize == -1) {
noteadd "FATAL ERROR: HSP3Service.dll is missing!", -1, 0
notesave LOG_FILE
end 0x485
}
// oncmd命令で受け取るSCとジャンプ先を指定して擬似的なコールバックを実装
oncmd *SvcStart, HSC_OK // サービス開始時 (必須)
oncmd gosub *SCStop, HSC_STOP // サービス終了時
oncmd gosub *SCShutdown, HSC_SHUTDOWN // シャットダウン時
oncmd *SCError, HSC_ERROR // プラグイン内部エラー発生時 (必須)
onerror *HSPError // HSPエラー発生時
// HSP3StartService命令を用いてサービスを開始する
// これ以降プロセスを終了するときはExitServiceProcess命令を使う (使い方は標準のend命令と同じ)
HSP3StartService 0, 0, SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE
if (stat) {
// 成功した場合はシステムとの接続が確立するとoncmdで指定した開始時のジャンプ先に移動する
noteadd strf("hThread = 0x%x", stat), -1, 0
notesave LOG_FILE
} else {
// 失敗した場合は終了 (パラメータに問題がない限り通常は成功する)
noteadd "ERROR: HSP3StartService failed!", -1, 0
notesave LOG_FILE
ExitServiceProcess
}
stop
*SvcStart
// HSC_OKメッセージを受信したらできるだけ早く初期化を完了させる
nArgc = wparam
maxArgLength = lparam + 2
sdim szArgv, maxArgLength, nArgc
// サービスの引数文字列取得
repeat nArgc
szArgv(cnt) = GetServiceArgument(cnt)
loop
noteadd "We received HSC_OK message successfully.", -1, 0
noteadd strf("Argc is %d, maximum argument length is %d", nArgc, maxArgLength - 2), -1, 0
notesave LOG_FILE
// 初期化が完了したらReportStatus命令を用いてサービスが実行中であることをシステムに報告する
ReportStatus SERVICE_RUNNING, 0
noteadd "Welcome to the world of Windows Service!", -1, 0
foreach szArgv
noteadd strf("Argv[%d] = %s", cnt, szArgv(cnt)), -1, 0
loop
notesave LOG_FILE
// ここからサービスとしての主な処理を実行する (この例では1秒ごとにログにタイムスタンプを約1分間記録する)
*SvcTaskMain
repeat 60
noteadd strf("Service main task %d at %d-%d-%d %d:%d:%d", cnt, gettime(0), gettime(1), gettime(3), gettime(4), gettime(5), gettime(6)), -1, 0
notesave LOG_FILE
wait 100
loop
// 処理が完了したらStopService命令を用いてサービス停止と終了コードをシステムに報告し, ExitServiceProcess命令を用いてプロセスを終了する
noteadd "Task done, exiting service.", -1, 0
notesave LOG_FILE
StopService 0, 0
ExitServiceProcess
// ユーザーがサービス停止操作をした場合やシャットダウン時はクリーンアップを完了させサービス停止を報告し, プロセスを終了する
*SCStop
noteadd strf("Service has been stopped manually at %d-%d-%d %d:%d:%d", gettime(0), gettime(1), gettime(3), gettime(4), gettime(5), gettime(6)), -1, 0
notesave LOG_FILE
StopService 0, 0
ExitServiceProcess
*SCShutdown
noteadd strf("Service has been stopped by system shutdown at %d-%d-%d %d:%d:%d", gettime(0), gettime(1), gettime(3), gettime(4), gettime(5), gettime(6)), -1, 0
notesave LOG_FILE
StopService 0, 0
ExitServiceProcess
// エラー発生時はDLLからHSC_ERRORメッセージが送信されwParamにはWindowsのエラーコード, lParamにはエラーが発生した操作が代入される
*SCError
switch lparam
// サービス開始失敗
case HSE_FAIL_START
noteadd strf("ERROR: Failed to start service. Windows Error Code = 0x%X", wparam), -1, 0
notesave LOG_FILE
swbreak
// HandlerEx コールバック関数登録失敗
case HSE_FAIL_REGISTER
noteadd strf("ERROR: Failed to register HandlerEx. Windows Error Code = 0x%X", wparam), -1, 0
notesave LOG_FILE
swbreak
swend
ExitServiceProcess
// HSP用エラーハンドラー
*HSPError
noteadd strf("HSP Error code = %d, Line = %d", err, lparam), -1, 0
notesave LOG_FILE
StopService ERROR_SERVICE_SPECIFIC_ERROR, err
ExitServiceProcess