Hallo,
hat jemand eine Idee, wie man für ein Installationsprogramm eine Programmgruppe unter Windows anlegt und diese Gruppe mit Einträgen (Links auf Programme, Dateien...) füllt ?
Für Tipps wäre ich dankbar.
Programmgruppe mit Einträgen mit QT erzeugen
Eine Programmgruppe ist auch nur ein Ordner im Startmenü und wie man Verknüpfungen anlegt, findet Du hier.
So, nachdem ich es umgeschrieben und erweitert habe, hier die entsprechenden Files für QT 4:
als erstes der Header pbshell.hpp
und dann der Source:
als erstes der Header pbshell.hpp
Code: Alles auswählen
#ifndef PBSHELL_HEADER_INCLUDED
#define PBSHELL_HEADER_INCLUDED
#define NO_WIN32_LEAN_AND_MEAN
#include <shlobj.h>
#include <QtCore>
struct PBShortcutCfg
{
// Konstruktor (Initialiserung der int-Membervariablen)
PBShortcutCfg()
{
ilShowCmd = SW_SHOWNORMAL;
wlHotKey = 0;
ilIconIndex = 0;
slShortcutName = "";
slLnkDir = "";
slDestFile = "";
slArguments = "";
slIconFile = "";
slWorkingDir = "";
slDescription = "";
}
// Member-Variablen:
QString slShortcutName; // Name der Verknüpfung -> wird auf dem Desktop/
// im Startmenü/etc. neben dem Symbol angezeigt.
// Verknüpfungsname entspriicht dem Dateinamen
// der Verknüpfung ohne Erweiterung .lnk.
QString slLnkDir; // Physikalischer Pfad zum
// Verknüpfungsverzeichnis
QString slDestFile; // "Zieldatei" der Verknüpfung -> kann eine
// beliebige Exe-Datei oder eine Datendatei mit
// registrierter Erweiterung (z.B. .html) sein
// Diese Datei wird beim Doppelklick auf die
// Verknüpfung ausgeführt bzw. geöffnet.
QString slArguments; // String mit den beim Programmstart zu
// übergebenden Parameter (kann leer bleiben)
QString slIconFile; // Name der Datei mit dem Symbol (Icon) für
// die Verknüpfung (exe, dll oder ico-Datei)
// Wird ein leerer String übergeben, verwendet
// Windows ein Standard-Icon der Zieldatei.
// (kann leer bleiben)
int ilIconIndex; // Index des Icons in der EXE oder DLL-Datei
// (Indexierung beginnt bei 0, kann 0 bleben)
QString slWorkingDir; // Das zu übergebende Arbeitsverzeichnis
// (kann i.d.R. leer bleiben - je nach
// Anforderungen der aufzurufenden Anwendung)
QString slDescription; // Kommentar zur Verknüpfung (Kommentar ist
// meines Wissens nur im Eigenschaften-
// Dialog der Verknüpfung unter NT sichtbar)
// (kann leer bleiben)
WORD wlHotKey; // Tastenkombination (Hotkey) für den Aufruf
// der Verknüpfung. Aufbau:
// - Low-Order Byte -> virtueller Tastencode
// (z.B. 'K', VK_F1 etc.)
// - High-Order Byte -> Modifizierer-Flags
// (binäre ODER Kombination aus Flags
// HOTKEYF_ALT, HOTKEYF_CONTROL und
// HOTKEYF_SHIFT möglich)
// (kann 0 bleiben)
int ilShowCmd; // Fenster-Anzeigemodus für den Programmstart
// Folgende Konstanten können verwendet werden:
// SW_SHOWNORMAL (default) -> normales Fenster
// SW_SHOWMINNOACTIVE -> minimiert starten
// SW_SHOWMAXIMIZED -> maximiert starten
// (kann i.d.R. SW_SHOWNORMAL bleiben)
};
bool CreateShortcut(PBShortcutCfg* sCfg, QString ProgrammGruppe, int ilFolder);
bool ReadShortcut(PBShortcutCfg* sCfg, QString slFileName);
#endif
Code: Alles auswählen
#include "pbshell.hpp"
#include <QDir>
//---------------------------------------------------------------------------
// Funktion CreateShortcut() erzeugt eine neue Verknüpfung (shell shortcut)
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// sCfg -> Zeiger auf PBShortcutCfg-Instanz mit der Konfguration
// der Verknüpfung
// PrgGrp -> Name der Programmgruppe
// ilFolder -> Zielfolder-Id Konstante (z.B. CSIDL_DESKTOP,CSIDL_STARTUP
// usw. definiert in der Datei ..\cbuilder\include\shlobj.h)
//
// Hinweis:
// Das Zielverzeichnis für die Verknüpfung kann ebenfalls in der slLnkDir-
// Membervariablen der TShortcutCfg als Pfad definiert werden. In diesem
// Fall muss der Wert von ilFolder auf -1 gesetzt werden.
//
// Rückgabewert: bei fehlerfreien Ausführung wird true zurückgelifert,
// anderenfalls false.
// (c) Original: S. Kreutzmann
// von http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc03002.php
// Umgeschrieben auf QT 4 von Peter
//---------------------------------------------------------------------------
bool CreateShortcut(PBShortcutCfg* sCfg, QString PrgGrp, int ilFolder)
{
wchar_t cBuf[MAX_PATH];
bool blRetVal = true; // Rückgabewert
wchar_t wsz [MAX_PATH]; // Buffer für Unicode String
IShellLink *psl;
QString slShortcutFile;
if(ilFolder >= 0)
{
// Shortcut-Verzeichnis bestimmen und den Namen der LNK-Datei erzeugen
LPITEMIDLIST pidl;
SHGetSpecialFolderLocation(0, ilFolder, &pidl);
SHGetPathFromIDList(pidl, cBuf);
QString progdir = QString::fromUtf16(cBuf);
if (QDir(progdir).exists())
{
if (PrgGrp.trimmed().length())
{
QDir dir(progdir + "\\" + PrgGrp);
if (!dir.exists())
dir.mkdir(progdir + "\\" + PrgGrp);
dir.refresh();
if (dir.exists())
slShortcutFile = progdir + "\\" + PrgGrp + "\\" + sCfg->slShortcutName + ".lnk";
else
blRetVal = false;
}
else
slShortcutFile = progdir + "\\" + sCfg->slShortcutName + ".lnk";
}
else
blRetVal = false;
}
else
if(QDir(sCfg->slLnkDir).exists())
{
slShortcutFile = sCfg->slLnkDir + sCfg->slShortcutName + ".lnk";
// slShortcutFile.WideChar(wsz, MAX_PATH);
}
else
blRetVal = false;
if(blRetVal)
{
// COM-Bibliothek initialisieren, hier kann S_FALSE auch bedeuten,
// dass bereits eine andere Com-Initialisierung stattgefunden hat.
// Der Aufruf scheitert wirklich, wenn CoCreateInstance nicht erstellt werden kann !
HRESULT result = CoInitialize(NULL);
blRetVal = false;
if (result == S_OK)
blRetVal = true;
if (result == S_FALSE)
blRetVal = true;
if(blRetVal)
{
// IShellLink Objekt erzeugen
blRetVal = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl) >= 0;
if(blRetVal)
{
IPersistFile *ppf;
// Zeiger auf IPersistFile-Interface (zum Speichern der
// Verknüpfung) besorgen
blRetVal = psl->QueryInterface(IID_IPersistFile, (void **)&ppf) >= 0;
if(blRetVal)
{
// Zieldatei der Verknüpfung setzen
if(sCfg->slDestFile.trimmed().length())
blRetVal = psl->SetPath(reinterpret_cast<wchar_t *>(sCfg->slDestFile.data())) >= 0;
// Übergabeparameter der Verknüpfung setzen
if(blRetVal && sCfg->slArguments.trimmed().length())
blRetVal = psl->SetArguments(reinterpret_cast<wchar_t *>(sCfg->slArguments.data())) >= 0;
// Icon zuweisen:
if(blRetVal && sCfg->slIconFile.trimmed().length() && QFile(sCfg->slIconFile).exists())
psl->SetIconLocation(reinterpret_cast<wchar_t *>(sCfg->slIconFile.data()), sCfg->ilIconIndex);
// Arbeitsverzeichnis für die Verknüpfung zuweisen:
if(blRetVal && sCfg->slWorkingDir.trimmed().length())
psl->SetWorkingDirectory(reinterpret_cast<wchar_t *>(sCfg->slWorkingDir.data()));
// Kommentar für die Verknüpfung zuweisen
// (Kommentar ist meines Wissens nur im Eigenscharten-
// Dialog der Verknüpfung unter NT sichtbar)
if(blRetVal && sCfg->slDescription.trimmed().length())
psl->SetDescription(reinterpret_cast<wchar_t *>(sCfg->slDescription.data()));
// Hotkey zuweisen:
if(blRetVal && sCfg->wlHotKey != 0)
psl->SetHotkey(sCfg->wlHotKey);
// Fenster-Modus zuweisen:
if(blRetVal && sCfg->ilShowCmd != 0)
psl->SetShowCmd(sCfg->ilShowCmd);
// Verknüpfung speichern
if(blRetVal) blRetVal = ppf->Save (reinterpret_cast<wchar_t *>(slShortcutFile.data()), TRUE) >= 0;
// Zeiger auf IPersistFile freigeben
ppf->Release ();
}
// Zeiger auf IShellLink freigeben
psl->Release ();
}
else
return false;
// COM-Bibliothek freigeben
CoUninitialize();
}
}
return blRetVal;
}
//---------------------------------------------------------------------------
// Funktion ReadShortcut() liest die Konfiguration einer Verknüpfung
// in die übergeben TShortcutCfg-Instanz ein
//---------------------------------------------------------------------------
// Übergabeparameter:
//
// sCfg -> Zeiger auf PBShortcutCfg-Instanz mit der Konfguration
// der Verknüpfung
// slFileName -> Name der einzulesenden Verknüpfungsdatei
// (z.B. "C:\\WINDOWS\\SENDTO\\Proton.lnk")
//
// Rückgabewert: bei fehlerfreien Ausführung wird true zurückgelifert,
// anderenfalls false.
// (c) Original: S. Kreutzmann
// (noch nicht fertig) Umgeschrieben auf QT 4 von Peter
//---------------------------------------------------------------------------
bool ReadShortcut(PBShortcutCfg* sCfg, QString slFileName)
{
bool blRetVal = true; // Rückgabewert
wchar_t wsz [MAX_PATH]; // Buffer für Unicode String
wchar_t buf[MAX_PATH];
IShellLink *psl;
// slFileName.WideChar(wsz, MAX_PATH);
if(blRetVal)
{
// COM-Bibliothek initialisieren
blRetVal = CoInitialize(NULL) == S_OK;
if(blRetVal)
{
// IShellLink Objekt erzeugen
blRetVal = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (void **)&psl) >= 0;
if(blRetVal)
{
IPersistFile *ppf;
// The IShellLink Interface supports the IPersistFile
// interface. Get an interface pointer to it.
blRetVal = psl->QueryInterface(IID_IPersistFile, (void **)&ppf) >= 0;
// Zeiger auf IPersistFile-Interface (zum Speichern der
// Verknüpfung) besorgen
if(blRetVal)
{
// Verknüpfungsdatei laden:
blRetVal = ppf->Load(wsz, TRUE) >= 0;
// Zieldatei der Verknüpfung lesen
if(blRetVal)
{
// Zieldatei der Verknüpfung lesen:
psl->GetPath(buf, MAX_PATH, NULL, 0);
sCfg->slDestFile = QString::fromUtf16(buf);
// Übergabeparameter der Verknüpfung lesen
psl->GetArguments(buf, MAX_PATH);
sCfg->slArguments = QString::fromUtf16(buf);
// Symbolinformationen lesen:
int ilIndex = 0;
if(psl->GetIconLocation(buf, MAX_PATH, &ilIndex) == NOERROR)
{
sCfg->slIconFile = QString::fromUtf16(buf);
sCfg->ilIconIndex = ilIndex >= 0 ? ilIndex : 0;
}
// Arbeitsverzeichnis der Verknüpfung lesen
psl->GetWorkingDirectory(buf, MAX_PATH);
sCfg->slWorkingDir = QString::fromUtf16(buf);
// Kommentar für die Verknüpfung lesen
psl->GetDescription(buf, MAX_PATH);
sCfg->slDescription = QString::fromUtf16(buf);
// Hotkey zuweisen:
psl->GetHotkey(&sCfg->wlHotKey);
// Fenster-Modus zuweisen:
psl->GetShowCmd(&sCfg->ilShowCmd);
}
// Zeiger auf IPersistFile freigeben
ppf->Release ();
}
// Zeiger auf IShellLink freigeben
psl->Release ();
}
// COM-Bibliothek freigeben
CoUninitialize();
}
if(blRetVal)
{
sCfg->slLnkDir = slFileName;
slFileName = slFileName;
// sCfg->slShortcutName = slFileName.Length() ?
// slFileName.mid(1, slFileName.Length()-ExtractFileExt(slFileName).Length()) : EmptyStr;
}
}
return blRetVal;
}