まだまだ修正する気満々だったのですが、リリースバイナリに未反映の修正がたまりすぎると不具合が発生した時、マスターと開発版をまた別管理しなくちゃいけなくなったります。それは避けたいので、4月になったし、いい加減リリースすることにしました。
さて、今回の修正は以下のとおりです。
OLEオブジェクトからLuaオブジェクトへの変換が日付型などでパニックを起こす不具合を修正
今回、GopherLua 向けの OLE用関数を zetamatta/glua-oleに分離したのですが、その際、まがりなりにも一通りの型を使えないとまずいだろうとやってる時に問題を確認しました。
Luaの数値が実数として OLE に渡されるべきだったのに、整数として渡されていた。
これは理由があって、trash.lua で
local shellApp = nyagos.create_object("Shell.Application")
local trashBox = shellApp:NameSpace(10)
というコードがあるんですが、これ実数をそのまま渡すと〈ゴミ箱〉を表す定数「10」が「10.0」になって NameSpace メソッドに期待どおりの ID番号が渡りません。それで実数ではなく整数を使っていたのですが、これは Lua の仕様としてはアウトです。なので、まずは通常動作ではあくまで実数を使うようにしました。
Lua: 関数: nyagos.to_ole_integer(n)
を追加
shellApp:NameSpace に整数を渡すために、同関数を作りました。この関数の戻り値は整数値をカプセル化した UserData です。OLE 関数側で中身の整数を開封します。
Lua: OLEObject に列挙用オブジェクトを得るメソッド _iter()
を追加
zetamatta/glua-oleを作る時に FileSystemObject を使ってテストしようと思ったら、コレクションを列挙するメソッドがなくて、ファイルリストの表示すら出来ないことに気づきまして。
Lua: OLEObject を開放するメソッド OLEObject:_release()
を追加
Excel でテストしている時、Excel のゾンビプロセスが残ることから気づきました。通常の lua53.dll だと __gc
が呼ばれるのでそこで自動解放できるんですが、GopherLua では Go 言語の Garbage Collection にゆだねているので、リソース解放する場所がありません。それでやむをえず、このようなかっこ悪い方法で逃げました。
trash.lua が COM の解放漏れを起こしていた問題を修正
これは先の _release
メソッドを呼ぶようにしただけです。これを呼ばなくても、特に実害はないようですが。
Lua: create_object
生成された IUnkown インスタンスが解放されていなかった不具合を修正
これも Excel テスト中に確認しました。
「~ユーザ名
」の展開を実装
せっかく "os/user"
パッケージがあって、ユーザのホームディレクトリが簡単に取得できるようになったので、使わなきゃ損ということで
バッチファイル以外の実行ファイルの exit status が表示されなくなっていた不具合を修正
昔の "os/exec" では、非0なプロセスが終了した時に得られる error は Error() で 「exit status %d
」みたいな文字列になってたような気がするんですが、いつの間にか、そういうのなくってて、動作が変わってしまい…いや、勘違いかな?
%COMSPEC%
が未定義の時に CMD.EXE を用いるエイリアス(ren,mklink,dir,...)が動かなくなっていた不具合を修正
まさか、COMSPEC が未定義な環境があるとは思いもしませんでした。
全角空白(%U+3000%)がパラメータの区切り文字と認識されていた点を修正
まさか unicode.IsSpace
で全角空白が true になるとは…
(#359) -c,-k オプションで CMD.EXE のように複数の引数をとれるようにした
この辺から
存在しないディレクトリ\何か
を補完しようとすると The system cannot find the path specified.
と表示される不具合を修正
エラーも何も出ないのが正しい挙動です(でも、ビープ音くらいはあってもよかったかも)
(#360) 幅ゼロやサロゲートペアな Unicode は<NNNNN>
と表示するようにした
まさか、コマンドプロンプトでサロゲートペアな Unicode が表示できないとは思いませんでした。
サロゲートペアな Unicode をそのまま出力するオプション --output-surrogate-pair を追加
今はダメですが、将来コマンドプロンプトでサロゲートペアな Unicode が表示できるようになった時、それができるかを試験できるよう、今のうちにオプションを追加しておきました。
suコマンドで、ネットワークドライブが失なわれないようにした
現在のネットワークドライブをリストアップしてから
CMD.EXE /S /C ""net use Z: "\\vmware-host\Shared Folders" & … & cd "Z:版のカレントディレクトリ" & nyagos.exe "
みたいな呼出しを shellexecute 関数の verb=runas でやってます。
内蔵の mklink コマンドを実装し、CMD.exe /c mklink
のエイリアス mklink
を削除
念願のジャンクションの作り方が分かったので
(#197) ソースがディレクトリで -s がない時、ln
はジャンクションを作成するようにした
mklinik /J
ができるようになったので、ln
の方も実装します。ln foo ~/
で済むことが、mklink
だと mklink /J ~\foo .\foo
と書かなくちゃいけないので。
ゼロバイトの Lua ファイルを削除(cdlnk.lua, open.lua, su.lua, swapstdfunc.lua )
0バイトのファイルを残していたのは、以前のバージョンのファイルが残っていた場合に機能しないように上書きするためなんですが、もうそろそろ残ってる環境もないだろうということで消しました。
UNCパスがカレントディレクトリでもバッチファイル・ren,assoc,dir,for を動くようにした
CMD.EXE ってカレントディレクトリが UNC パスだと、勝手に C:\Windows
に chdir してしまうため、相対パスがかわって期待通りにコマンドが動かなくなってしまいます。そこで、直前にUNCパスのトップに空いているネットワークドライブを自動マウントして、操作対象のファイルとの相対パスを維持するようにしました。ドライブは実行後にアンマウントします。
(#363) nyagos.alias.COMMAND="string" 中では逆クォート置換が機能しない問題を修正
言われるまで気づきませんでした。
(#259) アプリケーションをダイアログで選んでファイルを開くコマンド select
を実装
select book1.xlsx
とかやりますと、こんなん出るんですわ
これ背景としては、わたくし Visual Studio が複数バージョン入った環境で仕事をしていて、プロジェクトによって起動させるべきバージョンが違うのですよね。で、GUI だと右クリックよりの「プログラムから開く」で起動バージョンが選べるので、コマンドラインからでもできるようにしました。
diskfree
の出力フォーマットを修正
ディスクのファイルシステムと、ラベルも表示するようになりました。こんな感じです。
以上です