Programmgruppe mit Einträgen mit QT erzeugen

Alles rund um die Programmierung mit Qt
Antworten
peter999
Beiträge: 24
Registriert: 12. Januar 2006 11:28

Programmgruppe mit Einträgen mit QT erzeugen

Beitrag 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.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Eine Programmgruppe ist auch nur ein Ordner im Startmenü und wie man Verknüpfungen anlegt, findet Du hier.
peter999
Beiträge: 24
Registriert: 12. Januar 2006 11:28

Beitrag 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...
peter999
Beiträge: 24
Registriert: 12. Januar 2006 11:28

Beitrag 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;
}

Antworten