2010-10-11 24 views

Respuesta

17

Pruebe Windows Shell Links. Esta página también contiene un C++ example. Descriptiva Fragmento:

mediante el Shell Enlaces

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

EDIT: (. Y enlaces de MSDN mueren a menudo) añadir la muestra de código en caso de que el enlace muere

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

Este artice MSDN, Shell Links, proporcionan un tutorial completa sobre el tema con código ejemplo.

+0

Esto es divertido, el enlace que proporcionó y el enlace que proporcionó Paul son la misma página, pero tienen enlaces físicamente diferentes. Me pregunto por qué es así. Es extraño. Solo quería tirar eso ahí afuera. – dyslexicanaboko

4

Aquí es un código C++ muestra basada en William Rayer code on codeproject.com

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

Usted puede utilizar system función para ejecutar el comando mklink.

system("mklink /d shortcut_name Target_file"); 
+4

Esto no creará un atajo (archivo lnk) –

+0

, pero sí algunas otras combinaciones, como/J para vincular directorios. –

+0

/d es para un enlace a un directorio; simplemente elimine/d para un enlace a un archivo – Marichyasana

Cuestiones relacionadas