如何以编程方式使用Win32创build一个快捷方式

我需要以编程方式使用C ++创build一个快捷方式。

我怎样才能使用Win32 SDK做到这一点?

什么API函数可以用于这个目的?

尝试Windows Shell链接。 这个页面还包含一个C ++的例子 。 描述性片段:

使用Shell链接

本节包含演示如何在基于Win32的应用程序中创建和解决快捷方式的示例。 本节假定您熟悉Win32,C ++和OLE COM编程。

编辑:添加代码示例万一链接死(和MSDN链接经常死亡。)

// CreateLink - Uses the Shell's IShellLink and IPersistFile interfaces // to create and store a shortcut to the specified object. // // Returns the result of calling the member functions of the interfaces. // // Parameters: // lpszPathObj - Address of a buffer that contains the path of the object, // including the file name. // lpszPathLink - Address of a buffer that contains the path where the // Shell link is to be stored, including the file name. // lpszDesc - Address of a buffer that contains a description of the // Shell link, stored in the Comment field of the link // properties. #include "stdafx.h" #include "windows.h" #include "winnls.h" #include "shobjidl.h" #include "objbase.h" #include "objidl.h" #include "shlguid.h" HRESULT CreateLink(LPCWSTR lpszPathObj, LPCSTR lpszPathLink, LPCWSTR lpszDesc) { HRESULT hres; IShellLink* psl; // Get a pointer to the IShellLink interface. It is assumed that CoInitialize // has already been called. hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; // Set the path to the shortcut target and add the description. psl->SetPath(lpszPathObj); psl->SetDescription(lpszDesc); // Query IShellLink for the IPersistFile interface, used for saving the // shortcut in persistent storage. hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf); if (SUCCEEDED(hres)) { WCHAR wsz[MAX_PATH]; // Ensure that the string is Unicode. MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH); // Save the link by calling IPersistFile::Save. hres = ppf->Save(wsz, TRUE); ppf->Release(); } psl->Release(); } return hres; 

这里是codeproject.com上基于William Rayer代码的c ++示例代码

头文件(ShortcutProvider.h):

 #include <Windows.h> class ShortcutProvider { public: /* ------------------------------------------------------------------- Description: Creates the actual 'lnk' file (assumes COM has been initialized). Parameters: pszTargetfile - File name of the link's target. pszTargetargs - Command line arguments passed to link's target. pszLinkfile - File name of the actual link file being created. pszDescription - Description of the linked item. iShowmode - ShowWindow() constant for the link's target. pszCurdir - Working directory of the active link. pszIconfile - File name of the icon file used for the link. iIconindex - Index of the icon in the icon file. Returns: HRESULT value >= 0 for success, < 0 for failure. -------------------------------------------------------------------- */ HRESULT Create(LPSTR pszTargetfile, LPSTR pszTargetargs, LPSTR pszLinkfile, LPSTR pszDescription, int iShowmode, LPSTR pszCurdir, LPSTR pszIconfile, int iIconindex); }; 

源文件(ShortcutProvide.cpp):

 #include "ShortcutProvider.h" #include <Windows.h> #include <shlobj.h> #include <winnls.h> #include <shobjidl.h> #include <objbase.h> #include <objidl.h> #include <shlguid.h> HRESULT ShortcutProvider::Create(LPSTR pszTargetfile, LPSTR pszTargetargs, LPSTR pszLinkfile, LPSTR pszDescription, int iShowmode, LPSTR pszCurdir, LPSTR pszIconfile, int iIconindex) { HRESULT hRes; /* Returned COM result code */ IShellLink* pShellLink; /* IShellLink object pointer */ IPersistFile* pPersistFile; /* IPersistFile object pointer */ WCHAR wszLinkfile[MAX_PATH]; /* pszLinkfile as Unicode string */ int iWideCharsWritten; /* Number of wide characters written */ CoInitialize(NULL); hRes = E_INVALIDARG; if ( (pszTargetfile != NULL) && (strlen(pszTargetfile) > 0) && (pszTargetargs != NULL) && (pszLinkfile != NULL) && (strlen(pszLinkfile) > 0) && (pszDescription != NULL) && (iShowmode >= 0) && (pszCurdir != NULL) && (pszIconfile != NULL) && (iIconindex >= 0) ) { hRes = CoCreateInstance( CLSID_ShellLink, /* pre-defined CLSID of the IShellLink object */ NULL, /* pointer to parent interface if part of aggregate */ CLSCTX_INPROC_SERVER, /* caller and called code are in same process */ IID_IShellLink, /* pre-defined interface of the IShellLink object */ (LPVOID*)&pShellLink); /* Returns a pointer to the IShellLink object */ if (SUCCEEDED(hRes)) { /* Set the fields in the IShellLink object */ hRes = pShellLink->SetPath(pszTargetfile); hRes = pShellLink->SetArguments(pszTargetargs); if (strlen(pszDescription) > 0) { hRes = pShellLink->SetDescription(pszDescription); } if (iShowmode > 0) { hRes = pShellLink->SetShowCmd(iShowmode); } if (strlen(pszCurdir) > 0) { hRes = pShellLink->SetWorkingDirectory(pszCurdir); } if (strlen(pszIconfile) > 0 && iIconindex >= 0) { hRes = pShellLink->SetIconLocation(pszIconfile, iIconindex); } /* Use the IPersistFile object to save the shell link */ hRes = pShellLink->QueryInterface( IID_IPersistFile, /* pre-defined interface of the IPersistFile object */ (LPVOID*)&pPersistFile); /* returns a pointer to the IPersistFile object */ if (SUCCEEDED(hRes)) { iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, pszLinkfile, -1, wszLinkfile, MAX_PATH); hRes = pPersistFile->Save(wszLinkfile, TRUE); pPersistFile->Release(); } pShellLink->Release(); } } CoUninitialize(); return (hRes); } 

你可以使用系统函数来执行mklink命令。

 system("mklink /d shortcut_name Target_file"); 

这MSDN artice, 壳牌链接 ,提供了一个关于与代码示例主题的综合教程。