最終更新 2003 07/26
サンプルのダウンロード → API_GetCommandLine.lzh(37k)
全ソースコード
GetCommandLine 関数
対応しているバージョン
95, 98, Me, NT3.1以降, 2000, XP
使用するヘッダとライブラリ
winbase.h
kernel32.lib
|
メモ帳なんかのように、テキストファイルをメモ帳のアイコンにドロップして
起動すると、ドロップしたテキストファイルを開いた状態で起動できます。
これはコマンドラインを調べれば実現できます。
コマンドラインは WinMain() の引数の LPSTR lpCmdLine に
全部のコマンドラインをくっつけた状態で入っています。
他にコマンドラインを取得する方法として、GetCommandLine 関数を使う
方法があります。
GetCommandLine() 関数の方は、自分自身のパスも一緒に格納されています。
自分自身のパスを取得したい時に使えそうですが、それならそれ専用の
GetModuleFileName() 関数を使う方が良いです。
コマンドラインが複数ある場合はそれぞれスペースで区切られています。
ところが、ひとつのコマンドラインの中にスペースが混ざっている場合は
コマンドラインの両端に ”(ダブルクォーテーション)がついています。
例
"C:\Program Files\Test.txt" D:\Test2.bmp C:\Windows\Notepad.exe
こんな状態でコマンドラインの文字列が格納れています。
一つ目のコマンドライン "C:\Program Files\Test.txt" は
Program Files の中にスペースが入ってるので "" でくくられています。
このコマンドラインをひとつひとつ分割する作業がかなり面倒です。
簡単に分割してくれる関数がないかと探したのですが、撃沈しました・・・。
見つからないなら仕方がないので、自前で分割作業を行います。
多分、もっとよく探せばあると思います。
あるなら用意されている方を使った方が良いです。
ソースを書く時間と、自分の書いたソースをデバッグしている時間を
考えると、元からあるものを使う方がずっと作業効率が良いからです。
サンプルソースの場合、SplitCommandLine() 関数を呼んで
コマンドラインを取得したら、EraseCommandLine() 関数を呼んで
コマンドライン取得に確保したメモリを解放しなければなりません。
これだと、もし EraseCommandLine() 関数を書き忘れた場合
メモリがリークする事になります。
安全性の面でアレなので、コマンドラインを確保して解放するという
一連の動作はクラスにまとめた方が良いです。
コマンドライン管理クラスを作る
|