2010年2月27日土曜日

内骨格 1.94 - UNLHA32.DLLの使い方

内骨格の 1.94 を公開した。
  • LZH の仮想ディレクトリの中のルートディレクトリのファイルを開くときに、間違って他のディレクトリの同じ名前のファイルを開いてしまうケースがあったのを修正。
  • コマンドラインの計算機で、long 型の整数を扱えるようにした。
  • W キーによる、ファイル名比較選択で、ファイル名の大文字小文字を区別せずに比較するようにした。

内骨格では、Pythonから、ctypes をつかって、統合アーカイバのDLLを使うようにしている。
(ただし、zip や tgz については、Pythonの標準ライブラリを使っているので、統合アーカイバを使用しない。)

    http://www.csdinc.co.jp/archiver/

"統合"といっても、アーカイブからファイルを1つ取り出すための処理は、DLLの種類ごとに
ことなっている。


内骨格のなかでは、 以下のようにしてアーカイバDLLに対応する。

-----------------------------------------------

class LhaArchiver(Archiver):
  
    def __init__(self):
        Archiver.__init__( self, "unlha32.dll", "Unlha", True )
      
    def extract( self, hwnd, filename, dst_dirname, name ):
  
        if type(filename)==type(''):
            filename = unicode(filename,'mbcs')

        if type(dst_dirname)==type(''):
            dst_dirname = unicode(dst_dirname,'mbcs')

        if type(name)==type(''):
            name = unicode(name,'mbcs')

        dst_dirname = os.path.normpath(dst_dirname)
        if dst_dirname[-1]!="\\":
            dst_dirname += "\\"

        cmdline = u'e -+1 -n1 "%s" "%s" "%s" -p' % ( filename, dst_dirname, name )
        #print cmdline
      
        buf = ctypes.create_unicode_buffer(1024)
        ret = self._call( None, cmdline, buf, 1024 )
        if ret : raise ArchiverError(ret)

-----------------------------------------------


今回の修正は、cmdline の文字列に、-p を付け加えた、というものだ。

UNLHA32.DLLのドキュメントを見たら、コマンドのオプションがたくさんあって、
正直、使い方が正しいのか自信がない。
 

2010年2月14日日曜日

INFAMOUS クリア

INFAMOUSやっとクリアした。
善人プレイだ。

ビルをよじ登ったり、ワイヤーの上を滑り降りたり、
といった超人アクションと、

敵との戦闘の自由度の高さ、

それに、ヘリコプターの追跡や囚人の移送などの
バリエーションに富んだミッション、

バランスの取れた良質なゲームだ。
日本ではそれほどセールスが振るわなかったようだが、
海外では割と売れたみたい。

2010年2月13日土曜日

内骨格 1.92 タイムスタンプがおかしくなる問題を修正

ファイルコピー時に、タイムスタンプがおかしくなる場合があるのを修正した。

SYSTEMTIME に時刻をセットして
SystemTimeToFileTime に渡す際、SYSTEMTIMEの wMilliseconds が
初期化されていなかった、という初歩的なミスだった。

Cの構造体は、とにかく memset しておけということだ。

2010年2月12日金曜日

内骨格 1.91

内骨格 1.91 を公開した。

アーカイブが開かれっぱなしになってしまう現象を修正したつもりだ。

Pythonのような、ガーベージコレクタを搭載した言語では、
ファイルのクローズ処理も、オブジェクトの自動的な破棄に
任せてしまいがちだが、ファイルのクローズ処理のような、
アプリケーションの利用者に影響の大きい処理については、
ガベージコレクタに任せず、close() を明示的に呼ぶほうがよい。

2010年2月11日木曜日

keyhac 1.13 Altキー単体押し、など

keyhac 1.13 を公開した。

以前から、ユーザさんからレポートを受けたりして
気になっていた問題を修正した。

keyhac を使用すると、
Altキーを単体で押したときに、メニューバーにフォーカスが移動しなくなったり、
秀丸 や Apsaly といったテキストエディタの、ファンクションキーの表示が、
Shift や Ctrl を押したときに切り替わらなくなったり、、、
といった、問題だ。

しばらくは、まったく理由が分からなかったが、
結局、pyauto.Window.getFocus のなかで、win32の GetFocus() を呼ぶ前後で、
AttachThreadInput を呼び出して、スレッドのインプット状態を結び付ける処理を
行っているのが影響していることがわかった。

ややこしかった!

あと、WH_KEYBOARD_LL で設定するプロシージャが、フックDLLのなかにないといけないという
勘違いをしていて、プロセス間通信を行うような実装になっていたけど、
そんな必要はないことが分かった。