VC 中使用 COM 接口的一般步骤

本文介绍了在VC中使用COM接口的基本步骤,包括在头文件中添加必要的引用,使用CoInitialize(NULL)和CoUninitialize()进行初始化和终止,以及如何通过ATL COM接口设置桌面壁纸的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在“stdafx.h”中,在

   #include <afxwin.h>         // MFC 核心和标准组件
   #include <afxext.h>         // MFC 扩展
   #include <afxdisp.h>        // MFC 自动化类

   前面加上
   #include <afx.h>
   #include <wininet.h>   
   这两个头文件顺序不可颠倒

   即:
   #include <afx.h>
   #include <wininet.h>  
   #include <afxwin.h>         // MFC 核心和标准组件
   #include <afxext.h>         // MFC 扩展
   #include <afxdisp.h>        // MFC 自动化类

2.使用 CoInitialize(NULL)  和  CoUninitialize() 初始化和终止 COM 使用环境。

3.在使用了 ATL COM 接口的源文件头部,包含声明该 ATL COM 接口的头文件即可。
    IActiveDesktop =》#include <shlobj.h>

一个使用 ATL COM 的例子:
BOOL CSystemSet::SetWallPaper(CString strImaglePath, DWORD dwStyle)
{
 CoInitialize(NULL);

 BOOL bRet = FALSE;
 HRESULT hr = S_FALSE;
 IActiveDesktop* pIAD = NULL;

 hr = CoCreateInstance(CLSID_ActiveDesktop,  NULL, CLSCTX_INPROC_SERVER,
   IID_IActiveDesktop, (void**) &pIAD );
 if (SUCCEEDED(hr))
 {
  BOOL bActiveDesktop = FALSE;

  COMPONENTSOPT co;
  co.dwSize = sizeof(co);
  if (SUCCEEDED(pIAD->GetDesktopItemOptions(&co, 0)))
  {
   if (!co.fActiveDesktop || !co.fEnableComponents)
   {
    co.fActiveDesktop = TRUE;
    co.fEnableComponents = TRUE;
    if (SUCCEEDED(pIAD->SetDesktopItemOptions(&co, 0)))
     bActiveDesktop = TRUE;
   }
   else
    bActiveDesktop = TRUE;
  }
  if (bActiveDesktop)
  {
   WCHAR wszWallpaper [MAX_PATH];
   ZeroMemory(wszWallpaper, sizeof(wszWallpaper));

   #if defined(_UNICODE)
   CopyMemory(wszWallpaper, strImaglePath.GetBuffer(0),
    min(MAX_PATH * sizeof(TCHAR), (strImaglePath.GetLength() + 1) * sizeof(TCHAR)));
   #else
   MultiByteToWideChar(CP_ACP, 0, strImaglePath, -1, wszWallpaper, MAX_PATH);
   #endif

   WALLPAPEROPT wpo;
   wpo.dwSize = sizeof(wpo);
   wpo.dwStyle = dwStyle;
   if (SUCCEEDED(hr = pIAD->SetWallpaper(wszWallpaper, 0)) &&
    SUCCEEDED(hr = pIAD->SetWallpaperOptions(&wpo, 0)) &&
    SUCCEEDED(hr = pIAD->ApplyChanges(AD_APPLY_ALL)) &&
    SUCCEEDED(hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0)))
   {
    bRet = TRUE;
   }
  }
  pIAD->Release();
 }

 CoUninitialize();
 return bRet;
}
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值