プログラミングの最近のブログ記事

Paint.NETとTWAIN

| コメント(0) | トラックバック(0)
先月末、COMサーバーについて書きました。これが64ビットWindowsにおけるTWAINの話だったのですが、形になりました。

TWAINLocalServer.zip

Paint.NETでTWAINを使うものとして、効果プラグインのTwainableというのが既にありますが、64ビット環境では動作しませんでした。またクリップボードに入れるところまでしか行なわないらしいので、もう一手間かかりました。

こちらはファイルタイプのプラグインとして作ってあり、拡張子pdtwainを開くとTWAINから読み込みます。またアウトプロセスCOMサーバー経由なので、64ビット32ビット問わず動作します。スキャナの選択は通知領域から行ないます。

pdtwain.dllとTWAINLocalServerLib.dllをPaint.NETのFileTypesフォルダにコピーしてください。その上で、TWAINLocalServer.exeを適当な場所にコピーし、
TWAINLocalServer.exe -RegServer
として登録してください(管理者権限が必要)。登録解除は
TWAINLocalServer.exe -UnregServer
です(同じく)。

ベースとして、らんゆうじろう氏のCTWAINManagerを使っています。スキャンのウィンドウとスキャナ選択とを自動で切り替えるため、処理が完了してから行なえるようPostMessageをいくつか追加しました。

...というのが、そもそもTWAINが64ビット非対応というところから始まったものでした。公式TWAINは対応を果たしているのですが、Windows同梱の古い仕様のものは未対応なのです。

AnyCPUマネージドアプリであるPaint.NETから呼ばれるTwainableは、64ビット環境ではアンマネージドDLLとして64ビット版を要求するのですが、TWAINのDLL本体はWindowsフォルダの32ビット版しか存在せず、読もうとして落ちていたわけです。

そこでCOMサーバー。しかし肝心のデータの受け渡しをどうしたものかと試行錯誤をし、結局SAFEARRAYにまで手を付けました。ファイルマッピングでも良いのですが、不慣れなマネージド側の処理が楽になるので、マネージド配列として扱えるSAFEARRAYは好都合だったのです。

ちなみにタスクメモリは32/64の垣根を越えることができませんでした。ハンドルではなく直接アドレスを扱うAPIだからでしょうか。タスクメモリを使わなければデュアルインターフェース/オートメーションが使えるので、これはこれで悪い話ではありませんが。

まだエラー対策が不充分なのと、TWAINのウィンドウが背後に隠れる場合があるので、もう少し改良してからホームページ側で公開します。

今さらのもの

| コメント(0) | トラックバック(0)
GadgetScrew.pngWindows Vistaのサイドバーガジェットが左にずれていくのを防止するツールを公開しました。
GadgetScrew Ver.0.7

Vistaのサポートが来年春に切れるというのに、あまりにも今さらですが。BusinessとEnterpriseはまだ使うでしょうから、有用でないこともないでしょう。

ガジェットの追加・削除にも追随できるようにしてあります。

名前の元ネタは「モンティ・パイソン」でジョールが法廷に立つシーンです。

TS Demux for D-VHS

| コメント(0) | トラックバック(0)
dvhsdemux.png何となく動作するものができました。ホームページの方で公開しています。
DVHSDemuxer Ver.0.2

Code Projectを参考に、リストビューへの進捗表示を組み込んであります。

するとカスタムドローを使うので、ついでにパス表示にPathCompactPath APIを使うことができました。

なおtsdemuxerベースなのでGPLになっています。
企むことがあってCOMの学習中。

既に廃れつつあって参考書が少ない中、いきなりアウトプロセスのサーバーに挑戦です。

32ビットしか提供されていないアンマネージドDLLを、64ビットのマネージドアプリから使う必要があり、32/64相互運用はアウトプロセスCOM経由が一つの方法だと目にしたもので。

CodeGuruにC++で記述したアウトプロセスサーバーのサンプルがありました。Windows SDKのDCOMサンプル"Simple"よりわかりやすいと思います。

またMSDNにC#クライアントの解説がありました。

IDLファイルがあればタイプライブラリのTLBファイルが作られるので、tlbimpしてアセンブリファイルを作り、参照設定から「参照の追加」してやれば良いとわかりました。

コードはこうなりました。

namespace CSClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Server.MiniDcom d = new Server.MiniDcom();
            Server.IDouble id = (Server.IDouble)d;
            int r0, r1;
            r0 = 10;
            r1 = id.Double(r0);
            Console.WriteLine(r0 + "->" + r1);
        }
    }
}

TS Demux

| コメント(0) | トラックバック(0)
ものぐさキャプチャの環境が固定化しました。
基本的にDT-DRX100だけで全てを取り込み、IEEE1394でPCへ。外部入力にSL-2100とCLD-HF9Gが接続されています。

結局ADVC-100は主役に返り咲くことなく、DVキャプチャをすることは二度となさそうです。YUV411が好みではないのと、故障気味で滅多に正常動作せず、ランプが全て点灯してしまいます。基板交換対応のようです。

DT-DRX100からSTDモードでTS出力させ、CapDVHSで取り込み。CapDVHSは何とWindows 7 x64でも動くのですよ。
それをTSDemux 0.18で分離、さらにraw2lpcmでPCMのwavを生成、TMPGEnc Authoring Works 4でオーサリング。

しかしこの変換過程に若干問題があり、TSDemuxはm2vファイルのハンドル閉じ忘れがあるようです。またraw2lpcmはそれ自体は悪くないものの、比較的時間がかかるツールを複数手動で使うのは面倒です。PCM出力までをドラッグ&ドロップで一気に連続処理したいものです。

ということで、TSDemuxにraw2lpcmを組み込もうと思ったのですが、公式サイトが消滅しており配布されていたソースコードが手に入りません。VideoHelpあたりで聞くのも手ですが、他に選択肢はないかと探したところ、tsdemuxerが代わりになりそうでした。

Visual C++ 2008で普通に再ビルドできました。ライセンスはGPL v2なので、改造した場合私の初のGPLライセンス品として公開することになるでしょう。m2v出力の冒頭がTSDemuxと異なりますが、mp2とrawは同じでした(ただしrawの拡張子がac3)。

作りたいものが貯まってきました。そして、キャプチャするのはいいけど見る時間は!?

SPTI

| コメント(0) | トラックバック(0)
関心があってISO吸い出し挑戦したのですが、HFS/HFS+とのハイブリッドのディスク(Toastで言うカスタムハイブリッド)に対してReadFile()を使うと、ISOファイルシステムに含まれる領域しか読み出せないのですね。

# 正確にはドライブをCreateFile()で開いてReadFile()

SPTI経由でREAD(10)を発行すれば全て読み出せました。

やり方が悪いのか、IOCTL_CDROM_READ_TOC_EXがDVDだと通らないので、TOC取得の段階からSPTIに手を染めざるを得なかったりしますが。

WDKのapi/ntddscsi.hやddk/scsi.hに多少の定義がありますが、単純にunsigned charで定義したCDB配列、というよりSCSI_PASS_THROUGH構造体のCdbメンバに直接代入した方が楽なようです。

さてこのREAD(10)というコマンド、SCSIの初期から存在しているのだそうで。DVD規格が策定される10年以上前のコマンドで読み出せるのは、規格の素性と実装屋の頑張りと、最初の人と当時の人が思われて感動します。

さらにREAD(10)の原型になったREAD(6)コマンドは、SASIから取り込まれたものだそうで、悠久の時を感じる物語。SASIの最大40MBなんて容量は、今ではHDDのキャッシュです。

SASIはSCSIに移行し、そのSCSIも個人向けからは姿を消しましたが、コマンド体系はATAPIに流用され、こうして今も隣にいるのです。

証明書の更新

| コメント(0) | トラックバック(0)
一度途絶えたので更新ではなく新規になりましたが、CERTUMのコード署名用証明書を取得し直しました。

そういえば証明書には秘密鍵というものがあるのでしたね。

Firefoxで手続きしたら署名でエラーが出て、何だろう何だろうと試行錯誤したところ、InternetExplorerでCERTUMウェブ上からInstallボタンを押した時に「秘密鍵がないよ」と表示されまして、FirefoxからエクスポートしてIEでインポートし、事なきを得ました。

IEがWindowsと結びついているのも善し悪しではあるのですが。

MSDNライブラリの左ペイン

| コメント(0) | トラックバック(0)
Web版MSDNライブラリを表示した状態で、Firefoxのタブを開こうとして間違ってShift+Tを押してしまいました。

するとMSDNライブラリの左ペインの幅が変わり、或いは消えました。ショートカットはTなのですね。

試しにCtrl+Tでタブを追加して元に戻ると、やはり変わっていました。修飾キーの状態は見ていないようです。

MSDNライブラリの表示状態が時々変わる謎が解けました。でもFirefox側の操作であるCtrl+Tをスクリプトに検出されるのはどうなのか。

計画昼寝 PowerSiesta Ver.0.3

| コメント(0) | トラックバック(0)
節電効果と暖かくなったことから、計画停電が基本的には終了したようです。

喜ぶべきとはいえ出遅れたことになりますが、試作していた停電回避ツールを公開します。停電を検出して、計画停電終了と同時にレジュームする、というものです。

計画昼寝 PowerSiesta Ver.0.3
PowerSiesta0.3.zip

アプリケーションのアイコンは素材屋レトロさんから拝借しました。

起動するとタスクトレイに電球アイコンが入ります。アイコンの右クリックでメニューが出るので、まずは「設定」から、Windowsのアカウントとパスワードを設定してください。

アカウント・パスワードはタスクの登録に使います。「スリープを解除」のタスクでレジュームするためです。

PowerSiesta.datファイルが計画停電のタイムテーブルです。添付は第2グループで、見てわかると思いますが、一行目が開始日、以後が時間帯。
開始日をずらせば他のグループに対応できます。

デフォルトでは1分間隔で電源状態を監視し、5回連続でバッテリー駆動となった場合にレジューム用タスクを登録します。
また計画外の停電があった場合、1時間後にレジュームします。
レジューム後にまだ停電中だった場合、計画外としての検出ロジックが再度動作するので、1時間ずつスリープすることになります。

「自前でスリープ」がONの場合、レジューム予約と同時にスリープに入ります。
OFFの場合、Windowsの電源オプションの方でスリープさせる必要があります。

レジューム予約は複数は入りません。
メニューから手動でのレジューム予約をすることもできます。ラジオの録音のために使っていたりします。

そんな感じのものです。ソースコード付き。

VC++2010のsln

| コメント(0) | トラックバック(0)
仕事でもらったVisual C++ 2010 ExpressのslnファイルをダブルクリックしてもVisual Studio 2010 Professionalから開けないので試行錯誤したところ、UTF-8のBOMがないと受け付けられないとわかりました。

Version Selectorは共通でしょうから、ExpressだからといってBOMがないとは思えないので、何かの手違いでしょうが。
<<前のページへ 1|2|3|4|5|6|7|8

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