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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0909
SELIA!#deffunc #defcfuncのlocal変数について3解決


SELIA!

リンク

2012/9/9(Sun) 18:30:08|NO.49268

#deffunc, #defcfuncの local変数について質問です。

Windows Vista以降で使える、COMのTask Scheduler 2.0を使って
モジュールを作って見たのですが

以下のモジュールの"#deffunc _CreateScheduleOnLogon"の次の行の
コメントアウトを削除すると

pRootFolder-> "RegisterTaskDefinition" TaskName, pTask, TASK_CREATE_OR_UPDATE, "Builtin\\Users", , TASK_LOGON_GROUP, ""

の行でError 1 "システムエラーが発生しました" が発生します。
コメントアウトをつけている場合はエラーも起きず正常に設定できるので特にスクリプトには
問題は無いと思うのですが...

このエラーの原因がわかる方いらっしゃいましたら原因を教えていただけないでしょうか?


#const global FALSE 0 #const global TRUE 1 #const global NULL 0 #define global ctype SUCCEEDED(%1) (%1 == 0) #module #const HSPVAR_FLAG_COMOBJ 6 #defcfunc ComExist var ComObject if (vartype(ComObject) == HSPVAR_FLAG_COMOBJ){ return varuse(ComObject) } return FALSE #deffunc ComRelease var ComObject if (vartype(ComObject) == HSPVAR_FLAG_COMOBJ){ if (varuse(ComObject) == TRUE){ delcom@hsp ComObject : ComObject= NULL return TRUE } } return FALSE #global #module #define IID_IExecAction "{4C3D624D-FD6B-49A3-B9B7-09CB3CD3F047}" #define IID_ILogonTrigger "{72DADE38-FAE4-4B3E-BAF4-5D009AF02B1C}" #usecom IExecAction IID_IExecAction #usecom ILogonTrigger IID_ILogonTrigger #const TASK_CREATE_OR_UPDATE 6 #const TASK_TRIGGER_LOGON 9 #const TASK_ACTION_EXEC 0 #const TASK_LOGON_GROUP 4 // ログオン時に、指定した実行ファイルを起動する CreateScheduleOnLogon p1、p2、 p3, p4, p5, p6, p7 p1 (str) : 新しく作る(上書きする)タスクの名前 p2 (str) : タスク実行時に起動する実行ファイルのパス p3 (str) : タスクの作成者 p4 (str) : タスクの説明 p5 (int) : タスクが実行されてから、実際に実行ファイルが起動するまでの遅延時間 (秒単位) p6 (int) : バッテリ駆動時に、タスクを実行させるか (1= 起動させない : それ以外= 起動させる : デフォルト= 1) p7 (int) : タスクの実行中、バッテリ駆動に切り替わった場合タスクを終了させるか(1= 終了させる : それ以外= 終了させない : デフォルト= 1) #define global CreateScheduleOnLogon(%1,%2,%3="",%4="",%5=0,%6=1,%7=1) _CreateScheduleOnLogon %1,%2,%3,%4,%5,%6,%7 #deffunc _CreateScheduleOnLogon str TaskName, str ExecutablePath, str Author, str Description, int nDelay, int StartOnBatterie, int StopOnBatterie, local Time, local strDelay, local hr \ ;, local pService, local pTask, local pRegInfo, local pSettings, local pTriggerCollection, local pTrigger, local pLogonTrigger, local pActionCollection, local pAction, local pExecAction, local pRootFolder, local pRegisteredTask /* ↑ ここのコメントアウトを外すと、エラーが起きる */ if ((strlen(TaskName) == 0) | (strlen(ExecutablePath) == 0)) : return FALSE newcom pService, "Schedule.Service" if (ComExist(pService)){ pService->"connect" : hr= stat if SUCCEEDED(hr){ pTask= pService("NewTask", 0) if (ComExist(pTask)){ if ((strlen(Author) > 0) | (strlen(Description) > 0)){ pRegInfo= pTask("RegistrationInfo") if (ComExist(pRegInfo)){ pRegInfo("Author")= Author pRegInfo("Description")= Description ComRelease pRegInfo } } if ((StartOnBatterie != 1) | (StopOnBatterie != 1)){ pSettings= pTask("Settings") if (ComExist(pSettings)){ pSettings("DisallowStartIfOnBatteries")= (StartOnBatterie == 1) pSettings("StopIfGoingOnBatteries")= (StopOnBatterie == 1) ComRelease pSettings } } pTriggerCollection= pTask("Triggers") if (ComExist(pTriggerCollection)){ pTrigger= pTriggerCollection("Create", TASK_TRIGGER_LOGON) if (ComExist(pTrigger)){ querycom pLogonTrigger, pTrigger, ILogonTrigger if (ComExist(pLogonTrigger)){ pLogonTrigger("ID")= "Trigger1" pLogonTrigger("StartBoundary")= "2005-01-01T12:05:00" if (nDelay > 0){ Time(0)= ((nDelay/ 60)/ 60) Time(1)= ((nDelay/ 60)\ 60) Time(2)= ((nDelay\ 60)\ 60) strDelay= "PT" if (Time(0) > 0) : strDelay+= (str(Time(0))+ "H") if (Time(1) > 0) : strDelay+= (str(Time(1))+ "M") if (Time(2) > 0) : strDelay+= (str(Time(2))+ "S") pLogonTrigger("Delay")= strDelay } pActionCollection= pTask("Actions") if (ComExist(pActionCollection)){ pAction= pActionCollection("Create", TASK_ACTION_EXEC) if (ComExist(pAction)){ querycom pExecAction, pAction, IExecAction if (ComExist(pExecAction)){ pExecAction("Path")= ExecutablePath pRootFolder= pService("GetFolder", "\\") if (ComExist(pRootFolder)){ comres pRegisteredTask pRootFolder-> "RegisterTaskDefinition" TaskName, pTask, TASK_CREATE_OR_UPDATE, "Builtin\\Users", , TASK_LOGON_GROUP, "" : hr= stat if (ComExist(pRegisteredTask)){ ComRelease pRegisteredTask if (hr) : hr= FALSE : else : hr= TRUE } ComRelease pRootFolder } ComRelease pExecAction } ComRelease pAction } ComRelease pActionCollection } ComRelease pLogonTrigger } ComRelease pTrigger } ComRelease pTriggerCollection } ComRelease pTask } } ComRelease pService } return hr //指定したタスクの存在確認 ExistSchedule p1 p1 (str) : 存在するか調べたいタスクの名前 #defcfunc ExistSchedule str TaskPath, local hr \ ;, local pService, local pRootFolder, local pTask newcom pService, "Schedule.Service" if (ComExist(pService)){ pService->"connect" pRootFolder= pService("GetFolder", "\\") if (ComExist(pRootFolder)){ comres pTask pRootFolder->"GetTask" TaskPath if (ComExist(pTask)){ hr= TRUE : ComRelease pTask }else{ hr= FALSE } ComRelease pRootFolder } ComRelease pService } return hr #global TaskName= "TestTask" ExePath = "%windir%\\System32\\notepad.exe" Author = "作成者" Description = "ログオン時にノートパッドを起動します。" CreateScheduleOnLogon TaskName, ExePath, Author, Description, 60, 0, 0 if (stat){ dialog "テスト用タスクの作成に成功しました。\n\n作成したタスク \""+ TaskName+ "\" を削除してよろしいですか?", 2 if (stat == 6) : DeleteSchedule TaskName }else{ dialog "テスト用タスクの作成に失敗しました。", 1 } end

試してみた環境は
Windows7 (32Bit)
HSP3.31 RC1 & HSP 3.21
です。



この記事に返信する


てん

リンク

2012/9/10(Mon) 12:26:36|NO.49295

DeleteTask の定義はどこでしょうか



てん

リンク

2012/9/10(Mon) 12:57:47|NO.49296

127行目らへん

pRootFolder-> "RegisterTaskDefinition" TaskName, pTask, TASK_CREATE_OR_UPDATE, "Builtin\\Users", , TASK_LOGON_GROUP, ""
においてpTaskを値渡ししていることがエラーの原因のようです。
varptr(pTask)にしたところうまくいきました。

だがしかし、pTaskをローカル変数の指定から外したところ
なぜか値渡しのままでもうまくいくんですよね・・・・なぜ?

グローバル変数はコンパイル時に自動で参照渡しに置き換えてくれている、とか?


参考にしたのはmsdnのこれ
http://msdn.microsoft.com/en-us/library/windows/desktop/aa381365(v=vs.85).aspx



SELIA!

リンク

2012/9/10(Mon) 14:37:24|NO.49298

>てん さん

返信遅れてすいません、COMポインタで渡してないのが原因だったんですか...

申し訳ありません、DeleteScheduleの定義はこちらです


//指定したタスクの削除 DeleteSchedule p1 p1 (str) : 削除したいタスクの名前 #defcfunc DeleteSchedule str TaskName, local hr \ ;, local pService, local pRootFolder, local pTask newcom pService, "Schedule.Service" if (ComExist(pService)){ pService->"connect" pRootFolder= pService("GetFolder", "\\") if (ComExist(pRootFolder)){ pRootFolder->"Delete" TaskName if (stat) : hr= FALSE : else : hr= TRUE ComRelease pRootFolder } ComRelease pService } return hr

単純なミスですいませんでした、ありがとうございます。



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