PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu COM-Verweisen (Word) in VB.net


Misanthrop
2004-05-31, 23:44:54
Hi!

Kennt sich hier jemand ein wenig mit COM-Verweisen aus? Habe nämlich in einem Projekt einen COM-Verweis zu "Microsoft Word 11.0 Object Library" hinzugefügt, da ich in dem Programm Daten in Worddokumente exportieren will.


Auf meinem Rechner funktioniert alles super (hab Office 2003), aber ich frag mich ob das Programm auch auf Rechnern mit Word 97 oder 2000 oder so funktioniert.

Hat jemand Ahnung?

mfG

grakaman
2004-06-01, 13:43:29
Original geschrieben von Misanthrop
Hi!

Kennt sich hier jemand ein wenig mit COM-Verweisen aus? Habe nämlich in einem Projekt einen COM-Verweis zu "Microsoft Word 11.0 Object Library" hinzugefügt, da ich in dem Programm Daten in Worddokumente exportieren will.


Auf meinem Rechner funktioniert alles super (hab Office 2003), aber ich frag mich ob das Programm auch auf Rechnern mit Word 97 oder 2000 oder so funktioniert.

Hat jemand Ahnung?

mfG

Da du Office 2003 benutzt und wahrscheinlich auch die mitgelieferten PIA's verwendest, werden diese auch nur mit Office 2003 laufen. Ansonsten müsstest du wohl gegen die niedrigste Version linken, um Problemen vorzubeugen. Oder du benutzt late binding, was aber ein paar unangenehme Nebenwirkungen hat (kein IntelliSense, Fehler werden erst zur Laufzeit herausgefunden)

http://support.microsoft.com/default.aspx?kbid=302902

MfG

Misanthrop
2004-06-01, 19:07:26
thx für die Antwort!

Also wenn ich einfach einen Verweis auf zB Word 97 hinzufüge, sollte es auf allen Rechnern mit Office 97, 2000, XP, 2003 funktionieren?


mfG

grakaman
2004-06-01, 19:58:37
Original geschrieben von Misanthrop
thx für die Antwort!

Also wenn ich einfach einen Verweis auf zB Word 97 hinzufüge, sollte es auf allen Rechnern mit Office 97, 2000, XP, 2003 funktionieren?


mfG

Ich habe es zwar noch nicht ausprobiert, da ich immer mit dem 2000er Objekt gearbeitet habe, aber so sollte es funktionieren.

MfG

MeLLe
2004-06-02, 08:16:18
Rein theoretisch kannst du auch nen Mittelweg gehen - du schreibst den relevanten Code indem du die 2003er COM-Komponente im Projekt hältst, tust aber schon zu dieser Zeit die Objekte "sauber" instanzieren, d.h.
...
Dim objWord as Word.Application
...
usw. usf.

Später dann, wenn alles läuft, stellst du um auf Late Binding, indem du den COM-Verweis aus dem Projekt rauswirfst und Objekte per
...
Dim objWord as Object
Set objWord = CreateObject("Word.Application")
...
instanzierst.
Ggf dann noch einen Check, ob die Version "gut genug" für deine Zwecke ist, und voilà - deine Anwendung sollte auf fast alles PCs laufen, wo irgendeine* Word-Version installiert ist.

Melle

* irgendeine Version behält nur Gültigkeit, solange du Funktionen, Konstanten usw. benutzt, die in allen Versionen der Word-COM vorhanden sind.

Misanthrop
2004-06-02, 14:32:27
Brauch ich für

...
Dim objWord as Object
Set objWord = CreateObject("Word.Application")
...


denn keinen Verweis auf die Word-COM? Brauch ich dann nachher noch die Interop.Word.dll die im bin-Verzeichnis erstellt wird?


mfG

Misanthrop
2004-06-02, 20:15:20
Frage hat sich erübrigt, dafür is ne andere aufgekommen ;)


Das Erzeugen der Word.Application und Word.Document Objekte funktioniert super, aber nur vom Typ "Word" selbst kann ich kein Objekt anlegen, Fehler:

"Eine nicht behandelte Ausnahme des Typs 'System.Exception' ist in microsoft.visualbasic.dll aufgetreten.

Zusätzliche Informationen: ActiveX-Komponente kann nicht erstellt werden"




Brauche die Word-Klasse selbst aber ziemlich oft, zB bei:

WordApp.Selection.MoveRight(Word.WdUnits.wdCell, 1)

mfG

grakaman
2004-06-02, 20:22:32
Original geschrieben von Misanthrop
Brauche die Word-Klasse selbst aber ziemlich oft, zB bei:

WordApp.Selection.MoveRight(Word.WdUnits.wdCell, 1)

mfG

Es gibt keine Word Klasse und was du meinst ist lediglich eine Enumeration innerhalb eines Namespace. Um das so zu benutzen, muss du folgendes machen:

object unit = Word.WdUnits.wdCell;
object count = 1;

WordApp.Selection.MoveRight(ref unit, ref count);

MfG

Misanthrop
2004-06-02, 20:43:37
Original geschrieben von grakaman
object unit = Word.WdUnits.wdCell;



Thx, aber genau "dieses" Word kennt er ja nicht wenn ich ohne COM-Verweise mit Late Binding arbeite.

in VB.net würde das so ausschauen (hoff ich mal):

unit = CreateObject("Word.WdUnits.wdCell")
WordApp.Selection.MoveRight(unit, 1)


aber leider bekomm ich schon bei der unit = .. Zeile den oben erwähnten Fehler :(


mfG

grakaman
2004-06-02, 21:17:00
Und wie erstellst du dann das Application Objekt? Das befindet sich doch auch im Word Namespace.

MfG

Misanthrop
2004-06-02, 21:47:35
mit

Dim WordApp As Object
Dim WordDoc As Object
WordApp = CreateObject("Word.Application")
WordDoc = CreateObject("Word.Document")



funktioniert problemlos, kann mir auch nicht erklären warum es mit ("Word") nicht funktioniert.. :(

grakaman
2004-06-02, 21:48:22
Ja, der Fehler besteht wohl darin, dass du versuchst einen Enumerations-Member zu instanzieren. Versuche es doch mal so:

Dim unit As Object;
unit = CreateObject("Word.WdUnits")

Dim count As Object;
count = 1;
WordApp.Selection.MoveRight(ref unit.wdCell, ref count);

MfG

Misanthrop
2004-06-02, 22:16:54
Hi!

Könntest du mir die Zeile
WordApp.Selection.MoveRight(ref unit.wdCell, ref count); auf VB.net übersetzen? ;)

WordApp.Selection.MoveRight(ByRef unit.wdCell, ByRef count)nimmt er mir nicht :/

grakaman
2004-06-02, 22:41:10
Ich glaube bei VB/VB.NET müsste anstatt dem ref ein ByVal stehen. Bin mir da allerdings auch nicht absolut sicher.

MfG

Ps. OK, habs gerade gelesen.

grakaman
2004-06-02, 23:01:09
Ich habe das noch mal gefunden. Angeblich soll es so funktionieren:

WordApp.Selection.MoveRight(Unit:=CreateObject("Word").WdUnits.wdCell)

Misanthrop
2004-06-02, 23:13:12
hmm... Weder

objWord.Selection.MoveRight(unit:=CreateObject("Word").WdUnits.wdLine)

noch

objWord.Selection.MoveRight(CreateObject("Word").WdUnits.wdLine, 1)

funktionieren, obwohl sie syntaktisch richtig sind.... --> selbe Fehlermeldung wie vorher... :(


mfG