2017-09-22 4 views
0

Ich versuche, auf die COM-Klassen zuzugreifen, die von dem Lotus Notes-Client bereitgestellt werden. In Python hat dies mit win32com.client lib ganz einfach:Schnittstelle mit Lotus Notes über COM in Golang

def initialize_notes(self): 
    """ 
    Initializes an object from the class. 
    :return: Lotus Notes database 
    """ 
    notes_session = win32com.client.Dispatch('Lotus.NotesSession') 
    notes_session.Initialize(self.notes_password) 
    notes_database = notes_session.GetDatabase(self.domino_server, self.domino_db) 
    return notes_database 

Jetzt in Go, ich habe nicht erfolgreich gewesen. Unten ist mein Code:

import (
    "github.com/go-ole/go-ole" 
    "github.com/go-ole/go-ole/oleutil" 
) 

func Connect(dominoServer, database, notesPassword string) (*ole.IDispatch, error) { 
    ole.CoInitialize(0) 
    unknown, err := oleutil.CreateObject("Lotus.NotesSession") 
    if err != nil { 
     panic(err) 
    } 
    notes, err := unknown.QueryInterface(ole.IID_IDispatch) 
    if err != nil { 
     panic(err) 
    } 
    session := oleutil.MustCallMethod(notes, "Initialize", notesPassword).ToIDispatch() 
    db := oleutil.MustCallMethod(session, "GetDatabase", dominoServer, database).ToIDispatch() 
    return db, nil 
} 

Welche panic: Class not registered mit dem folgenden Fehler in Panik gerät. Die Klasse ist jedoch registriert, da sowohl die Powershell- als auch die Python-Version der Funktion problemlos darauf zugreifen kann.

Was mache ich falsch?

+0

Welcher Vorgang verursacht die Panik? – captncraig

+0

@captncraig gut, ich verursache die Panik beim ersten 'panic (err)', weil ich die Klasse – rhillhouse

+0

nicht laden kann CreateObject ist ein Dienstprogramm, das die ClassID über bestimmte Registrierungsschlüssel nachschlägt. Siehe Kommentar in [der entsprechende Code] (https://github.com/go-ole/go-ole/blob/8a4f5c214bfb4475619b8bb7ccbe6fa5c91745f4/com.go#L105) Ich vermute, es ist nicht registriert, und die Python-Lib tut etwas anderes. – captncraig

Antwort

0

Wenn Go in einer 64-Bit-Umgebung ausgeführt wird und Powershell und Python in einer 32-Bit-Umgebung ausgeführt werden - oder umgekehrt, ist das Ihr Problem. Beachten Sie, dass die Lotus COM-Klassen unsupported in 64 bit environments sind. Sie können (meistens) zum Funktionieren gebracht werden, wenn Sie sie richtig registriert bekommen, aber einige der Anrufe scheitern. Wenn Speicher mir richtig dient, scheitern alle Methoden, die Sammlungen von Designelementen zurückgeben, und es können einige andere sein.

+0

Ich bin mir bewusst, dass sie 32bit sind. Wenn ich Powershell benutze, benutze ich einfach die x86-Version, aber mit Python habe ich das nicht gemacht. Ich habe das Programm in Go 32bit Architekturen kompiliert, aber es funktioniert immer noch nicht. – rhillhouse