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

原创 2012年03月31日 08:52:05
/*
第二个例子展示了如何使用一个提供单接口的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(); 
}

使用IShellLink 创建快捷方式

用IShellLink解析快捷方式(ShortCut) 前几天要写一个解析快捷方式的程序,发现MSDN上有篇文章,转了过来  本想翻译一下的,想想英语比较弱,作罢。 Using Shell Lin...
  • htt9931
  • htt9931
  • 2013年08月10日 18:23
  • 4025

【COM原理和应用】2、COM对象和接口

1、COM对象 在客户程序与组件交互的过程中,COM组件将以COM对象形式封装的实体提供给客户程序。...
  • shaqoneal
  • shaqoneal
  • 2015年02月04日 17:56
  • 876

如何创建linux命令”快捷方式”或”自定义命令”

a). 查看系统中有哪些别名命令 [test @tset test]#alias 即可显示目前系统中的别名命令 alias ll=’ls -l’ alias vi=’vim’ b). 如何创建shel...
  • jgy8421d13
  • jgy8421d13
  • 2015年11月24日 11:13
  • 354

Vbox创建COM对象失败

最近在使用vbox时出现以下错误:创建COM对象失败,应用程序将被中断 在CMD里面输入以下命令: C:\Users\Administrator>d: ...
  • rlhua
  • rlhua
  • 2014年07月21日 21:14
  • 2867

COM组件开发(一)—— 对象与接口

一.前言        在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其,由于客户与C...
  • q5806622
  • q5806622
  • 2015年01月19日 23:08
  • 3697

编写一个类,增加一个实例方法用于打印一条字符串。

自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。...
  • Lvlelygirl
  • Lvlelygirl
  • 2014年07月25日 18:55
  • 2097

使用命令行WScript和vbs创建快捷方式

只需一个记事本,写一个.bat和一个.vbs文件,寥寥几行代码就可以在windows桌面上创建快捷方式,还可以设定图标和快捷键等。 先看VBS脚本 set WshShell=WScript...
  • MAILLIBIN
  • MAILLIBIN
  • 2015年07月28日 20:44
  • 2847

COM对象的创建原理

笔者学习COM原理有一段时间了,但是在创建COM对象时一直使用的是智能指针,别的方式在网上也见过好几次,但是不明白其原理,所以也只是看看,现在想系统的学一下 COM原理,将原来大致浏览的内容重新看了...
  • dasgk
  • dasgk
  • 2013年07月05日 09:38
  • 1709

建立一个对象数组

#include using namespace std; class Student { private: int num; int score; public: void input_stu...
  • miaaozhu2015
  • miaaozhu2015
  • 2015年05月01日 17:25
  • 619

Com对象的解释

⊙ 第一章 概述   COM 是什么   COM 对象与接口   COM 进程模型   COM 可重用性⊙ 第二章 COM 对象模型   全局唯一标识符 GUID   COM 对象   COM 接口...
  • EdisonGG
  • EdisonGG
  • 2007年12月26日 10:47
  • 1919
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。
举报原因:
原因补充:

(最多只允许输入30个字)