mcrblog

vcpp-ml

2003年05月

30

[vcpp 00060835] RE: SysListView32からのイメージリスト取得

 渋木です。

> APL側でCreateStreamOnHGlobal()した時に失敗してしまいます.

 エラーコードは?
 CoInitialize() し忘れてるだけのような気もするけど。

> また、ストリームを作成する際の確保サイズがわかりません.
> 指定必要なのか不要なのか?

 あらかじめ必要なサイズが予測できるなら(処理効率が多少はよくなるので)指定
すればいいし、不明なら省略することもできます。


--
// 渋木宏明 (Hiroaki SHIBUKI)
// mailto:h...@mbi.nifty.com
// http://www.hidori.jp/
// Microsoft MVP 2002-2003 of Windows Technology
30

[vcpp 00060834] Re: SysListView32からのイメージリスト取得

毎々お世話になります。
阿部です。
----------------------------------------------------------------
>Q1.STREAMサイズはGetImageCount()などから算出すると思うのですが...
>    (まったく違うかも ..)どのようにメモリサイズを算出すればよいのでしょうか
>?
 サイズを算出する必要はないと思います。
 アロケータが自動的にサイズを拡張してくれます。

 HRESULT hr = CreateStreamOnHGlobal( NULL, TRUE, &pSt ) ;
  if( FAILED( hr ) )
  {
    // エラー処理
  }
 
>
>Q2.CreateStreamOnHGlobal()は作ったままで終了してよいのでしょうか?
>     反する..Destroy.....()的な関数呼び出しは不要でしょうか?
>
 pSt->Release() ;

>他. 一旦Globalに取得して共用メモリに複写しているつもりですが
>  これでよろしいでしょうか?(下記ソースはイメージ読み込みストリームへの書
>き出しのみ)
>
 ImageList_Write
 pSt->Statでサイズ求める
 VirtualAllocExでメモリ確保
 pSt->Seekで先頭に移動
 pSt->Readで、メモリに読み出す

 ファイル渡しでいいなら、StgCreateDocfileを使えば簡単。
 同期をとる必要はあるけど。

-----------------------------------------
日立コンピュータ機器株式会社
Hitachi Computer Peripherals Co.,Ltd. 
氏名   :阿部佳史
E...@str.hitachi.co.jp
-----------------------------------------
30

[vcpp 00060833] Re: SysListView32からのイメージリスト取得

中村です。

At 30 May 2003 14:52:32 +0900 Yasuhiro.Kambe wrote:
> Q1.STREAMサイズはGetImageCount()などから算出すると思うのですが...
>     (まったく違うかも ..)どのようにメモリサイズを算出すればよいのでしょ
>     うか?

書き込む前にサイズを調べる必要はありません。ストリームに書き出されるに従っ
て勝手に伸張されます。


> Q2.CreateStreamOnHGlobal()は作ったままで終了してよいのでしょうか?
>      反する..Destroy.....()的な関数呼び出しは不要でしょうか?

COMオブジェクトですから、IStream::Releaseを呼びましょう。


> 他. 一旦Globalに取得して共用メモリに複写しているつもりですが
>   これでよろしいでしょうか?(下記ソースはイメージ読み込みストリームへ
> の書き出しのみ)

まず、グローバルメモリは自分で確保する必要はありません。
CreateStreamOnHGlobalの第一引数にはNULLを渡します。ImageList_Writeで書き終
わったら、IStream::Statを呼び出してストリームのサイズを取得し、そのサイズ
分のメモリをVirtualAllocExします。そして、GetHGlobalFromStreamでストリーム
からHGLOBALを取得し、GlobalLockしてポインタを取得してから確保したメモリに
コピーします。

実際には、ストリームのサイズも一緒に共有メモリに書き込んでおかないと読み込
むときにサイズがわからなくて困ると思いますけど。


-- 
Satoshi Nakamura <s...@zak.att.ne.jp>
30

[vcpp 00060832] Re: SysListView32からのイメージリスト取得

神戸です.

> しかし、イメージをストリームに読み込んたとき
> ImageList_Read()が失敗してます(返りが0x00000000L)
メモリ不足(GetLastError()==8L)で終了していました.

やはり、ストリームサイズの取得方法についてご教授お願いします.

P.S)投稿してから掲載されるのにかなりのタイムラグがありご迷惑を
おかけいたします > ML会員皆様
30

[vcpp 00060831] Re: SysListView32からのイメージリスト取得

> DLL側がとりあえず動作してますが, (サイズは65535ときめウチしてます ^^;
 汗)
> APL側でCreateStreamOnHGlobal()した時に失敗してしまいます.
神戸です.

CreateStreamOnHGlobal()==0 は成功でよいのですよね.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これはBOOL側と勘違いして、逆に判定してました.
HELPをみると成功時S_OK = 0Lなので...
※HRESETでキャストして使用しております

しかし、イメージをストリームに読み込んたとき
ImageList_Read()が失敗してます(返りが0x00000000L)
記事検索
Amazon.co.jp
  • ライブドアブログ