コマンド文字列をハンドラにそのまま渡して、各所で(しかも何度も)パースさせるのもちょっと酷い。
そこで、コマンド文字列じゃなく、パース済みのコマンドオブジェクトを渡すようにコマンドクラスを定義する。
Command.hを追加して、
CCommandのメンバ変数はパラメータを含むコマンド文字列m_tstrCommandString、パースしてベクタに格納したトークンm_vectstrCommandToken、コマンド名m_tstrCommandName。
そしてメンバ関数は、コマンド文字列のセットとパースをするSet、メンバ変数をクリアするClear、コマンド名を返すGetCommandName。
Command.cppは、
tstringstream型のtstrsrStreamに"<<"でコマンド文字列を入力。
tstring型のtmpに">>"で出力することで、空白区切りで1つずつトークンを取り出せる。
ただし、最後に空白が入っているとEOFにならないので、tmp.size()が1以上の時にm_vectstrCommandTokenにpush_back()。
0番目をコマンド名としてm_tstrCommandNameに入れる。
ConsoleCore.hに、
CCommandオブジェクトm_ccmdCommandを追加。
ConsoleCore.cppで、
初期化時にコマンドオブジェクトをクリア。
リターンキーを押したら、GetCommandStringの前にも1回クリア。
GetCommandStringの後に取得したコマンド文字列をm_ccmdCommand.Setに渡す。
UM_CONSOLECORECOMMANDのWPARAMにm_ccmdCommandのアドレスを指定する。
レスポンスが終了したら、使ったコマンドオブジェクトをクリアする。
Console.cppで、
OnConsoleCoreCommandで、wParamをキャストして、CCommandオブジェクトポインタpCommandに格納。
これでコマンドと引数のパースは不要になったのでコメント。
pCommand->GetCommandNameでコマンド名を取得して、あとはコマンド"hello"ならOnHelloを呼ぶ。
(今回は"list"は一時的にコメントアウト)
"hello hoge foo bar "という感じでパラメータを付けて、後ろにも空白をたくさん入れる。
これでも、ちゃんと"hello"コマンドが実行される。
パラメータがパースされて、ベクタに入っている。
コマンド名は0番目の"hello"になっている。