Newsgroup: it.comp.lang.c++
Titolo: creare collegamenti (shortcut)

> 
http://www.geocities.com/sunsetstrip/stage/7787
 <<
<<<<<<<<<<<< 
DucaCr...@iol.it
 >>>>>>>>>>>>>>
*** I won't be torn between
*** The man in the chair
*** And the man that's in my dream
*** I'm going to melt the two men into one
                                      (Queensr˙che)

 e ora come creo il collegamento ad un mio file?
..cut...
Prova a vedere se questo codice funziona:
***
#define INC_OLE2
#include <windows.h>
#include <ole2.h>
#include <shlobj.h>
#include <objidl.h>
#include <stdio.h>
#pragma comment(lib,"uuid.lib")
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"shell32.lib")
HRESULT __x_CreateLink (
 LPCSTR CommandLine,
 LPCSTR Arguments,
 WORD HotKey,
 LPCSTR IconLocation,
 int IconIndex,
 int Show,
 LPCSTR WorkingDirectory,
 LPCSTR Description,
 LPSTR LinkName
 );
int main (
 int argc,
 char *argv[] )
    {
    __x_CreateLink( "D:\\Nt40\\System32\\cmd.exe", NULL, 0, NULL, 0,
     SW_SHOWMINIMIZED, "D:\\Nt40\\System32", "Bill's link to cmd.exe",
     "D:\\Nt40\\Profiles\\bill\\Desktop\\Bills link to cmd.lnk" );
    return 1;
    }
HRESULT __x_CreateLink (
 LPCSTR CommandLine,
 LPCSTR Arguments,
 WORD HotKey,
 LPCSTR IconLocation,
 int IconIndex,
 int Show,
 LPCSTR WorkingDirectory,
 LPCSTR Description,
 LPSTR LinkName )
    {
    HRESULT hres;
    IShellLink *psl;
    if( (CommandLine==NULL) || (LinkName==NULL))
        {
        return ERROR_INVALID_PARAMETER;
        }
    hres = CoInitialize(NULL);
    if( !SUCCEEDED(hres))
        {
        printf("CoInitialize failed, rc(%x),%x\n",hres,GetLastError());
        return hres;
        }
    hres = CoCreateInstance( &CLSID_ShellLink, NULL,
     CLSCTX_INPROC_SERVER, &IID_IShellLink, &psl );
    if( SUCCEEDED(hres))
        {
        IPersistFile *ppf;
        psl->lpVtbl->SetPath( psl, CommandLine );
        if( Description != NULL )
            {
            psl->lpVtbl->SetDescription( psl, Description );
            }
        if( Arguments != NULL )
            {
            psl->lpVtbl->SetArguments( psl, Arguments );
            }
        if( HotKey != 0 )
            {
            psl->lpVtbl->SetHotkey( psl, HotKey );
            }
        if( IconLocation != NULL )
            {
            psl->lpVtbl->SetIconLocation( psl, IconLocation,
             IconIndex );
            }
        if( Show != -1 )
            {
            psl->lpVtbl->SetShowCmd( psl, Show );
            }
        if( WorkingDirectory != NULL )
            {
            psl->lpVtbl->SetWorkingDirectory( psl, WorkingDirectory );
            }
        hres = psl->lpVtbl->QueryInterface( psl, &IID_IPersistFile,
         &ppf );
        if( SUCCEEDED(hres))
            {
            WORD wsz[MAX_PATH];
            MultiByteToWideChar( CP_ACP, 0, LinkName, -1,
             wsz, MAX_PATH );
            hres = ppf->lpVtbl->Save( ppf, wsz, TRUE );
            ppf->lpVtbl->Release(ppf);
            }
        else
            {
            printf( "QueryInterface failed, rc(%x),%x\n", hres,
             GetLastError());
            }
        psl->lpVtbl->Release(psl);
        }
    else
        {
        printf( "CoCreateInstance failed, rc(%x),%x\n", hres,
         GetLastError());
        }
    CoUninitialize();
    return hres;
    }
***
Ciao, UDA.
-- 
<><><><><><><><><><><><><><><><><><><><><><><><
UDA'Software
mailto:
uda.so...@iol.it
http://www.GeoCities.com/SiliconValley/Bay/2165

Immagino che sia uguale a W95:
Per prima cosa devi ottenere un puntatore all'interfaccia IShellLink (usa
CoCreateInstance con CLSID_ShellLink e IID_IShellLink, dichiarati in
'shlguid.h'); sul puntatore ottenuto chiama QueryInterface per ottenere un
puntatore ad all'interfaccia IPersistFile (IID_IPersistFile). A questo
punto, sul puntatore all'interfaccia IShellLink, chiama il metodo 'SetPath'
passando per parametro il nome (con percorso completo) del file a cui vuoi
creare il collegamento; sullo stesso puntatore chiama 'SetDescription'
passando per parametro una stringa contenente la descrizione del
collegamento (ad esempio: "Collegamento a <che ne so>"). Adesso devi
salvare il file di collegamento vero e proprio (il .lnk) chiamando il
metodo 'Save' sul puntatore all'interfaccia IPersistFile; il metodo 'Save'
ha due parametri: una stringa UNICODE che rappresenta il nome del file di
collegamento (con percorso completo) che nel tuo caso sarà il percorso
della cartella Menu Avvio, più un nome di file con estensione 'lnk'; un
valore booleano, che non ho capito bene a cosa serva. Segue un rozzo
esempio che non controlla nemmeno gli HRESULT (tu controllali):
#include <objbase.h>
#include <shlguid.h>
IShellLink    *pIShellLink    = NULL;
IPersistFile  *pIPersistFile  = NULL;
char            szFileDaCollegare[] = "C:\\Documenti\\Documento.doc";
char            szDescrizione[] = "Collegamento a Documento";
wchar_t       wszPercorso[] = L"...\\Menu Avvio\\Link.lnk";
CoCreateInstance(CLSID_ShellLink,NULL,
                           CLSCTX_INPROC_SERVER,
                           IDD_IShellLink,(void **)&pIShellLink);
pIShellLink->QueryInterface(IDD_IPersistFile,
                                         (void **)&pIPersistFile);
pIShellLink->SetPath((char *)szFileDaCollegare);
pIShellLink->SetDescription((char *)szDescrizione);
pIPersistFile->Save((wchar_t *)wszPercorso,TRUE);
pIPersistFile->Release();
pIShellLink->Release();
Stefano.