title image


Smiley Re: ?Word97.Thesaurus via DDE aktivieren
Hallo WillAls Office Automation™ (der alte Name war OLE Automation) bezeichnet Microsoft® ein Verfahren, welches es erlaubt einen Verweis auf das Objektmodell einer anderen Anwendung zu setzen. mit dem Ziel, dieses der Client-Anwendung zur Verfügung zu stellen.Einen sehr Interessanten Ansatz; hat aber den Nachteil dass Office Automation wohl eine verschlossne Sardinenbüchse bleiben wird.Da die Anfrage in Richtung DDE doch immer wieder kommt, habe ich mich jetzt hier durchgebissen wohl wissend, dass nicht dabei heraus kommen wird, was irgendwie Sex-appeal hätte.Ich möchte betonen, dass ich hier ausschliesslich von jenem Teil der DDE Komponente spreche, welche es erlaubt, eine MS Office Funktion von einer x-beliebigen Anwendung aufzurufen. Dabei bin ich zum Fazit gelangt, dass das Ganze ein ziemlicher Bluff ist.Vom Sein und ScheinDDE heisst bekanntlich Dynamic Data Exchange. In diesem Begriff stecken gleich drei Wörter mit gewichtigem Inhalt.Dynamisch (möchten wir das nicht alle sein? Mehr noch, es wird sogar von uns erartet.)Data (ist das A & O der Informatik)Exchange (heisst Austausch. Menschen tauschten schon immer Ideen und Waren aus)Was ist DDE wirklich?!Keine Spur von Dynamik, Daten können nicht ausgetauscht werden. Es ist ganz einfach eine Methode um von der Anwendung A eine Funktion in der Anwendung B auszulösen. Als zusätzlicher Dämpfer handelt es sich dabei um eine Lösung, welche auf zwei Krücken geht.Die SyntaxDie Syntax ist so aufgebaut, dass wohl kein Mensch den Aufruf auf Anhieb schafft. Kommt hinzu, dass die Syntax anders ist, wenn z.B. DDE von Excel aufgerufen wird, als wenn DDE von Word aufgerufen wird. Ich kann Dir deshalb nicht mit Bestimmtheit sagen, wie Du DDE von Deiner Anwendung aufrufen musst.Interner AblaufIch darf vorausschicken, dass der Endbenutzer nichts mit kriegt vom internen Ablauf. Auch der/die EntwicklerIn in der Regel nicht. Es sei denn. Man will es genau wissen. Und es läuft so ab:In der Server-Anwendung wird ein temporäres Makro geschrieben, welches mit WordBasic-Befehlen (ja richtig WordBasic) einen Aufruf für den fraglichen Prozess zusammenbastelt.Der FunktionsumfangDürftiger geht es nicht mehr. Der Funktionsumfang beschränkt sich auf folgende fünf Befehle:DDEInitiateDDEExecuteDDPokeDDERequestDDEExexuteKommt hinzu, dass ich persönlich glaube, dass DDE in dieser Art NICHT bidirektional ist.Diese Befehle bieten keinerlei Optionen. Jeder oder jede, welche zum Beispiel APPC (Advanced Program to Program Communication) kennt, weiss das dies bestimmt nicht reicht für eine sichere und komfortable Kommunikation zwischen Programmen. APPC wurde schon 1979 von IBM entwickelt und wird sehr erfolgreich im vorwiegend im Grossrechnerbereich eingesetzt. Die Architektur ist offen und dokumentiert. APPC unterstützt über 20 Verben (mit Optionen). Die ganze funktionelle Bandbreite wird abgedeckt. Hier ein paar Bonbons:Synchroner oder asynchroner AufrufAsynchroner Aufruf mit späterem SynchronisationspunktParallel SessionsBidirektionalTransport von 64kb-Daten pro Send_Data-VorgangSession RecoveryVoll-Duplex (beide Seiten können gleichzeitig senden und empfangen)etc.Der Vergleich von APPC und DDE ist wirklich wie Neon-Licht gegen Kerzenlicht. Insofern wundert es mich nicht, wenn ausgerechnet Fragen bezüglich DDE in der MS News Gruppe von MS nahe stehenden Leute schon gar nicht mehr beantwortet werden. (Ich versuche es jetzt noch in der englischen News-Gruppe).Trotzdem habe ich jetzt zu Ende gespielt, das Kerzchen leuchtet und folgende romantische Lösung ist entstanden:Konzept(wenn ich das so nennen darf)Excel startet mittels DDE ein Prozess, welcher sich in einer Worddokumentenvorlage befindet. Dabei wird das Wort übergeben für welches Word die Synonyme suchen soll.Der Prozess in Word startet, sucht die Synonyme heraus und schreibt diese in einem definierten Format in eine temporäre DateiExcel liest diese Datei aus und schreibt das Ergebnis in ein TabellenblattDie Temporäre Datei wird nun von Excel gelöschtFormatDas Format sieht wie folgt aus:X'01' Start ByteWort Das Wort wird als Echo zurückgeschicktX'02' Start Byte für Anzahl der gefunden SynonymeAnzahlX'03' Start Byte für die semantische EbeneSymantische EbeneX'04' Start Byte für SynonymSynonymeX'03' Start Byte für die semantische EbeneSymantische EbeneX'04' Start Byte für Synonymu.s.w.AnpassungenFolgende Konstanten im Kopf der beiden Prozesse musst Du noch anpassen:Auf der Client-Seite:Vorlage = "C:\WINDOWS\Anwendungsdaten\Microsoft\Vorlagen\Normal.dot"Private Const TmpDatei = "C:\TEMP\Synonyme.txt"Private Const Wort = "Welt"Auf der Server-Seite:Private Const TmpDatei = "C:\TEMP\Synonyme.txt"Die Konstante "TmpDatei" muss auf beiden Seiten identisch sein.VBA-Code für die Client-Seite (Excel)Private Const Vorlage = "C:\WINDOWS\Anwendungsdaten\Microsoft\Vorlagen\Normal.dot"Private Const TmpDatei = "C:\TEMP\Synonyme.txt"Private Const Wort = "Welt" Sub TestDDE1() Chan = DDEInitiate(App:="WinWord", Topic:=Vorlage) xyz = "[Synonyme.Synonyme " & Chr(34) & Wort & Chr(34) & "]" DDEExecute Chan, xyz DDETerminate Channel:=Chan Close Open TmpDatei For Binary As #1 Input #1, tmpstr If InStr(tmpstr, Chr(1) & Wort) 1 Then MsgBox "Es ist ein unbekannter Fehler aufgetreten." End End If Anzahl = CDbl(Mid(tmpstr, InStr(tmpstr, Chr(2)) + 1, InStr(tmpstr, Chr(3)) - InStr(tmpstr, Chr(2)) - 1)) If Anzahl = 0 Then MsgBox "Es Wurden keine Synonyme für das Wort " & Wort & " gefunden." End End If Sheets(ActiveSheet.Name).Cells.Delete For i = 1 To Anzahl tmpstr = Right(tmpstr, Len(tmpstr) - InStr(tmpstr, Chr(3))) Cells(i, 1) = Left(tmpstr, InStr(tmpstr, Chr(4)) - 1) Cells(i, 2) = Mid(tmpstr, InStr(tmpstr, Chr(4)) + 1, InStr(tmpstr, Chr(3)) - InStr(tmpstr, Chr(4)) - 1) Next iEnd SubVBA-Code für die Server-Seite (Word)Private Const TmpDatei = "C:\TEMP\Synonyme.txt"Function Synonyme(Wort As String)Application.dd Dim tmpstr As String Symantik = SynonymInfo(Word:=Wort, LanguageID:=wdGerman).MeaningCount k = 0 If Symantik > 0 Then mlist = SynonymInfo(Word:=Wort, LanguageID:=wdGerman).MeaningList For i = 1 To Symantik slist = SynonymInfo(Word:=Wort, LanguageID:=wdGerman).SynonymList(Meaning:=i) For j = 1 To UBound(slist) k = k + 1 tmpstr = tmpstr & mlist(i) & Chr(4) & slist(j) & Chr(3) Next j Next i End If tmpstr = Chr(1) & Wort & Chr(2) & k & Chr(3) & tmpstr Close Open TmpDatei For Output As #1 Print #1, tmpstr Close #1End FunctionGrussSilvia Widmer

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: