ハングアップの日々

2009年 5月分

2009/05/31

Vista SP2

 Vista SP2 をインストールしてみた。特に大きな変化は見られない。exFAT で UTC タイムスタンプが使えるようになったらしいので、そのうち調べてみるか。

iPod, MP4

 前回とは別の曲を MPEG-2 AAC から MPEG-4 AAC に変換してみたところ、今度は iPod や iTunes でも途中で切れたりすることなく普通に再生できた。しかし、aacgain を使った音量変更がが効かない場合があったりして、本当によく分からない。

2009/05/30

4GiB 超えの MP4 ファイル

 MPC 内蔵の MP4 スプリッタだと 4GiB を超える MP4 ファイルが再生できないようだ。せっかく MP4Box をビルドして、4GiB を超えるファイルが出力できるようになったというのに・・・。とりあえず、MPC 内蔵の MP4 スプリッタはオフにして、Haali Media Splitter を使うようにしたところ、問題なく再生できた。
 VFRmaniac-Softwares にある、MP4Box 0.4.6-DEV-1 を見たところ、4GiB を超える MP4 ファイルが出力できるようにパッチを当ててあった。スタティックビルドしてあり、js32.dll も不要になっている。自分でビルドした 0.4.5 は捨てて、こちらを使うことにした。

Vista SP2

 Vista SP2 をダウンロードした。ISO ファイルをダウンロードしたところ、10時間ぐらい掛かった。中を見ると、x86 版x64 版、IA64 版のそれぞれの単体インストール用実行ファイルと、自動起動用のファイルが入っているだけだった。

2009/05/29

ActivePerl

 ActivePerl 5.10.0.1005 が出ていた。とりあえずインストール。

MP4Box

 MP4Box 0.4.4 が UNC パスを扱えないのと、MP4Box 0.4.5 が 4GiB を超えるファイルを出力できないのに不満が出てきたため、自分で MP4Box をビルドしてみることにした。とりあえず以下のサイトなどを参考にした。

 最初のサイトには、js32.lib と zlib.lib をビルドすれば良さそうなことが書かれているが、VC6 のリリースビルドでは、他に、libjpeg.lib, libpng.lib もビルドが必要だった。パッチを当ててビルドしたところ、無事 4GiB を超えるファイルも出力できる MP4Box ができた。

2009/05/28

URL memo

2009/05/27

URL memo

2009/05/26

URL memo

 雑多なメモ。

VersaPro UltraLite VS

 NEC から VersaPro UltraLite VS というものが発表されたが、これはかなり欲しいかも。工人舎 SC を持っているので、すぐに買おうとは思わないのだが、Windows 7 が出たら、VAIO P や VersaPro VS あたりの軽量 PC を検討するかも。

2009/05/25

VC++ 2003, WTL

 VC++ 2003 で WTL を使っていると、IntelliSense が効かない場合があるのが気になっていた。特に気になるのが、メッセージマップの後ろが、クラスの外として判断されてしまう点。「VC++6.0でWTLを使った時にClassViewがバグる」によると、BEGIN_MSG_MAP_EX() を使うと、END_MSG_MAP() との対応が取れず、IntelliSense がうまく動かないが BEGIN_MSG_MAP() ならば問題ないとのこと。BEGIN_MSG_MAP_EX() を BEGIN_MSG_MAP() に変更したところ、VC++ 2003 でもまともになった。なお、VC++ 2005 ならば、BEGIN_MSG_MAP_EX() でも問題なさそうだ。
 この対策を行っても、WTL で定義されているクラスに対して、IntelliSense が効かない場合があるが、それについては「Using WTL with Intellisense」を試すのが良さそうであるがまだやっていない。

2009/05/23

リダイレクト(その3)

 fprintf() をフックして、fflush() を呼ぶようにしたところ、進捗表示がリアルタイムに読み取れるようになった。件のソフトが msvcrt.dll に動的リンクしてあったため、うまい具合にフックを仕込むことができたが、CRT を静的リンクしていたらこのやり方は使えなかった。
 件のソフトを調べてみたところ、VC++ 6.0 ではなく、gcc (mingw) を使ってコンパイルしてあったようだ。

URL memo

iPod, MP4

 とあるソフトに MPEG-2 AAC を MPEG-4 AAC に変更する Perl スクリプトが同梱されている。それを使って、iPod で再生できなかった MP4 ファイルを処理してみたところ、再生できるようになった・・・かに思えたが、曲の最後が切れてしまった。iTunes 上で再生しても、同じように曲の最後の 10秒弱が切れてしまった。
 原因が分からなかったため、結局 iPod で聞くには、変更前のファイルを iTunes で AAC に再エンコードしている。

2009/05/22

リダイレクト(続き)

 標準エラー出力がバッファリングされてしまう件の続き。初めは、CreatePipe() で作成したパイプのバッファにたまっているのかと思っていたため、WriteFile() にでもフックを掛けて、FlushFileBuffers() を呼ぶようにしようかと考えていたがどうも違っていたようだ。
 件のソフトは msvcrt.dll の fprintf() で進捗を出力している。そこで CRT のソースを見たところ、fprintf(stderr, ...) の出力先がコンソールの場合はバッファリングされないため、すぐに画面に表示されるが、パイプを使ってリダイレクトした場合は、4KB のバッファが使われるようになっていた。fprintf() をフックして、fprintf() が呼ばれたら、その直後に fflush() を呼ぶようにすれば良さそうだ。

 さて、API フックのやり方を調べないと。

