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 einsetzenFunktion:
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 erzeugenGruss 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"; } // misslungenAufruf 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"; } // misslungenAufruf 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"; } // misslungenZur 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 DesktopDanke für Deine Hilfe. Gruss Stefan