Beiträge von gremgiz

    Hallo,


    scheinbar beißen sich da mehrere Leute die Zähne dran aus. Ich möchte mich erst einmal bei allen bedanken, die sich darüber den Kopf zerbrochen haben. Ich für meinen Teil habe es jetzt so gelöst, dass ich in VB eine DLL geschrieben habe, die ich über C# einbinde. Manchmal ist VB doch die bessere Alternative


    Falls noch Ideen bestehen, bitte posten.


    Gruß
    Gremgiz

    Hi,


    Ich habe ien wenig gespielt und herausgefunden, dass:


    Type NotesSessionType = Type.GetTypeFromProgID("Notes.NotesSession");
    object NotesSession = Activator.CreateInstance(NotesSessionType);


    bool obj = (bool)NotesSessionType.InvokeMember("ConvertMIME", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
    BindingFlags.Instance | BindingFlags.GetProperty, null, NotesSession, null);


    Wunderbar funktioniert. Nur wenn ich danach aufrufe:


    NotesSessionType.InvokeMember("ConvertMIME", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, NotesSession, new object[] {false});


    Knallt es mit „TargetInvocationException“. HRESULT: 0x8000FFFF (E_UNEXPECTED). Kann mir irgendjemand sagen was ich da falsch mache?

    Hallo,


    daher nutze ich ja SetProperty. Wenn man so im Netz sucht findet man eigenlich immer InvokemEthod um eine Eigenschaft zu setzen. Wie würdest du es denn machen?


    Gruß
    gremgiz

    Hallo,


    vielen Dank für den letzten Hinweis. Der hat mir sehr weitergeholfen. Ein Suche hat folgende wunderbare Seite ausgespuckt, die das ganze sehr gut erklärt


    http://www-10.lotus.com/ldd/nd…71250005b618?OpenDocument


    ich habe den Code bei mir entsprechend angepasst und es läft auch schon ganz gut. Ein paar Probleme bestehen noch.


    Hier erstmal die Übersetzung der Zeilen nach C#


    VBA: session=CreateObject("Notes.NotesSession)


    In C# sieht das ganze dann so aus:
    Type NotesSessionType = Type.GetTypeFromProgID("Notes.NotesSession");
    object NotesSession = Activator.CreateInstance(NotesSessionType);


    Danach kann man dann mit InvokeMember auf die Elemete zugreifen und alles machen. Es ist zwar nicht so übersichtlich wie in VBA tut aber wunderbar.


    Nun kurz zu meinem Problem:
    Ein Aufruf heißt wie folgt:
    object[] Mime_Settings = { (Object)false };


    try
    {
    object Mime = NotesSessionType.InvokeMember("ConvertMIME", BindingFlags.SetProperty, null, NotesSession, Mime_Settings);
    }
    catch (TargetInvocationException ex)
    {
    MessageBox.Show(ex.InnerException.Source.ToString());
    }


    Leider kommt da immer ne Fehlermeldung 0x8000FFFF E_UNEXPECTED. Kann sich das jemand erklären?

    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

    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

    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.

    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?

    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

    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?