お二方、参考になる回答ありがとうございました。私は次のように書きました。この実行可能ファイルを呼び出すのは私たちのコードだけであり、引用符を付けることはありませんが、追加するのはそれほど難しくありません。また、引数の間に複数のスペースがあるとうまくいかないかもしれませんが、繰り返しになりますが、他の人がこのプログラムを使用していることを心配する必要はありません。これは学術的な目的のためだけです。改善が必要だと思われる場合は、この投稿を編集し、コメントでそれを正当化してください。
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow ) {
assert(lpCmdLine != NULL);
int argc = 1, ret = 0;
std::vector<char*> args;
// Copy the entire array to a regular cstr
int cmdLineLen = _tcslen(lpCmdLine);
char *argv = new char[cmdLineLen];
wcstombs(argv,lpCmdLine,cmdLineLen);
args.push_back(&argv[0]);
// Replace spaces with nulls to effectively create array of cstr
for(int i=0; i<cmdLineLen; i++){
if(argv[i] == ' '){
argv[i] = '\0';
args.push_back(&argv[i+1]); // Keep track of the first char in each word
argc++;
}
}
// argv[argc] should be NULL.
args.push_back(NULL);
try{ // Run the program
ret = main(argc,&args[0]);
}
catch(...){
// TODO: Report error here. Commented code works OK for WinCE .NET
// delete argv;
// throw;
ret = -1;
}
delete argv;
return ret;
}
また、興味のある方は、コマンドラインでこれを実行してください
>myprogam.exe -a shortargument -b -c
以下をlpCmdLineに入れます
"-a shortargument -b -c"
また、私の最初の推測では、argv を delete[] する必要がありました (新しい char[] を作成したため) が、これを実行すると、プログラムに致命的なエラーが発生しました。上記に切り替えると、うまくいきました。new->delete/new[]->delete[] ルールに違反していませんか?