能力值:
( 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;
}
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
delphi的程序,都是这样,我写客户端程序,明明内存释放了,但内存一直暴涨,调了下,才发现,delphi 的VCL 本身就有内存泄漏,第三方的控件,最好少用!
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
我在delphi 中不能调用_Release, 会出现读内存错误的...
|
能力值:
( 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;
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
谢谢, 一样....调用一次, 句柄数变多了 80 个
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
加上
ADeskTop := nil;
试试。
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
谢谢, 一样
|
|
|