ページ 11

スクリーンセーバーの作成。コマンドライン処理について

Posted: 2014年7月19日(土) 22:30
by うずら
こんばんは。
DXライブラリを使用してスクリーンセーバーを作成しているのですが、コマンドラインについて疑問点があるので教えてください。
Screen Saver Libraryは使用していません。

コマンドライン引数について

コード:

{
    char lcCmd[16];

    sscanf_s(lpCmdLine, "//%s", lcCmd);

    if (strcmp(lcCmd, "c") == 0)
    {
      MessageBox(NULL, "設定はないです", "スクリーンセーバー", MB_OK);
      return 0;
    }
  }
上のコードは、WinMain関数内で最初に行う”コマンドラインの解析”を実行しようとしたのですが、うまく動作しません。
/c のコマンドが送られてくることを想定しているのですが・・・手動で /c指定をしてもこのコードに入りません。
理由と解決策を教えてください。

外に処理すべきオプションは/sと/pだけかどうかについての情報もお願いします。

Re: スクリーンセーバーの作成。コマンドライン処理について

Posted: 2014年7月19日(土) 22:41
by みけCAT
うずら さんが書きました:/c のコマンドが送られてくることを想定しているのですが・・・手動で /c指定をしてもこのコードに入りません。
理由と解決策を教えてください。
ここで使用されているsscanf_s関数がC言語標準ライブラリのsscanfと同じ機能を持っていると仮定すると、
lpCmdLineが"/c"から始まっていると仮定しても、"//%s"という書式では"c"の部分を読み込めません。

適当な解決策は、lpCmdLineが指す文字列に"/c"が含まれているかをstrstr関数などで調べ、
存在すれば"/c"オプションが指定されたとして処理する、という方法があります。
ただし、この方法だと、例えば"hoge.exe neko/cat.txt"というコマンドラインでも"/c"オプションがあるとみなされてしまいます。

きちんとした解決策は、真面目にコマンドラインを解析して判定することです。

Re: スクリーンセーバーの作成。コマンドライン処理について

Posted: 2014年7月20日(日) 12:10
by うずら
真面目に処理しようと思ったんですが、よくわからないしそこまでしなくていいと思ったので
結局strstr関数で処理しました。みけCATさん、ありがとうございます。