[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]

Client Setup

Der Exportprozess erzeugt ein Unterverzeichnis CLIENTS in dem Ordner, wo die PAK-Datei abgelegt wurde. Der CLIENTS-Ordner enthält eine einzige EXE-Datei. Diese Client Setup EXE muß auf den entsprechenden Clients ausgeführt werden, um die nötigen Registryeinträge zu setzen, damit die COM Server in dem MTS-Paket aufgerufen werden können.

Automatisierung der MTS Verwaltung

MTS enthält eine COM-Schnittstelle, mit der man programmgesteuert Verwaltungs- und Verteilungsstrukturen erstellen kann. Sie beinhaltet folgende Möglichkeiten :

  • Installation eines bereits bestehenden Paketes
  • Erzeugen von neuen Paketen und Installieren von Komponenten
  • Auflisten der installierte Pakete zur Aktualiserung von Eigenschaften
  • Auflisten der installierte Pakete, um ein Paket zu löschen
  • Auflisten der installierte Komponenten, um eine Komponente aus dem Paket zu entfernen
  • Zugriff auf die nötigen Auflistungen
  • Zugriff auf die Eigenschaften
  • Konfigurieren von Rollen
  • Exportieren von Rollen
  • Konfigurieren eines Clients zur benutzung von Remote Komponenten

Man die folgenden Administrationsobjekte in VFP benutzen

Objekt Beschreibung

Catalog

Das Catalog-Objekt ermöglicht es, sich zu einem MTS-Katalog zu verbinden und auf dessen Auflistungen zuzugreifen.

CatalogObject

Das CatalogObject-Object ermöglicht es, Objekteigenschaften auszulesen und zu setzen.

CatalogCollection

Über das CatalogCollection-Objekt kann Catalog-Objekte hinzufügen, löschen oder verändern bzw. auf Auflistungen zugreifen.

PackageUtil

Das PackageUtil-Objekt ermöglicht die Installation und den Export von Paketen. Es wird durch den Aufruf der GetUtilInterface()-Methode einer Packages-Auflistung instanziert.

ComponentUtil

Das ComponentUtil-Objekt dient zur Installation einer Komponente in einer bestimmten Auflistung und importiert als InProc-Server registrierte Komponenten. Es wird durch den Aufruf  der GetUtilInterface()-Methode einer ComponentsInPackage-Auflistung erzeugt.

RemoteComponentUtil

Mit dem RemoteComponentUtil-Objekt kann man programmtechnisch Remote Komponenten von einem Paket auf einem Remote Server holen. Es wird durch den Aufruf der GetUtilInterface()-Methode einer RemoteComponents instanziert.

RoleAssociationUtil

Das RoleAssociationUtil-Objekt dient zum Hinzufügen von Rollen zu einer Komponente oder Paket. Es wird durch den Aufruf der GetUtilInterface()-Methode einer RolesForPackageComponents- oder RolesForPackageComponentInterface Auflistung erzeugt.

Weiterhin werden die folgenden Auflistungen unterstützt :

Auflistungen

LocalComputer

ComputerList

Packages

ComponentsInPackage

RemoteComponents

InterfacesForComponent

InterfacesForRemoteComponent

RolesForPackageComponent

RolesForPackageComponentInterface

MethodsForInterface

RolesInPackage

UsersInRole

ErrorInfo

PropertyInfo

RelatedCollectionInfo

Um eine Referenz zu einer bestimmten Auflistung zu erhalten, wird die GetCollection-Methode verwendet. Das nachfolgende Beispiel greift zunächst auf die Packages-Auflistung und dann auf alle Komponenten des ersten Paketes zu.

#DEFINE MTS_CATALOG   "MTSAdmin.Catalog.1"

loCatalog = CREATEOBJECT(MTS_CATALOG)

loPackages = loCatalog.GetCollection("Packages")

loPackages.Populate()

? loPackages.Count

loComps = loPackages.GetCollection("ComponentsInPackage",;

                                   loPackages.Item(0).Key)

loComps.Populate()
  • Die GetCollection-Methode liefert zunächst eine Objektreferenz auf eine leere Auflistung. Diese muß mit der Populate-Methode gefüllt werden.
  • Auflistungen unterscheiden Groß-/Kleinschreibung

