|
|
|
|
Programmieren mit C++Code-Beispiele & LösungenKlassen für allgemeine AufgabenProgram Manager Shell
|
Die Klasse Program Manager Shell (PMS) kapselt eine Reihe komplexer Operationen rund um die Ansteuerung des Windows-Programm-Managers. Wichtige Fähigkeiten der PMS-Klasse sind:
- Gruppen- und Programmnamen müssen nicht in Anführungszeichen gesetzt werden, sofern sie aus nur einem Wort bestehen. Enthält der Name Leerzeichen, lassen sich die Anführungszeichen nicht vermeiden. Die für die Übergabe an den Programm-Manager erforderlichen Anführungszeichen erzeugt die Klasse automatisch durch interne Routinen.
- Mehrere Operationen können zu einem Aufruf zusammengefaßt werden. So erfolgt beim Aufruf von AddItem(…, NOTREDUNDANT) automatisch eine Überprüfung auf eine korrekte DDE-Verbindung. Anschließend wird der Gruppenname überprüft und die Gruppe verifiziert, bevor das Programm hinzugefügt wird.
- Die PMS-Klasse verhält sich sehr robust gegenüber Fehlern.
- Das gesamte Speicher-Management wird von der Klasse PMS ausgeführt, ebenso das DDE-Handling.
Referenz der Klasse DdeProgMan
Die Klasse DdeProgMan definiert im öffentlichen Bereich einen Zeiger auf einen String, der jeweils das Ergebnis der letzten Request-Operation enthält, sowie neben dem Konstruktor und Destruktor eine Boolean-Funktion, die eine DDE-Verbindung aufbaut:
class DdeProgMan {
public:
LPSTR TempText;
DdeProgMan();
~DdeProgMan();
boolean DdeConnect();
| | |
Die intern notwendigen Variablen für die Abwicklung des DDE-Protokolls befinden sich im privaten Bereich:
protected:
virtual void GenErr(int err);
virtual void DMLErr(int err);
private:
DWORD InstId;
HCONV HConv;
HSZ Service;
HSZ Topic;
HSZ TempStringHandle;
char commands[1024];
boolean DdeConnected;
HDDEDATA hProgData;
boolean DdeClientTransaction(UINT uType);
DWORD DdeGetData(LPSTR pDest, DWORD bMax);
};
Die übrigen Methoden der Klasse sind im public-Bereich deklariert und stellen die Funktionalität der Klasse bereit.
| DDE-Abwicklung |
boolean CreateGroup(LPSTR GroupName);
boolean CreateGroup(LPSTR GroupName,
LPSTR GroupPath);
CreateGroup erzeugt eine neue Gruppe im Programm-Manager oder aktiviert eine bestehende Gruppe. Der Name der Gruppe wird in GroupName übergeben. In GroupPath kann optional ein Pfad auf die Programmgruppe spezifiziert werden. Fehlt dieser zweite Parameter, verwendet Windows einen Standardnamen für die Gruppe im Windows-Verzeichnis.
| Methode CreateGroup |
boolean ShowGroup(LPSTR GroupName,
int ShowCommand);
ShowGroup weist den Programm Manager an, die bestehende Gruppe GroupName gemäß ShowCommand anzuzeigen. Der Parameter ShowCommand kann folgende Werte annehmen:
|
Wert
|
Anzeigemodus
|
|
1
|
Aktiviert das spezifizierte Fenster und zeigt es an. Ist das Fenster minimiert bzw. maximiert, so bringt Windows das Fenster auf seine ursprüngliche Größe und Position.
|
|
2
|
Aktiviert die Gruppe und zeigt das Fenster als Symbol an
|
|
3
|
Aktiviert die Gruppe und zeigt das Fenster im maximierten Zustand an
|
|
4
|
Restauriert die vorherige Position und Größe des spezifizierten Gruppenfensters. Das aktuell aktive Fenster bleibt jedoch weiterhin aktiv.
|
|
5
|
Aktiviert das Gruppenfenster und zeigt es in seiner derzeitigen Position und Größe an.
|
|
6
|
Minimiert das Gruppenfenster
|
|
7
|
Verkleinert das Gruppenfenster zum Symbol; das Fenster, das vorher aktiv war, bleibt jedoch aktiv.
|
|
8
|
Das Gruppenfenster wird in seiner derzeitigen Position und Größe angezeigt, allerdings bleibt das vorher aktivierte Fenster aktiv.
|
| Methode ShowGroup |
boolean DeleteGroup(LPSTR GroupName);
DeleteGroup weist den Programm-Manager an, die entsprechende Programmgruppe zu zerstören.
| Methode DeleteGroup |
boolean ReloadGroup(LPSTR GroupName);
Mit ReloadGroup wird der Programm-Manager angewiesen, eine bestehende Gruppe zu entfernen und wieder neu zu laden. Der Parameter spezifiziert die betreffende Gruppe. Wird kein Parameter übergeben, gilt der Befehl für alle Programmgruppen.
| ReloadGroup | |
In der Windows-Version 3.1 funktioniert das Kommando Reload() nicht wie dokumentiert, sondern führt dazu, daß die spezifizierte Programmgruppe bzw. im Fall eines fehlenden Parameters alle Programmgruppen entfernt werden.
| Anmerkung |
boolean AddItem(LPSTR CmdLine);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath,
int IconIndex);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath,
int IconIndex, int xPos, int yPos);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath,
int IconIndex, int xPos, int yPos,
LPSTR DefDir);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath,
int IconIndex, int xPos, int yPos,
LPSTR DefDir, LPSTR HotKey);
boolean AddItem(LPSTR CmdLine,
LPSTR ItemName, LPSTR IconPath,
int IconIndex, int xPos, int yPos,
LPSTR DefDir, LPSTR HotKey,
boolean fMinimize);
| Methode AddItem | |
ZAddItem() fügt ein Programm in eine Programmgruppe ein. Von der Klasse DdeProgMan werden verschiedene Aufrufformen unterstützt. Allen gemeinsam ist, daß jeweils nachfolgende Parameter entfallen können. Die Bedeutung der Parameter ist in allen Fällen gleich.
|
Parameter
|
Bedeutung
|
|
CmdLine
|
enthält die vollständige Kommandozeile, die für die Ausführung der Applikation erforderlich ist. Die minimale Angabe enthält den Namen der ausführbaren Datei. Es können jedoch auch ein vollständiger Pfad und Parameter enthalten sein.
|
|
Name
|
spezifiziert den Namen des Programms, der in der Programmgruppe unter dem Symbol angezeigt wird.
|
|
IconPath
|
definiert eine Datei, die das Symbol des Eintrags enthält. Dies kann eine ICO-, EXE- oder DLL-Datei sein. Ist der Parameter nicht spezifiziert, verwendet Windows das erste Icon, das in der ausführbaren Datei enthalten ist.
|
|
IconIndex
|
bildet einen Index in die Liste der Symbole, die in der durch IconPath definierten Datei enthalten sind. Fehlt dieser Parameter, wird der Wert Null angenommen, was dem ersten Symbol in der Datei entspricht.
|
|
XPos, yPos
|
spezifizieren die Position, an der das Symbol innerhalb der Programmgruppe angezeigt wird. Fehlen die Parameter, die immer beide anzugeben sind, plaziert Windows das Symbol an der ersten freien Position im Fenster.
|
|
DefDir
|
bezeichnet das optionale Arbeitsverzeichnis.
|
|
HotKey
|
definiert eine Tastenkombination, die für das Aufrufen der Anwendung verwendet werden kann.
|
|
FMinimize
|
legt fest, ob die Anwendung bei der ersten Anzeige als Symbol angezeigt werden soll.
|
| DdeProgMan |
boolean ReplaceItem(LPSTR ItemName);
Mit dem Kommando ReplaceItem() wird der Programm-Manager angewiesen, das in ItemName bezeichnete Element aus dem Programmfenster zu entfernen. Die Position des Symbols wird intern gespeichert und für die Plazierung des Symbols des nächsten AddItem()-Aufrufs verwendet.
| Methode ReplaceItem |
boolean DeleteItem(LPSTR ItemName);
DeleteItem() führt zur Löschung des in ItemName spezifizierten Elements der aktuell aktiven Gruppe.
| Methode DeleteItem |
boolean FreeForm(LPSTR Command);
Mit FreeForm() können mehrere Anweisungen an den Programm-Manager mit einem Aufruf abgesetzt werden. Jede einzelne Anweisung muß in eckige Klammern gesetzt werden. Als kleine Einschränkung erlaubt die aktuelle Version der Klasse DdeProgMan lediglich 1024 Zeichen für alle Anweisungen zusammen, da intern ein statischer Puffer dieser Größe verwendet wird.
| Methode FreeForm | |
Der folgende String ist ein Beispiel dafür, wie mit einem Aufruf eine Programmgruppe namens „Windows Applikationen“ angelegt, die Gruppe „MYGROUP.GRP“ angezeigt und „WinApp.exe“ eingefügt wird:
[CreateGroup("Windows Applikationen")][ShowGroup("MYGROUP.GRP", 1)]
[AddItem(winapp.exe,Win App,winapp.exe,2)]
Die Anweisungen folgen unmittelbar aufeinander ohne trennende Leerzeichen.
| Beispiel |
void FreeTemps();
Der intern allokierte temporäre Speicher für die DDE-Konversation mit dem Programm-Manager wird durch den Aufruf von FreeTemps() freigegeben.
| Methode FreeTemps |
boolean ExitProgman(int bSaveGroups=0);
Wurde der Programm-Manager durch eine andere Anwendung gestartet, so führt ExtProgman() zur Beendigung des Programm-Managers. Über den Parameter bSaveGroups kann der Programm-Manager angewiesen werden, die aktuellen Informationen über die Programmgruppen zu speichern.
Interna der Implementation
| Methode ExitProgman | |
Das Herzstück der Kommunkation zwischen dem Programm und der DDEML-Bibliothek bildet die Callback-Funktion ddeCallBack(). Da Windows keine C++-self-Zeiger an Callback-Funktionen übergibt, wird hier ein statischer Zeiger verwendet. Wenn mit Hilfe dieser Klasse ein Client erzeugt werden soll, der mehrere Kommunikationen gleichzeitig beherrscht, so muß anstelle des einfachen statischen Zeigers eine Liste der Konversationen mit zugehörigen self-Zeigern eingeführt werden.
| ddeCallBack ()
|
HDDEDATA FAR PASCAL _export DdeCallBack(WORD type, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD)
{
switch (type) {
case XTYP_DISCONNECT:
MessageBox(NULL, "Disconnected.", "Notice",
MB_ICONINFORMATION);
This->HConv = 0;
break;
case XTYP_ERROR:
MessageBox(NULL, "A critical DDE error has occured.",
"Error", MB_ICONINFORMATION);
}
return 0;
}
|
Die DDE-Konversation selbst wird von der Klasse DdeProgMan automatisch mit Hilfe der Funktion DdeConnect() aufgebaut und intern verwaltet. Dazu dienen die beiden Funktionen
boolean DdeProgMan::DdeClientTransaction(UINT uType)
DWORD DdeProgMan::DdeGetData(LPSTR pDest, DWORD cbMax)
Diese Funktionen fangen sämtliche Fehlermöglichkeiten der DDE-Konversation ab und setzen die entsprechenden Fehlertexte in den Puffer TempText.
|
|
|
|