app c++ windows winapi shortcut

app - ifstream y ofstream c++



Cómo crear mediante programación un acceso directo con Win32 (4)

Necesito crear programáticamente un atajo usando C ++.

¿Cómo puedo hacer esto usando Win32 SDK?

¿Qué función API se puede usar para este propósito?


Aquí hay un código de muestra de C ++ basado en el código de William Rayer en codeproject.com

archivo de encabezado (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); };

Archivo de origen (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); }


Este artice de MSDN, Shell Links , proporciona un tutorial completo sobre el tema con un ejemplo de código.


Pruebe los enlaces del shell de Windows . Esta página también contiene un ejemplo de C ++ . Fragmento descriptivo:

Usando enlaces de Shell

Esta sección contiene ejemplos que demuestran cómo crear y resolver accesos directos desde dentro de una aplicación basada en Win32. Esta sección asume que está familiarizado con la programación COM de Win32, C ++ y OLE.

EDITAR: Agregar el ejemplo de código en caso de que el enlace muera (y los enlaces de MSDN mueran a menudo).

// 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;


Puede usar la función del system para ejecutar el comando mklink .

system("mklink /d shortcut_name Target_file");