SGEで自分自身を多重起動させる。

gui.getexename()を使えば、exeのファイル名を取得できる。"SGE.exe"と決め打ちしてもいいが、ゲームとして世に出す時には別のファイル名にしてあることも多いだろうから、最初から変えても大丈夫なようにスクリプトを組むべし。

local exe = gui.getexename()

しかし、先頭に\がついているので、それを取り除かなければならない。

exe:gsub("\\", "")

その後で、gui.shell()に渡す。

gui.shell(exe)

そうすると自分自身を多重起動する。後はlock.singleton()で動作を別にする。

root.lua

function second_line()
	gui.okbox(gui.getcommandline(), "second")
	os.exit()
end

lock.singleton(second_line)

gui.create(640, 480)
local exe = gui.getexename()
gui.okbox(exe, "exe")
exe:gsub("\\", "")
gui.okbox(gui.getcommandline(), "first")
gui.shell(exe)
while true do
	gui.doevents()
	c = gui.getclick()
	if c then os.exit() end
end

その他

gui.shell(gui.getcommandline())
gui.shell(encoding.utf8_to_ansi(gui.getcommandline()))

これはうまくいかない。作業ディレクトリが効いているのか、フルパス指定しても無視される。念のために文字コードansiに変換しても同様。

gui.shell(exe.." command")

これもうまくいかない。コマンドライン渡しはできないようだ。
ただし。

SGE.exe command

上記内容のバッチファイル(例えば"sge.bat"と命名する)を同じディレクトリに置き、gui.shell("sge.bat")と実行すると、コマンド窓が開くがSGE.exeの多重起動に成功する。
しかもコマンドライン渡しが可能になる。この場合、gui.getcommandline()の返り値が"SGE.exe command"と言う文字列になる。
batファイルを作ってそれを起動するならば、コマンドライン渡しが可能になる、が、いちいちコマンド窓が開くのが辛い。
コマンド窓はショートカットを作成しそこから起動すれば最小化したまま、終了時に自分を消すこともできるのだけれども、今度はショートカットによる起動がSGEからはできない。痛し痒しである。

gui.getcommandline()の挙動

直接SGE.exeを起動させた場合、フルパスが返ってくる。
一旦コマンド窓を立ち上げてから起動させると、そのカレントディレクトリからの相対パスが返ってくる。
コマンドラインが指定してあれば、どちらの場合でもそれがついてくる。生なので、加工が必要。

lock.singleton()の注意点

lock.singleton()に関数を渡す時は、その関数の中にos.exit()を何らかの形で入れておくべし。
そうでないと、関数が終了した後何事もなく本来の動作が動いてしまうので。