Newsgroup: it.comp.programmare.win32
Titolo: creare shortcut

Salve.
Ho il problema di scrivere un programma che crea uno shortcut in una
cartella dell'HD, ad esempio sul desktop, noto il percorso da linkare.
So che esiste una API che fa una cosa del genere. Qualcuno sa dirmi qual'e'?
dove trovarla? come usarla?
Grazie per ogni suggerimento
Pietro

dove trovarla? come usarla?
Dovresti utilizzare l'interfaccia IShellLink (e seguenti, se ne esistono).
Se non conosci COM fai prima ad andare su 
www.wosit.org
 , studiarti il
formato dei file .lnk e crearti le tue funzioni.
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
ICQ: 42227764
---------------------------------------------------------------------------

Purtroppo non esiste un'API: è necessario usare un'interfaccia COM
(IShellLink). Se ti interessa, io ho scritto una DLL che implementa la
creazione dei collegamenti in maniera diretta, liberandoti dall'uso di COM.
Funziona direttamente con VC (è incluso il file .lib per il linker). Nella
documentazione c'è anche la dichiarazione per Visual Basic. La trovi a
questo indirizzo:
http://www.freeweb.org/letteratura/loz/lozutils.html
Bye,
Lorenzo
---
"...un tipo perso dietro le nuvole e la poesia..."
Lorenzo "Loz" Novara
E-Mail: 
l...@iol.it
Web: 
http://loz.freeweb.org

 wrote in message
zRTz3.20750$6C.7...@typhoon.libero.it...


Effettivamente l'appelet del pannello di controllo appwiz.cpl esporta una
funzione NewLinkHere ed altre, ma a quanto mi risulta non sono documentate,
pertanto eviterei di cimentarmici (potrebbero sempre sparire in future
versioni di Windows, proprio in virtů del fatto che non fanno parte delle
API ma sono funzioni proprietarie, volutamente non documentate), inoltre
ignoro i parametri che richiedono. Certo sembrano interessanti, c'č anche
una funzione dal nome ConfigStartMenu che mi attira molto... chi ne sa
qualcosa?


Ho risolto l'arcano: si tratta semplicemente dell'API invocata quando si
seleziona la voce Nuovo->Collegamento dal menu contestuale di una cartella.
Potete testarla in questo modo:
Selezionare Start->Esegui e digitare:
rundll32.exe AppWiz.Cpl,NewLinkHere NomeCartella
dove NomeCartella è un percorso valido (ed: C:\Windows\Desktop).
Si aprirà il wizard classico, permettendo di creare un collegamento.
Ovviamente ciò è inutile se si desidera creare un collegamento da un
programma.


 wrote in message
DabA3.46590$6C.1...@typhoon.libero.it...


Grazie per ogni suggerimento
Ti do una bella funzione pronta e funzionante (presa da un mio programma che
gira):
ObjPath: percorso dell'oggetto a cui creare uno shortcut
IconPath: percorso dell'icona da associare al collegamento (può essere "")
LinkDescription: descrizione del collegamento (per es. la frasetta scritta
sotto le icone del desktop)
LinkPath: percorso dove mettere il collegamento
La funzione restituisce TRUE se tutto è andato bene, altrimenti FALSE.
Utilizza le MFC. (Visual C++)
BOOL Crealink(CString ObjPath,CString IconPath,CString
LinkDescription,CString LinkPath)
{
    BOOL BRet=TRUE;
    HRESULT HRes;
    IShellLink *ShellLink;
    HRes=CoInitialize(NULL);
    if ((HRes!=S_OK) && (HRes!=S_FALSE))
      {
      AfxMessageBox("Problemi di memoria! Creazione fallita.");
      BRet=FALSE;
      }
    else
      {
HRes=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLi
nk,(void**)&ShellLink);
      if (SUCCEEDED(HRes))
        {
        IPersistFile *PersistFile;
        ShellLink->SetPath(LPCTSTR(ObjPath));
        ShellLink->SetDescription(LPCTSTR(LinkDescription));
        if (IconPath!="")
          ShellLink->SetIconLocation(LPCTSTR(IconPath),0);
HRes=ShellLink->QueryInterface(IID_IPersistFile,(void**)&PersistFile);
        if (SUCCEEDED(HRes))
          {
          wchar_t wsz[512];
          MultiByteToWideChar(CP_ACP,0,LPCTSTR(LinkPath),-1,wsz,512);
          HRes=PersistFile->Save(wsz,TRUE);
          if (HRes==E_FAIL)
            {
            AfxMessageBox("Problemi di memoria! Creazione fallita.");
            BRet=FALSE;
            }
          PersistFile->Release();
          }
        else
          {
          AfxMessageBox("Problemi di memoria! Creazione fallita.");
          BRet=FALSE;
          }
        ShellLink->Release();
        }
      else
        {
        AfxMessageBox("Problemi di memoria! Creazione fallita.");
        BRet=FALSE;
        }
      CoUninitialize();
      }
    return BRet;
}
                        Max