Neulich wollte ich, mittels PHP, eine COM-Verbindung zu einem COM-Objekt, auf einem 64-Bit Windows Server 2008 R2, aufbauen.
Allerdings funktionierte das nicht, da es sich bei dem COM-Objekt um eine 32-Bit Variante handelte. Nach langem Suchen und Probieren habe ich dann doch eine Lösung gefunden, die ich nun detailliert beschreiben möchte.
Beachte, alle Änderungen in der Registry werden immer unter dem Knoten „Wow6432Node“ durchgeführt!
Die im Folgenden erwähnte [GUID] besitzt immer einen Wert im Format:
z.B. {ADB924C1-899B-4DF6-B7F6-1DAA8CCB6DD5}
Die folgenden Screenshots können vergrößert werden, wenn man auf sie klickt.
Folgende Schritte sind auszuführen:
- Starte das Programm RegEdit aus „c:\windows\syswow64\regedit.exe“
- Ermittle, über die Suche nach dem Klassenname, die [GUID] des COM-Objektes in der Registry.
Der Klassenname ist der Name der bei der Instanziierung des COM-Objektes verwendet wird:
z.B. CreateObject(„Classname“).
- Suche nach „HKey_Classes_Root\Wow6432Node\CLSID\[GUID]“.
Füge unter diesem Knoten eine neue Zeichenfolge mit der Bezeichnung „AppID“ und dem Wert der [GUID] hinzu.
- Füge unter „HKey_Classes_Root\Wow6432Node\AppID\“ einen neuen Schlüssel mit dem Wert der [GUID] hinzu, falls er noch nicht existiert. Unter diesem Knoten wird dann eine neue Zeichenfolge mit der Bezeichnung „DllSurrogate“ anlegt. Der Wert dazu bleibt leer!
- Füge unter „HKey_Local_Machine\Software\Wow6432Node\Classes\AppID\“ einen neuen Schlüssel mit dem Wert der [GUID] hinzu, falls er noch nicht existiert. Unter diesem Knoten wird auch eine neue Zeichenfolge mit der Bezeichnung „DllSurrogate“ anlegt, falls diese auch noch nicht vorhanden ist. Der Wert dazu bleibt wieder leer!
Nun lief das 32-Bit COM-Objekt auf einem 64-Bit Windows Server 2008 R2 (Enterprise).
Um die Lauffähigkeit des COM-Objektes schnell zu testen, empfehle ich ein kleines VBS-Skript.
Den folgenden Inhalt einfach in eine Datei names „comtest.vbs“ einfügen und ausführen. Sollte keine Fehlermeldung kommen, dann läuft das COM-Objekt erfolgreich. Nicht vergessen: „Classname“ durch den richtigen Wert zu ersetzen!
Dim ComConnector
dim result
Set comConnector = CreateObject("Classname")
msgbox ("Verbindung erfolgreich hergestellt!")
Ich hoffe ich konnte einigen damit weiterhelfen.
Antworten