Neue Programmgruppe im Startmenü



  • Hallo,

    bekomme Verknüpfungen für Desktop und Startmenü soweit hin. Problem habe ich im Startmenü, wo er mir immer direkt ins Startmenü die Links reinsetzt, aber nicht in eine eigene Programmgruppe:

    Aufruf wie folgt:

    AnsiString z2,z3,z4;Boolean o2;
       z3="c:\autoexec.bat";                                                        // Dateiname
       z2="Autoexec Batch";                                                         // Beschreibung Link
       z4="Neue_Gruppe";                                                            // Programmgruppe
    
       o2=CreateShortCut(CSIDL_STARTMENU,z2+".lnk",z3,z2,z4,"");                    // Link erzeugen
       if(o2==false) { z1="NOT OK"; }                                               // misslungen
    
       frm1_5_rtfInfo->SelAttributes->Color=clGray;                                 // Textfarbe gr
       frm1_5_rtfInfo->Lines->Add("Link Startm.:\t"+z1+"\t"+z3);                    // Info einsetzen
    

    Funktion:

    Boolean CreateShortCut(int SpecialFolder,AnsiString file,AnsiString Path,AnsiString Description,AnsiString WorkDir,AnsiString Args)
    {IShellLink*   pLink;                                                           //
     IPersistFile* pPersistFile;                                                    //
     LPMALLOC      ShellMalloc;                                                     //
     LPITEMIDLIST  DesktopPidl;                                                     //
     char DesktopDir[MAX_PATH];                                                     //
    
     if(FAILED(SHGetMalloc(&ShellMalloc))) { return false; }                        // keine Speicheranforderung möglich
     if(FAILED(SHGetSpecialFolderLocation(NULL,SpecialFolder ,&DesktopPidl))) { return false; } // Verzeichnisanforderung fehlgeschlagen
    
     if(!SHGetPathFromIDList(DesktopPidl, DesktopDir)) {                            // Verzeichnnis in Liste NICHT gefunden
      ShellMalloc->Free(DesktopPidl);                                               // Speicher löschen
      ShellMalloc->Release();                                                       // und freigeben
      return false;                                                                 // und ohne Ergebnis zurück
     }                                                                              // ende if(!SHG
    
     ShellMalloc->Free(DesktopPidl);                                                // Speicher löschen
     ShellMalloc->Release();                                                        // und freigeben
    
     if(SUCCEEDED(CoInitialize(NULL))) {
      if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink, (void **) &pLink))) {
       pLink->SetPath(Path.c_str());                                                // Pfad zur Verknüpfung vorgeben
       pLink->SetDescription(Description.c_str());                                  // Beschreibung übergeben
       pLink->SetWorkingDirectory(WorkDir.c_str());                                 // Arbeitsordner übergeben
       pLink->SetArguments(Args.c_str());                                           // Argumente übergeben
       pLink->SetShowCmd(SW_SHOW);                                                  // und Link zeigen
    
       if (SUCCEEDED (pLink->QueryInterface(IID_IPersistFile, (void **) &pPersistFile))) {
        WideString strShortCutLocation(DesktopDir);                                 // Pfad für Link
        strShortCutLocation+="\\";                                                  // Trenner einsetzen
        strShortCutLocation+=+file.c_str();                                         // Dateiname für Link
        pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);                     // und sichern
        pPersistFile->Release();                                                    // und freigeben
       }                                                                            // ende if(Succeeded(pLink
    
      pLink->Release();                                                             // Linkaufruf beenden
      }                                                                             // ende if(Succeeded(CoCreate
    
     CoUninitialize();                                                              // und Initialisierung fertig
     }                                                                              // ende if(Succeeded(CoInit
    
     return true;                                                                   // alles ok, zurück
    }
    

    Ich vermute mal, daß ich erst für die CLSID Anforderung vorher (?)
    die Gruppe anlegen muss, aber wie bzw. wo? Für jeden Tipp dankbar,
    habe schon Google und Forum querbeet durchgeforstet, komme aber nicht
    mehr weiter...

    Danke und Gruss Stefan



  • Die Programmgruppen im Startmenu sind einfache Dateiordner, dementsprechend kannst du im Pfad des Startmenus einfach einen neuen Ordner mit dem gewünschten Namen erstellen.



  • Hallo, audacia

    Ordner erzeugen, gut. Aber wie übergebe ich dann diesen Pfad anstatt des
    Standardparameters CSIDL_STARTMENU ( +z4 ?????) ?

    AnsiString z2,z3,z4;Boolean o2;
       z3="c:\autoexec.bat";                                                        // Dateiname
       z2="Autoexec Batch";                                                         // Beschreibung Link
       z4="Neue_Gruppe";                                                            // Programmgruppe
    
       o2=CreateShortCut(CSIDL_STARTMENU +z4?????,z2+".lnk",z3,z2,"","");           // Link erzeugen
    

    Gruss Stefan



  • Du könntest z.B. deiner Funktion einen zusätzlichen Parameter spendieren, der den Namen eines ggf. zu erstellen Unterordners angibt, oder alternativ die Funktion in zwei Funktionen aufteilen (was ich bevorzugen würde):

    AnsiString GetSpecialFolderLocation (int SpecialFolder)
    {
      LPMALLOC      ShellMalloc;
      LPITEMIDLIST  DesktopPidl;
      char DesktopDir[MAX_PATH];
    
      if(FAILED (SHGetMalloc (&ShellMalloc)))
        return ("");        // keine Speicheranforderung möglich
      if(FAILED(SHGetSpecialFolderLocation (NULL, SpecialFolder, &DesktopPidl)))
        return ("");        // Verzeichnisanforderung fehlgeschlagen
    
      if(!SHGetPathFromIDList (DesktopPidl, DesktopDir))
      {                                  // Verzeichnnis in Liste NICHT gefunden
        ShellMalloc->Free (DesktopPidl); // Speicher löschen
        ShellMalloc->Release ();         // und freigeben
        return ("");                     // und ohne Ergebnis zurück
      }
    
      ShellMalloc->Free (DesktopPidl); // Speicher löschen
      ShellMalloc->Release (); // und freigeben
      return (AnsiString (DesktopDir));
    }
    
    bool CreateShortCut (AnsiString SavePath, AnsiString Path, AnsiString Description, AnsiString WorkDir, AnsiString Args)
    {
      IShellLink*   pLink;
      IPersistFile* pPersistFile;
    
      if(SUCCEEDED (CoInitialize (NULL)))
      {
        if(SUCCEEDED (CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &pLink)))
        {
          pLink->SetPath (Path.c_str());                 // Pfad zur Verknüpfung vorgeben
          pLink->SetDescription (Description.c_str());   // Beschreibung übergeben
          pLink->SetWorkingDirectory (WorkDir.c_str());  // Arbeitsordner übergeben
          pLink->SetArguments (Args.c_str());            // Argumente übergeben
          pLink->SetShowCmd (SW_SHOW);                   // und Link zeigen
    
          if (SUCCEEDED (pLink->QueryInterface (IID_IPersistFile, (void **) &pPersistFile)))
          {
            pPersistFile->Save (WideString (SavePath).c_bstr (), TRUE); // und sichern
            pPersistFile->Release ();                                // und freigeben
          }
    
          pLink->Release (); // Linkaufruf beenden
        }
    
        CoUninitialize ();   // und Initialisierung fertig
      }
      return (true);
    }
    
    ...
    
    CreateShortCut (GetSpecialFolderLocation (CSIDL_STARTMENU) + "\\Name des Links.lnk", "C:\\autoexec.bat", "AutoExec Batch File", "C:\\", "");
    


  • Hallo, audacia

    erstmal danke für Deine Antwort. Habe es implementiert und erweitert
    und geht. Vielen Dank!

    Hier für alle die danach suchen (2 Routinen zum Erzeugen):

    AnsiString GetSpecialFolderLocation (int SpecialFolder)
    {LPMALLOC      ShellMalloc;                                                     //
     LPITEMIDLIST  DesktopPidl;                                                     //
     char DesktopDir[MAX_PATH];                                                     //
    
     if(FAILED(SHGetMalloc (&ShellMalloc))) { return (""); }                        // keine Speicheranforderung möglich
     if(FAILED(SHGetSpecialFolderLocation (NULL, SpecialFolder, &DesktopPidl))) { return (""); } // Verzeichnisanforderung fehlgeschlagen, zurück
    
     if(!SHGetPathFromIDList (DesktopPidl, DesktopDir)) {                           // Verzeichnnis in Liste NICHT gefunden
      ShellMalloc->Free (DesktopPidl);                                              // Speicher löschen
      ShellMalloc->Release ();                                                      // und freigeben
      return ("");                                                                  // und ohne Ergebnis zurück
     }                                                                              // ende if(!SHGet
    
     ShellMalloc->Free (DesktopPidl);                                               // Speicher löschen
     ShellMalloc->Release ();                                                       // und freigeben
    
     return (AnsiString (DesktopDir));                                              // und Rückgabe Verzeichnisname
    }
    
    Boolean CreateShortCut(AnsiString SavePath, AnsiString Path, AnsiString Description, AnsiString WorkDir, AnsiString Args,AnsiString NewGroup)
    {AnsiString zLink=SavePath;Boolean o1;                                          // Vars definieren
     if(NewGroup.Length()>0) { zLink=zLink+"\\"+NewGroup; }                         // Neue Programmgruppe mit an Zielordner hängen (Startmenü)
    
     IShellLink*   pLink;                                                           //
     IPersistFile* pPersistFile;                                                    //
    
     if(SUCCEEDED (CoInitialize(NULL))) {
      if(SUCCEEDED (CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &pLink))) {
       pLink->SetPath (Path.c_str());                                               // Pfad zur Verknüpfung vorgeben
       pLink->SetDescription (Description.c_str());                                 // Beschreibung übergeben
       pLink->SetWorkingDirectory (WorkDir.c_str());                                // Arbeitsordner übergeben
       pLink->SetArguments (Args.c_str());                                          // Argumente übergeben
       pLink->SetShowCmd (SW_SHOW);                                                 // und Link zeigen
    
       if (SUCCEEDED (pLink->QueryInterface(IID_IPersistFile,(void **) &pPersistFile))) {
        if(DirectoryExists(zLink)==false) {                                         // ggfs. neue Programmgruppe erstellen
         o1=ForceDirectories(zLink);                                                // neuen Ordner erstellen
         if(o1==false) { zLink=SavePath; }                                          // nicht ok, also Links ohne Gruppe/Ordner eintragen
        }                                                                           // ende if(Dir
    
        zLink=zLink+"\\"+Description+".lnk";                                        // und ergänzen mit Linkname
        pPersistFile->Save(WideString(zLink).c_bstr(),TRUE);                        // und sichern
        pPersistFile->Release ();                                                   // und freigeben
       }                                                                            // ende if(SUCC pLink
      pLink->Release ();                                                            // Linkaufruf beenden
      }                                                                             // ende if(SUCC CoCreate
    
     CoUninitialize ();                                                             // und Initialisierung fertig
     }                                                                              // ende if(SUCC CoIit
    
     return (true);                                                                 // alles ok
    }
    

    Aufruf Desktop Link:

    z3=zZiel+DatenPipe(1,2,z4,"!!");                                             // Dateiname
       z2=DatenPipe(1,3,z4,"!!"); z1="OK";                                          // Beschreibung Link
    
       o2=CreateShortCut(GetSpecialFolderLocation(CSIDL_DESKTOP),z3,z2,"","","");
       if(o2==false) { z1="NOT OK"; }                                               // misslungen
    

    Aufruf Startmenü (ggfs. mit neuer Gruppe z4):

    z3=zZiel+DatenPipe(1,2,z4,"!!");                                             // Dateiname
       z2=DatenPipe(1,3,z4,"!!"); z1="OK";                                          // Beschreibung Link
       z4=DatenPipe(1,4,z4,"!!");                                                   // Programmgruppe
    
       o2=CreateShortCut(GetSpecialFolderLocation(CSIDL_STARTMENU),z3,z2,"","",z4);
       if(o2==false) { z1="NOT OK"; }                                               // misslungen
    

    Aufruf Autostart:

    z3=zZiel+DatenPipe(1,2,z4,"!!");                                             // Dateiname
       z2=DatenPipe(1,3,z4,"!!"); z1="OK";                                          // Beschreibung Link
    
       o2=CreateShortCut(GetSpecialFolderLocation(CSIDL_STARTUP),z3,z2,"","","");
       if(o2==false) { z1="NOT OK"; }                                               // misslungen
    

    Zur Erklärung: AnsiString zZiel ist der Pfad zur Datei; z3 ergibt dann den Pfd+Dateiname; z2=Beschreibung für den Link (Dateikonform!), o2=Ergebniss,
    z4=ggfs. neue Programmgruppe oder Unterordner z.B. auf dem Desktop

    Danke für Deine Hilfe. Gruss Stefan


Anmelden zum Antworten