Seite 1 von 1
Programmgruppe mit Einträgen mit QT erzeugen
Verfasst: 18. Februar 2009 07:56
von peter999
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.
Verfasst: 18. Februar 2009 10:50
von macman
Eine Programmgruppe ist auch nur ein Ordner im Startmenü und wie man Verknüpfungen anlegt, findet Du
hier.
Verfasst: 23. Februar 2009 08:49
von peter999
@macman
Danke für den Link. Ist ja einfacher als gedacht. Ich habe bisher über DDE die Programmgruppe erzeugt, das ist aber erheblich weniger aufwändig...
Verfasst: 25. Februar 2009 10:31
von peter999
So, nachdem ich es umgeschrieben und erweitert habe, hier die entsprechenden Files für QT 4:
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
und dann der Source:
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;
}