zoukankan      html  css  js  c++  java
  • VC++ 操作Windows快捷方式

      声明本文是参考网友博文,然后自己实践整理所得,转载请注明出处!

      Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件夹,驱动器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在弹出菜单中选择“属性”可以观察该快捷方式的这些性质。

      桌面快捷方式

      快捷方式的数据文件如果存放在C:WindowsDesktop子目录下,这个快捷方式就会显示在桌面上。

      “开始菜单”快捷方式

      如果存放在C:WindowsStart MenuPrograms子目录下,这个快捷方式就会作为“开始”菜单的一个菜单项出现。

      而桌面上的文件夹和“开始”菜单的菜单组则是上述两个子目录下的子目录的表现。

      Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功能。

      如何创建Windows的快捷方式?

      首先利用OLE通过调用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件(*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指针,以便于调用其成员函数Save()保存前面设置的信息。

      至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数SHFileOperation()就可以了。另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外壳有关变化以使之及时更新其显示状态。

      需要的头文件:shobjidl.h

      IShellLink接口成员:

      

      1、GetArguments:获取Shell link对象命令行参数信息

      2、GetDescription:获取Shell link对象描述信息

      3、GetHotkey:获得Shell link对象快捷键

      4、GetIconLocation:获得Shell link对象图标

      5、GetIDList:获得Shell link对象的唯一的item identifier list

      6、GetPath: 获得Shell link对象的目标文件或目录的全路径

      7、GetShowCmd:获得Shell link对象的运行方式,比如常规窗口,最大化

      8、GetWorkingDirectory:获得Shell link对象的工作目录

      9、Resolve:按一定的搜索规则尝试获得目标对象,即使已经被删除或移动

      10、SetArguments

      11、SetDescription

      12、SetHotkey

      13、SetIconLocation

      14、SetIDList

      15、SetPath

      16、SetRelativePat

      17、SetShowCmd

      18、SetWorkingDirectory

      IPersistFile接口成员:

      

      1、IsDirty:Checks an object for changes since it was last saved to its current file.

      2、Load:Opens the specified file and initializes an object from the file contents.

      3、Save:Saves the object into the specified file.

      4、SaveCompleted:Notifies the object that it can revert from NoScribble mode to Normal mode.

      5、GetCurFile:Gets the current name of the file associated with the object.

      更详细的用法还是参考MSDN,常用的是Load和Save。

      HRESULT Load( LPCOLSTR pszFileName,         //快捷方式的文件名

                      DWORD dwMode);                         //读取方式

      dwMode可取如下值:

      STGM_READ:只读

      STGM_WRITE:只写

      STGM_READWRITE:读写

      返回值:

      S_OK :成功

      E_OUTOFMEMORY :失败,原因是因为内存不足

      E_FAIL :失败,原因是除内存不足的其它的原因

         #include <ShObjIdl.h>

    #include <ShlGuid.h>
    #include <stdio.h>
    
    /* 函数功能:对指定文件在指定的目录下创建其快捷方式
    函数参数:
    lpszFileName    指定文件,为NULL表示当前进程的EXE文件。
    lpszLnkFileDir  指定目录,不能为NULL。
    lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
    wHotkey         为0表示不设置快捷键
    pszDescription  备注
    iShowCmd        运行方式,默认为常规窗口
    */
    
    BOOL CreateFileShortcut(LPCSTR lpszFileName, 
                            LPCSTR lpszLnkFileDir, 
                            LPCSTR lpszLnkFileName, 
                            LPCSTR lpszWorkDir, 
                            WORD wHotkey, 
                            LPCTSTR lpszDescription, 
                            int iShowCmd)
    {
        if (lpszLnkFileDir == NULL)
            return FALSE;
    
        HRESULT hr;
        IShellLink     *pLink; 
        IPersistFile   *ppf;    
    
        hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
        if (FAILED(hr))
            return FALSE;
    
        hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
        if (FAILED(hr))
        {
            pLink->Release();
            return FALSE;
        }
    
        if (lpszFileName == NULL)
            pLink->SetPath(_pgmptr);
        else
            pLink->SetPath(lpszFileName);
    
        if (lpszWorkDir != NULL)
            pLink->SetWorkingDirectory(lpszWorkDir);
    
        if (wHotkey != 0)
            pLink->SetHotkey(wHotkey);
    
        if (lpszDescription != NULL)
            pLink->SetDescription(lpszDescription);
    
        pLink->SetShowCmd(iShowCmd);
    
        char szBuffer[MAX_PATH] = {0};
        if (lpszLnkFileName != NULL) 
            sprintf(szBuffer, "%s\%s", lpszLnkFileDir, lpszLnkFileName);
        else  
        {
            const char *pstr;
            if (lpszFileName != NULL)
                pstr = strrchr(lpszFileName, '\');
            else
                pstr = strrchr(_pgmptr, '\');
    
            if (pstr == NULL)
            {    
                ppf->Release();
                pLink->Release();
                return FALSE;
            }
            sprintf(szBuffer, "%s\%s", lpszLnkFileDir, pstr);
            int nLen = strlen(szBuffer);
            szBuffer[nLen - 3] = 'l';
            szBuffer[nLen - 2] = 'n';
            szBuffer[nLen - 1] = 'k';
        }
    
        WCHAR wsz[MAX_PATH] = {0};  
        MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);
        hr = ppf->Save(wsz, TRUE);
        if (SUCCEEDED(hr))
        {
            // ...
        }
    
        ppf->Release();
        pLink->Release();
        return SUCCEEDED(hr);
    }
    
    
    /* 函数功能:获取指定快捷方式的目标文件(修改后可重新设置)
    函数参数:
    lpszLinkPath    指定快捷方式全路径名。
    lpszTargetPath  获取快捷方式目标文件缓冲区。
    dwTargetPathLen 快捷方式目标文件缓冲区大小。
    */
    
    BOOL GetLinkTarget(LPCSTR lpszLinkPath, 
               LPSTR lpszTargetPath,
               DWORD dwTargetPathLen) { BOOL bRet
    = FALSE; HRESULT hr = 0; IShellLink *pLink = NULL; IPersistFile *ppf = NULL; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink); if (FAILED(hr)) return FALSE; hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf); if (FAILED(hr)) { pLink->Release(); return FALSE; } WCHAR wszLinkPath[MAX_PATH + 1] = {0}; MultiByteToWideChar(CP_ACP, 0, lpszLinkPath, -1, wszLinkPath, MAX_PATH + 1); hr = ppf->Load(wszLinkPath, STGM_READWRITE); if (SUCCEEDED(hr)) { hr = pLink->Resolve(NULL, SLR_NO_UI); if (SUCCEEDED(hr)) { hr = pLink->GetPath(lpszTargetPath, dwTargetPathLen, NULL, SLGP_RAWPATH); if (SUCCEEDED(hr)) { hr = pLink->SetPath(lpszTargetPath); if (SUCCEEDED(hr)) {
                hr = ppf->Save(lpszLinkPath, TRUE);
               if (SUCCEEDED(hr))
                {                
                  bRet = TRUE;

                 }

                    }
                }
            }
        }
    
        ppf->Release();
        pLink->Release();
        return bRet;
    }
    
    int main()
    {
        CoInitialize(NULL);
        CreateFileShortcut("D:\Kingview7.5 SP1\KV7.5_CN_work\Unicode\build\bind\SignatureAudit.exe", 
            "D:\", 
            "SignatureAudit.lnk", 
            "D:\", 
            0, 
            "审计浏览器", 
            0);
    char szBuf[MAX_PATH] = ""; LPSTR lpszTargetPath = szBuf; GetLinkTarget("C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Kingview\Help\Kingview help.lnk", lpszTargetPath, MAX_PATH); CoUninitialize(); return 0; }
  • 相关阅读:
    Linux 字典数组应用
    Linux shell 字符串切割 内置方法
    【Swing/文本组件】定义自动换行的文本域
    【C++语法基础】实验1
    【Swing程序设计/常用面板】
    【标签组件与图标 3.3】
    【2018.2.26算法总结#分治】
    数据结构#课表排序及查询
    数据结构#前序遍历建立二叉树 输出中序遍历
    OJ#1002 又是a+b
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6651027.html
Copyright © 2011-2022 走看看