vom: 22.04.2001 von: Jürgen Kuhlenbach jkuhlenbach@t-online.de
DLL/OCX Registrieren ....  
Hallo,

diesen Beitrag von Erich Todt fand in der Fox-Usegroup

*****************

Es gibt definitiv nur einen wirklich guten Weg:
- Runtime ins Windows Systemverzeichnis kopieren und
- mit z.B. REGSVR32.EXE registrieren.

Ich versuche Euch zu erklären, warum:

Es taucht immer wieder die Frage auf, welche DLL nun tatsächlich genommen
wird. Dabei ist die Sache gar nicht zu "kryptisch", wie oft vermutet wird.

Man muß nur unterscheiden, ob es sich um eine herkömmliche DLL handelt,
die eine oder mehrere Funktionen zur Verfügung stellt, oder ob es sich im
eine ActiveX-Komponente (oder OLE-Server etc.) handelt (zumeist OCX,
manchmal aber auch DLL).

1.) DLLs, die Funktionen beinhalten, die dann mit DECLARE DLL für die
Verwendung in FoxPro "registriert" werden können, z.B. SHELL32.DLL:

"DECLARE IN " führt intern im Prinzip die Windows
API-Funktion LoadLibrary() aus. In der Dokumentation zu LoadLibrary() findet
man folgende Suchreihenfolge, in der die Datei gesucht wird:

1. Verzeichnis, von dem die Anwendung gestartet wurde, siehe SYS(16)
2. Arbeitsverzeichnis , siehe CURDIR(),
3. Windows Systemverzeichnis (WINNT/2000: zuerst system32, dann system)
4. Windows Verzeichnis,
5. Verzeichnisse, die in der Umgebungsvariablen PATH angegeben sind.

Diese Suchreihenfolge wird auch von CreateProcess(), ShellExecute() etc.
verwendet. Lediglich LoadLibraryEx() ermöglicht es dem C/C++ Programmierer,
zuerst an einer anderen Position zu suchen.


2.) OCX und DLL:
Diese müssen mit z.B. REGSVR32.EXE registriert werden, dabei wird
ein der Windows Registry ein Schlüssel erstellt, der für die Anwendungen,
die dann die Funktionen nutzen wollen, alle nötigen Informationen zur
Verfügung stellt. Der Pfad zur OCX/DLL findet sich unter:

HKEY_CLASSES_ROOT\
CLSID\
{............}\
InprocServer32


Wenn man nun eine unbekannte DLL "vor sich liegen" hat, kann man z.B.
DEPENDS.EXE ausführen (Dependency Walker - ist z.B. bei den Visual Studio
Tools dabei). Wenn die Liste der exportierten Funktionen
DllRegisterServer
DllUnregisterServer
enthält (das sind die Funktionen, die z.B. REGSVR32.EXE ausführt), handelt
es sich um eine DLL, die registriert werden muß, und die Anwendungen
beziehen die Informationen aus der Registry. Sind diese Funktionen nicht
vorhanden, handelt es sich um eine herkömmliche DLL.

3.) FLL:
Für FoxPro kann man auch eigene DLLs schreiben, die eine spezielle
FoxPro-spezifische Schnittstelle haben. Deshalb werden sie zumeist auch FLL
genannt (z.B. FOXTOOLS.FLL). Diese erkennt man an den exportierten
Funktionen
@OCXAPIinit@4
- oder -
@DispatchAPI@4

Diese FLL-Dateien werden von FoxPro genauso wie herkömmliche DLLs gesucht.


4) FoxPro Runtime:
Bei der FoxPro Runtime (im Wesentlichen vfp6r.dll) handelt es sich um eine
Mischung aus herk. DLL, FLL und OCX, der man halt dann den Namen DLL gegeben
hat (warum auch nicht ).


Fazit:
===

Wenn man nur die Funktioinen der Runtime benötigt, die als FLL Funktionen
implementiert sind, findet man sicher das Auslangen damit, dass man die
Dateien ins Anwendungsverzeichnis kopiert. Für einfache Anwendung kann das
ausreichen.

Wenn man aber die FoxPro Anwendung als OLE-Server laufen lassen möchte, oder
die OLE-Funktionen der Runtime nutzen möchte, kommt man nicht umhin, die
Runtime in der Registry zu registrieren. Dazu ist es erforderlich, dass die
Dateien immer an die selbe Stelle kopiert werden, als am besten das
Systemverzeichnis.

Wenn man sich nicht daran hält, wird mit jeder Installation an eine andere
Stelle die Information in der Registry umgeschrieben, und die früher
installierte Applikation greift auf die Runtime der neueren Applikation
zu -> Chaos pur, besonders, wenn der Anwender mehrere unterschiedliche
FoxPro Applikationen laufen hat. Was ist, wenn eine Applikation mit z.B.
VFP6-SP4 kompiliert wurde, und dann später eine mit SP1 kompiliere
Applikation installiert wird.

Ich für meinen Teil gehe immer wie folgt vor (und hatte noch NIE !!
irgendwelche Runtime-Probleme):

- Programme immer lokal installieren, auf Server nur gemeinsam genutzte
Tabellen etc.
- Alle Dateien, die auch von anderen Programmen genutzt werden (könnten),
ins Systemverzeichnis (Runtime, FLL, OCX, sonstige DLLs)
- Beim Installieren alle DLL/FLL/OCX, die DllRegister exportieren z.B. mit
REGSVR32.EXE registrieren.
- Ins Programmverzeichnis kommen daher nur meine EXE, diverse Reports etc.,
die ich ins Projekt nicht eingebunden habe, AVI-Dateien, die ich in
Formularen mit dem Animation-Control anzeigen möchte, und diverse TXT, HLP,
CHM Dateien, Beispiele u.s.w. Die CHMs kopiere ich manchmal auch direkt ins
Windows Help Verzeichnis.


So, nachdem die Nachricht doch etwas länger uind ausführlicher geworden ist,
als ich anfangs vermutet hatte, danke fürs Lesen.

Erich

--

--------------------------------------------------------

Erich TODT
e-mail: erich.todt@tz-com.at


Gruss
jk