
SHGetFileInfoでExplorerに表示されるICONのファイル名を取得したいのですが
うまくいきません。
int main(int argc, char* argv[])
{
SHFILEINFO sfi;
::CoInitialize(NULL);
if(0 == ::SHGetFileInfo("C:\\hogehoge.txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICONLOCATION))
return -1;
printf("Icon location file = %s\n", sfi.szDisplayName);
return 0;
}
SHGFI_TYPENAMEを指定するとsfi.szTypeNameファイルタイプ名が入るのは確認できたのですが、SHGFI_ICONLOCATIONを指定してもsfi.szDisplayNameにアイコンファイル名が入ってくれません。(sfi.szDisplayName[0]='\0'で終わりになっている...)
MSDNを見る限りはこれであっているようなのですが、正しい使い方を教えてください。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
正直うちの環境(Win98 + VC++ 6.0SP4)でもうまく行かないときはあります。
ただし、SHGFI_ICONを指定しておけばとりあえずアイコンハンドルが手に入るため、それをそのままMFCのCImageListとかに保存してListViewに渡してやればアイコンは表示できてしまうので、実際問題としてあまり不都合は感じてません。
WindowsCEを引き合いに出したのは、一応ターゲットとなっているOSプラットフォームが書かれていなかったため、念のため、と思ったまでのことです。
一応MSDN Knowledge Baseで検索をかけた結果でも、特にWin32環境で制限やバグがあるような報告は上がってなかったので、SHGFI_ICONLOCATIONがうまく働かない原因はいまだ謎のままです。
No.3
- 回答日時:
ひょっとすると、SHGFI_ICONLOCATIONだけではだめで、SHGFI_ICONも一緒に指定しないとだめなのではないでしょうか。
MSDNのドキュメントには記載がありませんが。あと気になるのは、WindowsCE Ver.2.10以降ではSHGFI_ICONLOCATIONはサポートされない、とMSDNドキュメントにも書かれているので、環境によってはSHGFI_ICONLOCATIONが使えなくなっている可能性も考えられます。
この回答への補足
たびたびお付き合いありがとうございます。
SHGFI_ICONも指定しましたが、だめでした。
CEとWin32を関連付ける意味が良く解かりませんが、
となるとCEでサポートされない多くのWin32APIも使用不能の可能性がありますね。
環境によりというのはありえるかもしれませんが、
cockyさんの環境では、あのコードで問題なく取得出来るのでしょうか?
No.2
- 回答日時:
一つ確認ですが、「c:\hogehoge.txt」というファイルはHDD上に実在しますか?
もし実在しないのであれば、SHGFI_USEFILEATTRIBUTESも一緒に指定しないと、Windowsが実際に「c:\hogehoge.txt」の情報を読みに行ってしまい、ファイルが存在しないためにエラーになってしまいますから、szDisplayNameに情報が入らないのも当たり前だと思いますが。
この回答への補足
たびたびすみません。
ファイルは実在します。SHGFI_USEFILEATTRIBUTESを指定しても同じでした。
パラメータに問題があるのかと思い、ファイルの種類も取得するように
改良してみました。
#include <windows.h>
#include <shellapi.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
SHFILEINFO sfi;
::CoInitialize(NULL);
if(0 == ::SHGetFileInfo(".pdf", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICONLOCATION | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
return -1;
printf("Icon location file = %s\n", sfi.szDisplayName);
printf("Type name = %s\n", sfi.szTypeName);
return 0;
}
結果、
Icon location file =
Type name = Adobe Acrobat文書
となりました。ファイルの種類は問題なく取得できるのですが、アイコンファイル名だけなぜかできないです。
No.1
- 回答日時:
他の拡張子のファイルでは試してみましたか?
.txtのような拡張子だとアイコン情報がSystemImageListの中に入っていて、SHGFI_ICONLOCATIONを指定してもアイコンファイル名が出てこなかったように記憶してるんですが。
この回答への補足
早速の回答ありがとうございます。
.txtではなく、.pdfにしてみましたAcrobatReaderの実行ファイルあたりが
返ってきてよさそうなのですが、結果は同じです。
SHGetFileInfo APIのドキュメントにも出てきますが、
SystemImageListというのが具体的にどのようなImageListなのか
(シェルにキャッシュされているアイコンを集めたものか、shell32.dllあたり
に格納されているシェル標準で持っているアイコンを集めたものか)
よくわかっていません。
いろいろ検索して調べてみましたが、うまく行く例が見当たりません。
もし「こうすればうまく行く」みたいな例があると助かります。
すみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
多数のサブディレクトリ内のフ...
-
VBAでワークシートを引数として...
-
Windowsのバッチファイルを利用...
-
リモートのファイル存在確認
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
renameコマンドについて
-
エクセルの各セルの内容をそれ...
-
VBSでフォルダ内のテキストファ...
-
ファイル名の一部をbatで変更し...
-
ファイルを処理中に次の処理に...
-
【C++】 ファイルの名前を変更...
-
外部exeに対しての引数受け渡し
-
COPYコマンドで結合すると余計...
-
ファイルの最後に文字列挿入
-
Excel VBAの文字列と数値の分類
-
【csh】ファイルの中の値を配列...
-
バッチ(bat)でリストファイルか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
拡張子を元に戻す
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
psqlでエラーログをとりたい
-
COPYコマンドで結合すると余計...
-
エクセルの各セルの内容をそれ...
-
バッチファイルで文字列削除に...
-
ファイルの最後に文字列挿入
-
UWSCでテキストファイルを開い...
-
バッチファイル 複数ファイル...
-
renameコマンドについて
-
ファイル名の一部をbatで変更し...
-
forfilesで検索したファイルを...
-
外部exeに対しての引数受け渡し
-
Windowsのバッチファイルを利用...
-
VBSでフォルダ内のテキストファ...
-
VBAでエクセルをtxtに変換する...
-
ExcelVBA テキストファイルUNIC...
おすすめ情報