Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スクリプト言語でがんばる~カノープスの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
    ENDIF
FEND

// 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



コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/454-4f38058d
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。