loPackages = loCatalog.GetCollection("Localcomputer") && scheitert

loPackages = loCatalog.GetCollection("LocalComputer") && ok
  • Alle MTS-Auflistungen sind null-basiert.

loPackages = loCatalog.GetCollection("LocalComputer")

loPackages.Populate()

? loPackages.Item[0].Name

In der Hilfe zu MTS findet man weitere Informationen zu den Auflistungen und Objekten

Visual FoxPro 6.0 eignet sich aufgrund der Projectmanager und Anwendungsgeneratoren Hooks ausgezeichnet zur Fernsteuerung von MTS.

Benutzen von VFP 6.0 ProjectHooks

Die MTS Beispiele enthalten einen speziell für MTS entwickelten ProjectHook. Diese Klasse fährt automatisch den MTS-Prozess herunter und aktualisiert die in MTS registrierten Server, die in diesem projekt enthalten sind. Normalerweise muß man andauernd zu dem MTS Explorer wechseln und den MTS-Prozess herunterfahren, damit die Server erneut erzeugt und überschrieben werden können. Die Benutzung eines ProjectHooks automatisiert diesen Prozess. In dem nachfolgenden Beispiel wird in dem BeforeBuild-Ereignis die Packages-Auflistung durchlaufen,um die Prozesse herunterzufahren.

* BeforeBuild-Ereignis

LPARAMETERS tcOutputName, tnBuildAction, tlRebuildAll,;

            tlShowErrors, tlBuildNewGuids

 

#DEFINE MTS_CATALOG        "MTSAdmin.Catalog.1"

#DEFINE MSG_MTSCHECK_LOC   "Fahre die MTS Server herunter...."

 

LOCAL loCatalog, loPackages, loUtil, i, j, loComps

LOCAL loProject, lnServers, las, lcSaveExact

 

THIS.lBuildNewGuids = tlBuildNewGuids

loProject = _VFP.ActiveProject

lnServers = loProject.Servers.Count

DIMENSION THIS.aServerInfo[1]

STORE "" TO THIS.aServerInfo

 

IF lnServers = 0 OR tnBuildAction != 4 THEN

   RETURN

ENDIF

WAIT WINDOW MSG_MTSCHECK_LOC NOWAIT

 

DIMENSION las[lnServers, 3]

FOR i = 1 TO lnServers

   las[m.i, 1] = loProject.Servers[m.i].

   las[m.i, 2] = loProject.Servers[m.i].CLSID

   las[m.i, 3] = THIS.GetLocalServer(las[m.i, 2])

ENDFOR

 

ACOPY(las, THIS.aServerInfo)

 

* Herunterfahren der Server

loCatalog = CREATEOBJECT(MTS_CATALOG)

loPackages = loCatalog.GetCollection("Packages")

loUtil = loPackages.GetUtilInterface()

loPackages.Populate()

 

lcSaveExact = SET("EXACT")

SET EXACT ON

 

FOR EACH loPackage IN loPackages

   loComps = loPackages.GetCollection("KomponentesInPackage",;

                                      loPackage.Key)

   loComps.Populate()

   FOR EACH loComp IN loComps

      IF ASCAN(las, loComp.Value("")) != 0 THEN

         loUtil.ShutdownPackage(loPackage.Value("ID"))

         EXIT

      ENDIF

   ENDFOR

ENDFOR

WAIT CLEAR

SET EXACT &lcSaveExact

 

* Der Benutzer erzeugt neue GUIDs, deshalb müssen

* die Pakete wieder manuell installiert werden

IF tlBuildNewGuids THEN

   RETURN

ENDIF

Dies ist nur ein Beispiel der vielen Möglichkeiten von VFP ProjectHooks. Die MTS-Adminobjekte können eine Menge Zeit einsparen, die man damit verbringt, Einstellungen in dem MTS Explorer vorzunehmen.

Benutzen des VFP 6.0 Anwendungsgenerators

Genau wie mit einem ProjektHook. Kann man auch einen Anwendungsgenerator erzeugen, der die Regsitrierung von VFP COM-Komponenten in MTS-Paketen vornimmt. Das VFP MTS-Beispiel enthält einen solchen Generator ( im README.TXT stehen weitere Informationen zur Installation und Benutzung dieser Dateien).

