【勝手に修正版】コマンドライン文字列を解析して取得【HSP】

【勝手に修正版】コマンドライン文字列を解析して取得【HSP】

※2014/08/27 20:00 頃 追記
Unicode であるにもかかわらず、文字数=バイト数で考えてました。ごめんなさい。修正しました。
ついでに、デバッグモード実行時に、obj が引数に加わるのを除外するプログラムにしました。
※追記ここまで


この程度ならモジュールにする必要ないかなーと思い、モジュールではなくしてしまいましたが、そこん所はお好みで。変数名や表示やスペースの使い方が違うのも私の勝手。
じゃあなにを修正したのかというと、「ポインタら文字列に直すときの長さ」です。

元のサンプルではテキトーに長さ 256 となっていますが、実際、コマンドラインで、1つ の引数の長さが 256 を超えてはいけないという制限はありません。それ以上の長さの文字列が来たら、途中で切れてしまいます。(自動で拡張してくれるかどうか、実際確かめてみたけど、だめでした。)

なので、コマンドライン文字列のポインタが取得できている時点で文字列の長さを取得するようにしました。

#include "kernel32.as"
#include "shell32.as"

// 
// メイン
// 
Argc = 0
Argv = ""

// コマンドライン文字列のポインタ取得
GetCommandLineW
pCommandLine = stat
// コマンドライン文字列の長さ取得
lstrlenW pCommandLine
CommandLineLength = stat
// 分解したコマンドライン文字列のポインタ配列取得
CommandLineToArgvW pCommandLine, varptr(Argc)
dupptr pArgv, stat, Argc * 4, 4

// 実行ファイル名
dupptr Args, pArgv(0), (CommandLineLength + 1) * 2, 2
Argv(0) = cnvwtos(Args)
// コマンドライン引数 1つ ずつ処理
#ifdef _debug
Argc--
repeat Argc - 1, 2
#else
repeat Argc - 1, 1
#endif
// 「ポインタ」から「文字列」に
dupptr Args, pArgv(cnt), (CommandLineLength + 1) * 2, 2
Argv(length(Argv)) = cnvwtos(Args)
loop

// ポインタ配列 解放
LocalFree varptr(pArgv)

// 後はご自由にどうぞ
repeat Argc
mes "Argv[" + cnt + "] = " + Argv(cnt)
loop


本当は、ポインタ配列のポインタを CommandLineToArgvW で取得しているので、それを変数に入れて取っておけば、LocalFree で varptr する必要ないんだけど、変数増えるとゴチャゴチャしてくるのでこうしました。

今回はここまでにしますが、次回はさらにオプションにも対応したいですね。
「HSP 版 getopt」! みたいな。

オプションそのものに関する資料がフフっても全然見つからないんだよなぁ…。やっと見つかったのがこれ。
GCC とかでも同様の資料あると思うんだけど、検索しても、GCC 本体のオプションが出てきちゃってダメなんだよなぁ…。どう探せばいいのか…。
これみて分かったことは、
  • 「1文字オプション」と「キーワードオプション」がある
  • 「引数付き」と「引数なし」がある
  • 「引数付き」の「キーワードオプション」では、オプションと引数の間の「スペース」の代わりに「イコール」を使うことができる ※2014/08/27 21:00 頃 修正
  • 「引数付き」の「1文字オプション」では、オプションと引数の間の「スペース」を省略できる
  • 「--」オプション以降は全て文字列として扱われ、オプションではなくなる
他に、先頭以外、「ハイフン」の代わりに「アンダーライン」が使えるとか書かれていたりするけど、これは実際やってみたら意味なかったので、独自の仕様みたい。その他はいくつかのアプリケーションで動作を確認しているので標準の仕様なのかと思いますたぶん。


じゃあ今回はこのへんで。またいつか~

↓ブログランキング投票 (クリック) お願いします~