作成ツールの概要と技術的選定理由
目下何処の会社でも話題沸騰中であろう(若しくはもう過ぎているかも)Win7からWin10への移行で、簡単な物で良いのでデータの移行ツールを作るよう指令を受けた。だいたいマイドキュメント配下ぐらい拾えたらいいらしい(よって特殊フォルダがチョイスして移行の対象を選ぶことになる)。
安請け合いしてそのうちやろうかと軽く思っていたが実はWin7とWin10ではデフォルトの.NET Frameworkのバージョンに互換性がないので双方で間違いなく動くものとなるとネイティブコードしかないと今日気付いた。このような場合選択枝としてはVCしかない。それも現実的な方法はMFCで作ってスタティックリンクでコンパイルというパターン。
VCなんてもう何年もまともに触っていないし、その間にC++もMFCも化け物みたいなものになっているということらしい。厄介なことに手を出したかなぁと思いつつ、今日はメンタル的にダメだったので有給。じっくり自宅作業として不慣れな環境での当該ツールの作成の日としました。
本エントリはその過程で調べたことのメモ。
文字列のコピーについて
Cで文字列をコピーしようとすると普通は_strcpy_となる。オーバーフローしないように_strcpy_s_というのも最近はあるらしい。しかしどちらを使ってもエラーとなった。
VCではMSが独自に作成した文字コードに配慮した_lstrcpy_という関数を使うのが正解とのこと。引数の型からしてMSである。
「l」から始まる文字列用の関数はこちらに。
ロケールについて
ファイルを収集したその結果をテスト的にテキストに出力してみると、日本語が出ていない。調べた結果
setlocale(LC_CTYPE, "jpn");
とロケールの設定をしてやらないといけない、とのこと。そしてこの関数を呼ぶため
# include <locale.h>
とヘッダも読み込む必要がある。そういえばMFCでプロジェクト作るとき英語しか選べていなかったような。
上記テキスト出力の箇所と、パスの組み立ての部分にもこのロケールの設定は影響していた。
TCHAR fullpath[MAX_PATH];
としていたところでオーバーフローする可能性があるとしてコンパイルエラーとなっていた(確かワーニングではなかったはず)。
暫定的、雑に MAX_PATH*4 としてコンパイルを通していたが、ロケールの設定を行ったら元の_MAX_PATH_のままでコンパイルが通った。裏付けとして調べるとUNICODEを使うんだからそりゃロケールの設定は必要でしょうと。言われてみたら全くその通りなのですが。
言わなきゃ(書かなきゃ)やってくれない、この融通の利かなさが僕がVC好きな理由でもあるんですけどね。いい勉強になりました♪
おまけ
特殊フォルダの取得について。
関数としては_SHGetSpecialFolderPath_を使えばOK。
肝心の特殊フォルダの一覧ですが、このようにまとめて下さっている方が居られたのでありがたく使わせて戴きました。
SHGetSpecialFolderPathに設定できるCSIDL
これをそのままヘッダとして取り込んで、サンプルのように
SPath* p = spath;
p = p + (使いたい位置)
という風にポインタズラして欲しいものが簡単に取れますね。