2010-10-11 14 views

Antwort

17

Versuchen Sie Windows Shell Links. Diese Seite enthält auch eine C++ example. Beschreibende Snippet:

Mit Shell-Links

Dieser Abschnitt enthält Beispiele, die zeigen, wie erstellen und Verknüpfungen innerhalb einer Win32-basierten Anwendung zu lösen. In diesem Abschnitt wird davon ausgegangen, dass Sie mit der COM-Programmierung von Win32, C++ und OLE vertraut sind.

EDIT: (. Und MSDN-Links oft sterben) Hinzufügen des Codebeispiel für den Fall der Link stirbt

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

Diese MSDN artice, Shell Links, bieten ein umfassendes Tutorial über das Thema mit dem Code Beispiel.

+0

Das ist amüsant, der Link, den Sie zur Verfügung gestellt haben und der Link, den Paul zur Verfügung stellt, sind die gleiche Seite, aber sie haben physikalisch verschiedene Links. Ich frage mich, warum das so ist. Nur komisch. Ich wollte das nur da rauswerfen. – dyslexicanaboko

4

ist hier ein C++ Codebeispiel basiert auf William Rayer code on codeproject.com

Header-Datei (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); 
}; 

Quelldatei (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

Sie verwenden können system Funktion zur Ausführung des Befehls mklink.

+4

Dies wird keine Verknüpfung (lnk-Datei) –

+0

erstellen, aber einige andere Kombinationen, wie/J zum Verknüpfen von Verzeichnissen tun. –

+0

/d ist für einen Link zu einem Verzeichnis; Entferne einfach/d für einen Link zu einer Datei – Marichyasana

Verwandte Themen