(2010/11/08 01:46)
先日、Vistaちゃんでショートカットファイル(.lnk)を ShellExecute()
で起動しようとしたところ、渡せるパラメータ(lpParameters
)の長さが極めて短いことを思い知りました。(たぶんバグ)
そこで、具体的に何文字までいけるのかを調べてみました。
# ちなみに下記検証に使用した Vistaちゃんは Home Premium SP1 です。SP2 を当てたら挙動が変わる気がします。
起動対象 | 方法 | OS | コマンドライン長 ※3 | 引数長 ※4 |
非ショートカット (.exe、.bat 等) | ShellExecute | XP | a) 2082文字を超えるとエラー | - |
Vista |
DropHandler ※1 | XP | a) 2082文字を超えるとエラー ※2 |
Vista |
ショートカット (.lnk) | ShellExecute | XP | - | b) 257文字を超える場合、258文字以降を無言で切り捨てる |
Vista | c) 259文字を超えるとエラー |
DropHandler ※1 | XP | a) 2082文字を超えるとエラー ※2 | - |
Vista | - | d) 265文字を超えると無言でエラー (処理がなにも起動されない) |
※1 … 上表における「DropHandler」は、エクスプローラで該当ファイルに別ファイルをドロップした場合の挙動を意味する。
※2 … XPの場合は「アクセスが拒否されました。」、Vistaの場合は「システム コールに渡されるデータ領域が小さすぎます。」と表示される。
※3 … 「コマンドライン長」は、 GetCommandLine()
で取得できるコマンドライン文字列全体の長さを意味する。つまり実行ファイルの名前(argv[0]
)も含まれる。
※4 … 「引数長」は、実行ファイルの名前を除いた純粋なパラメータ部分の長さを意味する。
関係しそうな定数。
定数 | 値 | 説明 | 定義 |
INTERNET_MAX_URL_LENGTH | 2084 | WinInetがサポートするURLの最大長 (終端のNULL文字分も含む) | wininet.h |
MAX_PATH | 260 | Windows SDK におけるファイルパスの最大長 (終端のNULL文字分も含む) | windef.h 他 |
# Windows SDK のヘッダをのぞいていると、ちょくちょく 『char file[MAX_PATH + 1];
』 みたいなのがあって若干残念な気がします。
関係しそうな資料。
関連記事。
# 2010/11/16 追記。CreateProcess() ならば、パラメータとして32768文字まで渡せるようです。
- lpCommandLine [in, out, optional]
The command line to be executed.
The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters.