「動的に関数を生成してコールバックにuser dataを付加する」というのはおもしろいのだが、それだと DEP に引っかかるのではなかろうか。VirtualProtect() を使って、実行属性を付加する必要があるはず。
コードの動的生成といえば、Xbyak というクラスライブラリがある。実行時に最適化を掛けることができるというのがおもしろい。
GNU lightning というものもあるようだが、よく知らない。
少しずつ UnIso32.dll が知られてきたようだ。統合アーカイバ・プロジェクトにも捕捉された模様。「週刊アーカイバニュース 2009/02/19」には「いずれ公式版に取り込む予定です。」とあるので、そのうち連絡が来るのかもしれない。
なお、現時点で確認できた対応ソフトは、自作のものを除くと3個。
ちなみに UnIso32.dll は、今後以下のタイミングでのバージョンアップを想定している。逆に言えば、これらがなければ機能的には完成していると考えているため、バージョンアップの予定はない。
ドキュメントが他の統合アーカイバ DLL に比べて不親切という問題はあるが、現時点で改善の予定はない。
UnIso32.dll を作る材料は前からそろっていたのに、なぜ今まで誰も作っていなかったのだろう。
あっちこっち修正してようやく UnIso32.dll で UDF が認識されるようになった。プロジェクト全体を 4.65 に移行した方がよかっただろうか。7-zip32.dll が 4.65 に対応していればそれを使うのが楽なのだが。
あふが UnIso32.dll に対応したようだ。自分以外ではこれが第1号か。さらに情報を追っていると、「おい!あふを語ろうぜ! Ver.30 No.788」 に有用な情報を発見。「ISO/UDF ブリッジ用のコードが 7-zip 4.65 の DLL 「外」にある」とのこと。ax7z.spi for 7-zip 4.57 を見て、該当箇所を確認した。
UnIso32.dll の CPP/7zip/UI/Common/OpenArchive.cpp にも同じ修正を入れてみたが、UDF を認識しない。7-Zip 4.65 の UDF 関連のソースを入れていなかったことに気付き、それらを追加したが今度はコンパイルが通らない。
ビジュアルスタイルを使うとエディットコントロールの挙動が変わる問題を、アクティベーションコンテキストを操作することで解決できないかと考えてみた。WinXP の場合、comctl32.dll Ver.5 は WinSxS ディレクトリには入っていない。そうなると、デフォルトは comctl32.dll Ver.6 を使い、エディットコントロールだけは comctl32.dll Ver.5 を使うことはできそうにない。デフォルトは Ver.5 にしておき、エディットコントロール以外のコントロールを使うときに Ver.6 に切り替えるのはかなり手間が増えそうだ。Vista ならば、comctl32.dll Ver.5 も WinSxS ディレクトリに入っているので、Ver.6 をデフォルトにすることができそうだが。
なかなかうまい方法が見当たらない。
TortoiseSVN の DLL を見ていると、いくつかの DLL のベースアドレスがデフォルトの 0x10000000 になっていた。シェルエクステンションのような複数のプロセスからロードされるような DLL はちゃんとベースアドレスを設定しておくべきだろう。editbin /rebase でベースアドレスを設定してみた。
3MB もある TortoiseProc1041.dll も、ベースアドレスがデフォルト値のままになっている。これはかなり問題なのではと思ったが、よく確かめてみると全く問題がなかった。Advanced Windows 第5版 下 p.263 に記載があるが、リソース専用 DLL のリンク時には、/SUBSYSTEM:WINDOWS,5.0 スイッチを指定するとよいようだ。これにより、リロケートセクションは含まないが、リロケート可能な DLL が作成される。
UnIso32.dll を SpringM から呼び出したところ、例外コード 0xE06D7363 が発生。VC++ の throw がこの例外コードを利用しているらしい。(PRB: Win32 SEH API の呼び出し時に例外コード 0xE06D7363) ステップ実行すると、ISO ファイル内のディレクトリに対してファイルサイズを読もうとして例外が発生していた。ディレクトリのサイズは読まないようにすることで、SpringM でも動作するようになった。
高速再生可能な nvplayer で WMV の再生を改善してみた。WMP11 をインストールすると、nvplayer で WMV を高速再生しようとしても音が途切れるという問題がある。WMP11 の qasf.dll が速度変更に対応していないらしく、WMP10 以前の qasf.dll に差し替えると、高速再生ができるようになるという情報がある。
Vista では、システムファイルは簡単には変更できないようになっており、qasf.dll も例外ではなかった。システムの qasf.dll は差し替えずに、nvplayer だけは古い qasf.dll を使うことはできないか試してみた。「chack のブログ - COM DLL をレジストリに登録しないで使用する方法 (COM DLL の Side-by-Side 実行)」のように .manifest を使う必要があるかとも思ったが、そこまでする必要もなく、単に WMP9 の qasf.dll を C:\Program Files\SEERA\NaveTheBK\ に置くだけで、WMV の高速再生ができるようになった。
久しぶりに nvplayer のサイトを確認したところ、新バージョンの 0.6.21 が出ていた。早速インストールしてみたところ、上記の qasf.dll の差し替えを行っても、WMV の高速再生ができなくなってしまった。どうやら、nvplayer 側で WMV は高速再生しないように制限が掛けられてしまったようだ。今まで使っていた 0.6.15 に戻すことにした。
7-Zip Ver.4.65 の ISO 部分のソースを持ってきて、Ver.4.57 と差し替えたところ、タイムスタンプが 9時間ずれるのは解消された。
7-zip32.dll から ISO 関連に必要なソースのみを抽出し、UnIso32.dll として独立させることにした。
この前公開された Windows 7 β版の ISO ファイルを開いたところ、中身が見えない。正確には、README.TXT と [BOOT]\Bootable_NoEmulation.img という 2ファイルしか見えない。README.TXT の中を見ると次のように書かれていた。
This disc contains a "UDF" file system and requires an operating system that supports the ISO-13346 "UDF" file system specification.
7-Zip は UDF には対応していないということか?
IE をコマンドラインから複数回起動すると、プロセスが複数立ち上がってしまう。以下のように WSH を使うと、単一プロセスで複数ウィンドウ開くようになる。
var IE = WScript.CreateObject("InternetExplorer.Application"); IE.Visible = true; IE.Navigate("http://〜");
ISO イメージファイルを統合アーカイバ DLL で扱えないものかと以前から考えていた。XacRett.dll というものがあるが、DVD のイメージファイルは読めない。7-zip32.dll の元となっている 7-Zip は、ISO ファイルにも対応していることから、7-zip32.dll を ISO ファイルに対応させることはできないかと思い、試してみた。
7-Zip のコンパイルには VC++ 6.0 と Platform SDK Feb. 2003 が必要らしいが、PSDK をインストールするのが面倒なので、ソースをいじって VC++ 6.0 でコンパイルできるようにしてみた。まずは initguid.h をインクルードしても、INITGUID が定義されていないために問題が発生し、CPP/Common/MyInitGuid.h を修正して対処した。次に、MEMORYSTATUSEX 構造体が定義されていない問題が発生し、CPP/Windows/System.cpp を修正して対処した。これで、7-zip32.dll がコンパイルできる環境になった。
ISO 関連のファイルを 7-zip32.dll のプロジェクトに追加するだけで、7-zip32.dll で ISO ファイルが開けるようになった。しかし、ファイルを開くとタイムスタンプが 9時間ずれている。
先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 604通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 4通(0.7%)。