[python-de] probleme mit com objekten

Gerson Kurz Gerson.Kurz at t-online.de
Sam Aug 2 12:10:57 EDT 2003


Dusch reibst:

> win32com.client.dynamic.Dispatch("Outlook.Application")  macht probleme.
> wenn ich die py-datei mit IDLE =F6ffne und dann ablaufen lass krieg ich f=
> ehler
> meldungen.

1) Schmeiss Idle weg und nimm Pythonwin. Ist meine vollig vorurteilslose
Meinung.

2) Folgende Fehlermeldung:

>pythonw -u ausguck03.py
Traceback (most recent call last):
  File "ausguck03.py", line 25, in ?
    DumpDefaultAddressBook()
  File "ausguck03.py", line 12, in DumpDefaultAddressBook
    folder =
mapi.GetDefaultFolder(win32com.client.constants.olFolderContacts)
  File "C:\Python23\lib\site-packages\win32com\client\__init__.py", line
168, in __getattr__
    raise AttributeError, a
AttributeError: olFolderContacts
>Exit code: 1

liegt daran, da? du zuerst mittels makepy die Typelib-Infos (das ist eine
quasi maschinenlesbare Beschreibung, was fur Zeug Ausguck exportiert).

-> Pythonwin starten
-> COM makepy utility im Tools menu
-> Microsoft Outlook 9.0 Object Library (oder halt deine Version)

Es steht was da der Form

Generating to
C:\Python23\lib\site-packages\win32com\gen_py\00062FFF-0000-0000-C000-000000
000046x0x9x0.py

Wenn du die Datei im Editor offnest, siehst du, was Ausguck so "offiziell"
anbietet. z.B. findest du

class Application(CoClassBaseClass): # A CoClass
	CLSID = IID('{0006F03A-0000-0000-C000-000000000046}')
	coclass_sources = [
		ApplicationEvents,
	]
	default_source = ApplicationEvents
	coclass_interfaces = [
		_Application,
	]
	default_interface = _Application

Das bedeutet, da? die Klasse Application das Interface _Application
exportiert. Guckst du weiter, findest du die

class _Application:
	...

	def ActiveWindow(self):
		ret = self._oleobj_.InvokeTypes(287, LCID, 1, (9, 0), (),)
		if ret is not None:
			ret = Dispatch(ret, 'ActiveWindow', None, UnicodeToString=0)
		return ret
	...

	_prop_map_get_ = {
	...
		"Name": (12289, 2, (8, 0), (), "Name", None),
		"Parent": (61441, 2, (9, 0), (), "Parent", None),
		"ProductCode": (284, 2, (8, 0), (), "ProductCode", None),
		# Method 'Session' returns object of type '_NameSpace'
		"Session": (61451, 2, (9, 0), (), "Session",
'{00063002-0000-0000-C000-000000000046}'),
		"Version": (278, 2, (8, 0), (), "Version", None),
	}

Daraus kannst du z.B. lesen, da? es eine Methode

	Application.ActiveWindow()

gibt und da? es ein Property

	Application.Name gibt.

Versuche folgendes:

import codecs, win32com.client

o = win32com.client.Dispatch("Outlook.Application")
print o.Name
print o.ActiveWindow()

Hat also geklappt. Mein Orginalbeispiel sollte nach makepy auch
funktionieren.

Du schreibst ferner:

> Hab herausgefunden das es die Funktion "Add" gibt. Jetzt hab ich echt
keinen
> plan wie ich die aufrufen soll?
> weiss nicht sorecht was ich davorschreiben muss.
> kann ja nicht einfach
> Add("NewContacts")
> schreiben um nen neuen Order zu erstellen.
> Kannst du mir vielleicht das mit der "Add" Funktion dazucoden, dass ich
mal
> seh wie man aus Python die Funktionen aufruft???
> Ware dir echt dankbar

Guck dir im oben genannten makepy-generierten Source mal an, was unter

class _ContactItem

steht. Da findest du z.B. eine *riesige* unwahrscheinlich kranke liste an
Properties, die in Kontaktitems enthalten sind. Anlegen geht so:

# ausguck auf
o = win32com.client.Dispatch("Outlook.Application")
mapi = o.GetNamespace("MAPI")
folder = mapi.GetDefaultFolder(win32com.client.constants.olFolderContacts)

# neuer eintrag
item = folder.Items.Add()
item.FullName = EncodeUnicodeString("Heinz Erhardt")
item.Email1Address = EncodeUnicodeString("heinz.erhardt at nix.invalid")

# usw fur alle Properties, die du vergeben willst

# Am schluss nicht vergessen:
item.Save()