2009/05/21

TerminateProcess

 Windows には、指定プロセスを強制終了させる TerminateProcess() という API がある。しかし、DLL に対する終了通知が行われないため、DLL が管理するデータに不整合が発生する可能性がある。また昨日の調査では、コンソールプログラムの終了は TerminateProcess() 以外の方法で行っていることが分かった。指定プロセスを安全に終了させる方法はないかと思い、次のようなコードを作ってみた。

BOOL ExitRemoteProcess(HANDLE hProcess, UINT uExitCode)
{
    LPTHREAD_START_ROUTINE pfnExitProcess =
            (LPTHREAD_START_ROUTINE) GetProcAddress(
                    GetModuleHandle(_T("kernel32.dll")), "ExitProcess");
    if ((hProcess != NULL) && (pfnExitProcess != NULL)) {
        HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
                pfnExitProcess, (LPVOID) uExitCode, 0, NULL);
        if (hThread != NULL) {
            CloseHandle(hThread);
            return TRUE;
        }
    }
    return FALSE;
}

 CreateRemoteThread() を使って、ExitProcess() を指定プロセス上で実行している。ExitProcess() の引数はたまたま1つなので、CreateRemoteThread() から直接 ExitProcess() を呼ぶことができる。どうやら問題なく動くようだ。

 ググってみたら、"Dr. Dobb's | A Safer Alternative to TerminateProcess() | July 1, 1999" という記事が見つかった。基本的な概念は上のコードと同じだが、エラーチェックなどが強化されている。

リダイレクト

 とあるソフトの標準エラー出力をリダイレクトして、GUI プログラムから読み取ろうとしているが、どうもうまくいかない。そのソフトは、処理の進捗を fprintf() を使って標準エラー出力に出しているが、その際、バッファをフラッシュしていない。バッファは 4KB あるようで、そのバッファが一杯になるまで読み取れない。そのせいで、進捗が全く分からない。リアルタイムで出力を読み取るにはどうしたらよいのやら。

2009/05/20

コンソールプログラムの終了方法

 コンソールプログラムの終了方法について調べてみた。コンソールプログラムを Ctrl+C や、コンソールウィンドウを閉じることで終了させた場合に、DLL_PROCESS_DETACH が呼ばれるかを確かめた。
 ログを取ってみたところ、まず DLL_THREAD_ATTACH が呼ばれてから DLL_PROCESS_DETACH が呼ばれることが判明した。CreateRemoteThread() を使って ExitProcess() を実行しているのだろうか。少なくとも、TerminateProcess() で終了しているのではないということが分かった。

2009/05/18

Ctrl+Break

 GUI プログラムからコンソールプログラムに対して、Ctrl+C や Ctrl+Break を送信するにはどうすればよいのだろうかと思い、少し調べてみた。楽に済ませるなら、AllocConsole() で、コンソールを割り当ててしまうか。

2009/05/14

URL memo

2009/05/12

WTL

 ダイアログボックスベースのちょっとしたソフトを作ろうと思っている。MFC を使うのは大仰だし、Win32 API で作るのはちょっと面倒くさい。何かいいものはないかと考えたところ、WTL というものを思い出した。前から一度は使ってみようと思っていたが、今まで使う機会がなかった。
 とりあえず、「ATL/WTLによるWindowsプログラミング 第2版」などを参考に進めてみたい。

MS Shell Dlg

 MS Shell Dlg とは何だろうと思い、調べてみた。

2009/05/09

MP4Box、字幕

 「TSの字幕をmp4に保存する (動画物置(旧FEZ物置))」を参考に、字幕を .mp4 に入れてみた。
 再生ソフトは MPC や VLC が対応していた。ただし、MPC はレンダラを適切に選択しないと字幕が表示されないようだ。
 字幕入りの複数の .mp4 を MP4Box で結合してみたところ、結合点で字幕がどんどんずれていってしまった。残念ながら、:dur オプションを付けても、字幕には反映されないようだ。MP4Box を使って、複数の .mp4 を結合するときは、字幕がない状態で結合し、それに合わせて字幕ファイル (.srt) の時間情報を修正してから、最後に字幕を付加しないといけない。
 MP4Box で .srt を mux すると、末尾の字幕が2回表示されてしまっているように見える。動画の長さもその分長くなったように見えている。

2009/05/08

URL memo

2009/05/01

MP4Box

 MP4Box で mp4 ファイルを結合しようとしたら、ファイル出力の段階で落ちてしまった。どうも出力サイズが 4GB を超えると落ちるようだ。「mp4box のバグ - oops の日記」によると、0.4.5 のバグらしい。1つ古い、0.4.4 を使ったところ、4GB を超えた場合でも問題なく結合できた。

spam

 先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 2121通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 10通(0.5%)。spam が大幅に増加中。

メール受信状況 2009/04


Copyright (C) 2009 K.Takata