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を見る限りはこれであっているようなのですが、正しい使い方を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

正直うちの環境(Win98 + VC++ 6.0SP4)でもうまく行かないときはあります。


ただし、SHGFI_ICONを指定しておけばとりあえずアイコンハンドルが手に入るため、それをそのままMFCのCImageListとかに保存してListViewに渡してやればアイコンは表示できてしまうので、実際問題としてあまり不都合は感じてません。

WindowsCEを引き合いに出したのは、一応ターゲットとなっているOSプラットフォームが書かれていなかったため、念のため、と思ったまでのことです。
一応MSDN Knowledge Baseで検索をかけた結果でも、特にWin32環境で制限やバグがあるような報告は上がってなかったので、SHGFI_ICONLOCATIONがうまく働かない原因はいまだ謎のままです。
    • good
    • 0
この回答へのお礼

解決になりませんでしたが、お付き合いくださいましてありがとうございました。

お礼日時:2001/03/02 22:17

ひょっとすると、SHGFI_ICONLOCATIONだけではだめで、SHGFI_ICONも一緒に指定しないとだめなのではないでしょうか。

MSDNのドキュメントには記載がありませんが。

あと気になるのは、WindowsCE Ver.2.10以降ではSHGFI_ICONLOCATIONはサポートされない、とMSDNドキュメントにも書かれているので、環境によってはSHGFI_ICONLOCATIONが使えなくなっている可能性も考えられます。

この回答への補足

たびたびお付き合いありがとうございます。

SHGFI_ICONも指定しましたが、だめでした。

CEとWin32を関連付ける意味が良く解かりませんが、
となるとCEでサポートされない多くのWin32APIも使用不能の可能性がありますね。

環境によりというのはありえるかもしれませんが、
cockyさんの環境では、あのコードで問題なく取得出来るのでしょうか?

補足日時:2001/03/02 18:08
    • good
    • 0

一つ確認ですが、「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文書

となりました。ファイルの種類は問題なく取得できるのですが、アイコンファイル名だけなぜかできないです。

補足日時:2001/03/02 08:24
    • good
    • 0

他の拡張子のファイルでは試してみましたか?


.txtのような拡張子だとアイコン情報がSystemImageListの中に入っていて、SHGFI_ICONLOCATIONを指定してもアイコンファイル名が出てこなかったように記憶してるんですが。

この回答への補足

早速の回答ありがとうございます。
.txtではなく、.pdfにしてみましたAcrobatReaderの実行ファイルあたりが
返ってきてよさそうなのですが、結果は同じです。

SHGetFileInfo APIのドキュメントにも出てきますが、
SystemImageListというのが具体的にどのようなImageListなのか
(シェルにキャッシュされているアイコンを集めたものか、shell32.dllあたり
に格納されているシェル標準で持っているアイコンを集めたものか)
よくわかっていません。

いろいろ検索して調べてみましたが、うまく行く例が見当たりません。
もし「こうすればうまく行く」みたいな例があると助かります。
すみません。

補足日時:2001/03/02 00:24
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qデスクトップのアイコンがなくなった

いつもクイック起動にデスクトップのアイコンがあってたくさんファイルを開けててもデスクトップのアイコンをクリックするとすぐにデスクトップの画面に戻っていたのですが、
この前、デスクトップのアイコンが邪魔だったのでゴミ箱に入れてしまいました。それからというものデスクトップのアイコンが見つかりません。ファイルの検索をして「デスクトップ」って入れても出てきません。デスクトップのアイコンを出すにはどのようにすればいいのでしょうか?
宜しくお願いします。

Aベストアンサー

こちらのFAQが参考になるかも。

できるネット - [クイック起動]にあった[デスクトップの表示]アイコンが消えてしまったが、どうすれば元に戻せるか
http://dekiru.impress.co.jp/faq/win/win001.htm
秘密結社 - 006 クイック起動の「デスクトップの表示」アイコンを削除してしまった場合の復帰方法
http://www.efix.co.jp/sc/himitu/006.htm


> ファイルの検索をして「デスクトップ」って入れても出てきません。

あれ?
サブフォルダを探すのチェックが無かったから失敗…とかなら良いのですが。

参考URL:http://dekiru.impress.co.jp/faq/win/win001.htm, http://www.efix.co.jp/sc/himitu/006.htm

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

