Programmieren mit C++

Code-Beispiele & Lösungen

Klassen für allgemeine Aufgaben

Program 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.





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:59:34 von textarchiv.alojado.de