Ui Klassen in C#

  • Hallo zusammen,


    wie kann ich NOTESUIWORKSPACE (notes32.tlb) aus einem C# Code initialisieren?
    NOTESUIWORKSPACE ws = new NOTESUIWORKSPACE("Notes.NotesUIWorkspace") funktioniert nicht.


    In C++ habe ich das Problem, dass zwar eine Instanz erzeugt wird, WorkSpace und Session Objekt bleiben allerdings leer.


    #import <C:\\Program Files\\lotus\\notes\\Notes32.tlb> rename("TEXT", "__TEXT") rename("DOMAIN", "__DOMAIN")


    ::CoInitialize(NULL);


    lotus::NOTESSESSIONPtr session;
    lotus::NOTESUIWORKSPACEPtr uiworkspace;


    hr = session.CreateInstance(_T("Notes.NotesSession"));
    hr = uiworkspace.CreateInstance(_T("Notes.NotesUIWorkspace"));


    In VBA funktioniert es.
    Dim ws As Object
    Dim doc As Object
    Set notesSession = CreateObject("Notes.NotesSession")
    Set ws = CreateObject("Notes.NotesUIWorkspace")

  • Hallo,


    vielleicht könnte jemand mal den Code in C# posten? Pallino schneit es ja hinbekommen zu haben. Ich stehe noch vor der Lösung :-). Ich konnte zwar schon einiges über UI initialisieren, bekomme aber einen Fehler zur Laufzeit.


    "Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "lotus.NOTESSESSION" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{29131401-2EED-1069-BF5D-00DD011186B7}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE))."


    Hier mal der Code:
    Type Notes_session = Type.GetTypeFromProgID("Notes.NOTESSESSION");
    NOTESSESSION objNotes = (NOTESSESSION)Activator.CreateInstance(Notes_session);


    NOTESDATABASE objDatabase = (NOTESDATABASE)objNotes.GETDATABASE("xxx", "xxx.nsf", false);


    objNotes.CONVERTMIME = false;
    NOTESSTREAM objStream = (NOTESSTREAM)objNotes.CREATESTREAM();
    NOTESDOCUMENT objNotesMailDoc = (NOTESDOCUMENT)objDatabase.CREATEDOCUMENT();
    objNotesMailDoc.REPLACEITEMVALUE("Form", "Memo");
    objNotesMailDoc.REPLACEITEMVALUE("SendTo", TB_Comm_Email.Text);
    objNotesMailDoc.REPLACEITEMVALUE("Subject", "Anfragenummer: " + TB_Ticket_SupportID.Text);
    objNotesMailDoc.REPLACEITEMVALUE("ccActiontype", "NEWMAIL");
    objNotesMailDoc.REPLACEITEMVALUE("CCOSISCSC_NOTES_FIELD_SUPPORTNUMBER", "xcv");


    NOTESMIMEENTITY mItem = (NOTESMIMEENTITY)objNotesMailDoc.CREATEMIMEENTITY("Body");
    NOTESMIMEENTITY mItemChild = (NOTESMIMEENTITY)mItem.CREATECHILDENTITY(mItem);


    objStream.WRITETEXT("hallo", "CR");
    mItemChild.SETCONTENTFROMTEXT(objStream, "text/html;utf-8", 1725);
    objStream.CLOSE();
    objStream.TRUNCATE();


    objNotesMailDoc.COMPUTEWITHFORM(0, 0);


    Type Type_NotesUIWorkspace = Type.GetTypeFromProgID("Notes.NotesUIWorkspace");
    NOTESUIWORKSPACE objNotesUIWorkspace = (NOTESUIWORKSPACE)Activator.CreateInstance(Type_NotesUIWorkspace);
    objNotesUIWorkspace.EDITDOCUMENT("RW", objNotesMailDoc, false, true, false, false);
    objNotes.CONVERTMIME = true;


    Wo mache ich was falsch?

  • Du kannst Objekte die über UI Klassen erstellt wurden nicht mischen mit welchen ie über Backen Klassen erzeugt wurden.


    Sagt ja die Fehlermeldung schon aus.


    Also wenn du etwas über notes.x aufrufst müssen auch die Parameter über notes.x generiert worden sein

  • Danke schon mal für den Tipp. Leider verstehe ich es noch nicht richtig. Die Notes32.tlb ist eingebunden. Wenn ich das richtig sehe und mit dem Methoden aus domobj.tlb vergleiche sind die Methoden der notes32.tlb (also die UI Klassen) immer in großbuchstaben und die anderen eher in Klienbuchstaben gehalten. Daher müsste es doch gehen.


    Die Fehlermeldung kommt in der zweiten Zeile: NOTESSESSION objNotes = (NOTESSESSION)Activator.CreateInstance(Notes_session);


    Wie müsste die umformuliert werden? Leider hat Pallino ja nicht das Ergebnis gepostet, da ich eigenlich fast vor dem gleichen Problem stehe, dass ich nur über Domini.xyz oder über lotus.xyz Methoden aufrufen kann, aber nicht über Notes. Gibt es eigentlich gravierende Unterschiede zu Notes 7?


    Gruß
    Gremgiz

  • Ich glaube du verstehst nicht was ich dir sagen wollte:


    Ein Notes Document, daß über lotus.notessession erzeugt worden ist kann nicht an eine Methode übergeben werden, die mit notes.notessession erzeugt wurde.

  • OK, dann habe ich noch einen Gedankenfehler bzw. den gesamten Thread noch nicht korrekt verinnerlicht. Ich habe gerade einiges probiert umzuschreiben, so dass ich auf die Notes.xyz Methoden zugreifen kann (ohne zu mischen). Nur leider zeigt sich, dass ich entweder über Domini.xyz oder über lotus.xyz zugreifen kann, nicht jedoch über Notes.xyz.


    Vermutlich werde ich mal im Urschleim wühlen müssen und werde mal meine Gedanken hier schreiben:


    Als Verweis habe ich die COM Geschichten domobj.tlb und notes32.tlb eingebunden und kann auch drauf zugreifen. In Deinem Beispiel machst du es ja ähnlich oder?


    Nur wie kann ich auf die Notes.xyz Methoden zugreifen, wenn ich nur domino und lotus als Namespace zur Verfügugn habe?

  • Dann hast du wohl etwas bei dir falsch konfiguriert.


    Das offizielle Interface für COM und Domino lautet Lotus.Notessession und das für OLE und Notes lautet Notes.NotesSession.


    Und genau diese beiden darfst du wie ich schon sagte nicht mischen.
    Woher bei dir jetzt das Domino.x kommt kann ich dir auch nicht sagen, aber auf meinem installierten System existiert das nicht.
    War das eventuell eine Angabe, die du beim importieren der TypeLibraries gemacht hast ?

  • Hmm ich dachte eigentlich da kann man nix falsch machen... Kann es vielleicht sein, dass iBM was in Notes 7 gegenüber V6 geändert hat? Die Notes32.tlb hat bei mir die Version 6.0 und die liefert halt nur lotus.x.

  • War ja nur so ne Hoffnung. ich würde ja auch gerne ohne die Typelibraries arbeiten und direkt draufgehen, aber das lassen die abstrakten Klassen leider nicht zu. Ich habe auch gerade noch gefunden, dass dies Interfaces sind. Ich werde mal versuchen was daüber herauszufinden

  • Also Interfaces gibt es meines Wissens nach auch nur bei den Backend Klassen, da Interfaces ein COM Merkmal sind und die Frontendklassen ja OLE Klassen sind.


    Vermutlich geht es deswegen nicht, und du hast deswegen auch keine Frontendklassen zur Verfügung

  • taurec am 26.02.2009 16:36:00:

    Zitat


    Also Interfaces gibt es meines Wissens nach auch nur bei den Backend Klassen, da Interfaces ein COM Merkmal sind und die Frontendklassen ja OLE Klassen sind.


    Vermutlich geht es deswegen nicht, und du hast deswegen auch keine Frontendklassen zur Verfügung


    Hmmm. Widersprichst Du Dir damit nicht gerade selber? Das hat doch Bernhard schon in Posting #11 gesagt:


    koehlerbv am 18.01.2008 01:53

    Zitat

    UI Klassen über C#? Wenn, dann nur via API, aber nicht via OLE / COM. Ganz bestimmt nicht ...


    Worauf Du meintest:


    taurec am 18.01.2008 09:14:

    Zitat

    koehlerbv


    UI Klassen über OLE gehen sehr wohl. Hab ich auch schon öfters gemacht



    Also was jetzt?

  • bofh


    Du verwechselst da zwei Dinge:


    OLE ist eine Schnittstelle, die man ansprechen kann.


    Die COM Schnittstelle selbst definiert aber entsprechende Interfaces (IDispatch bzw davon abgeleitete) und diese sind in den Type Libraries hinterlegt. Bei OLE gibt es aber keine solchen Interfaces, sondern es werden die Anwendungen direkt mit Befehlen gesteuert.


    Frontendklassen kann man grundsätzlich ansprechen, aber eben nur per OLE und nicht über COM

  • Ich würde vorschlagen, dass wir mal vorn anfangen, sprich bei den Verweisen.


    domobj.tlb sind die COM Objekte für die Backend-Klassen und referenzieren auf domino.xyz.


    notes32.tlb sind die COM/OLE(?) Objekte für die Fronten-Klassen und sollten auf Notes.xyz refrenzieren.


    Ist das erst mal soweit richtig?


    Wenn man im Netz stöbert findet man immer wieder, dass die notes32.tlb aber auch auf lotus.xyz referenziert.


    Ich habe hier eine VBA Anwendung, die funktioniert. Dort sind auch nur die Automation CLasses (notes32.tlb) als Verweis eingebunden und via CreateObject(Notes.xyz) eingebunden. Daher müssen die Klassen ja zur Verfügung stehen. Nur wie zum Geier kann ich über C# darauf zugreifen?


    Eingebunden habe ich die notes32.tlb über Rechtsklick auf Verweise im Projekt -> Neuen Verweis hinzufügen und dann aus dem Kartenreiter COM die notes32.tlb (Automation Classes)


    Gruß
    gremgiz

  • Nein. In den TypeLibraries wirst du nur COM Klassen finden, keine OLE Klassen.


    Diese musst du über eine dem CreateObject ähnliche Funktion initialisieren.


    Wie diese aber unter C# heisst kann ich dir nicht sagen