比如用这段代码在WINDOWS2008上运行,把shell32.dll里的图标写入到一个文件中. CImageList imagelist2;
LPSTREAM lpStreamWrite;
INT nIcouCount = (INT)::ExtractIcon(_Module.m_hInst, TEXT("shell32.dll"), -1);
imagelist2.Create(48, 48, ILC_COLOR32|ILC_MASK, 200, 1);
::SHCreateStreamOnFile(TEXT("d:\\icon.dat"), STGM_CREATE|STGM_WRITE, &lpStreamWrite);
for(int i=0; i<nIcouCount; i++)
{
imagelist2.AddIcon(::ExtractIcon(_Module.m_hInst, TEXT("shell32.dll"), i));
}
imagelist2.Write(lpStreamWrite);然后把刚才生成的文件复制到在XP,2003上用这段代码读取刚才生成的文件.并把图标显示到LISTVIEW控件上.
竟然读取不到icon.dat里的图标.现在确定icon.dat这个文件是没有问题的,同样用下面这段代码在2008系统上运行是正常的.刚一朋友发现这个问题,我自己也试下了,
的确是如此.百思不得其解,不知道是怎么回事. CImageList imagelist;
CListViewCtrl lv = (CListViewCtrl)GetDlgItem(IDC_LIST1);
LPSTREAM lpStream;

::SHCreateStreamOnFile(TEXT("d:\\icon.dat"), STGM_READ, &lpStream);
imagelist.CreateFromStream(lpStream);
lv.SetImageList(imagelist.m_hImageList, LVSIL_NORMAL);

for (int i=0; i<imagelist.GetImageCount(); i++)
{
lv.InsertItem(i, TEXT("123"), i);
}

解决方案 »

  1.   

    MSDN看看这个函数有什么要求
    SHCreateStreamOnFile
      

  2.   

    SHCreateStreamOnFile执行正常,返回lpStream的值是有效的.
    关键是imagelist控件是无效的.
      

  3.   

    imagelist2.Create(48, 48, ILC_COLOR32|ILC_MASK, 200, 1);
    是不是太大了,用小的(24)试试
      

  4.   

     imagelist2.Write(lpStreamWrite) 参数不是这样的吗 Write( CArchive* pArchive );
      

  5.   

    Cimagelist是全局的吗 或者SetImageList之后用m_ImageList.Detach() 
      

  6.   

    imagelist2.Create(48, 48, ILC_COLOR32|ILC_MASK, 200, 1);改成 
    imagelist2.Create(48, 48, ILC_COLOR24|ILC_MASK, 200, 1);
    试试就OK