- ベストアンサー
シェルアイコンがイメージリストに登録できない??
- Visual C++においての質問です。APIで関連づけられたアイコンを取得したあと、イメージリストに登録しようとしてるのですが、「不正な処理」とかで落ちてしまいます。なんか…マズい処理をやってるんでしょうか??
- 以下のコードでは、C++でアイコンを取得し、イメージリストに登録する処理を行っています。しかし、何らかのエラーが発生してしまい、「不正な処理」というエラーメッセージが表示されます。どこが間違っているかご教授いただけないでしょうか?
- Visual C++でアイコンを取得し、イメージリストに登録する処理を行っていますが、「不正な処理」というエラーメッセージが表示されてしまいます。正しい処理方法を教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
スペルミスの件は、「CoInitialize」と「CoInitialise」の差(zとsの違いのこと)を言ったつもりだったんですけど。 だいたい最初の発言では「CoIntialise」でiも落ちてますし。 で、ImageList.Add()のASSERTで落ちている、ということは、hIconにアイコンハンドルがきちんと渡ってない、ということですよね? とりあえずSHGetFileInfoの返値を見てみて、 if( SHGetFileInfo(...) ) { IconList.Add( hIcon ); } という風にすれば、とりあえず落ちることはないと思いますけど。 あと、念のために確認しますが、FilePathで示されているファイルは実在しますよね?
その他の回答 (2)
- cocky
- ベストアンサー率57% (232/402)
CoInitializeのスペルが違うのは単なるタイプミスですよね? あと、よく考えたら、SHGetFileInfoの中のdwFileAttributesはあくまで値を入れるところであってポインタを入れるところではないので、そこがNULLなのはまずいような気がしますが。 VC++なら統合環境のデバッガで命令のトレース実行ができるでしょうから、具体的にどこで落ちてるかを特定できるとアドバイスもしやすいんですが。
補足
デバッグで見たところ、イメージリストでのAddで落ちているようでした。 MFCヘッダーファイル内のASSERTで落ちるようです…。 スペルミスはCointialiseとCoIntialiseのスペルですかね? SDKヘルプでCoIntialiseとあるし、Cointialiseにすると「定義されてない」と怒られてしまうんです。 dwFileAttributesのNULLですが、どこかのページでのサンプルがこういった使い方をしてたので見よう見まねです…。 ちなみに、FILE_ATTRIBUTE_NORMALなども試してもダメでした。 FileInfoのmemset、イメージリストを関連づけたリストビューの描画停止など、いろいろ組み合わせて試してるんですけど…。(xox)
- cocky
- ベストアンサー率57% (232/402)
SHGFI_SMALLICONであれば、ImageListのイメージサイズは32x32ではなく16x16ではないか、という気がしますけど。 ただ、それを除けばここまでの処理には不都合は見あたらないですが、SHGetFileInfoを実行したあとで、FileInfo.hIconをIconListに登録する部分の処理が書かれてないですよね。 そこを見ないと「不正な処理」で落ちる原因はつかめないと思います。
補足
ありゃりゃ、Createは(16,16…)ですね。 Addも書き忘れてました。(T△T) そりゃー分からんわ…。すみませんです。 追加: IconList.Add(FileInfo.hIcon); やはりハンドルの渡し方がマズイんかなーと…。
お礼
if抜けは試してたんですが、Add処理に移ってしまい落ちてしまいました。 値もデバッグで張り巡らして監視したのですが、ポインタの類は見てもサッパリですし…。 自作アイコンでハンドルを取って、ではちゃんと追加してくれるんですけどね。 パスももちろん実在する物を使っています。 明日からの予定で、しばらくの間ネットから離れます。 今回はこの件を取り下げて、COM系統レベルから書籍を片端から見てみることにします。 未解決ですが、cockyさん、本当にありがとうございました。