本文参考:https://blog.csdn.net/wangqiulin123456/article/details/8026270
在使用Qt在windows系统上编程的时候遇到了调节电脑亮度的Api,通过上网查找,发现这个功能依靠的是com相关的Api实现的。于是想了解一下什么是com编程。
COM(组件对象模型)是Component Object Model的缩写。
常见的术语:COM对象、接口、服务器等。
COM编程的目的是通过二进制的方式来实现代码重用,但是在windows外很少听说。
Com编程提供的都是接口,这些接口也被叫做方法。接口可以从其它接口继承,这里所说的继承的原理就好像C++中的单继承。接口是不允许多继承的。
使用:
hr = CoCreateInstance (
CLSID_ShellLink, //coclass 的CLSID
NULL, //不是用聚合
CLSCTX_INPROC_SERVER, //服务器类型
IID_IShellLink, //接口的IID
(void**)&pISL ); // 指向接口的指针
基本接口(IUnknown)所有的com都必须调用。
单接口调用:
步骤:
1. 初始化COM库。 (Initialize);
2. 创建一个与活动桌面交互的COM对象,并取得IActiveDesktop接口;
3. 调用COM对象的GetWallpaper()方法;
4. 如果GetWallpaper()成功,则输出/显示墙纸文件名;
5. 释放接口(Release());
6. 收回COM库(Uninitialize);
{
WCHAR wszWallpaper [MAX_PATH];
CString strPath;
HRESULT hr;
IActiveDesktop *pIAD;
// 1. 初始化COM库(让Windows加载DLLs)。通常是在程序的InitInstance()中调用
// CoInitialize ( NULL )或其它启动代码。MFC程序使用AfxOleInit()。
CoInitialize ( NULL );
// 2. 使用外壳提供的活动桌面组件对象类创建COM对象。
// 第四个参数通知COM需要什么接口(这里是IActiveDesktop).
hr = CoCreateInstance ( CLSID_ActiveDesktop,
NULL,
CLSCTX_INPROC_SERVER,
IID_IActiveDesktop,
(void **) &pIAD );
if (SUCCEEDED(hr)) {
// 3. 如果COM对象被创建成功,则调用这个对象的GetWallpaper() 方法。
hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0);
if (SUCCEEDED(hr)) {
// 4. 如果 GetWallpaper() 成功,则输出它返回的文件名字。
// 注意这里使用wcout 来显示Unicode 串wszWallpaper. wcout 是
// Unicode 专用,功能与cout.相同。
wcout << L"Wallpaper pathis:\n " << wszWallpaper << endl << endl;
} else {
cout << _T("GetWallpaper()failed.") << endl << endl;
}
// 5. 释放接口。
pIAD->Release();
} else {
cout << _T("CoCreateInstance()failed.") << endl << endl;
}
// 6. 收回COM库。MFC 程序不用这一步,它自动完成。
CoUninitialize();
}
多接口COM:
步骤:
1. 初始化 COM 库;
2. 创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口;
3. 调用IShellLink 接口的SetPath()方法;
4. 调用对象的QueryInterface()函数并取得IPersistFile接口;
5. 调用IPersistFile 接口的Save()方法;
6. 释放接口;
7. 收回COM库;
{
CString sWallpaper = wszWallpaper; // 将墙纸路径转换为ANSI
IShellLink *pISL;
IPersistFile *pIPF;
// 1. 初始化COM库(让Windows 加载DLLs). 通常在InitInstance()中调用
// CoInitialize ( NULL )或其它启动代码。MFC 程序使用AfxOleInit()。
CoInitialize ( NULL );
// 2. 使用外壳提供的Shell Link组件对象类创建COM对象。.
// 第四个参数通知COM 需要什么接口(这里是IShellLink)。
hr = CoCreateInstance ( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pISL );
if ( SUCCEEDED(hr) ) {
// 3. 设置快捷方式目标(墙纸文件)的路径。
hr = pISL->SetPath ( sWallpaper );
if ( SUCCEEDED(hr) ) {
// 4. 获取这个对象的第二个接口(IPersistFile)。
hr = pISL->QueryInterface (IID_IPersistFile, (void **) &pIPF );
if ( SUCCEEDED(hr) ) {
// 5. 调用Save() 方法保存某个文件得快捷方式。第一个参数是
// Unicode 串。
hr = pIPF->Save (L"C:\\wallpaper.lnk", FALSE );
// 6a. 释放IPersistFile 接口。
pIPF->Release();
}
}
// 6. 释放IShellLink 接口。
pISL->Release();
}
// 输出错误信息部分这里省略。
// 7. 收回COM 库。MFC 程序不用这一步,它自动完成。
CoUninitialize();
}