在Golang中通过COM与Lotus Notes的接口

时间:2017-09-22 13:40:09

标签: go com lotus-notes

我正在尝试访问Lotus Notes客户端提供的COM类。在Python中,使用win32com.client lib:

非常容易
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

现在在Go,我没有成功。以下是我的代码:

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
}

出现以下错误panic: Class not registered的恐慌。该类已注册,因为该函数的Powershell和Python版本都可以毫无问题地访问它。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果Go在64位环境中执行,并且Powershell和Python在32位环境中执行 - 反之亦然,这就是您的问题。请注意,Lotus COM类是unsupported in 64 bit environments。如果你正确地注册它们,它们可以(大多数情况下)工作,但是一些调用确实失败了。如果内存正确地为我服务,那么返回设计元素集合的所有方法都会失败,并且可能会有其他一些方法。