• 快捷方式文件的解析类


    转自 http://bbs.csdn.net/topics/90077176

    快捷方式的文件实际上是*.lnk文件,在命令行里可以看到,下面这个类提供了方便的解析lnk文件的目标的方法。


    ///////////////////////////////////////////////////////////////////////
    // lnkparser.h
    // Creamdog

    #pragma once

    EXTERN_C const CLSID CLSID_ShellLink;

    #ifdef UNICODE
    #define IID_IShellLink  IID_IShellLinkW
    #else
    #define IID_IShellLink  IID_IShellLinkA
    #endif // !UNICODE


    class CLnkParser
    {
    public: // 公有函数
    CLnkParser( void ); // 构造函数
    ~CLnkParser( void ); // 析构函数
    HRESULT LoadFile( LPCWSTR lpFileName );
    HRESULT GetTargetPath( LPTSTR lpStr, int cch );
    private: // 私有函数
    HRESULT Initialize( void ); // 数据初始化
    void Uninitialize( void ); // 数据释放
    private: // 私有成员
    IShellLink *m_pShellLink; // IShellLink接口指针
    IPersistFile *m_pPersistFile; // IPersistFile接口指针
    };



    ///////////////////////////////////////////////////////////////////////
    // lnkparser.cpp
    // Creamdog
    #include "lnkparser.h"


    // 构造函数
    CLnkParser::CLnkParser( void )
    : m_pShellLink( NULL ), m_pPersistFile( NULL )
    {
    // 初始化成员数据
    HRESULT hr = S_OK;
    lb_init:
    hr = Initialize();
    if ( hr == CO_E_NOTINITIALIZED )
    {
    hr = CoInitialize( NULL );
    if ( SUCCEEDED( hr ) )
    {
    goto lb_init;
    }
    }
    if ( FAILED( hr ) )
    {
    // 如果失败,释放数据
    Uninitialize();
    // 掷出异常
    throw ( _T("Initialize failed.") );
    }
    }

    // 析构函数
    CLnkParser::~CLnkParser( void )
    {
    // 释放数据
    Uninitialize();
    }

    // 读取文件
    HRESULT CLnkParser::LoadFile( LPCWSTR lpFileName )
    {
    HRESULT hr = S_OK; // 返回值
    // 以只读方式加载指定的文件数据
    hr = m_pPersistFile->Load( lpFileName, STGM_READ );
    // 如果失败,返回错误
    if ( FAILED(hr) )
    {
    return hr;
    }
    // 解析文件,接受消息的父窗体置零
    hr = m_pShellLink->Resolve( NULL, SLR_ANY_MATCH );
    // 如果失败,返回错误
    if ( FAILED(hr) )
    {
    return hr;
    }
    return S_OK;
    }

    HRESULT CLnkParser::GetTargetPath( LPTSTR lpStr, int cch )
    {
    HRESULT hr = S_OK;
    hr = m_pShellLink->GetPath( lpStr, cch, NULL, SLGP_RAWPATH );
    if ( FAILED(hr) )
    {
    return hr;
    }
    return S_OK;
    }

    // 成员数据初始化
    HRESULT CLnkParser::Initialize( void )
    {
    HRESULT hr = S_OK; // 返回值
    // 创建IShellLink接口实例
    hr = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
    IID_IShellLink, (LPVOID*)&m_pShellLink );
    // 如果创建失败,输出错误信息,结束程序
    if ( FAILED(hr) )
    {
    return hr;
    }

    // 从IShellLink接口查询创建IPersistFile接口实例
    hr = m_pShellLink->QueryInterface( IID_IPersistFile, (LPVOID*)&m_pPersistFile );
    // 如果创建失败,输出错误信息,结束程序
    if ( FAILED(hr) )
    {
    return hr;
    }
    return S_OK;
    }

    // 释放成员数据
    void CLnkParser::Uninitialize( void )
    {
    // 释放m_pPersistFile接口,指针置零
    if ( m_pPersistFile )
    {
    m_pPersistFile->Release();
    m_pPersistFile = NULL;
    }
    // 释放m_pShellLink接口,指针置零
    if ( m_pShellLink )
    {
    m_pShellLink->Release();
    m_pShellLink = NULL;
    }
    }


    用法:
    先包含必要的头文件,缺什么加什么就行了。
    CLnkParser LnkParser;
    LnkParser.LoadFile( L"lnk文件名" );
    TCHAR szTarget[MAX_PATH];
    LnkParser.GetTargetPath( szTarget, MAX_PATH ); // 获得目标路径

  • 相关阅读:
    使用South时候由于两个相同id的文件引起的问题
    Python os模块
    Ubuntu的关机重启命令知识
    [BUGFIX]__import_pywin32_system_module__
    Django生产环境的部署-Apache-mod_wsgi
    我是如何将linux用在开发环境中的
    php抽奖概率算法
    PHP接收IOS post过来的json数据无法解析的问题
    python apache下出现The _imaging C module is not installed
    php 打印
  • 原文地址:https://www.cnblogs.com/gamesun/p/3072415.html
Copyright © 2020-2023  润新知