WindowsShell系API

2017/11/28

Shell Reference
昔IE 4.0をインストールして、Active Desktopを有効にすると使えるようになったWindows Shell API。昔はIEのバージョンによって使える機能があったりなかったりしたので、敬遠されていたかもしれません。そしてそういうことがあったからか、ドキュメントも日本語化されていません。
ユーザー インターフェイス デザインおよび開発
もうWin32配下は泣きたいほどen-usとja-jpで違いがあります。翻訳の優先順位は.NET Frameworkのほうが高いということは理解できるのですが、だったら足りないところは英語版のコンテンツでもいいからぶら下げてほしいと言ってはいるのですが…。といっても嘆くだけではどうしようもないので、勝手に紹介シリーズ。今まで自作したり、どこからか拾ってきたコードを使っていたかもしれませんが、Windows Shell APIにあるかもしれませんよ。とはいえ、いくつか注意点があります。

Unicode版しかないものがある

気を付けてくださいとしか言えません。引数がLP(C)WSTRであれば、Unicodeに変換して渡すしかありません。CA2W()マクロやMultiByteToWideChar()を使ってください。あるいは最初からUnicodeプロジェクトにするとか…今はVisual C++ 2005で何も考えずに作るとUnicodeプロジェクトですしね。

Visual C++標準状態ではライブラリが足りないかもしれない

なまじVisual C++の初期設定でいろいろ付いているので、最近はlibファイルを追加しなくてもいいと思っている方もいるようです。MSDN libraryには追加するライブラリとヘッダファイルの名前がちゃんと書かれているので、忘れずに。

パス/ファイルの上限

現在サポートされているWindows 2000以降ではUnicode版の関数を使用すると_MAX_PATH以上の長いパス/ファイル名を指定することができます。
Naming Files, Paths, and Namespaces (Windows)
Windows Shell APIではMAX_PATHまでという制限があるものもあるので、気をつけましょう。長いパスまでサポートするとなると使えないことがあります。たとえばPathFileExistsという関数はMAX_PATHの範囲に入っていなくてはならないと決まっています。

実装に依存する

たとえば、パスやファイル名の解釈に問題があった場合、当然ながら実装に依存します。MFCやCRT,ATLのようにソースがあるわけでもないので、そこらへんは一応含んでおく必要があります。とはいえ、C/C++で最初に楽をするために使うのは全然ありだと思います。ものによっては問題が出たら考える位で。