スクリプト言語でがんばる~カノープスのHD RECSのその後その3
で,まあUWSCでコマンドラインから録画開始・停止ができるようになった.WindowsのMediaCenterの録画機能と同期してこれを動かすのだが,とりあえずJavaScriptでサクッと書いてみる.(1)録画の検出は,MediaCenterの録画保存ディレクトリを定期的に(とりあえず1秒間隔)みて,一番新しい & 拡張子dvr-msファイルを監視する.具体的には,排他的(exclusive)にread openを試みてできなければ,MediaCenterが録画中と判断して,HD RECSで録画開始(2)上記で見つけたファイルを定期的に排他的にread openを試みてできれば,録画終了と判断して HD RECSでの録画を停止.という極めて,アホな方法でやってみる.ロックファイルの応用といえなくもない.JavaScriptにはファイルを「排他的にリードオープンする方法」がないみたいなので,「アペンドモードでwrite open」することにする(ちょっと強引.ファイルが壊れるかも).結果,まあOKなのだが,JavaScriptからUWSCを起動するのが思いのほか時間がかかり,UWSCのスクリプト中にいれる待ち時間の調整がうまくいかない.ならばと,全体の制御もUWSCでやってしまうことにするが,「排他的にread open」なんてことはできない.仕方ないので,UWSCからDLLを呼べるらしいので挑戦してみる.恐れていた,深みにハマる感じ(笑)コードは最後にのせるが,一応動いた.仕掛けとしては,kernel32.dllのCreatFile()を呼んでいるのだが,引数がよくわからない,特に,SECURITY_ATTRIBUTES構造体はNULLポインタで良いみたいだが,肝心のNULLポインタの渡し方がよくわかりましぇんorzそのうちUWSCのサポート板で聞いてみましょう.今回はこれでよしっと.あと一般的なシステムコールの名前は,CreatFile()だと思うのだが,Windowsのkernel32.dllではCreatFileAとなるようだ.最初これが判らなくて,DLL関数の呼び出し定義がわるいのか,なにがわるいのかわからなくて小一時間悩んでしまった.----本日の御託新潟精密,飛んじゃったね~.RFの面白い技術や,デジタルオーディオ用のドライバICとかはちょっと気になってたんだけどなー.インテルの資本も入っていたはずだけど・・・//------------------------------------// lowere level functions//------------------------------------DEF_DLL CreateFileA( var String, uint, Long, {Long,Long,Long}, Long, Long, Long):Long:kernel32.dll // CreateFile(// ByVal lpFileName As String, オープンするファイル名、作成するファイル名 // ByVal dwDesiredAccess As Long, ファイルのアクセス方法(定数) // ByVal dwShareMode As Long, ファイルの共有モード(定数) // lpSecurityAttributes As SECURITY_ATTRIBUTES, 所得したハンドルを子プロセスに継承されるか指定する SECURITY_ATTRIBUTES構造体 // ByVal dwCreationDisposition As Long, 同一ファイル名の時の処理方法(定数) // ByVal dwFlagsAndAttributes As Long, ファイルの属性を指定/ファイルの読み書きモードの指定の組み合わせ // ByVal hTemplateFile As Long) As Long win98では無効(常に0)DEF_DLL CloseHandle( Long handle):bool:kernel32.dll////// check if file in use or not//FUNCTION IsFileInUse( strFileSpec) // print "filename "+ strFileSpec hndFile = CreateFileA( strFileSpec, GENERIC_WRITE, 0, _ 0,0,0, OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , 0) // print "IsFile ..." + hndFile IFB hndFile <> -1 THEN // PRINT "--- Not In use" CloseHandle( hndFile ) RESULT = 0 ELSE // PRINT "--- In use" RESULT =1 ENDIFFEND// for dwDesiredAccess// 0 デバイスにアクセスせずデバイスの属性を調べるCONST GENERIC_READ = $80000000 // 読み込みCONST GENERIC_WRITE = $40000000 // 書き込み // for dwShareMode // 0 共有しないCONST FILE_SHARE_READ = $1 // 他のアプリケーションから読み込み可能CONST FILE_SHARE_WRITE = $2 // 他のアプリケーションから書き込み可能// for dwCreationDisposition CONST CREATE_NEW = 1 // 新しいファイルを作成同一ファイル名時エラー CONST CREATE_ALWAYS = 2 // 新しいファイルを作成 同一ファイル名時上書き CONST OPEN_EXISTING = 3 // 既存ファイルを開く ファイルがない時エラー CONST OPEN_ALWAYS = 4 // 指定のファイルを開く なければ新規作成 CONST TRUNCATE_EXISTING = 5 // ファイルサイズを0にし 既存ファイルを開く// ファイルがない時エラー// (このフラグを設定する時GENERIC_WRITE も 設定する)// for dwFlagsAndAttributes//ファイル属性を指定 CONST FILE_ATTRIBUTE_ARCHIVE = $20 // アーカイブ属性 CONST FILE_ATTRIBUTE_HIDDEN = $2 // 隠しファイル属性 CONST FILE_ATTRIBUTE_NORMAL = $80 // 他のファイル属性を持たない CONST FILE_ATTRIBUTE_READONLY = $1 // ReadOnly属性 CONST FILE_ATTRIBUTE_SYSTEM = $4 // システムファイル属性 CONST FILE_ATTRIBUTE_TEMPORARY = $100 // 一時ファイル属性//ファイルの読み書きモードの指定 CONST FILE_FLAG_WRITE_THROUGH = $80000000 //キャッシュを通さず直接書き込む CONST FILE_FLAG_OVERLAPPED = $40000000 //非同期アクセス CONST FILE_FLAG_NO_BUFFERING = $20000000 CONST FILE_FLAG_RANDOM_ACCESS = $10000000 //ランダムアクセス CONST FILE_FLAG_SEQUENTIAL_SCAN = $8000000 //シーケンスアクセスCONST FILE_FLAG_DELETE_ON_CLOSE = $4000000 //ファイルをクローズ後削除するCONST FILE_FLAG_POSIX_SEMANTICS = $1000000 //ファイル名の大文字小文字を区別 // Type SECURITY_ATTRIBUTES// nLength As Long 構造体のバイト数// lpSecurityDescriptor As Long セキュリティデスクリプタ// bInheritHandle As Long 1の時属性を継承する// End Type