[ 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 :
|