Dieser Generator durchläuft die Servers-Auflistung des VFP-Projektes  und der verfügbaren MTS-Pakete. Man kann ein bestimmtes Paket aussuchen (oder ein neues erzeugen) und registrierte zu diesem Paket hinzufügen. Zusätzlich kann man zu jedem Paket die Transaktionseigenschaft setzen. Das nachfolgende VFP-Programm demonstriert die Vorgehensweise :

#DEFINE MTS_CATALOG      "MTSAdmin.Catalog.1"

#DEFINE ERR_NOACTION_LOC "Nichts getan!"

 

LOCAL loCatalog, loPackages, loUtil, i, j, loComps, lnPoslcPackage

LOCAL llPackageExists, loCompRef

LOCAL loProject, lnServers, las, loPackage

LOCAL lcTrans, lcSaveExact

 

lcPackage = ALLTRIM(THIS.cboPackages.DisplayValue)

llPackageExists = .F.

 

SELECT mtssvrs

LOCATE FOR include

IF !FOUND() OR EMPTY(lcPackage)

   MESSAGEBOX(ERR_NOACTION_LOC)

   RETURN

ENDIF

THIS.Hide

 

loCatalog = CREATEOBJECT(MTS_CATALOG)

loPackages = loCatalog.GetCollection("Packages")

loPackages.Populate()

FOR EACH loPackage IN loPackages

   IF UPPER(loPackage.Name) == UPPER(lcPackage)

      llPackageExists=.T.

      EXIT

   ENDIF

ENDFOR

 

IF !llPackageExists THEN && Erzeugen eines neuen Paketes

   loPackage = loPackages.Add

   loPackage.Value("Name") = lcPackage

   loPackages.SaveChanges

ENDIF

 

loComps = loPackages.GetCollection("ComponentsInPackage",;

                                    loPackage.Key)

loUtil = loComps.GetUtilInterface()

 

SCAN FOR include

   loUtil.ImportComponentByName(ALLTRIM())

ENDSCAN

 

loPackages.SaveChanges()

loComps.Populate()

 

SCAN FOR include

   DO CASE

      CASE trans = 1

         lcTrans = "Supported"

      CASE trans = 2

         lcTrans = "Required"

      CASE trans = 3

         lcTrans = "Requires New"

      OTHERWISE

         lcTrans = "Not Supported"

   ENDCASE

   FOR EACH loComp IN oComps

      IF loComp.Value("") = ALLTRIM()

         loComp.Value("Transaction") = lcTrans

         loComp.Value("SecurityEnabled") = ;

IIF(THIS.chkSecurity.Value, "Y", "N")

      ENDIF

   ENDFOR

ENDSCAN

loComps.SaveChanges()

loPackages.SaveChanges()

Tips und Tricks

Hier noch einige abschließende Ratschläge :

  • Entwerfen Sie Ihre Komponenten im Hinblick auf MTS.
  • Komponenten müssen InProc-DLLs sein.
  • Beim Hinzufügen von VFP-Komponenten muß sowohl die DLL als auch die TLB ausgewählt werden.
  • VFP COM Server müssen bei Eigenschaft Instanzierung auf 'MultiUse' stehen
  • Der DTC-Dienst muß gestartet sein, damit Transaktionen unterstützt werden.
  • Rufen Sie SetComplete() unabhängig von, der Benutzung von Transaktionen auf, um die Komponente zustandslos zu machen.
  • Die DispLogin-Eigenschaft von Verbindungen muß auf DB_PROMPTNEVER stehen. In SPT kann man dies SQLSETPROP(0, "DispLogin", DB_PROMPTNEVER) erreichen.
  • Minimieren Sie die Anzahl von Eigenschaften (keine PUBLIC-Eigenschaften)
  • Zur Zugriffsrechtsverwaltung muß eine gültige Rolle zu der Komponente hinzugefügt werden.
  • Vermeiden Sie die Benutzung der CreateInstance-Methode auf Komponenten, die nicht innerhalb von MTS laufen.
  • Geben Sie keine Referenzen von Kontextobjekten außerhalb des Objekts weiter.
  • Verwenden Sie ADO Recordsets um Datenbestände an den Client weiterzugeben.
  • Parameter sollten nur als Wertparameter (by-Value) übergeben werden
  • Keep it simple!

    [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]