您的位置:首页 > 运维架构 > Shell

创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。

2012-03-31 08:52 519 查看
/*
第二个例子展示了如何使用一个提供单接口的COM对象QueryInterface()函数。
其中的代码用外壳的Shell Link组件对象类创建我们在第一个例子中获得的
墙纸文件的快捷方式  
以下是编程步骤:  

初始化COM 库。   
创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。  
调用IShellLink 接口的SetPath()方法  
调用对象的QueryInterface()函数并取得IPersistFile接口。  
调用IPersistFile 接口的Save()方法。  
释放接口  
收回COM库    
//*/
//#include <windows.h>
#include <afxwin.h>
#include <afxext.h> // MFC 扩展 
#include "wininet.h" // 自己添加(IActiveDesktop需要) 
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 
#include <iostream>
using namespace std;

void main(void)
{
	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 path is:\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();
	
	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(); 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