ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 创建、解析快捷方式

2019-10-25 10:03:06  阅读:355  来源: 互联网

标签:cout SUCCEEDED hr C++ Release PATH 快捷方式 解析 ppf


原文链接:https://blog.csdn.net/zlk1214/article/details/79269524
#include <iostream>
#include <ShObjIdl.h>
#include <strsafe.h>
 
using namespace std;
 
#define TARGET TEXT("C:\\WINDOWS\\system32\\shell32.dll") // 快捷方式链接目标
#define LNKFILE L"example.lnk"
 
// 给cout添加输出Unicode字符串的功能
#ifdef _UNICODE
ostream &operator << (ostream &os, LPCWSTR lpwstr)
{
    if (os == cout)
        WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), lpwstr, wcslen(lpwstr), NULL, NULL);
    return os;
}
#endif
 
// 创建快捷方式
void CreateShortcut(void)
{
    IShellLink *psl;
    HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
    if (SUCCEEDED(hr))
    {
        psl->SetPath(TARGET);
        psl->SetDescription(TEXT("This is just an example."));
        
        IPersistFile *ppf;
        hr = psl->QueryInterface(&ppf);
        if (SUCCEEDED(hr))
        {
            hr = ppf->Save(LNKFILE, TRUE);
            if (SUCCEEDED(hr))
                cout << TEXT("创建快捷方式成功") << endl;
            else
                cout << TEXT("创建快捷方式失败") << endl;
            ppf->Release();
        }
        else
            cout << TEXT("创建快捷方式时遇到系统错误") << endl;
 
        psl->Release();
    }
    else
        cout << TEXT("操作失败") << endl;
}
 
// 解析快捷方式
void ResolveShortcut(void)
{
    IShellLink *psl;
    HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
    if (SUCCEEDED(hr))
    {
        IPersistFile *ppf;
        hr = psl->QueryInterface(&ppf);
        if (SUCCEEDED(hr))
        {
            hr = ppf->Load(LNKFILE, STGM_READ);
            if (SUCCEEDED(hr))
            {
                TCHAR szPath[MAX_PATH];
                TCHAR szDesc[INFOTIPSIZE];
                hr = psl->GetPath(szPath, MAX_PATH, NULL, SLGP_RAWPATH);
                if (SUCCEEDED(hr))
                    cout << TEXT("快捷方式指向的文件: ") << szPath << endl;
                else
                    cout << TEXT("获取快捷方式指向的文件失败!") << endl;
                hr = psl->GetDescription(szDesc, INFOTIPSIZE);
                if (SUCCEEDED(hr))
                    cout << TEXT("描述: ") << szDesc << endl;
                else
                    cout << TEXT("获取快捷方式描述失败!") << endl;
            }
            else
                cout << TEXT("打开文件失败") << endl;
            ppf->Release();
        }
        else
            cout << TEXT("读取文件时遇到系统错误") << endl;
        psl->Release();
    }
    else
        cout << TEXT("操作失败") << endl;
}
 
// 解析开始菜单中Office2010的所有快捷方式
void Office2010Desc(void)
{
    TCHAR szFolder[MAX_PATH] = TEXT("C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\Microsoft Office\\");
    TCHAR szPath[MAX_PATH];
 
	HANDLE hFind;
    int flag;
    for (flag = 0; flag <= 1; flag++)
    {
        if (flag == 1)
        {
            StringCchCat(szFolder, MAX_PATH, TEXT("Microsoft Office 2010 工具\\"));
            if (hFind != INVALID_HANDLE_VALUE)
				cout << endl << endl << endl;
        }
 
        WIN32_FIND_DATA data;
        StringCchCopy(szPath, MAX_PATH, szFolder);
        StringCchCat(szPath, MAX_PATH, TEXT("*.lnk"));
        hFind = FindFirstFile(szPath, &data);
		if (hFind == INVALID_HANDLE_VALUE)
		{
			cout << szPath << TEXT(" doesn't exist!") << endl;
			continue;
		}
        do
        {
            TCHAR szDesc[INFOTIPSIZE + 2] = TEXT(": ");
            IShellLink *psl;
            HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
            if (SUCCEEDED(hr))
            {
                IPersistFile *ppf;
                hr = psl->QueryInterface(&ppf);
                if (SUCCEEDED(hr))
                {
                    StringCchCopy(szPath, MAX_PATH, szFolder);
                    StringCchCat(szPath, MAX_PATH, data.cFileName);
#ifdef _UNICODE
                    hr = ppf->Load(szPath, STGM_READ);
#else
                    WCHAR szwPath[MAX_PATH];
                    MultiByteToWideChar(CP_ACP, NULL, szPath, -1, szwPath, MAX_PATH);
                    hr = ppf->Load(szwPath, STGM_READ);
#endif
 
                    if (SUCCEEDED(hr))
                    {
                        hr = psl->GetDescription(szDesc + 2, INFOTIPSIZE);
                        if (FAILED(hr))
                            szDesc[0] = '\0';
                    }
                    ppf->Release();
                }
                psl->Release();
            }
 
            int len = lstrlen(data.cFileName);
            data.cFileName[len - 4] = '\0';
            cout << data.cFileName << szDesc << endl;
        } while (FindNextFile(hFind, &data));
        FindClose(hFind);
    }
}
 
int main(void)
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
 
	CreateShortcut();
	ResolveShortcut();
    Office2010Desc();
 
    CoUninitialize();
	system("pause");
    return 0;
}

标签:cout,SUCCEEDED,hr,C++,Release,PATH,快捷方式,解析,ppf
来源: https://blog.csdn.net/Simon798/article/details/102737320

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有