QデスクトップにIEのアイコンを表示したい

 XP Home を使用しています.
 デスクトップにIE のアイコンを表示したいのですが,やり方がわかりません.

 デスクトップを右クリック->プロパティ->デスクトップタブ->デスクトップのカスタマイズボタンで表示できると聞いたのですが,その画面からはIE のアイコンを表示できませんでした.

 ショートカットアイコン以外でIE のアイコンをデスクトップに表示する方法はありますでしょうか.

Aベストアンサー

XP SP2の場合
http://pasofaq.jp/windows/desktop/desktopcustomizeieicon.htm

XP SP3の場合
http://pasofaq.jp/windows/desktop/desktopcustomizeieiconsp3.htm

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qデスクトップのマイコンピュータのアイコンが・・・

デスクトップのマイコンピュータの

アイコンはデスクトップ上になくても

不便さはないかな?と

デスクトップのアイコンを少しでも少なくしたい

気持ちを優先し、デスクトップ上から削除しました。

ところが、もと通りにデスクトップ上に、

マイコンピュータのアイコンを表示させる方法が

わからず、ご教授願います。

【一度、削除したデスクトップ上のマイコンピュータの

アイコンを再表示させる方法を教えてくださいませ。】

Aベストアンサー

ディスクトップ画面→右クリック→プロパティ→ディスクトップ→全般のディスクトップアイコンをチェックしては如何でしょうか。

Qc 文字列の終わりを示すコードは 0x00 それとも '?0' , '/0' ?

cの本を参考にプログラムをかじっているのですが、
本には '?0' と書いてあり、それで出力してみるとうまくいかず
いろいろインターネットで調べたのですが、
0x00 だとうまくいきました。
良くわからないのですが、なぜでしょう?

スミマセンおねがいします。

Aベストアンサー

文字列の最後には'\0'(NULL)が必要になります。
0x00で上手くいったのは、
NULLも「整数値の0」だからです。

QiPhone6 アイコンをデスクトップに表示してますが、子供が勝手にアマゾンのアイコンを消してし

iPhone6


アイコンをデスクトップに表示してますが、子供が勝手にアマゾンのアイコンを消してしまい、デスクトップから消えました。
再ダウンロードしようとしたら、ダウンロードがでずに、開く、しかないので、デスクトップ上のアイコンがなくなってるだけのようです。デスクトップにアイコンを再表示させる方法を教えて下さい。
一応、全部見たんですが、デスクトップにアイコンないです。

Aベストアンサー

失礼しました!デスクトップと書いてあったので
パソコンだと思って勘違いしました!
iphoneのホーム画面のことですね!
iphoneをホーム画面にして左にフリックすると
一番上に検索画面がでますので『Amazon』と
入力してください。
Amazonのアプリが出てきたと思います。
そのアイコンの右側にどこに入ってるか
表示されますのでそこからデスクトップに
置いてあげてください。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

QiPhone6を使ってます。 アイコンをデスクトップに表示してますが、子供が勝手にアマゾンのアイコン

iPhone6を使ってます。
アイコンをデスクトップに表示してますが、子供が勝手にアマゾンのアイコンを消してしまい、デスクトップから消えました。
再ダウンロードしようとしたら、ダウンロードがでずに、開く、しかないので、デスクトップ上のアイコンがなくなってるだけのようです。デスクトップにアイコンを再表示させる方法を教えて下さい。
一応、全部見たんですが、デスクトップにアイコンないです。

Aベストアンサー

Amazonアプリのアイコンが表示されないということでしょうか?
◆Amazonアプリ
https://itunes.apple.com/jp/app/amazon-apuri/id374254473?mt=8

原因は分かりませんが、稀にホーム画面上にアイコンが表示されなくなることがあります。
その場合、App Storeを見てもアプリをアンインストールしている状態になければ、「開く」という表示になっています。
一旦アンインストールをしてから再インストールをして方がいいかもしれません。
設定よりアプリのアンインストールが行えますので、以下の通りたどって、アンインストールを行ってみてください。

設定>一般>ストレージとiCloudの使用状況>ストレージ:ストレージを管理
>アプリの一覧が表示されますので「Amazon アプリ」開く>Appを削除

これでアンインストールを行えます。
再度、iTunes StoreからAmazon アプリをインストールしてみてください。

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.


人気Q&Aランキング

おすすめ情報