-PR-
解決済み

シェルアイコンがイメージリストに登録できない??

  • 暇なときにでも
  • 質問No.47316
  • 閲覧数308
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 60% (3/5)

Visual C++においての質問です。
APIで関連づけられたアイコンを取得したあと、イメージリストに登録しようとしてるのですが、
「不正な処理」とかで落ちてしまいます。なんか…マズい処理をやってるんでしょうか??
大まかなソースは以下の通りです。
超初心者ですので、とんでもない間違いをしてるだけだと思うんですが…。どなたかご教授をお願いします。

CImageList IconList;
CString FilePath = "C:\\test.txt";
SHFILEINFO FileInfo;

IconList.Create(32,32,ILC_COLORDDB|ILC_MASK,1,1000);
::CoIntialise(NULL);

SHGetFileInfo(FilePath,NULL,&FileInfo,sizeof(FileInfo),SHGFI_ICON|SHGFI_SMALLICON);
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 57% (232/402)

スペルミスの件は、「CoInitialize」と「CoInitialise」の差(zとsの違いのこと)を言ったつもりだったんですけど。
だいたい最初の発言では「CoIntialise」でiも落ちてますし。

で、ImageList.Add()のASSERTで落ちている、ということは、hIconにアイコンハンドルがきちんと渡ってない、ということですよね?
とりあえずSHGetFileInfoの返値を見てみて、
if( SHGetFileInfo(...) ) {
 IconList.Add( hIcon );
}
という風にすれば、とりあえず落ちることはないと思いますけど。

あと、念のために確認しますが、FilePathで示されているファイルは実在しますよね?
お礼コメント
f_a_k_e

お礼率 60% (3/5)

if抜けは試してたんですが、Add処理に移ってしまい落ちてしまいました。
値もデバッグで張り巡らして監視したのですが、ポインタの類は見てもサッパリですし…。
自作アイコンでハンドルを取って、ではちゃんと追加してくれるんですけどね。
パスももちろん実在する物を使っています。

明日からの予定で、しばらくの間ネットから離れます。
今回はこの件を取り下げて、COM系統レベルから書籍を片端から見てみることにします。
未解決ですが、cockyさん、本当にありがとうございました。
投稿日時 - 2001-03-05 00:37:45
関連するQ&A
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 57% (232/402)

SHGFI_SMALLICONであれば、ImageListのイメージサイズは32x32ではなく16x16ではないか、という気がしますけど。 ただ、それを除けばここまでの処理には不都合は見あたらないですが、SHGetFileInfoを実行したあとで、FileInfo.hIconをIconListに登録する部分の処理が書かれてないですよね。 そこを見ないと「不正な処理」で落ちる原因はつかめないと思いま ...続きを読む
SHGFI_SMALLICONであれば、ImageListのイメージサイズは32x32ではなく16x16ではないか、という気がしますけど。

ただ、それを除けばここまでの処理には不都合は見あたらないですが、SHGetFileInfoを実行したあとで、FileInfo.hIconをIconListに登録する部分の処理が書かれてないですよね。
そこを見ないと「不正な処理」で落ちる原因はつかめないと思います。
補足コメント
f_a_k_e

お礼率 60% (3/5)

ありゃりゃ、Createは(16,16…)ですね。
Addも書き忘れてました。(T△T)
そりゃー分からんわ…。すみませんです。

追加:
IconList.Add(FileInfo.hIcon);

やはりハンドルの渡し方がマズイんかなーと…。
投稿日時 - 2001-03-04 17:15:52


  • 回答No.2
レベル12

ベストアンサー率 57% (232/402)

CoInitializeのスペルが違うのは単なるタイプミスですよね? あと、よく考えたら、SHGetFileInfoの中のdwFileAttributesはあくまで値を入れるところであってポインタを入れるところではないので、そこがNULLなのはまずいような気がしますが。 VC++なら統合環境のデバッガで命令のトレース実行ができるでしょうから、具体的にどこで落ちてるかを特定できるとアドバイスもしやす ...続きを読む
CoInitializeのスペルが違うのは単なるタイプミスですよね?
あと、よく考えたら、SHGetFileInfoの中のdwFileAttributesはあくまで値を入れるところであってポインタを入れるところではないので、そこがNULLなのはまずいような気がしますが。

VC++なら統合環境のデバッガで命令のトレース実行ができるでしょうから、具体的にどこで落ちてるかを特定できるとアドバイスもしやすいんですが。
補足コメント
f_a_k_e

お礼率 60% (3/5)

デバッグで見たところ、イメージリストでのAddで落ちているようでした。
MFCヘッダーファイル内のASSERTで落ちるようです…。

スペルミスはCointialiseとCoIntialiseのスペルですかね?
SDKヘルプでCoIntialiseとあるし、Cointialiseにすると「定義されてない」と怒られてしまうんです。
dwFileAttributesのNULLですが、どこかのページでのサンプルがこういった使い方をしてたので見よう見まねです…。
ちなみに、FILE_ATTRIBUTE_NORMALなども試してもダメでした。

FileInfoのmemset、イメージリストを関連づけたリストビューの描画停止など、いろいろ組み合わせて試してるんですけど…。(xox)
投稿日時 - 2001-03-04 23:08:48
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