【猫プロ】Windows SDK 第1部 (3) 第10章
2008.08.31 |Category …PC/プログラミング
【感想】
第10章をクリアするのに、予想以上に時間がかかってしまった。
負け惜しみに聞こえるかもしれないが
すぐに組み終わってはいた。
普通に時間は表示されていたし、実行ファイルに何も問題はなかった。
しかし、変な警告が消えなくて悪戦苦闘していた…。
タイプミスだと思い込み、見直していたりしていたら、
時間が過ぎてしまった。
動くんだし、警告なんてほっとけば?と
おっしゃる方もいらっしゃるかもしれない。
でも、一応、プログラマのはしくれですから、
警告をそのままほってなんて進めないッス。
# 時と場合によりますが。
進捗が遅いが、じっくり納得いくまで考えて、
最後までやり遂げよう。
【本日の進捗】
猫でもわかるプログラミング
Windows SDK編 第1部
第5章まで完了 10 / 350
第10章をクリアするのに、予想以上に時間がかかってしまった。
負け惜しみに聞こえるかもしれないが
すぐに組み終わってはいた。
普通に時間は表示されていたし、実行ファイルに何も問題はなかった。
しかし、変な警告が消えなくて悪戦苦闘していた…。
タイプミスだと思い込み、見直していたりしていたら、
時間が過ぎてしまった。
動くんだし、警告なんてほっとけば?と
おっしゃる方もいらっしゃるかもしれない。
でも、一応、プログラマのはしくれですから、
警告をそのままほってなんて進めないッス。
# 時と場合によりますが。
進捗が遅いが、じっくり納得いくまで考えて、
最後までやり遂げよう。
【本日の進捗】
猫でもわかるプログラミング
Windows SDK編 第1部
第5章まで完了 10 / 350
▽【発生した問題点とその解決策】
【発生した問題点とその解決策】
・関数sprintf,localtimeで警告
(章)
第10章
(詳細)
関数sprintfと関数localtimeに対して、コンパイラが下記の警告を出力していた。
> 関数sprintfに対する警告
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
> 関数localtimeに対する警告
warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\time.inl(114) : 'localtime' の宣言を確認してください。
(解決策)
Visual C++のVersion Upにより、関数sprintf,localtimeのセキュリティを強化した関数が用意されたため、
既存関数の使用を推奨しないという警告を出力するようになった模様。()
それぞれのセキュリティ強化版の関数は下記。
・spritf ⇒ sprintf_s (参考サイト(2)(3))
・localtime ⇒ localtime_s (参考サイト(4)(5))
ただし、localtimeは引数、戻り値が変更となっているため、
関数名以外にも変更が必要。(詳細は参考サイト参照)
上記を踏まえ、修正したコードを下記に記載する。
>修正前
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm *now_time;
time(&long_time);
now_time = localtime(&long_time);
sprintf(time_str,
str_org,
now_time->tm_year,
now_time->tm_mon + 1,
now_time->tm_mday,
now_time->tm_hour,
now_time->tm_min,
now_time->tm_sec
);
return 0;
}
>修正後
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm now_time; // ポインタから、変数実体に変更
time(&long_time);
localtime_s(&now_time,&long_time); // 戻り値から引数に変更
sprintf_s(time_str, // ポインタでないため、"->"から"."に変更
str_org,
now_time.tm_year,
now_time.tm_mon + 1,
now_time.tm_mday,
now_time.tm_hour,
now_time.tm_min,
now_time.tm_sec
);
return 0;
}
(参考サイト)
MSDNライブラリ
(1)CRT のセキュリティ強化
(2)sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
(3)sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
(4)localtime、_localtime32、_localtime64
(5)localtime_s、_localtime32_s、_localtime64_s
・タイマの再セットしないのか?
(章)
第10章
(詳細)
私の勝手な思い込みかもしれないが、タイマがタイムアップした際には、
再度タイマのセット処理をしてやらないと、タイムアップしっぱなしになったり、
次のタイムアップが検出できなくなると考えていた。
そのため、猫プロ記載のコードに再セット処理がないことに懸念を抱いた。
(解決策)
killTimerを呼ぶまで、指定した時間ごとに
タイムアウトメッセージが発行されるようである。
つまり、再セットは不要。
しかし、実際に使用する際はKillTimerを忘れると、
意図しないメッセージが発行される恐れがあるため注意が必要。
・関数sprintf,localtimeで警告
(章)
第10章
(詳細)
関数sprintfと関数localtimeに対して、コンパイラが下記の警告を出力していた。
> 関数sprintfに対する警告
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
> 関数localtimeに対する警告
warning C4996: 'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\time.inl(114) : 'localtime' の宣言を確認してください。
(解決策)
Visual C++のVersion Upにより、関数sprintf,localtimeのセキュリティを強化した関数が用意されたため、
既存関数の使用を推奨しないという警告を出力するようになった模様。()
それぞれのセキュリティ強化版の関数は下記。
・spritf ⇒ sprintf_s (参考サイト(2)(3))
・localtime ⇒ localtime_s (参考サイト(4)(5))
ただし、localtimeは引数、戻り値が変更となっているため、
関数名以外にも変更が必要。(詳細は参考サイト参照)
上記を踏まえ、修正したコードを下記に記載する。
>修正前
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm *now_time;
time(&long_time);
now_time = localtime(&long_time);
sprintf(time_str,
str_org,
now_time->tm_year,
now_time->tm_mon + 1,
now_time->tm_mday,
now_time->tm_hour,
now_time->tm_min,
now_time->tm_sec
);
return 0;
}
>修正後
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm now_time; // ポインタから、変数実体に変更
time(&long_time);
localtime_s(&now_time,&long_time); // 戻り値から引数に変更
sprintf_s(time_str, // ポインタでないため、"->"から"."に変更
str_org,
now_time.tm_year,
now_time.tm_mon + 1,
now_time.tm_mday,
now_time.tm_hour,
now_time.tm_min,
now_time.tm_sec
);
return 0;
}
(参考サイト)
MSDNライブラリ
(1)CRT のセキュリティ強化
(2)sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
(3)sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
(4)localtime、_localtime32、_localtime64
(5)localtime_s、_localtime32_s、_localtime64_s
・タイマの再セットしないのか?
(章)
第10章
(詳細)
私の勝手な思い込みかもしれないが、タイマがタイムアップした際には、
再度タイマのセット処理をしてやらないと、タイムアップしっぱなしになったり、
次のタイムアップが検出できなくなると考えていた。
そのため、猫プロ記載のコードに再セット処理がないことに懸念を抱いた。
(解決策)
killTimerを呼ぶまで、指定した時間ごとに
タイムアウトメッセージが発行されるようである。
つまり、再セットは不要。
しかし、実際に使用する際はKillTimerを忘れると、
意図しないメッセージが発行される恐れがあるため注意が必要。
PR
●Thanks Comments
●この記事にコメントする
●この記事へのトラックバック
TrackbackURL: