首页
社区
课程
招聘
[求助]一个API 导致内存大量泄漏???
发表于: 2009-12-22 00:43 4512

[求助]一个API 导致内存大量泄漏???

2009-12-22 00:43
4512
........................

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
不太清楚你vb中com接口怎么释放的。c++里要显式调用pUnknown->Release()的。
我注意到你的代码中有一个_Release被注释掉了。
c++代码如下:
WallPaperChanger::WallPaperChanger()
{
	::CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
		IID_IActiveDesktop, (void**)&m_pActiveDesktop);
}

WallPaperChanger::~WallPaperChanger()
{
	if (m_pActiveDesktop)
	{
		m_pActiveDesktop->Release();
		m_pActiveDesktop = NULL;
	}		
}

bool WallPaperChanger::SetWallPaper(LPCWSTR pwszWallpaper, WallPaperStyle wallpaperStyle)
{
	if (m_pActiveDesktop)
	{
		if (S_OK == m_pActiveDesktop->SetWallpaper(pwszWallpaper, 0))
		{	
			WALLPAPEROPT wpopt;
			wpopt.dwSize = sizeof(wpopt);
			wpopt.dwStyle = wallpaperStyle;
			m_pActiveDesktop->SetWallpaperOptions(&wpopt, 0);
			m_pActiveDesktop->ApplyChanges(AD_APPLY_SAVE);
			return true;
		}	
	}
	return false;
}
2009-12-22 09:01
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
delphi的程序,都是这样,我写客户端程序,明明内存释放了,但内存一直暴涨,调了下,才发现,delphi 的VCL 本身就有内存泄漏,第三方的控件,最好少用!
2009-12-22 12:32
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我在delphi 中不能调用_Release, 会出现读内存错误的...
2009-12-23 17:35
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你这样写试试
function SetActiveDesktopWallpaper(StrWallpaperPath : String; WallpaperStyle : Integer) : Boolean;
        procedure Wrapper;
        var
          Wallpaper : PWideChar;
          ADeskTop : IActiveDesktop;
          WallpaperOption : TWallPaperOpt;
        begin
                ADeskTop:=CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
            Wallpaper:=AllocMem(MAX_PATH * 2);
            StringToWideChar(StrWallpaperPath, Wallpaper , MAX_PATH * 2);

            with WallpaperOption do
            begin
            dwStyle:=WallpaperStyle; // WPSTYLE_CENTER ;  // 居中
            dwSize :=SizeOf(WallpaperOption);
            end;

            with ADeskTop do
            begin
            SetWallpaperOptions(WallpaperOption, 0);
            SetWallpaper(Wallpaper, 0);
            ApplyChanges(AD_APPLY_ALL);
            //_Release;
            end;

            FreeMem(Wallpaper);
        end;

begin
  Result:=False;
    if not SUCCEEDED(CoInitialize(nil)) then Exit;
  try
   Wrapper;
   Result:=True;
  finally
    CoUninitialize;
  end;
end;
2009-12-23 20:52
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
谢谢, 一样....调用一次, 句柄数变多了 80 个
2009-12-23 21:51
0
雪    币: 182
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
加上
ADeskTop := nil;
试试。
2009-12-23 22:31
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
谢谢, 一样
2009-12-24 05:05
0
游客
登录 | 注册 方可回帖
返回
//