Necesito crear mediante programación un acceso directo usando C++.Cómo crear un acceso directo mediante programación utilizando Win32
¿Cómo puedo hacer esto usando Win32 SDK?
¿Qué función de API se puede utilizar para este fin?
Necesito crear mediante programación un acceso directo usando C++.Cómo crear un acceso directo mediante programación utilizando Win32
¿Cómo puedo hacer esto usando Win32 SDK?
¿Qué función de API se puede utilizar para este fin?
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;
Este artice MSDN, Shell Links, proporcionan un tutorial completa sobre el tema con código ejemplo.
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);
}
Usted puede utilizar system función para ejecutar el comando mklink.
system("mklink /d shortcut_name Target_file");
Esto no creará un atajo (archivo lnk) –
, pero sí algunas otras combinaciones, como/J para vincular directorios. –
/d es para un enlace a un directorio; simplemente elimine/d para un enlace a un archivo – Marichyasana
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