9367|26

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

wince 5.0 使用 imaging COM组件 画png图片 内存泄露 [复制链接]

BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, IImage** pIImage)
{
        HRSRC hRsrc = ::FindResource (hInstRes,MAKEINTRESOURCE(nID),sTR); // type
        if (!hRsrc)
                return FALSE;       
        //加载资源进入内存
        DWORD len = SizeofResource(hInstRes, hRsrc);
        BYTE* lpRsrc = (BYTE*)LoadResource(hInstRes, hRsrc);
        if (!lpRsrc)
                return FALSE;
        //申请全局内存,目的是在其上创建 流
        HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
        BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
   
        memcpy(pmem,lpRsrc,len);
        IStream* pStream;
        CreateStreamOnHGlobal(m_hMem,FALSE,&pStream);
       
        //从流数据中加载
        pIImgFactory->CreateImageFromStream(pStream, pIImage);        
       
        // 释放资源
        GlobalUnlock(m_hMem);
        GlobalFree(m_hMem);

        if(pStream!=NULL)
        {
                pStream->Release();
                pStream = NULL;
        }
        //        FreeResource(lpRsrc);//查看下内存的情况
        delete pmem;
        pmem =NULL;

        if(!pIImage)
                return FALSE;
   
        return TRUE;
       
}

void DrawXXImage(HDC hdestdc, int x, int y, LPCTSTR sTR, int nImageIn )
{
        ImageInfo xximage;
        IImage*        pImageIn = NULL; //清空操作       
         CoInitializeEx(NULL,COINIT_MULTITHREADED);//初始化com
        if(!SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void **)&pIImgFactory)))
        {
                return ;
        }       
        ImageFromIDResource(nImageIn, sTR, &pImageIn);
        pImageIn->GetImageInfo(&xximage);
    UINT reswide=xximage.Width;
        UINT resheight=xximage.Height;
        RECT rc={x,y,x+reswide,y+resheight};
        pImageIn->Draw(hdestdc,&rc,NULL);
//        delete pImageIn;
//        pImageIn=NULL;
        pImageIn->Release();
        pImageIn=NULL;
        if(pIImgFactory!=NULL)
        {
                pIImgFactory->Release();
                pIImgFactory=NULL;
        }
        CoUninitialize();
}

当我多次DrawXXImage时发生明显的内存泄露,敬请高手指点

最新回复

职业+友情帮顶!还没遇到过这个问题呢,呵呵…  详情 回复 发表于 2010-1-16 15:47
点赞 关注

回复
举报

61

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
明显?如何明显法,说说看。
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我用evc 的查看内存工具remote system information可以看到啊,不时的有好几百kb的增加,91program,能帮看看上面是不是有哪个地方没释放,还是有更好的方法?谢谢(我如果点区域画图全部在onpaint里的话,速度也很慢)
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
我做gps里的软件,目的是使用的图片空间小,界面更好看,当然速度不能太慢,请大侠们指教
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
不懂,up
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
这是完整的代码吗?如果不是, 有没有可能对memory和COM interface释放的代码被错误处理之类的代码跳过? 可以贴完整代码吗

对于COM interface,建议用CComPtr管理

建议使用AppVerifer检测内存泄露,可以检测出泄露处的callstack. 这里有Mobile下的视频教程,WinCE应该类似http://download.microsoft.com/download/0/9/f/09fb0ed3-cc89-4f94-a022-c362902f50a2/UsingAppVerifierWindowsMobile.wmv
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个工具网上很少,能否给个链接什么的,我的程序大体框架是主界面窗口上很多图片,点击图片出现另一张,区域画图模拟按钮,点击按钮始终在invalidate,所有画图全在onpaint 里进行,上面两函数有哪些不合理的不?谢谢大家关注,我的qq273329194
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

8
 
内存工具remote system information的显示不一定准确,建议LZ疲劳测试:重复调用此段代码,看看是否会出现错误。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
我没看出什么泄露的地方, 但有些别的问题
1. 这个不需要
    delete pmem;
    pmem =NULL;
2. 为什么每次都要CoInitializeEx/CoUninitialize, 在你这个线程的入口和出口调一次就可以了
3. 这个存在类里或全局就可以了, 不用每次创建,可以提高性能
   if(!SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory,(void **)&pIImgFactory)))


AppVerifer是微软出的一个辅助开发工具,可以检测memory leak, handle leak等,
在这里下载http://www.microsoft.com/downloads/details.aspx?FamilyID=bd02c19c-1250-433c-8c1b-2619bd93b3a2&DisplayLang=en
我上面给了一个视频教程,或者看自带的帮助,使用很简单, 最后程序退出时给一个报告,给出有问题的callstack
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
你在msdn.microsoft.com上搜"AppVerifier Windows CE"或者"AppVerifier Windows Mobile"会有很多信息.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

11
 
mark
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
加班时间过长,现在都有点不想事了
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

13
 
好像大家都不用AppVerifier检查资源泄漏. 我觉得它是WinCE/Mobile上一个非常优秀的工具,而且是微软提供的, 我们会定期运行这个程序检查我们自己代码的bug.
写了个简单的使用说明<使用Application Verifier (AppVerifier)检查资源泄漏>, 希望对你有帮助
http://blog.eeworld.net/xdkui/archive/2008/12/19/3560143.aspx
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
每次增加的内存是不是你的图片的大小,
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
感谢xdkui的热心,
增加的内存并非图片大小

在此我想再问大家一个问题
一个主界面程序,比如像手机的或者gps的,点击某一个按钮或者区域,他需要调用一个程序(假设为music.exe),没有调用music之前我用remote system information记下一个内存值,music执行后我再把他关了,这下也就是只剩下当初的主界面了,我再记下一个内存值,发现占用的内存比原来多了,听别人说一个程序关闭后与其相关的内存都会释放,那为什么这两个内存值会有差距???平常的按钮我点击下,一般都会有4kb的内存减少,???小弟在此抛砖引玉了,谢谢。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
做界面美化的程序,全部用png是否可行,位图空间大,32位alpha通道bmp更大,咋办?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 
直接用PNG没问题啊,我都子直接用PNG啊,我的资源里有个PIC的类,我用来显示PNG用的,可以拿去试下啊,也是使用IMAGING,COM控件。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

18
 
帅哥,能发一份到我的邮箱不?motta021@163.com
谢谢
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

19
 
顶,大侠们指教一下,我正在烦恼做PNG图片问题,尤其是透明的PNG图片,刷新就出问题了。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

20
 

既然可以解码,楼主把PNG转成BMP用就好了
一个HBITMAP 句柄  随便你折腾
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表